Mercurial > dovecot > original-hg > dovecot-1.2
changeset 4457:fa7353daa44f HEAD
safe_mkdir() should return 1 always when it creates a new directory, even if
it changes the group/permissions when doing it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 30 Jun 2006 17:49:03 +0300 |
parents | 9577a99b7fef |
children | 3e196acd60b7 |
files | src/lib/safe-mkdir.c |
diffstat | 1 files changed, 10 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/safe-mkdir.c Thu Jun 29 15:50:18 2006 +0300 +++ b/src/lib/safe-mkdir.c Fri Jun 30 17:49:03 2006 +0300 @@ -10,17 +10,19 @@ int safe_mkdir(const char *dir, mode_t mode, uid_t uid, gid_t gid) { struct stat st; - int fd, ret = 1; + int fd, ret = 2, changed_ret = 0; if (lstat(dir, &st) < 0) { if (errno != ENOENT) i_fatal("lstat() failed for %s: %m", dir); - if (mkdir(dir, mode) < 0) - i_fatal("Can't create directory %s: %m", dir); - } else { - /* already exists. */ - ret = 2; + if (mkdir(dir, mode) < 0) { + if (errno != EEXIST) + i_fatal("Can't create directory %s: %m", dir); + } else { + /* created it */ + ret = changed_ret = 1; + } } /* use fchown() and fchmod() just to make sure we aren't following @@ -40,13 +42,13 @@ if (st.st_uid != uid || st.st_gid != gid) { if (fchown(fd, uid, gid) < 0) i_fatal("fchown() failed for %s: %m", dir); - ret = 0; + ret = changed_ret; } if ((st.st_mode & 07777) != mode) { if (fchmod(fd, mode) < 0) i_fatal("chmod() failed for %s: %m", dir); - ret = 0; + ret = changed_ret; } if (close(fd) < 0)