mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
drop use of stat operation in temporary file name generation
this change serves two purposes:
1. it eliminates one of the few remaining uses of the kernel stat
structure which will not be present in future archs, avoiding the need
for growing ifdef logic here.
2. it potentially makes the operations less expensive when the
candidate exists as a non-symlink by avoiding the need to read the
inode (assuming the directory tables suffice to distinguish symlinks).
this uses the idiom I discovered while rewriting realpath for commit
29ff7599a4
of being able to use the
readlink operation as an inexpensive probe for file existence that
doesn't following symlinks.
This commit is contained in:
parent
12a757b321
commit
9a93749555
2 changed files with 6 additions and 10 deletions
|
@ -6,7 +6,6 @@
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "syscall.h"
|
||||
#include "kstat.h"
|
||||
|
||||
#define MAXTRIES 100
|
||||
|
||||
|
@ -37,11 +36,10 @@ char *tempnam(const char *dir, const char *pfx)
|
|||
|
||||
for (try=0; try<MAXTRIES; try++) {
|
||||
__randname(s+l-6);
|
||||
#ifdef SYS_lstat
|
||||
r = __syscall(SYS_lstat, s, &(struct kstat){0});
|
||||
#ifdef SYS_readlink
|
||||
r = __syscall(SYS_readlink, s, (char[1]){0}, 1);
|
||||
#else
|
||||
r = __syscall(SYS_fstatat, AT_FDCWD, s,
|
||||
&(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
|
||||
r = __syscall(SYS_readlinkat, AT_FDCWD, s, (char[1]){0}, 1);
|
||||
#endif
|
||||
if (r == -ENOENT) return strdup(s);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "syscall.h"
|
||||
#include "kstat.h"
|
||||
|
||||
#define MAXTRIES 100
|
||||
|
||||
|
@ -17,11 +16,10 @@ char *tmpnam(char *buf)
|
|||
int r;
|
||||
for (try=0; try<MAXTRIES; try++) {
|
||||
__randname(s+12);
|
||||
#ifdef SYS_lstat
|
||||
r = __syscall(SYS_lstat, s, &(struct kstat){0});
|
||||
#ifdef SYS_readlink
|
||||
r = __syscall(SYS_readlink, s, (char[1]){0}, 1);
|
||||
#else
|
||||
r = __syscall(SYS_fstatat, AT_FDCWD, s,
|
||||
&(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
|
||||
r = __syscall(SYS_readlinkat, AT_FDCWD, s, (char[1]){0}, 1);
|
||||
#endif
|
||||
if (r == -ENOENT) return strcpy(buf ? buf : internal, s);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue