X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_netspool.c;h=500d931bf0c57cce635bb116a0283449fe8956ac;hb=2b57abb4e89077f1bdf104e95203015810cf1a6f;hp=62afec686cb53afa4307133f25e5b9ce4c180893;hpb=f88d67da640fc36def6a9c7e14e6e0ac793273a9;p=citadel.git diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index 62afec686..500d931bf 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -209,11 +209,13 @@ void InspectQueuedRoom(SpoolControl **pSC, 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 +233,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 +332,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 @@ -351,8 +355,12 @@ void network_spoolout_room(SpoolControl *sc) /* 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"); + + sc->digestfp = create_digest_file(&sc->room); + sc->haveDigest = ftell(sc->digestfp) > 0; + if (!sc->haveDigest) { + fprintf(sc->digestfp, "Content-type: text/plain\n\n"); + } } CalcListID(sc); @@ -360,11 +368,10 @@ void network_spoolout_room(SpoolControl *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 +391,50 @@ 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->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 */ + 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 (sc->haveDigest && + (secs_today < 300) && + (delta < 300) ) + { + 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 */ + } + fclose(sc->digestfp); + sc->digestfp = NULL; + remove_digest_file(&sc->room); } /* 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); } /* @@ -978,7 +1007,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);