changeset 15555:40f9e2e339a6

Added stat_first_parent() helper function.
author Timo Sirainen <tss@iki.fi>
date Thu, 13 Dec 2012 12:13:42 +0200
parents f13f2725882e
children c0ad6afa4128
files src/lib/mkdir-parents.c src/lib/mkdir-parents.h
diffstat 2 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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;
+}
--- 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