From f6f17fbfb48a62cc2f499c82cef8698c196879fc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Dec 2017 17:05:39 +0100 Subject: [PATCH] - give tmpfileplus its own RNG. This should not interfere with the global one which can be explicitly seeded. It also seems a bit pointless to constantly re-seed the RNG for something this inconsequential. --- src/tmpfileplus.cpp | 75 +++++---------------------------------------- src/tmpfileplus.h | 20 ------------ 2 files changed, 7 insertions(+), 88 deletions(-) diff --git a/src/tmpfileplus.cpp b/src/tmpfileplus.cpp index 4bb9f4586..0ebb23185 100644 --- a/src/tmpfileplus.cpp +++ b/src/tmpfileplus.cpp @@ -67,23 +67,6 @@ * */ -/* ADDED IN v2.0 */ - -/* -* NAME -* tmpfileplus_f - create a unique temporary file with filename stored in a fixed-length buffer -* -* SYNOPSIS -* FILE *tmpfileplus_f(const char *dir, const char *prefix, char *pathnamebuf, size_t pathsize, int keep); -* -* DESCRIPTION -* Same as tmpfileplus() except receives filename in a fixed-length buffer. No allocated memory to free. - -* ERRORS -* E2BIG Resulting filename is too big for the buffer `pathnamebuf`. - -*/ - #include "tmpfileplus.h" #include @@ -112,47 +95,32 @@ #define FDOPEN_ fdopen #endif +#include "m_random.h" +#include "cmdlib.h" -#ifdef _WIN32 -#define FILE_SEPARATOR "\\" -#else #define FILE_SEPARATOR "/" -#endif #define RANDCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" #define NRANDCHARS (sizeof(RANDCHARS) - 1) +static FRandom pr_tmpfile; + /** Replace each byte in string s with a random character from TEMPCHARS */ static char *set_randpart(char *s) { size_t i; unsigned int r; - static unsigned int seed; /* NB static */ - if (seed == 0) - { /* First time set our seed using current time and clock */ - seed = ((unsigned)time(NULL)<<8) ^ (unsigned)clock(); - } - srand(seed++); + for (i = 0; i < strlen(s); i++) { - r = rand() % NRANDCHARS; + r = pr_tmpfile() % NRANDCHARS; s[i] = (RANDCHARS)[r]; } return s; } -/** Return 1 if path is a valid directory otherwise 0 */ -static int is_valid_dir(const char *path) -{ - struct stat st; - if ((stat(path, &st) == 0) && (st.st_mode & S_IFDIR)) - return 1; - - return 0; -} - /** Call getenv and save a copy in buf */ static char *getenv_save(const char *varname, char *buf, size_t bufsize) { @@ -203,7 +171,7 @@ static FILE *mktempfile_internal(const char *tmpdir, const char *pfx, char **tmp pmode = S_IRUSR|S_IWUSR; #endif - if (!tmpdir || !is_valid_dir(tmpdir)) { + if (!tmpdir || !DirExists(tmpdir)) { errno = ENOENT; return NULL; } @@ -295,32 +263,3 @@ FILE *tmpfileplus(const char *dir, const char *prefix, char **pathname, int keep return fp; } -/* Same as tmpfileplus() but with fixed length buffer for output filename and no memory allocation */ -FILE *tmpfileplus_f(const char *dir, const char *prefix, char *pathnamebuf, size_t pathsize, int keep) -{ - char *tmpbuf = NULL; - FILE *fp; - - /* If no buffer provided, do the normal way */ - if (!pathnamebuf || (int)pathsize <= 0) { - return tmpfileplus(dir, prefix, NULL, keep); - } - /* Call with a temporary buffer */ - fp = tmpfileplus(dir, prefix, &tmpbuf, keep); - if (fp && strlen(tmpbuf) > pathsize - 1) { - /* Succeeded but not enough room in output buffer, so clean up and return an error */ - pathnamebuf[0] = 0; - fclose(fp); - if (keep) remove(tmpbuf); - free(tmpbuf); - errno = E2BIG; - return NULL; - } - /* Copy name into buffer */ - strcpy(pathnamebuf, tmpbuf); - free(tmpbuf); - - return fp; -} - - diff --git a/src/tmpfileplus.h b/src/tmpfileplus.h index e32ff5042..07b5ca0d5 100644 --- a/src/tmpfileplus.h +++ b/src/tmpfileplus.h @@ -23,10 +23,6 @@ #include -#ifdef __cplusplus -extern "C" { -#endif - /** Create a unique temporary file. @param dir (optional) directory to create file. If NULL use default TMP directory. @param prefix (optional) prefix for file name. If NULL use "tmp.". @@ -40,22 +36,6 @@ extern "C" { FILE *tmpfileplus(const char *dir, const char *prefix, char **pathname, int keep); -/** Create a unique temporary file with filename stored in a fixed-length buffer. -@param dir (optional) directory to create file. If NULL use default directory. -@param prefix (optional) prefix for file name. If NULL use "tmp.". -@param pathnamebuf (optional) buffer to receive full pathname of temporary file. Ignored if NULL. -@param pathsize Size of buffer to receive filename and its terminating null character. -@param keep If `keep` is nonzero and `pathname` is not NULL, then keep the file after closing. - Otherwise file is automatically deleted when closed. -@return Pointer to stream opened in binary read/write (w+b) mode, or a null pointer on error. -@exception E2BIG Resulting filename is too big for the buffer `pathnamebuf`. -*/ -FILE *tmpfileplus_f(const char *dir, const char *prefix, char *pathnamebuf, size_t pathsize, int keep); - #define TMPFILE_KEEP 1 -#ifdef __cplusplus -} -#endif - #endif /* end TMPFILEPLUS_H_ */