Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 7 #include <unistd.h> |
1483
836c952e17ec
More robust error handling for mbox.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
8035 | 9 static int mkdir_chown(const char *path, mode_t mode, uid_t uid, gid_t gid) |
10 { | |
11 mode_t old_mask; | |
12 int ret; | |
13 | |
14 old_mask = umask(0); | |
15 ret = mkdir(path, mode); | |
16 umask(old_mask); | |
17 | |
18 if (ret < 0) { | |
19 if (errno == EISDIR || errno == ENOSYS) { | |
20 /* EISDIR check is for BSD/OS which returns it if path | |
21 contains '/' at the end and it exists. | |
22 | |
23 ENOSYS check is for NFS mount points. */ | |
24 errno = EEXIST; | |
25 } | |
26 return -1; | |
27 } | |
28 if (chown(path, uid, gid) < 0) { | |
29 i_error("chown(%s, %ld, %ld) failed: %m", path, | |
30 uid == (uid_t)-1 ? -1L : (long)uid, | |
31 gid == (gid_t)-1 ? -1L : (long)gid); | |
32 return -1; | |
33 } | |
34 return 0; | |
35 } | |
36 | |
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 | 42 if (mkdir_chown(path, mode, uid, gid) < 0) { |
43 if (errno != ENOENT) | |
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 | 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 | 52 ret = mkdir_parents_chown(t_strdup_until(path, p), |
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 | 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 | 64 |
65 int mkdir_parents(const char *path, mode_t mode) | |
66 { | |
67 return mkdir_parents_chown(path, mode, (uid_t)-1, (gid_t)-1); | |
68 } |