annotate src/lib/mkdir-parents.c @ 8590:b9faf4db2a9f HEAD

Updated copyright notices to include year 2009.
author Timo Sirainen <tss@iki.fi>
date Tue, 06 Jan 2009 09:25:38 -0500
parents ed12eee73357
children 3870069faea3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8035
diff changeset
1 /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "mkdir-parents.h"
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include <sys/stat.h>
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
7 #include <unistd.h>
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
9 static int mkdir_chown(const char *path, mode_t mode, uid_t uid, gid_t gid)
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
10 {
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
11 mode_t old_mask;
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
12 int ret;
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
13
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
14 old_mask = umask(0);
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
15 ret = mkdir(path, mode);
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
16 umask(old_mask);
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
17
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
18 if (ret < 0) {
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
19 if (errno == EISDIR || errno == ENOSYS) {
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
20 /* EISDIR check is for BSD/OS which returns it if path
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
21 contains '/' at the end and it exists.
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
22
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
23 ENOSYS check is for NFS mount points. */
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
24 errno = EEXIST;
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
25 }
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
26 return -1;
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
27 }
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
28 if (chown(path, uid, gid) < 0) {
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
29 i_error("chown(%s, %ld, %ld) failed: %m", path,
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
30 uid == (uid_t)-1 ? -1L : (long)uid,
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
31 gid == (gid_t)-1 ? -1L : (long)gid);
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
32 return -1;
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
33 }
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
34 return 0;
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
35 }
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
36
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
37 int mkdir_parents_chown(const char *path, mode_t mode, uid_t uid, gid_t gid)
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 {
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 const char *p;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
40 int ret;
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
42 if (mkdir_chown(path, mode, uid, gid) < 0) {
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
43 if (errno != ENOENT)
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
44 return -1;
3312
3cd4ae5f1210 Ignore if mkdir() returns ENOSYS. It probably means we tried to mkdir a
Timo Sirainen <tss@iki.fi>
parents: 2309
diff changeset
45
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
46 /* doesn't exist, try recursively creating our parent dir */
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 p = strrchr(path, '/');
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 if (p == NULL || p == path)
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 return -1; /* shouldn't happen */
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
51 T_BEGIN {
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
52 ret = mkdir_parents_chown(t_strdup_until(path, p),
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
53 mode, uid, gid);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
54 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
55 if (ret < 0)
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 return -1;
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 /* should work now */
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
59 if (mkdir_chown(path, mode, uid, gid) < 0)
1483
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 return -1;
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 }
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 return 0;
836c952e17ec More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
8035
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
64
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
65 int mkdir_parents(const char *path, mode_t mode)
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
66 {
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
67 return mkdir_parents_chown(path, mode, (uid_t)-1, (gid_t)-1);
ed12eee73357 Added mkdir_parents_chown().
Timo Sirainen <tss@iki.fi>
parents: 8034
diff changeset
68 }