int pocl_mk_tempname (char *output, const char *prefix, const char *suffix, int *ret_fd) { #if defined(_MSC_VER) || defined(__MINGW32__) #error "making temporary files on Windows not implemented" #elif defined(HAVE_MKOSTEMPS) || defined(HAVE_MKSTEMPS) || defined(__ANDROID__) /* using mkstemp() instead of tmpnam() has no real benefit * here, as we have to pass the filename to llvm, * but tmpnam() generates an annoying warning... */ int fd; strncpy (output, prefix, POCL_FILENAME_LENGTH); size_t len = strlen (prefix); strncpy (output + len, "_XXXXXX", (POCL_FILENAME_LENGTH - len)); #ifdef __ANDROID__ fd = pocl_mkstemp (output); #else if (suffix) { len += 7; strncpy (output + len, suffix, (POCL_FILENAME_LENGTH - len)); #ifdef HAVE_MKOSTEMPS fd = mkostemps (output, strlen (suffix), O_CLOEXEC); #else fd = mkstemps (output, strlen (suffix)); #endif } else #ifdef HAVE_MKOSTEMPS fd = mkostemp (output, O_CLOEXEC); #else fd = mkstemp (output); #endif #endif if (fd < 0) { POCL_MSG_ERR ("mkstemp() failed\n"); return errno; } int err = 0; if (ret_fd) *ret_fd = fd; else { err = close (fd); } return err ? errno : 0; #else #error mkostemps() / mkstemps() both unavailable #endif }
static int generate_tmp_image_fd() { int tmp_fd; char tmp_image_fname[] = "/tmp/spektro_XXXXXX.pgm"; tmp_fd = mkostemps(tmp_image_fname, 4, O_CREAT|O_WRONLY); if (image_fname != NULL) { free(image_fname); } image_fname = strdup(tmp_image_fname); return tmp_fd; }
/* Like mkostemps, but do not return STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. */ int mkostemps_safer (char *templ, int suffixlen, int flags) { return fd_safer_flag (mkostemps (templ, suffixlen, flags), flags); }
int main (int argc, char *argv[]) { char name[256]; char name_suffix[256]; FILE *fp = NULL; int retval = 0; int fd; int flags = O_RDONLY | O_CLOEXEC; struct stat sb_f1; struct stat sb_f2; /* mkstemp test */ sprintf(name, "/tmp/%s-uClibc-test.XXXXXX", __FILE__); fd = mkstemp(name); fstat(fd, &sb_f1); assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) stat(name, &sb_f2); assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) assert (sb_f1.st_ino == sb_f2.st_ino) close(fd); unlink (name); /* mkstemps test */ sprintf(name_suffix, "/tmp/%s-uClibc-test.XXXXXX.txt", __FILE__); fd = mkstemps(name_suffix, 4); fstat(fd, &sb_f1); assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) stat(name_suffix, &sb_f2); assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) assert (sb_f1.st_ino == sb_f2.st_ino) close(fd); unlink (name_suffix); /* mkostemp test */ sprintf(name, "/tmp/%s-uClibc-test.XXXXXX", __FILE__); fd = mkostemp(name, flags); fstat(fd, &sb_f1); assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) stat(name, &sb_f2); assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) assert (sb_f1.st_ino == sb_f2.st_ino) assert (sb_f1.st_mode == sb_f2.st_mode) close(fd); unlink (name); /* mkostemps test */ sprintf(name_suffix, "/tmp/%s-uClibc-test.XXXXXX.txt", __FILE__); fd = mkostemps(name_suffix, 4, flags); fstat(fd, &sb_f1); assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) stat(name_suffix, &sb_f2); assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) assert (sb_f1.st_ino == sb_f2.st_ino) assert (sb_f1.st_mode == sb_f2.st_mode) close(fd); unlink (name_suffix); /* suffixlen = 0 */ sprintf(name_suffix, "/tmp/%s-uClibc-test.XXXXXX", __FILE__); fd = mkostemps(name_suffix, 0, flags); fstat(fd, &sb_f1); assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) stat(name_suffix, &sb_f2); assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) assert (sb_f1.st_ino == sb_f2.st_ino) assert (sb_f1.st_mode == sb_f2.st_mode) close(fd); unlink (name_suffix); /* stress tests */ /* template len < 6 */ sprintf(name, "XXXXX"); fd = mkstemp(name); assert(fd == -1); assert(errno == EINVAL); /* suffixlen < 0 */ sprintf(name_suffix, "/tmp/%s-uClibc-test.XXXXXX.txt", __FILE__); fd = mkostemps(name_suffix, -1, flags); assert(fd == -1); assert(errno == EINVAL); /* Missing one X */ sprintf(name_suffix, "/tmp/%s-uClibc-test.XXXXX.txt", __FILE__); fd = mkostemps(name_suffix, 4, flags); assert(fd == -1); assert(errno == EINVAL); /* wrong suffixlen */ sprintf(name_suffix, "/tmp/%s-uClibc-test.XXXXXX.txt", __FILE__); fd = mkostemps(name_suffix, 2, flags); assert(fd == -1); assert(errno == EINVAL); the_end: if (fp != NULL) assert (fclose (fp) == 0); unlink (name); unlink (name_suffix); return retval; }