static int pop_create_message (struct _pop3_message *mpm, struct _pop3_mailbox *mpd) { int status; mu_message_t msg; status = mu_message_create (&msg, mpm); if (status) return status; mu_message_set_get_stream (msg, pop_message_get_stream, mpm); mu_message_set_size (msg, pop_message_size, mpm); mu_message_set_lines (msg, pop_message_lines, mpm); mpm->message = msg; return 0; }
static int nntp_mailbox_get_message (mu_mailbox_t mbox, size_t msgno, mu_message_t *pmsg) { m_nntp_t m_nntp = mbox->data; msg_nntp_t msg_nntp; mu_message_t msg = NULL; int status; size_t i; /* Sanity. */ if (pmsg == NULL) return MU_ERR_OUT_PTR_NULL; msgno--; mu_monitor_rdlock (mbox->monitor); /* See if we have already this message. */ for (i = 0; i < m_nntp->messages_count; i++) { if (m_nntp->messages[i]) { if (m_nntp->messages[i]->msgno == msgno + m_nntp->low) { *pmsg = m_nntp->messages[i]->message; mu_monitor_unlock (mbox->monitor); return 0; } } } mu_monitor_unlock (mbox->monitor); msg_nntp = calloc (1, sizeof (*msg_nntp)); if (msg_nntp == NULL) return ENOMEM; /* Back pointer. */ msg_nntp->m_nntp = m_nntp; msg_nntp->msgno = msgno + m_nntp->low; /* Create the message. */ { mu_stream_t stream = NULL; if ((status = mu_message_create (&msg, msg_nntp)) != 0 || (status = mu_stream_create (&stream, mbox->flags, msg)) != 0) { mu_stream_destroy (&stream, msg); mu_message_destroy (&msg, msg_nntp); free (msg_nntp); return status; } /* Help for the readline()s */ mu_stream_set_read (stream, nntp_message_read, msg); mu_stream_set_get_transport2 (stream, nntp_message_get_transport2, msg); mu_message_set_stream (msg, stream, msg_nntp); mu_message_set_size (msg, nntp_message_size, msg_nntp); } /* Create the header. */ { mu_header_t header = NULL; if ((status = mu_header_create (&header, NULL, 0, msg)) != 0) { mu_message_destroy (&msg, msg_nntp); free (msg_nntp); return status; } mu_header_set_fill (header, nntp_header_fill, msg); mu_message_set_header (msg, header, msg_nntp); } /* Create the body and its stream. */ { mu_body_t body = NULL; mu_stream_t stream = NULL; if ((status = mu_body_create (&body, msg)) != 0 || (status = mu_stream_create (&stream, mbox->flags, body)) != 0) { mu_body_destroy (&body, msg); mu_stream_destroy (&stream, body); mu_message_destroy (&msg, msg_nntp); free (msg_nntp); return status; } /* Helps for the readline()s */ mu_stream_set_read (stream, nntp_body_read, body); mu_stream_set_get_transport2 (stream, nntp_body_get_transport2, body); mu_body_set_size (body, nntp_body_size, msg); mu_body_set_lines (body, nntp_body_lines, msg); mu_body_set_stream (body, stream, msg); mu_message_set_body (msg, body, msg_nntp); } /* Set the UID on the message. */ mu_message_set_uid (msg, nntp_message_uid, msg_nntp); /* Add it to the list. */ mu_monitor_wrlock (mbox->monitor); { msg_nntp_t *m ; m = realloc (m_nntp->messages, (m_nntp->messages_count + 1)*sizeof (*m)); if (m == NULL) { mu_message_destroy (&msg, msg_nntp); free (msg_nntp); mu_monitor_unlock (mbox->monitor); return ENOMEM; } m_nntp->messages = m; m_nntp->messages[m_nntp->messages_count] = msg_nntp; m_nntp->messages_count++; } mu_monitor_unlock (mbox->monitor); /* Save The message pointer. */ mu_message_set_mailbox (msg, mbox, msg_nntp); *pmsg = msg_nntp->message = msg; return 0; }