mkdir-parents.c revision 766814de3fbfeb8ca7c4d6b592f6ca09f14d5690
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2003-2012 Dovecot authors, see the included COPYING file */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenmkdir_chown_full(const char *path, mode_t mode, uid_t uid,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* EISDIR check is for BSD/OS which returns it if path
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen contains '/' at the end and it exists.
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen ENOSYS check is for NFS mount points. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen i_error("%s", eperm_error_get_chgrp("chown", path, gid,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint mkdir_chown(const char *path, mode_t mode, uid_t uid, gid_t gid)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return mkdir_chown_full(path, mode, uid, gid, NULL);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return mkdir_chown_full(path, mode, (uid_t)-1, gid, gid_origin);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenmkdir_parents_chown_full(const char *path, mode_t mode, uid_t uid, gid_t gid,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char *p;
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen if (mkdir_chown_full(path, mode, uid, gid, gid_origin) < 0) {
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* doesn't exist, try recursively creating our parent dir */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen ret = mkdir_parents_chown_full(t_strdup_until(path, p),
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* should work now */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen if (mkdir_chown_full(path, mode, uid, gid, gid_origin) < 0)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint mkdir_parents_chown(const char *path, mode_t mode, uid_t uid, gid_t gid)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return mkdir_parents_chown_full(path, mode, uid, gid, NULL);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint mkdir_parents_chgrp(const char *path, mode_t mode,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return mkdir_parents_chown_full(path, mode, (uid_t)-1, gid, gid_origin);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint mkdir_parents(const char *path, mode_t mode)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return mkdir_parents_chown(path, mode, (uid_t)-1, (gid_t)-1);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint stat_first_parent(const char *path, const char **root_dir_r,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char *p;
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen if (errno != ENOENT || strcmp(path, "/") == 0) {