X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fmkdir.c;fp=src%2Fshared%2Fmkdir.c;h=fef674c1b39eaf78a5336dad8f3f824c59d7911e;hb=9e13dbae509605dba1bde7e7385086b59acb428e;hp=3d9822129618e28bd4ad50727536f0c1fa5a41c0;hpb=f13b388f97bc3ba8db844bd3413d510e2466a0b6;p=elogind.git diff --git a/src/shared/mkdir.c b/src/shared/mkdir.c index 3d9822129..fef674c1b 100644 --- a/src/shared/mkdir.c +++ b/src/shared/mkdir.c @@ -53,13 +53,24 @@ int safe_mkdir(const char *path, mode_t mode, uid_t uid, gid_t gid) { } int mkdir_parents(const char *path, mode_t mode) { + struct stat st; const char *p, *e; assert(path); - /* Creates every parent directory in the path except the last - * component. */ + /* return immediately if directory exists */ + e = strrchr(path, '/'); + if (!e) + return -EINVAL; + p = strndupa(path, e - path); + if (stat(p, &st) >= 0) { + if ((st.st_mode & S_IFMT) == S_IFDIR) + return 0; + else + return -ENOTDIR; + } + /* create every parent directory in the path, except the last component */ p = path + strspn(path, "/"); for (;;) { int r; @@ -73,11 +84,10 @@ int mkdir_parents(const char *path, mode_t mode) { if (*p == 0) return 0; - if (!(t = strndup(path, e - path))) + if (!(t = strndupa(path, e - path))) return -ENOMEM; r = label_mkdir(t, mode); - free(t); if (r < 0 && errno != EEXIST) return -errno;