diff options
Diffstat (limited to 'src/imap/cmd-create.c')
-rw-r--r-- | src/imap/cmd-create.c | 48 |
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; +} |