github.com/afumu/libc@v0.0.6/musl/src/stdio/tempnam.c (about)

     1  #include <stdio.h>
     2  #include <fcntl.h>
     3  #include <errno.h>
     4  #include <sys/stat.h>
     5  #include <limits.h>
     6  #include <string.h>
     7  #include <stdlib.h>
     8  #include "syscall.h"
     9  #include "kstat.h"
    10  
    11  #define MAXTRIES 100
    12  
    13  char *tempnam(const char *dir, const char *pfx)
    14  {
    15  	char s[PATH_MAX];
    16  	size_t l, dl, pl;
    17  	int try;
    18  	int r;
    19  
    20  	if (!dir) dir = P_tmpdir;
    21  	if (!pfx) pfx = "temp";
    22  
    23  	dl = strlen(dir);
    24  	pl = strlen(pfx);
    25  	l = dl + 1 + pl + 1 + 6;
    26  
    27  	if (l >= PATH_MAX) {
    28  		errno = ENAMETOOLONG;
    29  		return 0;
    30  	}
    31  
    32  	memcpy(s, dir, dl);
    33  	s[dl] = '/';
    34  	memcpy(s+dl+1, pfx, pl);
    35  	s[dl+1+pl] = '_';
    36  	s[l] = 0;
    37  
    38  	for (try=0; try<MAXTRIES; try++) {
    39  		__randname(s+l-6);
    40  #ifdef SYS_lstat
    41  		r = __syscall(SYS_lstat, s, &(struct kstat){0});
    42  #else
    43  		r = __syscall(SYS_fstatat, AT_FDCWD, s,
    44  			&(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
    45  #endif
    46  		if (r == -ENOENT) return strdup(s);
    47  	}
    48  	return 0;
    49  }