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