Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions include/stdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ extern "C" {
#define FOPEN_MAX 16
#define L_ctermid 11 /* Fit at least /dev/pts/XX */
#define L_tmpnam 16
#define P_tmpdir "/tmp"
#define TMP_MAX 32767

typedef off_t fpos_t;
Expand Down Expand Up @@ -194,6 +195,10 @@ extern FILE *tmpfile(void);
extern char *tmpnam(char *str);


/* Generates a pathname that may be used for a temporary file. */
extern char *tempnam(const char *dir, const char *pfx);


/* Sends formatted output to a stream. */
extern int fprintf(FILE *stream, const char *format, ...)
__attribute__((format(printf, 2, 3)));
Expand Down
4 changes: 0 additions & 4 deletions posix/stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,6 @@ char *gets(char *str)
return NULL;
}

char *tmpnam(char *str)
{
return NULL;
}

int wctomb(char *str, wchar_t wchar)
{
Expand Down
60 changes: 60 additions & 0 deletions stdlib/mktemp.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

#include <sys/msg.h>
Expand Down Expand Up @@ -119,3 +121,61 @@ char *mkdtemp(char *templt)

return templt;
}


char *tmpnam(char *str)
{
static char template[L_tmpnam];
int err;

if (str == NULL) {
str = template;
}

do {
(void)strcpy(str, "/tmp/fileXXXXXX");
err = __mktemp(str, 0);
} while ((err < 0) && errno == EEXIST);

return (err < 0) ? NULL : str;
}


char *tempnam(const char *dir, const char *pfx)
{
struct stat statbuf;
int err, dirlen, pfxlen, sep = 0;

if (dir == NULL || stat(dir, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode)) {
if (access(P_tmpdir, W_OK | X_OK) < 0) {
dir = "/";
}
else {
dir = P_tmpdir;
}
}
Comment thread
julianuziemblo marked this conversation as resolved.

dirlen = strlen(dir);
pfxlen = (pfx == NULL) ? 4 /* strlen("file") */ : strlen(pfx);
if (dir[dirlen - 1] != '/') {
sep = 1;
}

char *name = malloc(dirlen + sep + pfxlen + 6 /* "XXXXXX" */ + 1);
if (name == NULL) {
errno = ENOMEM;
return NULL;
}

do {
sprintf(name, "%s%s%sXXXXXX", dir, (sep != 0) ? "/" : "", (pfx == NULL) ? "file" : pfx);
err = __mktemp(name, 0);
} while ((err < 0) && errno == EEXIST);

if (err < 0) {
free(name);
name = NULL;
}

return name;
}
Loading