/* 6.3.6. SUBSCRIBE Command Arguments: mailbox Responses: no specific responses for this command Result: OK - subscribe completed NO - subscribe failure: can't subscribe to that name BAD - command unknown or arguments invalid */ int imap4d_subscribe (struct imap4d_session *session, struct imap4d_command *command, imap4d_tokbuf_t tok) { int rc; char *name; mu_property_t prop; if (imap4d_tokbuf_argc (tok) != 3) return io_completion_response (command, RESP_BAD, "Invalid arguments"); name = imap4d_tokbuf_getarg (tok, IMAP4_ARG_1); prop = open_subscription (); if (!prop) return io_completion_response (command, RESP_NO, "Cannot subscribe"); rc = mu_property_set_value (prop, name, "", 1); if (rc) mu_diag_funcall (MU_DIAG_ERROR, "mu_property_set_value", name, rc); else { rc = mu_property_save (prop); if (rc) mu_diag_funcall (MU_DIAG_ERROR, "mu_property_save", NULL, rc); } mu_property_destroy (&prop); if (rc) return io_completion_response (command, RESP_NO, "Cannot subscribe"); return io_completion_response (command, RESP_OK, "Completed"); }
static int test_and_update_prop (mu_property_t prop, const char *from, time_t now, unsigned int days, mu_sieve_machine_t mach) { const char *result; char *timebuf; time_t last; int rc = mu_property_sget_value (prop, from, &result); switch (rc) { case MU_ERR_NOENT: break; case 0: if (days == 0) return 1; last = (time_t) strtoul (result, NULL, 0); if (last + (24 * 60 * 60 * days) > now) return 1; break; default: mu_sieve_error (mach, "%lu: mu_property_sget_value: %s", (unsigned long) mu_sieve_get_message_num (mach), mu_strerror (rc)); return -1; } rc = mu_asprintf (&timebuf, "%lu", (unsigned long) now); if (rc) { mu_sieve_error (mach, "%lu: mu_asprintf: %s", (unsigned long) mu_sieve_get_message_num (mach), mu_strerror (rc)); return -1; } rc = mu_property_set_value (prop, from, timebuf, 1); free (timebuf); if (rc) { mu_sieve_error (mach, "%lu: mu_property_set_value: %s", (unsigned long) mu_sieve_get_message_num (mach), mu_strerror (rc)); return -1; } rc = mu_property_save (prop); if (rc) { mu_sieve_error (mach, "%lu: mu_property_save: %s", (unsigned long) mu_sieve_get_message_num (mach), mu_strerror (rc)); return -1; } return 0; }
static int _pop3_mailbox_init (mu_mailbox_t mbox, int pops) { struct _pop3_mailbox *mpd; int status = 0; /* Allocate specifics for pop data. */ mpd = mbox->data = calloc (1, sizeof (*mpd)); if (mbox->data == NULL) return ENOMEM; mpd->pop3 = NULL; mpd->mbox = mbox; /* Back pointer. */ mpd->pops = pops; /* Initialize the structure. */ mbox->_destroy = pop_destroy; mbox->_open = pop_open; mbox->_close = pop_close; mbox->_messages_count = pop_messages_count; /* FIXME: There is no way to retrieve the number of recent messages via POP3 protocol, so we consider all messages recent. */ mbox->_messages_recent = pop_messages_count; mbox->_is_updated = pop_is_updated; mbox->_scan = pop_scan; mbox->_message_unseen = pop_message_unseen; mbox->_get_size = pop_get_size; /* Messages. */ mbox->_get_message = pop_get_message; mbox->_expunge = pop_expunge; /* Set our properties. */ { mu_property_t property = NULL; mu_mailbox_get_property (mbox, &property); mu_property_set_value (property, "TYPE", "POP3", 1); } /* Hack! POP does not really have a folder. */ mbox->folder->data = mbox; return status; }
int _nntp_mailbox_init (mu_mailbox_t mbox) { m_nntp_t m_nntp; int status = 0; /* Allocate specifics for nntp data. */ m_nntp = mbox->data = calloc (1, sizeof (*m_nntp)); if (mbox->data == NULL) return ENOMEM; /* Get the back pointer of the concrete folder. */ if (mbox->folder) m_nntp->f_nntp = mbox->folder->data; m_nntp->mailbox = mbox; /* Back pointer. */ /* Retrieve the name of the newsgroup from the URL. */ status = mu_url_aget_path (mbox->url, &m_nntp->name); if (status == MU_ERR_NOENT) { m_nntp->name = strdup ("INBOX"); if (!m_nntp->name) return ENOMEM; } else if (status) return status; else { char *p; p = strchr (m_nntp->name, '/'); if (p) *p = '\0'; } /* Initialize the structure. */ mbox->_destroy = nntp_mailbox_destroy; mbox->_open = nntp_mailbox_open; mbox->_close = nntp_mailbox_close; /* Messages. */ mbox->_get_message = nntp_mailbox_get_message; mbox->_messages_count = nntp_mailbox_messages_count; mbox->_messages_recent = nntp_mailbox_messages_count; mbox->_message_unseen = nntp_mailbox_messages_count; /*mbox->_expunge = nntp_mailbox_expunge;*/ mbox->_scan = nntp_mailbox_scan; /*mbox->_is_updated = nntp_mailbox_is_updated; */ /*mbox->_get_size = nntp_mailbox_get_size; */ /* Set our properties. */ { mu_property_t property = NULL; mu_mailbox_get_property (mbox, &property); mu_property_set_value (property, "TYPE", "NNTP", 1); } return status; }
/* Allocate the mbox_data_t struct(concrete mailbox), but don't do any parsing on the name or even test for existence. However we do strip any leading "mbox:" part of the name, this is suppose to be the protocol/scheme name. */ int _mailbox_mbox_init (mu_mailbox_t mailbox) { int status; mbox_data_t mud; if (mailbox == NULL) return EINVAL; /* Allocate specific mbox data. */ mud = mailbox->data = calloc (1, sizeof (*mud)); if (mailbox->data == NULL) return ENOMEM; /* Back pointer. */ mud->mailbox = mailbox; /* Copy the name: We do not do any further interpretation after the scheme "mbox:" Because for example on distributed system like QnX4 a file name is //390/etc/passwd. So the best approach is to let the OS handle it for example if we receive: "mbox:///var/mail/alain" the mailbox name will be "///var/mail/alain", we let open() do the right thing. So it will let things like this "mbox://390/var/mail/alain" where the "//" _is_ part of the filename, pass correctely. */ status = mu_url_aget_path (mailbox->url, &mud->name); if (status) { free (mud); mailbox->data = NULL; return status; } mud->state = MBOX_NO_STATE; /* Overloading the defaults. */ mailbox->_destroy = mbox_destroy; mailbox->_open = mbox_open; mailbox->_close = mbox_close; /* Overloading of the entire mailbox object methods. */ mailbox->_get_message = mbox_get_message; mailbox->_append_message = mbox_append_message; mailbox->_messages_count = mbox_messages_count; mailbox->_messages_recent = mbox_messages_recent; mailbox->_message_unseen = mbox_message_unseen; mailbox->_expunge = mbox_expunge; mailbox->_sync = mbox_sync; mailbox->_uidvalidity = mbox_uidvalidity; mailbox->_uidnext = mbox_uidnext; mailbox->_quick_get_message = mbox_quick_get_message; mailbox->_scan = mbox_scan; mailbox->_is_updated = mbox_is_updated; mailbox->_get_size = mbox_get_size; /* Set our properties. */ { mu_property_t property = NULL; mu_mailbox_get_property (mailbox, &property); mu_property_set_value (property, "TYPE", "MBOX", 1); } MU_DEBUG1 (mailbox->debug, MU_DEBUG_TRACE1, "mbox_init (%s)\n", mud->name); return 0; /* okdoke */ }