diff --git a/ncat/ncat_core.h b/ncat/ncat_core.h index b19e43652..9e8408857 100644 --- a/ncat/ncat_core.h +++ b/ncat/ncat_core.h @@ -267,3 +267,5 @@ extern void set_lf_mode(void); extern int setenv_portable(const char *name, const char *value); extern void setup_environment(struct fdinfo *fdinfo); + +extern char *tempfile(const char *dir, const char *prefix); diff --git a/ncat/ncat_posix.c b/ncat/ncat_posix.c index 44c6f5254..aaadfcc0e 100644 --- a/ncat/ncat_posix.c +++ b/ncat/ncat_posix.c @@ -436,3 +436,36 @@ int setenv_portable(const char *name, const char *value) { return setenv(name, value, 1); } + +/* Create a name temporary file. This function aims to emulate tempnam, with the + exception that it creates the file like mkstemp does. + The directories tried are, in order, + * $TMPDIR + * dir + * /tmp +*/ +char *tempfile(const char *dir, const char *prefix) +{ + const char *SUFFIX = "XXXXXXXXXX"; + const char *tmpdir; + char *namebuf; + size_t namelen; + int n; + + tmpdir = NULL; + if ((getuid() == geteuid()) && (getgid() == getegid())) + tmpdir = getenv("TMPDIR"); + if (tmpdir == NULL) + tmpdir = dir; + if (tmpdir == NULL) + tmpdir = "/tmp"; + namelen = strlen(tmpdir) + 1 + strlen(prefix) + strlen(SUFFIX); + namebuf = malloc(namelen + 1); + n = Snprintf(namebuf, namelen + 1, "%s/%s%s", tmpdir, prefix, SUFFIX); + ncat_assert(n >= 0 && n <= namelen); + n = mkstemp(namebuf); + if (n == -1) + return NULL; + + return namebuf; +} diff --git a/ncat/ncat_win.c b/ncat/ncat_win.c index e7ca35d79..5515ad2d5 100644 --- a/ncat/ncat_win.c +++ b/ncat/ncat_win.c @@ -178,3 +178,8 @@ int ssl_load_default_ca_certs(SSL_CTX *ctx) return rc == 1 ? 0 : -1; } #endif + +char *tempfile(const char *dir, const char *prefix) +{ + return tempnam(dir, prefix); +}