summaryrefslogtreecommitdiffstats
path: root/src/imap/cmd-create.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/imap/cmd-create.c')
-rw-r--r--src/imap/cmd-create.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/imap/cmd-create.c b/src/imap/cmd-create.c
new file mode 100644
index 0000000..2459173
--- /dev/null
+++ b/src/imap/cmd-create.c
@@ -0,0 +1,48 @@
+/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
+
+#include "imap-common.h"
+#include "imap-resp-code.h"
+#include "mail-namespace.h"
+#include "imap-commands.h"
+
+bool cmd_create(struct client_command_context *cmd)
+{
+ struct mail_namespace *ns;
+ const char *mailbox, *orig_mailbox;
+ struct mailbox *box;
+ bool directory;
+ size_t len;
+
+ /* <mailbox> */
+ if (!client_read_string_args(cmd, 1, &mailbox))
+ return FALSE;
+
+ orig_mailbox = mailbox;
+ ns = client_find_namespace(cmd, &mailbox);
+ if (ns == NULL)
+ return TRUE;
+
+ len = strlen(orig_mailbox);
+ if (len == 0 || orig_mailbox[len-1] != mail_namespace_get_sep(ns))
+ directory = FALSE;
+ else {
+ /* name ends with hierarchy separator - client is just
+ informing us that it wants to create children under this
+ mailbox. */
+ directory = TRUE;
+
+ /* drop separator from mailbox. it's already dropped when
+ WORKAROUND_TB_EXTRA_MAILBOX_SEP is enabled */
+ if (len == strlen(mailbox))
+ mailbox = t_strndup(mailbox, len-1);
+ }
+
+ box = mailbox_alloc(ns->list, mailbox, 0);
+ event_add_str(cmd->global_event, "mailbox", mailbox_get_vname(box));
+ if (mailbox_create(box, NULL, directory) < 0)
+ client_send_box_error(cmd, box);
+ else
+ client_send_tagline(cmd, "OK Create completed.");
+ mailbox_free(&box);
+ return TRUE;
+}