Bugfix.
* imap4d/create.c: Rewrite to create mailboxes honoring mailbox-type. * mailbox/mailbox.c (mu_mailbox_create): Bugfix.
Showing
3 changed files
with
82 additions
and
42 deletions
1 | 2008-08-07 Sergey Poznyakoff <gray@gnu.org.ua> | ||
2 | |||
3 | * imap4d/create.c: Rewrite to create mailboxes honoring | ||
4 | mailbox-type. | ||
5 | * mailbox/mailbox.c (mu_mailbox_create): Bugfix. | ||
6 | |||
1 | 2008-08-04 Sergey Poznyakoff <gray@gnu.org.ua> | 7 | 2008-08-04 Sergey Poznyakoff <gray@gnu.org.ua> |
2 | 8 | ||
3 | * pop3d/retr.c (pop3d_retr): Use constant-size buffer. This | 9 | * pop3d/retr.c (pop3d_retr): Use constant-size buffer. This | ... | ... |
... | @@ -19,9 +19,49 @@ | ... | @@ -19,9 +19,49 @@ |
19 | #include "imap4d.h" | 19 | #include "imap4d.h" |
20 | #include <unistd.h> | 20 | #include <unistd.h> |
21 | 21 | ||
22 | /* | 22 | #define MKDIR_PERMISSIONS 0700 |
23 | * Must create a new mailbox | 23 | |
24 | */ | 24 | static int |
25 | mkdir_p (char *name, int delim) | ||
26 | { | ||
27 | char *p, *dir; | ||
28 | int rc = 0; | ||
29 | |||
30 | dir = name; | ||
31 | if (dir[0] == delim) | ||
32 | dir++; | ||
33 | for (; rc == 0 && (p = strchr (dir, delim)); dir = p) | ||
34 | { | ||
35 | struct stat st; | ||
36 | |||
37 | *p++ = 0; | ||
38 | if (stat (name, &st) == 0) | ||
39 | { | ||
40 | if (!S_ISDIR (st.st_mode)) | ||
41 | { | ||
42 | mu_diag_output (MU_DIAG_ERR, | ||
43 | _("component %s is not a directory"), name); | ||
44 | rc = 1; | ||
45 | } | ||
46 | } | ||
47 | else if (errno != ENOENT) | ||
48 | { | ||
49 | mu_diag_output (MU_DIAG_ERR, | ||
50 | _("cannot stat file %s: %s"), | ||
51 | name, mu_strerror (errno)); | ||
52 | rc = 1; | ||
53 | } | ||
54 | else if (mkdir (name, MKDIR_PERMISSIONS)) | ||
55 | { | ||
56 | mu_diag_output (MU_DIAG_ERR, | ||
57 | _("cannot create directory %s: %s"), name, | ||
58 | mu_strerror (errno)); | ||
59 | rc = 1; | ||
60 | } | ||
61 | p[-1] = delim; | ||
62 | } | ||
63 | return 0; | ||
64 | } | ||
25 | 65 | ||
26 | /* FIXME: How do we do this ??????: | 66 | /* FIXME: How do we do this ??????: |
27 | IF a new mailbox is created with the same name as a mailbox which was | 67 | IF a new mailbox is created with the same name as a mailbox which was |
... | @@ -76,45 +116,39 @@ imap4d_create (struct imap4d_command *command, char *arg) | ... | @@ -76,45 +116,39 @@ imap4d_create (struct imap4d_command *command, char *arg) |
76 | /* It will fail if the mailbox already exists. */ | 116 | /* It will fail if the mailbox already exists. */ |
77 | if (access (name, F_OK) != 0) | 117 | if (access (name, F_OK) != 0) |
78 | { | 118 | { |
79 | if (!isdir) | 119 | if (mkdir_p (name, delim[0])) |
120 | { | ||
121 | rc = RESP_NO; | ||
122 | msg = "Cannot create mailbox"; | ||
123 | } | ||
124 | |||
125 | if (rc == RESP_OK && !isdir) | ||
80 | { | 126 | { |
81 | char *dir; | 127 | mu_mailbox_t mbox; |
82 | char *d = name + strlen (delim); /* Pass the root delimeter. */ | 128 | |
83 | 129 | rc = mu_mailbox_create_default (&mbox, name); | |
84 | /* If the server's hierarchy separtor character appears elsewhere in | 130 | if (rc) |
85 | name, the server SHOULD create any superior hierarchcal names | ||
86 | that are needed for the CREATE command to complete successfully. | ||
87 | */ | ||
88 | if (chdir (delim) == 0) /* start on the root. */ | ||
89 | for (; (dir = strchr (d, delim[0])); d = dir) | ||
90 | { | ||
91 | *dir++ = '\0'; | ||
92 | if (chdir (d) != 0) | ||
93 | { | ||
94 | if (mkdir (d, 0700) == 0) | ||
95 | { | ||
96 | if (chdir (d) == 0) | ||
97 | continue; | ||
98 | else | ||
99 | { | ||
100 | rc = RESP_NO; | ||
101 | msg = "Cannot create mailbox"; | ||
102 | break; | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 | |||
108 | if (rc == RESP_OK && d && *d != '\0') | ||
109 | { | 131 | { |
110 | int fd = creat (d, 0600); | 132 | mu_diag_output (MU_DIAG_ERR, |
111 | if (fd != -1) | 133 | _("Cannot create mailbox %s: %s"), name, |
112 | close (fd); | 134 | mu_strerror (rc)); |
113 | else | 135 | rc = RESP_NO; |
114 | { | 136 | msg = "Cannot create mailbox"; |
115 | rc = RESP_NO; | 137 | } |
116 | msg = "Cannot create mailbox"; | 138 | else if ((rc = mu_mailbox_open (mbox, |
117 | } | 139 | MU_STREAM_RDWR|MU_STREAM_CREAT))) |
140 | { | ||
141 | mu_diag_output (MU_DIAG_ERR, | ||
142 | _("Cannot open mailbox %s: %s"), | ||
143 | name, mu_strerror (rc)); | ||
144 | rc = RESP_NO; | ||
145 | msg = "Cannot create mailbox"; | ||
146 | } | ||
147 | else | ||
148 | { | ||
149 | mu_mailbox_close (mbox); | ||
150 | mu_mailbox_destroy (&mbox); | ||
151 | rc = RESP_OK; | ||
118 | } | 152 | } |
119 | } | 153 | } |
120 | } | 154 | } |
... | @@ -123,7 +157,7 @@ imap4d_create (struct imap4d_command *command, char *arg) | ... | @@ -123,7 +157,7 @@ imap4d_create (struct imap4d_command *command, char *arg) |
123 | rc = RESP_NO; | 157 | rc = RESP_NO; |
124 | msg = "already exists"; | 158 | msg = "already exists"; |
125 | } | 159 | } |
126 | chdir (homedir); | 160 | |
127 | free (name); | 161 | free (name); |
128 | return util_finish (command, rc, msg); | 162 | return util_finish (command, rc, msg); |
129 | } | 163 | } | ... | ... |
... | @@ -234,7 +234,7 @@ mu_mailbox_create (mu_mailbox_t *pmbox, const char *name) | ... | @@ -234,7 +234,7 @@ mu_mailbox_create (mu_mailbox_t *pmbox, const char *name) |
234 | char *tmp_name = malloc (strlen (default_proto) + strlen (name) + 1); | 234 | char *tmp_name = malloc (strlen (default_proto) + strlen (name) + 1); |
235 | strcpy (tmp_name, default_proto); | 235 | strcpy (tmp_name, default_proto); |
236 | strcat (tmp_name, name); | 236 | strcat (tmp_name, name); |
237 | rc = _create_mailbox (pmbox, name); | 237 | rc = _create_mailbox (pmbox, tmp_name); |
238 | free (tmp_name); | 238 | free (tmp_name); |
239 | } | 239 | } |
240 | else | 240 | else | ... | ... |
-
Please register or sign in to post a comment