*/
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) || (msg->cm_fields['I'] == NULL) || (IsEmptyStr(msg->cm_fields['I'])))
+ {
return(0);
}
/* Generate the message ID */
- strcpy(msgid, msg->cm_fields['I']);
- if (haschar(msgid, '@') == 0) {
- strcat(msgid, "@");
+ msgid = NewStrBufPlain(msg->cm_fields['I'], -1);
+ if (haschar(ChrPtr(msgid), '@') == 0) {
+ StrBufAppendBufPlain(msgid, HKEY("@"), 0);
if (msg->cm_fields['N'] != NULL) {
- strcat(msgid, msg->cm_fields['N']);
+ StrBufAppendBufPlain(msgid, msg->cm_fields['N'], -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);
}
-void CalcListID(SpoolControl *sc)
-{
- const char *err;
- int fd;
- struct CitContext *CCC = CC;
- char filename[PATH_MAX];
-#define MAX_LISTIDLENGTH 150
-
- assoc_file_name(filename, sizeof filename, &sc->room, ctdl_info_dir);
- fd = open(filename, 0);
-
- if (fd != 0) {
- struct stat stbuf;
-
- fstat(fd, &stbuf);
- if (stbuf.st_size > 0)
- {
- sc->RoomInfo = NewStrBufPlain(NULL, stbuf.st_size + 1);
- StrBufReadBLOB(sc->RoomInfo, &fd, 0, stbuf.st_size, &err);
- }
- close(fd);
- }
-
- 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);
-
- 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);
- StrBufAppendBufPlain(sc->ListID, sc->room.QRname, -1, 0);
- StrBufAppendBufPlain(sc->ListID, HKEY("."), 0);
- StrBufAppendBufPlain(sc->ListID, config.c_fqdn, -1, 0);
- /*
- * this used to be:
- * roomname <Room-Number.list-id.fqdn>
- * according to rfc2919.txt it only has to be a uniq 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();
-
- StrBufPrintf(sc->Users[roommailalias],
- "room_%s@%s",
- CCC->room.QRname,
- config.c_fqdn);
-
- StrBufAsciify(sc->Users[roommailalias], '_');
- StrBufLowerCase(sc->Users[roommailalias]);
- }
-
-}
/*
* Send the *entire* contents of the current room to one specific network node,
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;
}
{
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);
sc.working_ignetcfg = CtdlLoadIgNetCfg();
sc.the_netmap = CtdlReadNetworkMap();
- CalcListID(&sc);
/* Send ALL messages */
num_spooled = CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL,
network_spool_msg, &sc);
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);
*/
if (msg->cm_fields['R'] == NULL) {
free(msg->cm_fields['R']);
+ msg->cm_fields['R'] = NULL;
}
if (msg->cm_fields['D'] == NULL) {
free(msg->cm_fields['D']);
+ msg->cm_fields['D'] = NULL;
}
snprintf(recipient, sizeof recipient, "%s@%s",
}
-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()
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 */