Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5542:8669dc1e4036 HEAD
Added safe_mkstemp().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 11 Apr 2007 14:24:34 +0300 |
parents | 7082bef9081e |
children | a240e903841e |
files | src/lib/Makefile.am src/lib/safe-mkstemp.c src/lib/safe-mkstemp.h |
diffstat | 3 files changed, 72 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/Makefile.am Wed Apr 11 14:19:25 2007 +0300 +++ b/src/lib/Makefile.am Wed Apr 11 14:24:34 2007 +0300 @@ -74,6 +74,7 @@ restrict-process-size.c \ safe-memset.c \ safe-mkdir.c \ + safe-mkstemp.c \ sendfile-util.c \ seq-range-array.c \ sha1.c \ @@ -153,6 +154,7 @@ restrict-process-size.h \ safe-memset.h \ safe-mkdir.h \ + safe-mkstemp.h \ sendfile-util.h \ seq-range-array.h \ sha1.h \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/safe-mkstemp.c Wed Apr 11 14:24:34 2007 +0300 @@ -0,0 +1,59 @@ +/* Copyright (c) 2007 Timo Sirainen */ + +#include "lib.h" +#include "str.h" +#include "hex-binary.h" +#include "randgen.h" +#include "hostpid.h" +#include "safe-mkstemp.h" + +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> + +int safe_mkstemp(string_t *prefix, mode_t mode, uid_t uid, gid_t gid) +{ + size_t prefix_len; + struct stat st; + unsigned char randbuf[8]; + int fd; + + prefix_len = str_len(prefix); + for (;;) { + do { + random_fill_weak(randbuf, sizeof(randbuf)); + str_truncate(prefix, prefix_len); + str_append(prefix, + binary_to_hex(randbuf, sizeof(randbuf))); + } while (lstat(str_c(prefix), &st) == 0); + + if (errno != ENOENT) { + i_error("stat(%s) failed: %m", str_c(prefix)); + return -1; + } + + fd = open(str_c(prefix), O_RDWR | O_EXCL | O_CREAT, mode); + if (fd != -1) + break; + + if (errno != EEXIST) { + i_error("open(%s) failed: %m", str_c(prefix)); + return -1; + } + } + if (uid != (uid_t)-1 || gid != (gid_t)-1) { + if (fchown(fd, uid, gid) < 0) { + i_error("fchown(%s) failed: %m", str_c(prefix)); + (void)close(fd); + (void)unlink(str_c(prefix)); + return -1; + } + } + return fd; +} + +int safe_mkstemp_hostpid(string_t *prefix, mode_t mode, uid_t uid, gid_t gid) +{ + str_printfa(prefix, "%s.%s.", my_hostname, my_pid); + return safe_mkstemp(prefix, mode, uid, gid); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/safe-mkstemp.h Wed Apr 11 14:24:34 2007 +0300 @@ -0,0 +1,11 @@ +#ifndef __SAFE_MKSTEMP_H +#define __SAFE_MKSTEMP_H + +/* Create a new file with a given prefix. The string is updated to contain the + created filename. uid and gid can be (uid_t)-1 and (gid_t)-1 to use the + defaults. */ +int safe_mkstemp(string_t *prefix, mode_t mode, uid_t uid, gid_t gid); +/* Append host and PID to the prefix. */ +int safe_mkstemp_hostpid(string_t *prefix, mode_t mode, uid_t uid, gid_t gid); + +#endif