X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_netspool.c;h=1921bbaff86ebd984adcdb2478d95b07f2ea1cb1;hp=f4224d6ad6d179fb261f9e4086944795dfe81920;hb=7a9b0685e406cc83597171cc39d008c7e5459ca8;hpb=7a65130ea2a5be56603233ba7b8d230691f604a0 diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index f4224d6ad..1921bbaff 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -39,16 +39,8 @@ #include #include #include -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif +#include + #ifdef HAVE_SYSCALL_H # include #else @@ -81,318 +73,6 @@ #include "netmail.h" -void ParseLastSent(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *OneRNCFG) -{ - RoomNetCfgLine *nptr; - nptr = (RoomNetCfgLine *) malloc(sizeof(RoomNetCfgLine)); - memset(nptr, 0, sizeof(RoomNetCfgLine)); - OneRNCFG->lastsent = extract_long(LinePos, 0); - OneRNCFG->NetConfigs[ThisOne->C] = nptr; -} - -void ParseRoomAlias(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *rncfg) -{ - if (rncfg->Sender != NULL) { - return; - } - - ParseGeneric(ThisOne, Line, LinePos, rncfg); - rncfg->Sender = NewStrBufDup(rncfg->NetConfigs[roommailalias]->Value[0]); -} - -void ParseSubPendingLine(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *OneRNCFG) -{ - if (time(NULL) - extract_long(LinePos, 3) > EXP) - return; /* expired subscription... */ - - ParseGeneric(ThisOne, Line, LinePos, OneRNCFG); -} -void ParseUnSubPendingLine(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *OneRNCFG) -{ - if (time(NULL) - extract_long(LinePos, 2) > EXP) - return; /* expired subscription... */ - - ParseGeneric(ThisOne, Line, LinePos, OneRNCFG); -} - - -void SerializeLastSent(const CfgLineType *ThisOne, StrBuf *OutputBuffer, OneRoomNetCfg *RNCfg, RoomNetCfgLine *data) -{ - StrBufAppendBufPlain(OutputBuffer, CKEY(ThisOne->Str), 0); - StrBufAppendPrintf(OutputBuffer, "|%ld\n", RNCfg->lastsent); -} - -void DeleteLastSent(const CfgLineType *ThisOne, RoomNetCfgLine **data) -{ - free(*data); - *data = NULL; -} - -static const RoomNetCfg SpoolCfgs [4] = { - listrecp, - digestrecp, - participate, -}; - -static const long SpoolCfgsCopyN [4] = { - 1, 1, 1, 2 -}; - -int HaveSpoolConfig(OneRoomNetCfg* RNCfg) -{ - int i; - int interested = 0; - for (i=0; i < 4; i++) if (RNCfg->NetConfigs[SpoolCfgs[i]] == NULL) interested = 1; - return interested; -} - - -void InspectQueuedRoom(SpoolControl **pSC, - RoomProcList *room_to_spool, - HashList *working_ignetcfg, - HashList *the_netmap -) { - SpoolControl *sc; - int i = 0; - - syslog(LOG_INFO, "netspool: InspectQueuedRoom(%s)", room_to_spool->name); - - sc = (SpoolControl*)malloc(sizeof(SpoolControl)); - memset(sc, 0, sizeof(SpoolControl)); - sc->working_ignetcfg = working_ignetcfg; - sc->the_netmap = the_netmap; - - /* - * If the room doesn't exist, don't try to perform its networking tasks. - * Normally this should never happen, but once in a while maybe a room gets - * queued for networking and then deleted before it can happen. - */ - if (CtdlGetRoom(&sc->room, room_to_spool->name) != 0) { - syslog(LOG_INFO, "netspool: ERROR; cannot load <%s>", room_to_spool->name); - free(sc); - return; - } - - assert(sc->RNCfg == NULL); // checking to make sure we cleared it from last time - - sc->RNCfg = CtdlGetNetCfgForRoom(sc->room.QRnumber); - - syslog(LOG_DEBUG, "netspool: room <%s> highest=%ld lastsent=%ld", room_to_spool->name, sc->room.QRhighest, sc->RNCfg->lastsent); - if ( (!HaveSpoolConfig(sc->RNCfg)) || (sc->room.QRhighest <= sc->RNCfg->lastsent) ) - { - // There is nothing to send from this room. - syslog(LOG_DEBUG, "netspool: nothing to do for <%s>", room_to_spool->name); - FreeRoomNetworkStruct(&sc->RNCfg); - sc->RNCfg = NULL; - free(sc); - return; - } - - sc->lastsent = sc->RNCfg->lastsent; - room_to_spool->lastsent = sc->lastsent; - - /* Now lets remember whats needed for the actual work... */ - - for (i=0; i < 4; i++) - { - aggregate_recipients(&sc->Users[SpoolCfgs[i]], SpoolCfgs[i], sc->RNCfg, SpoolCfgsCopyN[i]); - } - - if (StrLength(sc->RNCfg->Sender) > 0) { - sc->Users[roommailalias] = NewStrBufDup(sc->RNCfg->Sender); - } - - sc->next = *pSC; - *pSC = sc; - - FreeRoomNetworkStruct(&sc->RNCfg); // done with this for now, we'll grab it again next time - sc->RNCfg = NULL; -} - - -void CalcListID(SpoolControl *sc) -{ - StrBuf *RoomName; - struct CitContext *CCC = CC; -#define MAX_LISTIDLENGTH 150 - - // Load the room banner as the list description - struct CtdlMessage *msg = CtdlFetchMessage(sc->room.msgnum_info, 1); - if (msg != NULL) { - CC->redirect_buffer = NewStrBufPlain(NULL, SIZ); - CtdlOutputPreLoadedMsg(msg, MT_CITADEL, HEADERS_NONE, 0, 0, 0); - CM_Free(msg); - sc->RoomInfo = CC->redirect_buffer; - CC->redirect_buffer = NULL; - } - else { - sc->RoomInfo = NewStrBufPlain(NULL, SIZ); - } - - // Calculate the List ID - sc->ListID = NewStrBufPlain(NULL, 1024); - if (StrLength(sc->RoomInfo) > 0) - { - const char *Pos = NULL; - StrBufSipLine(sc->ListID, sc->RoomInfo, &Pos); - - if (StrLength(sc->ListID) > MAX_LISTIDLENGTH) - { - StrBufCutAt(sc->ListID, MAX_LISTIDLENGTH, NULL); - StrBufAppendBufPlain(sc->ListID, HKEY("..."), 0); - } - StrBufAsciify(sc->ListID, ' '); - } - else - { - StrBufAppendBufPlain(sc->ListID, CCC->room.QRname, -1, 0); - } - - StrBufAppendBufPlain(sc->ListID, HKEY("<"), 0); - RoomName = NewStrBufPlain (sc->room.QRname, -1); - StrBufAsciify(RoomName, '_'); - StrBufReplaceChars(RoomName, ' ', '_'); - - if (StrLength(sc->Users[roommailalias]) > 0) - { - long Pos; - const char *AtPos; - - Pos = StrLength(sc->ListID); - StrBufAppendBuf(sc->ListID, sc->Users[roommailalias], 0); - AtPos = strchr(ChrPtr(sc->ListID) + Pos, '@'); - - if (AtPos != NULL) - { - StrBufPeek(sc->ListID, AtPos, 0, '.'); - } - } - else - { - StrBufAppendBufPlain(sc->ListID, HKEY("room_"), 0); - StrBufAppendBuf(sc->ListID, RoomName, 0); - StrBufAppendBufPlain(sc->ListID, HKEY("."), 0); - StrBufAppendBufPlain(sc->ListID, CtdlGetConfigStr("c_fqdn"), -1, 0); - /* - * this used to be: - * roomname - * according to rfc2919.txt it only has to be a unique identifier - * under the domain of the system; - * in general MUAs use it to calculate the reply address nowadays. - */ - } - StrBufAppendBufPlain(sc->ListID, HKEY(">"), 0); - - if (StrLength(sc->Users[roommailalias]) == 0) - { - sc->Users[roommailalias] = NewStrBuf(); - - StrBufAppendBufPlain(sc->Users[roommailalias], HKEY("room_"), 0); - StrBufAppendBuf(sc->Users[roommailalias], RoomName, 0); - StrBufAppendBufPlain(sc->Users[roommailalias], HKEY("@"), 0); - StrBufAppendBufPlain(sc->Users[roommailalias], CtdlGetConfigStr("c_fqdn"), -1, 0); - - StrBufLowerCase(sc->Users[roommailalias]); - } - - FreeStrBuf(&RoomName); -} - - -/* - * Batch up and send all outbound traffic from the current room (this is definitely used for mailing lists) - */ -void network_spoolout_room(SpoolControl *sc) -{ - struct CitContext *CCC = CC; - char buf[SIZ]; - int i; - long lastsent; - - /* - * If the room doesn't exist, don't try to perform its networking tasks. - * Normally this should never happen, but once in a while maybe a room gets - * queued for networking and then deleted before it can happen. - */ - memcpy (&CCC->room, &sc->room, sizeof(ctdlroom)); - - syslog(LOG_INFO, "netspool: network_spoolout_room(room=%s, lastsent=%ld)", CCC->room.QRname, sc->lastsent); - - CalcListID(sc); - - /* remember where we started... */ - lastsent = sc->lastsent; - - /* Fetch the messages we ought to send & prepare them. */ - CtdlForEachMessage(MSGS_GT, sc->lastsent, NULL, NULL, NULL, network_spool_msg, sc); - - if (StrLength(sc->Users[roommailalias]) > 0) - { - long len; - len = StrLength(sc->Users[roommailalias]); - if (len + 1 > sizeof(buf)) - len = sizeof(buf) - 1; - memcpy(buf, ChrPtr(sc->Users[roommailalias]), len); - buf[len] = '\0'; - } - else - { - snprintf(buf, sizeof buf, "room_%s@%s", CCC->room.QRname, CtdlGetConfigStr("c_fqdn")); - } - - for (i=0; buf[i]; ++i) { - buf[i] = tolower(buf[i]); - if (isspace(buf[i])) buf[i] = '_'; - } - - /* If we wrote a digest, deliver it and then close it */ - if ( (sc->Users[digestrecp] != NULL) && (sc->digestfp != NULL) ) - { - fprintf(sc->digestfp, - " ------------------------------------------------------------------------------\n" - "You are subscribed to the '%s' list.\n" - "To post to the list: %s\n", - CCC->room.QRname, buf - ); - network_deliver_digest(sc); /* deliver */ - fclose(sc->digestfp); - sc->digestfp = NULL; - } - - /* Now rewrite the netconfig */ - syslog(LOG_DEBUG, "netspool: lastsent was %ld , now it is %ld", lastsent, sc->lastsent); - if (sc->lastsent != lastsent) - { - OneRoomNetCfg *r; - - begin_critical_section(S_NETCONFIGS); - r = CtdlGetNetCfgForRoom(sc->room.QRnumber); - r->lastsent = sc->lastsent; - SaveRoomNetConfigFile(r, sc->room.QRnumber); - FreeRoomNetworkStruct(&r); - end_critical_section(S_NETCONFIGS); - } -} - - -void free_spoolcontrol_struct(SpoolControl **sc) -{ - free_spoolcontrol_struct_members(*sc); - free(*sc); - *sc = NULL; -} - - -void free_spoolcontrol_struct_members(SpoolControl *sc) -{ - int i; - FreeStrBuf(&sc->RoomInfo); - FreeStrBuf(&sc->ListID); - for (i = 0; i < maxRoomNetCfg; i++) - FreeStrBuf(&sc->Users[i]); -} - - /* * Module entry point */ @@ -400,13 +80,13 @@ CTDL_MODULE_INIT(network_spool) { if (!threading) { - CtdlREGISTERRoomCfgType(subpending, ParseSubPendingLine, 0, 5, SerializeGeneric, DeleteGenericCfgLine); - CtdlREGISTERRoomCfgType(unsubpending, ParseUnSubPendingLine, 0, 4, SerializeGeneric, DeleteGenericCfgLine); - CtdlREGISTERRoomCfgType(lastsent, ParseLastSent, 1, 1, SerializeLastSent, DeleteLastSent); - CtdlREGISTERRoomCfgType(listrecp, ParseGeneric, 0, 1, SerializeGeneric, DeleteGenericCfgLine); - CtdlREGISTERRoomCfgType(digestrecp, ParseGeneric, 0, 1, SerializeGeneric, DeleteGenericCfgLine); - CtdlREGISTERRoomCfgType(participate, ParseGeneric, 0, 1, SerializeGeneric, DeleteGenericCfgLine); - CtdlREGISTERRoomCfgType(roommailalias, ParseRoomAlias, 0, 1, SerializeGeneric, DeleteGenericCfgLine); + //CtdlREGISTERRoomCfgType(subpending, ParseSubPendingLine, 0, 5, SerializeGeneric, DeleteGenericCfgLine); + //CtdlREGISTERRoomCfgType(unsubpending, ParseUnSubPendingLine, 0, 4, SerializeGeneric, DeleteGenericCfgLine); + //CtdlREGISTERRoomCfgType(lastsent, ParseLastSent, 1, 1, SerializeLastSent, DeleteLastSent); + //CtdlREGISTERRoomCfgType(listrecp, ParseGeneric, 0, 1, SerializeGeneric, DeleteGenericCfgLine); + //CtdlREGISTERRoomCfgType(digestrecp, ParseGeneric, 0, 1, SerializeGeneric, DeleteGenericCfgLine); + //CtdlREGISTERRoomCfgType(participate, ParseGeneric, 0, 1, SerializeGeneric, DeleteGenericCfgLine); + //CtdlREGISTERRoomCfgType(roommailalias, ParseRoomAlias, 0, 1, SerializeGeneric, DeleteGenericCfgLine); } return "network_spool"; }