dovecot-2.1: Added stat_first_parent() helper function.

dovecot at dovecot.org dovecot at dovecot.org
Thu Dec 13 12:13:52 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/40f9e2e339a6
changeset: 14845:40f9e2e339a6
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Dec 13 12:13:42 2012 +0200
description:
Added stat_first_parent() helper function.

diffstat:

 src/lib/mkdir-parents.c |  20 ++++++++++++++++++++
 src/lib/mkdir-parents.h |   8 ++++++++
 2 files changed, 28 insertions(+), 0 deletions(-)

diffs (50 lines):

diff -r f13f2725882e -r 40f9e2e339a6 src/lib/mkdir-parents.c
--- a/src/lib/mkdir-parents.c	Tue Dec 11 20:04:10 2012 +0200
+++ b/src/lib/mkdir-parents.c	Thu Dec 13 12:13:42 2012 +0200
@@ -125,3 +125,23 @@
 {
 	return mkdir_parents_chown(path, mode, (uid_t)-1, (gid_t)-1);
 }
+
+int stat_first_parent(const char *path, const char **root_dir_r,
+		      struct stat *st_r)
+{
+	const char *p;
+
+	while (stat(path, st_r) < 0) {
+		if (errno != ENOENT || strcmp(path, "/") == 0) {
+			*root_dir_r = path;
+			return -1;
+		}
+		p = strrchr(path, '/');
+		if (p == NULL)
+			path = "/";
+		else
+			path = t_strdup_until(path, p);
+	}
+	*root_dir_r = path;
+	return 0;
+}
diff -r f13f2725882e -r 40f9e2e339a6 src/lib/mkdir-parents.h
--- a/src/lib/mkdir-parents.h	Tue Dec 11 20:04:10 2012 +0200
+++ b/src/lib/mkdir-parents.h	Thu Dec 13 12:13:42 2012 +0200
@@ -1,6 +1,8 @@
 #ifndef MKDIR_PARENTS_H
 #define MKDIR_PARENTS_H
 
+#include <sys/stat.h>
+
 /* Create path and all the directories under it if needed. Permissions for
    existing directories isn't changed. Returns 0 if ok. If directory already
    exists, returns -1 with errno=EEXIST. */
@@ -20,4 +22,10 @@
 int mkdir_chgrp(const char *path, mode_t mode,
 		gid_t gid, const char *gid_origin);
 
+/* stat() the path or its first parent that exists. Returns 0 if ok, -1 if
+   failed. root_dir is set to the last stat()ed directory (on success and
+   on failure). */
+int stat_first_parent(const char *path, const char **root_dir_r,
+		      struct stat *st_r);
+
 #endif


More information about the dovecot-cvs mailing list