diff --git a/src/internal/procfdname.c b/src/internal/procfdname.c new file mode 100644 index 0000000000000000000000000000000000000000..697e0bdc2e1f6a2ae212f70a5915b99cc35d1dfd --- /dev/null +++ b/src/internal/procfdname.c @@ -0,0 +1,13 @@ +void __procfdname(char *buf, unsigned fd) +{ + unsigned i, j; + for (i=0; (buf[i] = "/proc/self/fd/"[i]); i++); + if (!fd) { + buf[i] = '0'; + buf[i+1] = 0; + return; + } + for (j=fd; j; j/=10, i++); + buf[i] = 0; + for (; fd; fd/=10) buf[--i] = '0' + fd%10; +} diff --git a/src/misc/realpath.c b/src/misc/realpath.c index 183351462519b99912265da7a87a11489dd8f1b9..d238ed014db44f70536079df3b3bc9f9262c99ce 100644 --- a/src/misc/realpath.c +++ b/src/misc/realpath.c @@ -6,6 +6,8 @@ #include #include +void __procfdname(char *, unsigned); + char *realpath(const char *restrict filename, char *restrict resolved) { int fd; @@ -21,7 +23,7 @@ char *realpath(const char *restrict filename, char *restrict resolved) fd = open(filename, O_RDONLY|O_NONBLOCK|O_CLOEXEC); if (fd < 0) return 0; - snprintf(buf, sizeof buf, "/proc/self/fd/%d", fd); + __procfdname(buf, fd); if (!resolved) { alloc = 1; diff --git a/src/process/fexecve.c b/src/process/fexecve.c index 5939181a7e1adcfba2fb8e9681eb3e7823f3267c..8ab02a74683dc8b7f2911e22c8874bbc94ac6484 100644 --- a/src/process/fexecve.c +++ b/src/process/fexecve.c @@ -2,11 +2,12 @@ #include #include +void __procfdname(char *, unsigned); + int fexecve(int fd, char *const argv[], char *const envp[]) { - static const char proc[] = "/proc/self/fd/%d"; - char buf[sizeof proc + 3*sizeof(int)]; - snprintf(buf, sizeof buf, proc, fd); + char buf[15 + 3*sizeof(int)]; + __procfdname(buf, fd); execve(buf, argv, envp); if (errno == ENOENT) errno = EBADF; return -1; diff --git a/src/stat/fchmodat.c b/src/stat/fchmodat.c index c1410bc58d2fe311e9d5bc73e31fbf78951deead..aeb50bc5741aa3740c13f78cc95319ffb7e26207 100644 --- a/src/stat/fchmodat.c +++ b/src/stat/fchmodat.c @@ -4,6 +4,8 @@ #include #include "syscall.h" +void __procfdname(char *, unsigned); + int fchmodat(int fd, const char *path, mode_t mode, int flag) { if (!flag) return syscall(SYS_fchmodat, fd, path, mode, flag); @@ -26,7 +28,7 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag) return __syscall_ret(fd2); } - snprintf(proc, sizeof proc, "/proc/self/fd/%d", fd2); + __procfdname(proc, fd2); if (!(ret = __syscall(SYS_stat, proc, &st)) && !S_ISLNK(st.st_mode)) ret = __syscall(SYS_chmod, proc, mode); diff --git a/src/unistd/ttyname_r.c b/src/unistd/ttyname_r.c index 2255e2dfebb7a5c2e8378e38879792dba88476f0..a2ce351192eb959e1c59f47ed525def5c7b35120 100644 --- a/src/unistd/ttyname_r.c +++ b/src/unistd/ttyname_r.c @@ -3,6 +3,8 @@ #include #include +void __procfdname(char *, unsigned); + int ttyname_r(int fd, char *name, size_t size) { char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2]; @@ -10,7 +12,7 @@ int ttyname_r(int fd, char *name, size_t size) if (!isatty(fd)) return ENOTTY; - snprintf(procname, sizeof procname, "/proc/self/fd/%d", fd); + __procfdname(procname, fd); l = readlink(procname, name, size); if (l < 0) return errno;