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)