X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmodules%2Flistdeliver%2Fserv_listdeliver.c;h=29c1c5c82e737a78e9be648b49539db7e480a735;hp=7591822bd7784f3b1af31820848078b3d82eb5c0;hb=51b18018ff923284d76a36cbd421d62abf6afcf4;hpb=325ec75a28c593fc183eb3447089ed18b24b9026 diff --git a/citadel/modules/listdeliver/serv_listdeliver.c b/citadel/modules/listdeliver/serv_listdeliver.c index 7591822bd..29c1c5c82 100644 --- a/citadel/modules/listdeliver/serv_listdeliver.c +++ b/citadel/modules/listdeliver/serv_listdeliver.c @@ -55,6 +55,8 @@ void listdeliver_do_msg(long msgnum, void *userdata) { struct lddata *ld = (struct lddata *) userdata; if (!ld) return; char buf[SIZ]; + char *ch; + char bounce_to[256]; ld->msgnum = msgnum; if (msgnum <= 0) return; @@ -62,12 +64,20 @@ void listdeliver_do_msg(long msgnum, void *userdata) { struct CtdlMessage *TheMessage = CtdlFetchMessage(msgnum, 1); if (!TheMessage) return; + // If the subject line does not contain the name of the room, add it now. + if (!bmstrcasestr(TheMessage->cm_fields[eMsgSubject], CC->room.QRname)) { + snprintf(buf, sizeof buf, "[%s] %s", CC->room.QRname, TheMessage->cm_fields[eMsgSubject]); + CM_SetField(TheMessage, eMsgSubject, buf, strlen(buf)); + } + // Reply-to: should be set so that replies come to the list. + snprintf(buf, sizeof buf, "room_%s@%s", CC->room.QRname, CtdlGetConfigStr("c_fqdn")); + for (ch=buf; *ch; ++ch) { + if (isspace(*ch)) *ch = '_'; + } + CM_SetField(TheMessage, eReplyTo, buf, strlen(buf)); - // FIXME munge the headers so it looks like it came from a mailing list - - - + // With that out of the way, let's figure out who this message needs to be sent to. char *recipients = malloc(strlen(ld->netconf)); if (recipients) { recipients[0] = 0; @@ -88,10 +98,16 @@ void listdeliver_do_msg(long msgnum, void *userdata) { strcat(recipients, &buf[11]); } } - syslog(LOG_DEBUG, "\033[33m%s\033[0m", recipients); + + // Where do we want bounces and other noise to be sent? Certainly not to the list members! + snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", CtdlGetConfigStr("c_fqdn")); + + // Now submit the message struct recptypes *valid = validate_recipients(recipients, NULL, 0); if (valid) { - long new_msgnum = CtdlSubmitMsg(TheMessage, valid, ""); + valid->bounce_to = strdup(bounce_to); + valid->envelope_from = strdup(bounce_to); + CtdlSubmitMsg(TheMessage, valid, ""); free_recipients(valid); } } @@ -104,6 +120,7 @@ void listdeliver_do_msg(long msgnum, void *userdata) { */ void listdeliver_sweep_room(char *roomname) { char *netconfig = NULL; + char *newnetconfig = NULL; long lastsent = 0; char buf[SIZ]; int config_lines; @@ -122,8 +139,6 @@ void listdeliver_sweep_room(char *roomname) { return; // no netconfig, no processing, no problem } - syslog(LOG_DEBUG, "listdeliver: sweeping %s", roomname); - config_lines = num_tokens(netconfig, '\n'); for (i=0; i for <%d> recipients", CC->room.QRname, number_of_recipients); ld.netconf = netconfig; number_of_messages_processed = CtdlForEachMessage(MSGS_GT, lastsent, NULL, NULL, NULL, listdeliver_do_msg, &ld); - syslog(LOG_DEBUG, "listdeliver: processed %d messages", number_of_messages_processed); + syslog(LOG_INFO, "listdeliver: processed <%d> messages in <%s> for <%d> recipients", number_of_messages_processed, CC->room.QRname, number_of_recipients); if (number_of_messages_processed > 0) { syslog(LOG_DEBUG, "listdeliver: new lastsent is %ld", ld.msgnum); - // FIXME write lastsent back to netconfig - syslog(LOG_DEBUG, "\033[31mBEFORE:<%s>\033[0m", netconfig); - syslog(LOG_DEBUG, "\033[32mAFTER:<%s>\033[0m", netconfig); - + // Update this room's netconfig with the updated lastsent + begin_critical_section(S_NETCONFIGS); + netconfig = LoadRoomNetConfigFile(CC->room.QRnumber); + if (!netconfig) { + netconfig = strdup(""); + } + // The new netconfig begins with the new lastsent directive + newnetconfig = malloc(strlen(netconfig) + 1024); + sprintf(newnetconfig, "lastsent|%ld\n", ld.msgnum); + // And then we append all of the old netconfig, minus the old lastsent. Also omit blank lines. + config_lines = num_tokens(netconfig, '\n'); + for (i=0; iroom.QRnumber, newnetconfig); + end_critical_section(S_NETCONFIGS); + free(newnetconfig); // this was the new netconfig, free it because we're done with it } } - - free(netconfig); + free(netconfig); // this was the old netconfig, free it even if we didn't do anything } @@ -208,19 +239,15 @@ void listdeliver_sweep(void) { syslog(LOG_DEBUG, "listdeliver: ended"); last_run = time(NULL); doing_listdeliver = 0; - - //exit(0); } - /* * Module entry point */ CTDL_MODULE_INIT(listdeliver) { - if (!threading) - { + if (!threading) { CtdlRegisterSessionHook(listdeliver_sweep, EVT_TIMER, PRIO_AGGR + 50); }