Replace all discrete checks for empty message fields by CM_IsEmpty()
[citadel.git] / citadel / modules / network / serv_network.c
index 5dedf0c536ec52754710e18c0078b74182fd8f20..8533d8410fce7e0954b5561c8a701dde34859689 100644 (file)
@@ -106,45 +106,40 @@ struct RoomProcList *rplist = NULL;
  */
 int network_usetable(struct CtdlMessage *msg)
 {
+       StrBuf *msgid;
        struct CitContext *CCC = CC;
-       char msgid[SIZ];
-       struct cdbdata *cdbut;
-       struct UseTable ut;
+       time_t now;
 
        /* Bail out if we can't generate a message ID */
-       if (msg == NULL) {
-               return(0);
-       }
-       if (msg->cm_fields['I'] == NULL) {
-               return(0);
-       }
-       if (IsEmptyStr(msg->cm_fields['I'])) {
+       if ((msg == NULL) || CM_IsEmpty(msg, emessageId))
+       {
                return(0);
        }
 
        /* Generate the message ID */
-       strcpy(msgid, msg->cm_fields['I']);
-       if (haschar(msgid, '@') == 0) {
-               strcat(msgid, "@");
-               if (msg->cm_fields['N'] != NULL) {
-                       strcat(msgid, msg->cm_fields['N']);
+       msgid = NewStrBufPlain(msg->cm_fields[emessageId], -1);
+       if (haschar(ChrPtr(msgid), '@') == 0) {
+               StrBufAppendBufPlain(msgid, HKEY("@"), 0);
+               if (!CM_IsEmpty(msg, eNodeName)) {
+                       StrBufAppendBufPlain(msgid, msg->cm_fields[eNodeName], -1, 0);
                }
                else {
+                       FreeStrBuf(&msgid);
                        return(0);
                }
        }
-
-       cdbut = cdb_fetch(CDB_USETABLE, msgid, strlen(msgid));
-       if (cdbut != NULL) {
-               cdb_free(cdbut);
-               QN_syslog(LOG_DEBUG, "network_usetable() : we already have %s\n", msgid);
+       now = time(NULL);
+       if (CheckIfAlreadySeen("Networker Import",
+                              msgid,
+                              now, 0,
+                              eCheckUpdate,
+                              CCC->cs_pid, 0) != 0)
+       {
+               FreeStrBuf(&msgid);
                return(1);
        }
+       FreeStrBuf(&msgid);
 
-       /* If we got to this point, it's unique: add it. */
-       strcpy(ut.ut_msgid, msgid);
-       ut.ut_timestamp = time(NULL);
-       cdb_store(CDB_USETABLE, msgid, strlen(msgid), &ut, sizeof(struct UseTable) );
        return(0);
 }
 
@@ -176,7 +171,7 @@ int network_sync_to(char *target_node, long len)
        pCfgLine = pRNCFG->NetConfigs[ignet_push_share];
        while (pCfgLine != NULL)
        {
-               if (strcmp(ChrPtr(pCfgLine->Value[0]), target_node))
+               if (!strcmp(ChrPtr(pCfgLine->Value[0]), target_node))
                        break;
                pCfgLine = pCfgLine->next;
        }
@@ -184,10 +179,25 @@ int network_sync_to(char *target_node, long len)
        {
                return -1;
        }
+
        memset(&sc, 0, sizeof(SpoolControl));
        memset(&OneRNCFG, 0, sizeof(OneRoomNetCfg));
        sc.RNCfg = &OneRNCFG;
        sc.RNCfg->NetConfigs[ignet_push_share] = DuplicateOneGenericCfgLine(pCfgLine);
+       sc.Users[ignet_push_share] = NewStrBufPlain(NULL,
+                                                   StrLength(pCfgLine->Value[0]) +
+                                                   StrLength(pCfgLine->Value[1]) + 10);
+       StrBufAppendBuf(sc.Users[ignet_push_share], 
+                       pCfgLine->Value[0],
+                       0);
+       StrBufAppendBufPlain(sc.Users[ignet_push_share], 
+                            HKEY(","),
+                            0);
+
+       StrBufAppendBuf(sc.Users[ignet_push_share], 
+                       pCfgLine->Value[1],
+                       0);
+       CalcListID(&sc);
 
        end_critical_section(S_NETCONFIGS);
 
@@ -203,6 +213,7 @@ int network_sync_to(char *target_node, long len)
 
        DeleteHash(&sc.working_ignetcfg);
        DeleteHash(&sc.the_netmap);
+       free_spoolcontrol_struct_members(&sc);
 
        QN_syslog(LOG_NOTICE, "Synchronized %d messages to <%s>\n",
                  num_spooled, target_node);
@@ -337,14 +348,13 @@ void destroy_network_queue_room_locked (void)
 void network_bounce(struct CtdlMessage *msg, char *reason)
 {
        struct CitContext *CCC = CC;
-       char *oldpath = NULL;
        char buf[SIZ];
        char bouncesource[SIZ];
        char recipient[SIZ];
        struct recptypes *valid = NULL;
        char force_room[ROOMNAMELEN];
        static int serialnum = 0;
-       size_t size;
+       long len;
 
        QNM_syslog(LOG_DEBUG, "entering network_bounce()\n");
 
@@ -355,65 +365,37 @@ void network_bounce(struct CtdlMessage *msg, char *reason)
        /* 
         * Give it a fresh message ID
         */
-       if (msg->cm_fields['I'] != NULL) {
-               free(msg->cm_fields['I']);
-       }
-       snprintf(buf, sizeof buf, "%ld.%04lx.%04x@%s",
-               (long)time(NULL), (long)getpid(), ++serialnum, config.c_fqdn);
-       msg->cm_fields['I'] = strdup(buf);
+       len = snprintf(buf, sizeof(buf),
+                      "%ld.%04lx.%04x@%s",
+                      (long)time(NULL),
+                      (long)getpid(),
+                      ++serialnum,
+                      config.c_fqdn);
+
+       CM_SetField(msg, emessageId, buf, len);
 
        /*
         * FIXME ... right now we're just sending a bounce; we really want to
         * include the text of the bounced message.
         */
-       if (msg->cm_fields['M'] != NULL) {
-               free(msg->cm_fields['M']);
-       }
-       msg->cm_fields['M'] = strdup(reason);
+       CM_SetField(msg, eMesageText, reason, strlen(reason));
        msg->cm_format_type = 0;
 
        /*
         * Turn the message around
         */
-       if (msg->cm_fields['R'] == NULL) {
-               free(msg->cm_fields['R']);
-       }
+       CM_FlushField(msg, eRecipient);
+       CM_FlushField(msg, eDestination);
 
-       if (msg->cm_fields['D'] == NULL) {
-               free(msg->cm_fields['D']);
-       }
+       len = snprintf(recipient, sizeof(recipient), "%s@%s",
+                      msg->cm_fields[eAuthor],
+                      msg->cm_fields[eNodeName]);
 
-       snprintf(recipient, sizeof recipient, "%s@%s",
-               msg->cm_fields['A'], msg->cm_fields['N']);
+       CM_SetField(msg, eAuthor, HKEY(BOUNCESOURCE));
+       CM_SetField(msg, eNodeName, config.c_nodename, strlen(config.c_nodename));
+       CM_SetField(msg, eMsgSubject, HKEY("Delivery Status Notification (Failure)"));
 
-       if (msg->cm_fields['A'] == NULL) {
-               free(msg->cm_fields['A']);
-       }
-
-       if (msg->cm_fields['N'] == NULL) {
-               free(msg->cm_fields['N']);
-       }
-
-       if (msg->cm_fields['U'] == NULL) {
-               free(msg->cm_fields['U']);
-       }
-
-       msg->cm_fields['A'] = strdup(BOUNCESOURCE);
-       msg->cm_fields['N'] = strdup(config.c_nodename);
-       msg->cm_fields['U'] = strdup("Delivery Status Notification (Failure)");
-
-       /* prepend our node to the path */
-       if (msg->cm_fields['P'] != NULL) {
-               oldpath = msg->cm_fields['P'];
-               msg->cm_fields['P'] = NULL;
-       }
-       else {
-               oldpath = strdup("unknown_user");
-       }
-       size = strlen(oldpath) + SIZ;
-       msg->cm_fields['P'] = malloc(size);
-       snprintf(msg->cm_fields['P'], size, "%s!%s", config.c_nodename, oldpath);
-       free(oldpath);
+       Netmap_AddMe(msg, HKEY("unknown_user"));
 
        /* Now submit the message */
        valid = validate_recipients(recipient, NULL, 0);
@@ -439,19 +421,6 @@ void network_bounce(struct CtdlMessage *msg, char *reason)
 }
 
 
-void free_network_spoolout_room(SpoolControl *sc)
-{
-       if (sc != NULL)
-       {
-               int i;
-               for (i = subpending; i < maxRoomNetCfg; i++)
-                       FreeStrBuf(&sc->Users[i]);
-               free(sc);
-       }
-}
-
-
-
 
 /*
  * network_do_queue()
@@ -551,7 +520,7 @@ void network_do_queue(void)
        while (pSC != NULL)
        {
                sc = pSC->next;
-               free_network_spoolout_room(pSC);
+               free_spoolcontrol_struct(&pSC);
                pSC = sc;
        }
        /* If there is anything in the inbound queue, process it */