Mercurial > dovecot > core-2.2
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