Silence!
[citadel.git] / citadel / modules / network / serv_netspool.c
index 5b90ef23d89f40510e98920e04bc9a1922dace9d..0edb1f11efa0e240bcf7c7c3d79ead11d21b3934 100644 (file)
@@ -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);
 }
 
 /*
@@ -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);