-
-
-/*
- * Check the use table. This is a list of messages which have recently
- * arrived on the system. It is maintained and queried to prevent the same
- * message from being entered into the database multiple times if it happens
- * to arrive multiple times by accident.
- */
-int network_usetable(struct CtdlMessage *msg)
-{
- struct CitContext *CCC = CC;
- char msgid[SIZ];
- struct cdbdata *cdbut;
- struct UseTable ut;
-
- /* 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'])) {
- 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']);
- }
- else {
- 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);
- return(1);
- }
-
- /* 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);
-}
-
-
-
-/*
- * Send the *entire* contents of the current room to one specific network node,
- * ignoring anything we know about which messages have already undergone
- * network processing. This can be used to bring a new node into sync.
- */
-int network_sync_to(char *target_node, long len)
-{
- struct CitContext *CCC = CC;
- OneRoomNetCfg OneRNCFG;
- OneRoomNetCfg *pRNCFG;
- const RoomNetCfgLine *pCfgLine;
- SpoolControl sc;
- int num_spooled = 0;
-
- /* Grab the configuration line we're looking for */
- begin_critical_section(S_NETCONFIGS);
- pRNCFG = CtdlGetNetCfgForRoom(CCC->room.QRnumber);
- if ((pRNCFG == NULL) ||
- (pRNCFG->NetConfigs[ignet_push_share] == NULL))
- {
- return -1;
- }
-
- pCfgLine = pRNCFG->NetConfigs[ignet_push_share];
- while (pCfgLine != NULL)
- {
- if (strcmp(ChrPtr(pCfgLine->Value[0]), target_node))
- break;
- pCfgLine = pCfgLine->next;
- }
- if (pCfgLine == NULL)
- {
- return -1;
- }
- memset(&sc, 0, sizeof(SpoolControl));
- memset(&OneRNCFG, 0, sizeof(OneRoomNetCfg));
- sc.RNCfg = &OneRNCFG;
- sc.RNCfg->NetConfigs[ignet_push_share] = DuplicateOneGenericCfgLine(pCfgLine);
-
- end_critical_section(S_NETCONFIGS);
-
- sc.working_ignetcfg = CtdlLoadIgNetCfg();
- sc.the_netmap = CtdlReadNetworkMap();
-
- /* Send ALL messages */
- num_spooled = CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL,
- network_spool_msg, &sc);
-
- /* Concise cleanup because we know there's only one node in the sc */
- DeleteGenericCfgLine(NULL/*TODO*/, &sc.RNCfg->NetConfigs[ignet_push_share]);
-
- DeleteHash(&sc.working_ignetcfg);
- DeleteHash(&sc.the_netmap);
-
- QN_syslog(LOG_NOTICE, "Synchronized %d messages to <%s>\n",
- num_spooled, target_node);
- return(num_spooled);
-}
-
-
-/*
- * Implements the NSYN command
- */
-void cmd_nsyn(char *argbuf) {
- int num_spooled;
- long len;
- char target_node[256];
-
- if (CtdlAccessCheck(ac_aide)) return;
-
- len = extract_token(target_node, argbuf, 0, '|', sizeof target_node);
- num_spooled = network_sync_to(target_node, len);
- if (num_spooled >= 0) {
- cprintf("%d Spooled %d messages.\n", CIT_OK, num_spooled);
- }
- else {
- cprintf("%d No such room/node share exists.\n",
- ERROR + ROOM_NOT_FOUND);
- }
-}
-