X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_netspool.c;h=0edb1f11efa0e240bcf7c7c3d79ead11d21b3934;hb=17facca88daba3788c5fcf6ffc8d57f3ed7a5905;hp=c75e682fb74a1b51d30e0821e8635c39bc3851b7;hpb=e750a47a92b48dfa6faf63a61a71f103871c9e5b;p=citadel.git diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index c75e682fb..0edb1f11e 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -168,7 +168,7 @@ void Netmap_AddMe(struct CtdlMessage *msg, const char *defl, long defllen) if (CM_IsEmpty(msg, eMessagePath)) { CM_SetField(msg, eMessagePath, defl, defllen); } - node_len = strlen(config.c_nodename); + node_len = configlen.c_nodename; if (node_len >= SIZ) node_len = SIZ - 1; memcpy(buf, config.c_nodename, node_len); @@ -182,6 +182,7 @@ void InspectQueuedRoom(SpoolControl **pSC, HashList *working_ignetcfg, HashList *the_netmap) { + struct CitContext *CCC = CC; SpoolControl *sc; int i = 0; @@ -204,16 +205,18 @@ void InspectQueuedRoom(SpoolControl **pSC, } if (sc->room.QRhighest <= sc->lastsent) { - syslog(LOG_DEBUG, "nothing to do for <%s>\n", room_to_spool->name); + QN_syslog(LOG_DEBUG, "nothing to do for <%s>\n", room_to_spool->name); free(sc); return; } + begin_critical_section(S_NETCONFIGS); if (sc->RNCfg == NULL) sc->RNCfg = CtdlGetNetCfgForRoom(sc->room.QRnumber); if (!HaveSpoolConfig(sc->RNCfg)) { + end_critical_section(S_NETCONFIGS); free(sc); /* nothing to do for this room... */ return; @@ -231,6 +234,7 @@ void InspectQueuedRoom(SpoolControl **pSC, if (StrLength(sc->RNCfg->Sender) > 0) sc->Users[roommailalias] = NewStrBufDup(sc->RNCfg->Sender); + end_critical_section(S_NETCONFIGS); sc->next = *pSC; *pSC = sc; @@ -329,6 +333,7 @@ void CalcListID(SpoolControl *sc) FreeStrBuf(&RoomName); } +static time_t last_digest_delivery = 0; /* * Batch up and send all outbound traffic from the current room @@ -349,22 +354,15 @@ void network_spoolout_room(SpoolControl *sc) syslog(LOG_INFO, "Networking started for <%s>\n", CCC->room.QRname); - /* If there are digest recipients, we have to build a digest */ - if (sc->Users[digestrecp] != NULL) { - sc->digestfp = tmpfile(); - fprintf(sc->digestfp, "Content-type: text/plain\n\n"); - } - CalcListID(sc); /* remember where we started... */ lastsent = sc->lastsent; - /* Do something useful */ + /* Fetch the messages we ought to send & prepare them. */ CtdlForEachMessage(MSGS_GT, sc->lastsent, NULL, NULL, NULL, network_spool_msg, sc); - /* If we wrote a digest, deliver it and then close it */ if (StrLength(sc->Users[roommailalias]) > 0) { long len; @@ -384,28 +382,56 @@ void network_spoolout_room(SpoolControl *sc) 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) { + time_t now = time(NULL); + time_t secs_today = now % (24 * 60 * 60); + long delta = 0; + + if (last_digest_delivery != 0) { + delta = now - last_digest_delivery; + delta = (24 * 60 * 60) - delta; + } + + if ((secs_today < 300) && + (delta < 300)) + { + if (sc->digestfp == NULL) { + sc->digestfp = create_digest_file(&sc->room, 0); + } + if (sc->digestfp != NULL) { + last_digest_delivery = now; + 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 */ + remove_digest_file(&sc->room); + } + } + } if (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 and close */ + fclose(sc->digestfp); + sc->digestfp = NULL; } /* Now rewrite the config file */ if (sc->lastsent != lastsent) { + begin_critical_section(S_NETCONFIGS); sc->RNCfg = CtdlGetNetCfgForRoom(sc->room.QRnumber); sc->RNCfg->lastsent = sc->lastsent; sc->RNCfg->changed = 1; + end_critical_section(S_NETCONFIGS); } - end_critical_section(S_NETCONFIGS); } /* @@ -420,7 +446,7 @@ void network_process_buffer(char *buffer, long size, HashList *working_ignetcfg, struct CtdlMessage *msg = NULL; long pos; int field; - struct recptypes *recp = NULL; + recptypes *recp = NULL; char target_room[ROOMNAMELEN]; struct ser_ret sermsg; char filename[PATH_MAX]; @@ -462,7 +488,7 @@ void network_process_buffer(char *buffer, long size, HashList *working_ignetcfg, if (strcasecmp(msg->cm_fields[eDestination], config.c_nodename)) { /* route the message */ - Buf = NewStrBufPlain(msg->cm_fields[eDestination], -1); + Buf = NewStrBufPlain(CM_KEY(msg,eDestination)); if (CtdlIsValidNode(&nexthop, NULL, Buf, @@ -720,7 +746,7 @@ void network_do_spoolin(HashList *working_ignetcfg, HashList *the_netmap, int *n (filedir_entry != NULL)) { #ifdef _DIRENT_HAVE_D_NAMLEN - d_namelen = filedir_entry->d_namelen; + d_namelen = filedir_entry->d_namlen; #else d_namelen = strlen(filedir_entry->d_name); @@ -824,7 +850,7 @@ void network_consolidate_spoolout(HashList *working_ignetcfg, HashList *the_netm (filedir_entry != NULL)) { #ifdef _DIRENT_HAVE_D_NAMLEN - d_namelen = filedir_entry->d_namelen; + d_namelen = filedir_entry->d_namlen; #else d_namelen = strlen(filedir_entry->d_name); @@ -978,7 +1004,7 @@ void network_consolidate_spoolout(HashList *working_ignetcfg, HashList *the_netm (filedir_entry != NULL)) { #ifdef _DIRENT_HAVE_D_NAMLEN - d_namelen = filedir_entry->d_namelen; + d_namelen = filedir_entry->d_namlen; #else d_namelen = strlen(filedir_entry->d_name);