X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmsgbase.c;h=bf18da7447b0e2323e4cfbc74aad76235ad4f876;hp=2574758927a6f8e3059dde07c6cedddbfbe2980b;hb=0387f48886a9395d89eaca01cd40ab751610426f;hpb=97812f00652c44ac174a4ec2a3e17e94863c8bbe diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 257475892..bf18da744 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -61,7 +61,7 @@ char *msgkeys[] = { "rep2", // K -> eReplyTo "list", // L -> eListID "text", // M -> eMesageText - NULL, // N (formerly used as eNodeName) + "locl", // N -> eOrigLocal "room", // O -> eOriginalRoom "path", // P -> eMessagePath NULL, // Q @@ -76,6 +76,7 @@ char *msgkeys[] = { NULL // Z }; + HashList *msgKeyLookup = NULL; int GetFieldFromMnemonic(eMsgField *f, const char* c) @@ -101,6 +102,7 @@ void FillMsgKeyLookupTable(void) } } + eMsgField FieldOrder[] = { /* Important fields */ emessageId , @@ -111,6 +113,7 @@ eMsgField FieldOrder[] = { eOriginalRoom, eRecipient , /* Semi-important fields */ + eOrigLocal , eBig_message , eExclusiveID , eWeferences , @@ -1854,6 +1857,7 @@ void OutputRFC822MsgHeaders( case eSuppressIdx: case eExtnotify: case eVltMsgNum: + case eOrigLocal: /* these don't map to mime message headers. */ break; } @@ -2456,8 +2460,6 @@ int CtdlSaveMsgPointerInRoom(char *roomname, long msgid, } - - /* * Message base operation to save a new message to the message store * (returns new message number) @@ -2477,8 +2479,7 @@ long CtdlSaveThisMessage(struct CtdlMessage *msg, long msgid, int Reply) { * If the message is big, set its body aside for storage elsewhere * and we hide the message body from the serializer */ - if (!CM_IsEmpty(msg, eMesageText) && msg->cm_lengths[eMesageText] > BIGMSG) - { + if (!CM_IsEmpty(msg, eMesageText) && msg->cm_lengths[eMesageText] > BIGMSG) { is_bigmsg = 1; holdM = msg->cm_fields[eMesageText]; msg->cm_fields[eMesageText] = NULL; @@ -2508,8 +2509,7 @@ long CtdlSaveThisMessage(struct CtdlMessage *msg, long msgid, int Reply) { } /* Write our little bundle of joy into the message base */ - retval = cdb_store(CDB_MSGMAIN, &msgid, (int)sizeof(long), - smr.ser, smr.len); + retval = cdb_store(CDB_MSGMAIN, &msgid, (int)sizeof(long), smr.ser, smr.len); if (retval < 0) { syslog(LOG_ERR, "msgbase: can't store message %ld: %ld", msgid, retval); } @@ -2533,6 +2533,7 @@ long CtdlSaveThisMessage(struct CtdlMessage *msg, long msgid, int Reply) { return(retval); } + long send_message(struct CtdlMessage *msg) { long newmsgid; long retval; @@ -2566,7 +2567,6 @@ long send_message(struct CtdlMessage *msg) { } - /* * Serialize a struct CtdlMessage into the format used on disk and network. * @@ -2608,9 +2608,8 @@ void CtdlSerializeMessage(struct ser_ret *ret, /* return values */ ret->ser[2] = msg->cm_format_type; wlen = 3; - for (i=0; i < NDiskFields; ++i) - if (msg->cm_fields[FieldOrder[i]] != NULL) - { + for (i=0; i < NDiskFields; ++i) { + if (msg->cm_fields[FieldOrder[i]] != NULL) { ret->ser[wlen++] = (char)FieldOrder[i]; memcpy(&ret->ser[wlen], @@ -2619,6 +2618,7 @@ void CtdlSerializeMessage(struct ser_ret *ret, /* return values */ wlen = wlen + msg->cm_lengths[FieldOrder[i]] + 1; } + } if (ret->len != wlen) { syslog(LOG_ERR, "msgbase: ERROR; len=%ld wlen=%ld", (long)ret->len, (long)wlen); @@ -2654,16 +2654,13 @@ void ReplicationChecks(struct CtdlMessage *msg) { } - /* * Save a message to disk and submit it into the delivery system. */ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ recptypes *recps, /* recipients (if mail) */ - const char *force, /* force a particular room? */ - int flags /* should the message be exported clean? */ - ) -{ + const char *force /* force a particular room? */ +) { char hold_rm[ROOMNAMELEN]; char actual_rm[ROOMNAMELEN]; char force_room[ROOMNAMELEN]; @@ -2808,8 +2805,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ memset(&smi, 0, sizeof(struct MetaData)); smi.meta_msgnum = newmsgid; smi.meta_refcount = 0; - safestrncpy(smi.meta_content_type, content_type, - sizeof smi.meta_content_type); + safestrncpy(smi.meta_content_type, content_type, sizeof smi.meta_content_type); /* * Measure how big this message will be when rendered as RFC822. @@ -2853,13 +2849,13 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ } /* If other rooms are specified, drop them there too. */ - if ((recps != NULL) && (recps->num_room > 0)) + if ((recps != NULL) && (recps->num_room > 0)) { for (i=0; irecp_room, '|'); ++i) { - extract_token(recipient, recps->recp_room, i, - '|', sizeof recipient); + extract_token(recipient, recps->recp_room, i, '|', sizeof recipient); syslog(LOG_DEBUG, "msgbase: delivering to room <%s>", recipient); CtdlSaveMsgPointerInRoom(recipient, newmsgid, 0, msg); } + } /* Bump this user's messages posted counter. */ syslog(LOG_DEBUG, "msgbase: updating user"); @@ -2868,12 +2864,11 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ CtdlPutCurrentUserLock(); /* Decide where bounces need to be delivered */ - if ((recps != NULL) && (recps->bounce_to == NULL)) - { + if ((recps != NULL) && (recps->bounce_to == NULL)) { if (CC->logged_in) { strcpy(bounce_to, CC->user.fullname); } - else { + else if (!IsEmptyStr(msg->cm_fields[eAuthor])){ strcpy(bounce_to, msg->cm_fields[eAuthor]); } recps->bounce_to = bounce_to; @@ -2881,20 +2876,17 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ CM_SetFieldLONG(msg, eVltMsgNum, newmsgid); - /* If this is private, local mail, make a copy in the * recipient's mailbox and bump the reference count. */ - if ((recps != NULL) && (recps->num_local > 0)) - { + if ((recps != NULL) && (recps->num_local > 0)) { char *pch; int ntokens; pch = recps->recp_local; recps->recp_local = recipient; ntokens = num_tokens(pch, '|'); - for (i=0; i", recipient); if (CtdlGetUser(&userbuf, recipient) == 0) { @@ -2919,8 +2911,9 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ /* Go back to the room we started from */ syslog(LOG_DEBUG, "msgbase: returning to original room %s", hold_rm); - if (strcasecmp(hold_rm, CC->room.QRname)) + if (strcasecmp(hold_rm, CC->room.QRname)) { CtdlUserGoto(hold_rm, 0, 1, NULL, NULL, NULL, NULL); + } /* * Any addresses to harvest for someone's address book? @@ -2930,10 +2923,8 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ } if (collected_addresses != NULL) { - aptr = (struct addresses_to_be_filed *) - malloc(sizeof(struct addresses_to_be_filed)); - CtdlMailboxName(actual_rm, sizeof actual_rm, - &CC->user, USERCONTACTSROOM); + aptr = (struct addresses_to_be_filed *) malloc(sizeof(struct addresses_to_be_filed)); + CtdlMailboxName(actual_rm, sizeof actual_rm, &CC->user, USERCONTACTSROOM); aptr->roomname = strdup(actual_rm); aptr->collected_addresses = collected_addresses; begin_critical_section(S_ATBF); @@ -3030,7 +3021,7 @@ long quickie_message(const char *from, CM_SetField(msg, eMesageText, text, -1); } - long msgnum = CtdlSubmitMsg(msg, recp, room, 0); + long msgnum = CtdlSubmitMsg(msg, recp, room); CM_Free(msg); if (recp != NULL) free_recipients(recp); return msgnum; @@ -3046,8 +3037,7 @@ StrBuf *CtdlReadMessageBodyBuf(char *terminator, /* token signalling EOT */ StrBuf *exist, /* if non-null, append to it; exist is ALWAYS freed */ int crlf /* CRLF newlines instead of LF */ - ) -{ +) { StrBuf *Message; StrBuf *LineBuf; int flushing = 0; @@ -3124,6 +3114,7 @@ char *CtdlReadMessageBody(char *terminator, /* token signalling EOT */ return SmashStrBuf(&Message); } + struct CtdlMessage *CtdlMakeMessage( struct ctdluser *author, /* author's user structure */ char *recipient, /* NULL if it's not mail */ @@ -3137,8 +3128,7 @@ struct CtdlMessage *CtdlMakeMessage( char *supplied_euid, /* ...or NULL if this is irrelevant */ char *preformatted_text, /* ...or NULL to read text from client */ char *references /* Thread references */ -) -{ +) { return CtdlMakeMessageLen( author, /* author's user structure */ recipient, /* NULL if it's not mail */ @@ -3164,6 +3154,7 @@ struct CtdlMessage *CtdlMakeMessage( } + /* * Build a binary message to be saved on disk. * (NOTE: if you supply 'preformatted_text', the buffer you give it @@ -3171,7 +3162,6 @@ struct CtdlMessage *CtdlMakeMessage( * responsible for managing that memory -- it will be freed along with * the rest of the fields when CM_Free() is called.) */ - struct CtdlMessage *CtdlMakeMessageLen( struct ctdluser *author, /* author's user structure */ char *recipient, /* NULL if it's not mail */ @@ -3194,10 +3184,7 @@ struct CtdlMessage *CtdlMakeMessageLen( long textlen, char *references, /* Thread references */ long reflen - ) -{ - /* Don't confuse the poor folks if it's not routed mail. * / - char dest_node[256] = "";*/ +) { long blen; char buf[1024]; struct CtdlMessage *msg; @@ -3304,18 +3291,15 @@ struct CtdlMessage *CtdlMakeMessageLen( } - - /* * API function to delete messages which match a set of criteria * (returns the actual number of messages deleted) */ -int CtdlDeleteMessages(const char *room_name, /* which room */ - long *dmsgnums, /* array of msg numbers to be deleted */ - int num_dmsgnums, /* number of msgs to be deleted, or 0 for "any" */ - char *content_type /* or "" for any. regular expressions expected. */ - ) -{ +int CtdlDeleteMessages(const char *room_name, // which room + long *dmsgnums, // array of msg numbers to be deleted + int num_dmsgnums, // number of msgs to be deleted, or 0 for "any" + char *content_type // or "" for any. regular expressions expected. +) { struct ctdlroom qrbuf; struct cdbdata *cdbfr; long *msglist = NULL; @@ -3562,8 +3546,7 @@ void CtdlWriteObject(char *req_room, /* Room to stuff it in */ int is_binary, /* Is encoding necessary? */ int is_unique, /* Del others of this type? */ unsigned int flags /* Internal save flags */ - ) -{ +) { struct ctdlroom qrbuf; char roomname[ROOMNAMELEN]; struct CtdlMessage *msg; @@ -3628,7 +3611,7 @@ void CtdlWriteObject(char *req_room, /* Room to stuff it in */ ); } /* Now write the data */ - CtdlSubmitMsg(msg, NULL, roomname, 0); + CtdlSubmitMsg(msg, NULL, roomname); CM_Free(msg); }