X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fm_mktemp.c;h=6f2089ba4509495a789920a850de12c596852c77;hp=aa25636a95eda47cb12171d9fe5e845fe72a7f91;hb=a485ed478abbd599d8c9aab48934e7a26733ecb1;hpb=f480c03187724e54e5391ee61b810827da319a6c diff --git a/sbr/m_mktemp.c b/sbr/m_mktemp.c index aa25636..6f2089b 100644 --- a/sbr/m_mktemp.c +++ b/sbr/m_mktemp.c @@ -27,7 +27,7 @@ static char *get_temp_dir(); * * When pfx_in is null, the temporary directory is determined as * follows, in order: - * + * * MHTMPDIR envvar * TMPDIR envvar * TMP envvar @@ -42,49 +42,49 @@ static char *get_temp_dir(); */ char * m_mktemp ( - const char *pfx_in, /* Pathname prefix for temporary file. */ - int *fd_ret, /* (return,optional) File descriptor to temp file. */ - FILE **fp_ret /* (return,optional) FILE pointer to temp file. */ + const char *pfx_in, /* Pathname prefix for temporary file. */ + int *fd_ret, /* (return,optional) File descriptor to temp file. */ + FILE **fp_ret /* (return,optional) FILE pointer to temp file. */ ) { - static char tmpfil[BUFSIZ]; - int fd = -1; - int keep_open = 0; - mode_t oldmode = umask(077); + static char tmpfil[BUFSIZ]; + int fd = -1; + int keep_open = 0; + mode_t oldmode = umask(077); - if (pfx_in == NULL) { - snprintf(tmpfil, sizeof(tmpfil), "%s/nmhXXXXXX", get_temp_dir()); - } else { - snprintf(tmpfil, sizeof(tmpfil), "%sXXXXXX", pfx_in); - } + if (pfx_in == NULL) { + snprintf(tmpfil, sizeof(tmpfil), "%s/nmhXXXXXX", get_temp_dir()); + } else { + snprintf(tmpfil, sizeof(tmpfil), "%sXXXXXX", pfx_in); + } - fd = mkstemp(tmpfil); - if (fd < 0) { - umask(oldmode); - return NULL; - } - if (fd_ret != NULL) { - *fd_ret = fd; - keep_open = 1; - } - if (fp_ret != NULL) { - FILE *fp = fdopen(fd, "w+"); - if (fp == NULL) { - int olderr = errno; - unlink(tmpfil); - close(fd); - errno = olderr; - umask(oldmode); - return NULL; - } - *fp_ret = fp; - keep_open = 1; - } - if (!keep_open) { - close(fd); - } - umask(oldmode); - return tmpfil; + fd = mkstemp(tmpfil); + if (fd < 0) { + umask(oldmode); + return NULL; + } + if (fd_ret != NULL) { + *fd_ret = fd; + keep_open = 1; + } + if (fp_ret != NULL) { + FILE *fp = fdopen(fd, "w+"); + if (fp == NULL) { + int olderr = errno; + unlink(tmpfil); + close(fd); + errno = olderr; + umask(oldmode); + return NULL; + } + *fp_ret = fp; + keep_open = 1; + } + if (!keep_open) { + close(fd); + } + umask(oldmode); + return tmpfil; } /* This version allows one to specify the directory the temp file should @@ -99,48 +99,48 @@ m_mktemp ( */ char * m_mktemp2 ( - const char *dir_in, /* Directory to place temp file. */ - const char *pfx_in, /* Basename prefix for temp file. */ - int *fd_ret, /* (return,optional) File descriptor to temp file. */ - FILE **fp_ret /* (return,optional) FILE pointer to temp file. */ + const char *dir_in, /* Directory to place temp file. */ + const char *pfx_in, /* Basename prefix for temp file. */ + int *fd_ret, /* (return,optional) File descriptor to temp file. */ + FILE **fp_ret /* (return,optional) FILE pointer to temp file. */ ) { - static char buffer[BUFSIZ]; - char *cp; - int n; + static char buffer[BUFSIZ]; + char *cp; + int n; - if (dir_in == NULL) { - if (pfx_in == NULL) { - return m_mktemp(NULL, fd_ret, fp_ret); - } - snprintf(buffer, sizeof(buffer), "%s/%s", get_temp_dir(), pfx_in); - return m_mktemp(buffer, fd_ret, fp_ret); - } + if (dir_in == NULL) { + if (pfx_in == NULL) { + return m_mktemp(NULL, fd_ret, fp_ret); + } + snprintf(buffer, sizeof(buffer), "%s/%s", get_temp_dir(), pfx_in); + return m_mktemp(buffer, fd_ret, fp_ret); + } - if ((cp = r1bindex ((char *)dir_in, '/')) == dir_in) { - /* No directory component */ - return m_mktemp(pfx_in, fd_ret, fp_ret); - } - n = (int)(cp-dir_in-1); /* Length of dir component */ - snprintf(buffer, sizeof(buffer), "%.*s%s", n, dir_in, pfx_in); - return m_mktemp(buffer, fd_ret, fp_ret); + if ((cp = r1bindex ((char *)dir_in, '/')) == dir_in) { + /* No directory component */ + return m_mktemp(pfx_in, fd_ret, fp_ret); + } + n = (int)(cp-dir_in-1); /* Length of dir component */ + snprintf(buffer, sizeof(buffer), "%.*s%s", n, dir_in, pfx_in); + return m_mktemp(buffer, fd_ret, fp_ret); } static char * get_temp_dir() { - // Ignore envvars if we are setuid - if ((getuid()==geteuid()) && (getgid()==getegid())) { - char *tmpdir = NULL; - tmpdir = getenv("MHTMPDIR"); - if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; + // Ignore envvars if we are setuid + if ((getuid()==geteuid()) && (getgid()==getegid())) { + char *tmpdir = NULL; + tmpdir = getenv("MHTMPDIR"); + if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; - tmpdir = getenv("TMPDIR"); - if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; + tmpdir = getenv("TMPDIR"); + if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; - tmpdir = getenv("TMP"); - if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; - } - return m_maildir(""); + tmpdir = getenv("TMP"); + if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; + } + return m_maildir(""); }