} while ((field_length > 0) && (field_header != 'M'));
cdb_free(dmsgtext);
+
+ /* Perform "before read" hooks (aborting if any return nonzero) */
+ if (PerformMessageHooks(ret, EVT_BEFOREREAD) > 0) {
+ CtdlFreeMessage(ret);
+ return NULL;
+ }
+
return (ret);
}
if (TheMessage->cm_fields['U']) {
cprintf("subj=%s\n", TheMessage->cm_fields['U']);
}
+ if (TheMessage->cm_fields['Z']) {
+ cprintf("zaps=%s\n", TheMessage->cm_fields['Z']);
+ }
}
/* begin header processing loop for RFC822 transfer format */
{
long msgnum;
struct CtdlMessage *msg;
- struct sermsgret smr;
+ struct ser_ret smr;
if (CC->internal_pgm == 0) {
cprintf("%d This command is for internal programs only.\n",
long newmsgid;
long retval;
char msgidbuf[32];
- struct sermsgret smr;
+ struct ser_ret smr;
/* Get a new message number */
newmsgid = get_new_message_number();
/*
* Serialize a struct CtdlMessage into the format used on disk and network.
*
- * This function returns a "struct sermsgret" (defined in msgbase.h) which
+ * This function loads up a "struct ser_ret" (defined in server.h) which
* contains the length of the serialized message and a pointer to the
* serialized message in memory. THE LATTER MUST BE FREED BY THE CALLER.
*/
-void serialize_message(struct sermsgret *ret, /* return values */
+void serialize_message(struct ser_ret *ret, /* return values */
struct CtdlMessage *msg) /* unserialized msg */
{
size_t wlen;
ret->ser[1] = msg->cm_anon_type;
ret->ser[2] = msg->cm_format_type;
wlen = 3;
- lprintf(9, "stuff\n");
+ lprintf(9, "stuff\n");
for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL) {
ret->ser[wlen++] = (char)forder[i];
strcpy(&ret->ser[wlen], msg->cm_fields[(int)forder[i]]);
}
if (ret->len != wlen) lprintf(3, "ERROR: len=%d wlen=%d\n",
ret->len, wlen);
+ lprintf(9, "done serializing\n");
return;
}
}
}
+ /* Perform "before save" hooks (aborting if any return nonzero) */
+ if (PerformMessageHooks(msg, EVT_BEFORESAVE) > 0) return;
+
/* Network mail - send a copy to the network program. */
if ((strlen(recipient) > 0) && (mailtype != MES_LOCAL)) {
sprintf(aaa, "./network/spoolin/netmail.%04lx.%04x.%04x",
smi.smi_refcount = successful_local_recipients;
safestrncpy(smi.smi_content_type, content_type, 64);
PutSuppMsgInfo(&smi);
+
+ /* Perform "after save" hooks */
+ PerformMessageHooks(msg, EVT_AFTERSAVE);
}
void CtdlWriteObject(char *req_room, /* Room to stuff it in */
char *content_type, /* MIME type of this object */
char *tempfilename, /* Where to fetch it from */
- int is_mailbox, /* Private mailbox room? */
+ struct usersupp *is_mailbox, /* Mailbox room? */
int is_binary, /* Is encoding necessary? */
- int is_unique /* Del others of this type? */
+ int is_unique, /* Del others of this type? */
+ unsigned int flags /* Internal save flags */
)
{
struct CtdlMessage *msg;
size_t len;
- lprintf(9, "CtdlWriteObject() called\n");
-
- if (is_mailbox)
- MailboxName(roomname, &CC->usersupp, req_room);
+ if (is_mailbox != NULL)
+ MailboxName(roomname, is_mailbox, req_room);
else
safestrncpy(roomname, req_room, sizeof(roomname));
+ lprintf(9, "CtdlWriteObject() to <%s> (flags=%d)\n", roomname, flags);
strcpy(filename, tmpnam(NULL));
fp = fopen(filename, "w");
msg->cm_anon_type = MES_NORMAL;
msg->cm_format_type = 4;
msg->cm_fields['A'] = strdoop(CC->usersupp.fullname);
- msg->cm_fields['O'] = strdoop(roomname);
+ msg->cm_fields['O'] = strdoop(req_room);
msg->cm_fields['N'] = strdoop(config.c_nodename);
msg->cm_fields['H'] = strdoop(config.c_humannode);
+ msg->cm_flags = flags;
lprintf(9, "Loading\n");
fp = fopen(filename, "rb");