X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_network.c;h=7955f5a2eb935ebe4b16336c2f0d51a9653a9a36;hb=e26a8dee20d1726b4995821f717f867f50fc5659;hp=d0ab940927c317a8f92bfa3a1c8c1bb4942b7d5b;hpb=93197e1ecd3f6ae08ad94017b408b8fc5c6acff6;p=citadel.git diff --git a/citadel/modules/network/serv_network.c b/citadel/modules/network/serv_network.c index d0ab94092..7955f5a2e 100644 --- a/citadel/modules/network/serv_network.c +++ b/citadel/modules/network/serv_network.c @@ -2,9 +2,9 @@ * This module handles shared rooms, inter-Citadel mail, and outbound * mailing list processing. * - * Copyright (c) 2000-2010 by the citadel.org team + * Copyright (c) 2000-2011 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify + * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. @@ -92,9 +92,6 @@ -/* Nonzero while we are doing network processing */ -static int doing_queue = 0; - /* * When we do network processing, it's accomplished in two passes; one to * gather a list of rooms and one to actually do them. It's ok that rplist @@ -221,7 +218,7 @@ int network_usetable(struct CtdlMessage *msg) { cdbut = cdb_fetch(CDB_USETABLE, msgid, strlen(msgid)); if (cdbut != NULL) { cdb_free(cdbut); - CtdlLogPrintf(CTDL_DEBUG, "network_usetable() : we already have %s\n", msgid); + syslog(LOG_DEBUG, "network_usetable() : we already have %s\n", msgid); return(1); } @@ -323,7 +320,7 @@ int is_valid_node(char *nexthop, char *secret, char *node) { * First try the neighbor nodes */ if (working_ignetcfg == NULL) { - CtdlLogPrintf(CTDL_ERR, "working_ignetcfg is NULL!\n"); + syslog(LOG_ERR, "working_ignetcfg is NULL!\n"); if (nexthop != NULL) { strcpy(nexthop, ""); } @@ -371,7 +368,7 @@ int is_valid_node(char *nexthop, char *secret, char *node) { /* * If we get to this point, the supplied node name is bogus. */ - CtdlLogPrintf(CTDL_ERR, "Invalid node name <%s>\n", node); + syslog(LOG_ERR, "Invalid node name <%s>\n", node); return(-1); } @@ -497,7 +494,6 @@ void network_deliver_digest(SpoolControl *sc) { long msglen; char *recps = NULL; size_t recps_len = SIZ; - size_t siz; struct recptypes *valid; namelist *nptr; char bounce_to[256]; @@ -544,7 +540,7 @@ void network_deliver_digest(SpoolControl *sc) { msg->cm_fields['M'] = malloc(msglen + 1); fseek(sc->digestfp, 0L, SEEK_SET); - siz = fread(msg->cm_fields['M'], (size_t)msglen, 1, sc->digestfp); + fread(msg->cm_fields['M'], (size_t)msglen, 1, sc->digestfp); msg->cm_fields['M'][msglen] = '\0'; fclose(sc->digestfp); @@ -562,7 +558,7 @@ void network_deliver_digest(SpoolControl *sc) { recps = malloc(recps_len); if (recps == NULL) { - CtdlLogPrintf(CTDL_EMERG, "Cannot allocate %ld bytes for recps...\n", (long)recps_len); + syslog(LOG_EMERG, "Cannot allocate %ld bytes for recps...\n", (long)recps_len); abort(); } @@ -617,7 +613,7 @@ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc) { recps = malloc(recps_len); if (recps == NULL) { - CtdlLogPrintf(CTDL_EMERG, "Cannot allocate %ld bytes for recps...\n", (long)recps_len); + syslog(LOG_EMERG, "Cannot allocate %ld bytes for recps...\n", (long)recps_len); abort(); } @@ -656,7 +652,6 @@ void network_spool_msg(long msgnum, void *userdata) { SpoolControl *sc; int i; char *newpath = NULL; - size_t instr_len = SIZ; struct CtdlMessage *msg = NULL; namelist *nptr; maplist *mptr; @@ -675,13 +670,16 @@ void network_spool_msg(long msgnum, void *userdata) { /* * Process mailing list recipients */ - instr_len = SIZ; if (sc->listrecps != NULL) { /* Fetch the message. We're going to need to modify it * in order to insert the [list name] in it, etc. */ msg = CtdlFetchMessage(msgnum, 1); if (msg != NULL) { + int rlen; + char *pCh; + StrBuf *Subject, *FlatSubject; + if (msg->cm_fields['V'] == NULL){ /* local message, no enVelope */ StrBuf *Buf; @@ -709,11 +707,38 @@ void network_spool_msg(long msgnum, void *userdata) { /* Prepend "[List name]" to the subject */ if (msg->cm_fields['U'] == NULL) { - msg->cm_fields['U'] = strdup("(no subject)"); + Subject = NewStrBufPlain(HKEY("(no subject)")); + } + else { + Subject = NewStrBufPlain(msg->cm_fields['U'], -1); + } + FlatSubject = NewStrBufPlain(NULL, StrLength(Subject)); + StrBuf_RFC822_to_Utf8(FlatSubject, Subject, NULL, NULL); + + rlen = strlen(CC->room.QRname); + pCh = strstr(ChrPtr(FlatSubject), CC->room.QRname); + if ((pCh == NULL) || + (*(pCh + rlen) != ']') || + (pCh == ChrPtr(FlatSubject)) || + (*(pCh - 1) != '[') + ) + { + StrBuf *tmp; + StrBufPlain(Subject, HKEY("[")); + StrBufAppendBufPlain(Subject, CC->room.QRname, rlen, 0); + StrBufAppendBufPlain(Subject, HKEY("] "), 0); + StrBufAppendBuf(Subject, FlatSubject, 0); + tmp = Subject; Subject = FlatSubject; FlatSubject = tmp; /* so we can free the right one... */ + StrBufRFC2047encode(&Subject, FlatSubject); } - snprintf(buf, sizeof buf, "[%s] %s", CC->room.QRname, msg->cm_fields['U']); - free(msg->cm_fields['U']); - msg->cm_fields['U'] = strdup(buf); + + if (msg->cm_fields['U'] != NULL) + free (msg->cm_fields['U']); + msg->cm_fields['U'] = SmashStrBuf(&Subject); + + FreeStrBuf(&FlatSubject); + + /* else we won't modify the buffer, since the roomname is already here. */ /* Set the recipient of the list message to the * email address of the room itself. @@ -782,7 +807,6 @@ void network_spool_msg(long msgnum, void *userdata) { /* * Process client-side list participations for this room */ - instr_len = SIZ; if (sc->participates != NULL) { msg = CtdlFetchMessage(msgnum, 1); if (msg != NULL) { @@ -879,24 +903,24 @@ void network_spool_msg(long msgnum, void *userdata) { /* Check for valid node name */ if (is_valid_node(NULL, NULL, mptr->remote_nodename) != 0) { - CtdlLogPrintf(CTDL_ERR, "Invalid node <%s>\n", mptr->remote_nodename); + syslog(LOG_ERR, "Invalid node <%s>\n", mptr->remote_nodename); send = 0; } /* Check for split horizon */ - CtdlLogPrintf(CTDL_DEBUG, "Path is %s\n", msg->cm_fields['P']); + syslog(LOG_DEBUG, "Path is %s\n", msg->cm_fields['P']); bang = num_tokens(msg->cm_fields['P'], '!'); if (bang > 1) for (i=0; i<(bang-1); ++i) { extract_token(buf, msg->cm_fields['P'], i, '!', sizeof buf); - CtdlLogPrintf(CTDL_DEBUG, "Compare <%s> to <%s>\n", + syslog(LOG_DEBUG, "Compare <%s> to <%s>\n", buf, mptr->remote_nodename) ; if (!strcasecmp(buf, mptr->remote_nodename)) { send = 0; - CtdlLogPrintf(CTDL_DEBUG, "Not sending to %s\n", + syslog(LOG_DEBUG, "Not sending to %s\n", mptr->remote_nodename); } else { - CtdlLogPrintf(CTDL_DEBUG, "Sending to %s\n", mptr->remote_nodename); + syslog(LOG_DEBUG, "Sending to %s\n", mptr->remote_nodename); } } @@ -928,7 +952,7 @@ void network_spool_msg(long msgnum, void *userdata) { time(NULL), rand() ); - CtdlLogPrintf(CTDL_DEBUG, "Appending to %s\n", filename); + syslog(LOG_DEBUG, "Appending to %s\n", filename); fp = fopen(filename, "ab"); if (fp != NULL) { fwrite(sermsg.ser, @@ -936,7 +960,7 @@ void network_spool_msg(long msgnum, void *userdata) { fclose(fp); } else { - CtdlLogPrintf(CTDL_ERR, "%s: %s\n", filename, strerror(errno)); + syslog(LOG_ERR, "%s: %s\n", filename, strerror(errno)); } /* free the serialized version */ @@ -1115,19 +1139,20 @@ int writenfree_spoolcontrol_file(SpoolControl **scc, char *filename) TmpFD = open(tempfilename, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR); Cfg = NewStrBuf(); if ((TmpFD < 0) || (errno != 0)) { - CtdlLogPrintf(CTDL_CRIT, "ERROR: cannot open %s: %s\n", + syslog(LOG_CRIT, "ERROR: cannot open %s: %s\n", filename, strerror(errno)); free_spoolcontrol_struct(scc); unlink(tempfilename); } else { + fchown(TmpFD, config.c_ctdluid, 0); StrBufAppendPrintf(Cfg, "lastsent|%ld\n", sc->lastsent); - + /* Write out the listrecps while freeing from memory at the * same time. Am I clever or what? :) */ while (sc->listrecps != NULL) { - StrBufAppendPrintf(Cfg, "listrecp|%s\n", sc->listrecps->name); + StrBufAppendPrintf(Cfg, "listrecp|%s\n", sc->listrecps->name); nptr = sc->listrecps->next; free(sc->listrecps); sc->listrecps = nptr; @@ -1168,7 +1193,7 @@ int writenfree_spoolcontrol_file(SpoolControl **scc, char *filename) rename(tempfilename, filename); } else { - CtdlLogPrintf(CTDL_EMERG, + syslog(LOG_EMERG, "unable to write %s; [%s]; not enough space on the disk?\n", tempfilename, strerror(errno)); @@ -1226,7 +1251,7 @@ void network_spoolout_room(char *room_to_spool) { * queued for networking and then deleted before it can happen. */ if (CtdlGetRoom(&CC->room, room_to_spool) != 0) { - CtdlLogPrintf(CTDL_CRIT, "ERROR: cannot load <%s>\n", room_to_spool); + syslog(LOG_CRIT, "ERROR: cannot load <%s>\n", room_to_spool); return; } @@ -1239,7 +1264,7 @@ void network_spoolout_room(char *room_to_spool) { end_critical_section(S_NETCONFIGS); return; } - CtdlLogPrintf(CTDL_INFO, "Networking started for <%s>\n", CC->room.QRname); + syslog(LOG_INFO, "Networking started for <%s>\n", CC->room.QRname); /* If there are digest recipients, we have to build a digest */ if (sc->digestrecps != NULL) { @@ -1271,7 +1296,7 @@ void network_spoolout_room(char *room_to_spool) { } /* Now rewrite the config file */ - writenfree_spoolcontrol_file (&sc, filename); + writenfree_spoolcontrol_file(&sc, filename); end_critical_section(S_NETCONFIGS); } @@ -1335,7 +1360,7 @@ int network_sync_to(char *target_node) { /* Concise cleanup because we know there's only one node in the sc */ free(sc.ignet_push_shares); - CtdlLogPrintf(CTDL_NOTICE, "Synchronized %d messages to <%s>\n", + syslog(LOG_NOTICE, "Synchronized %d messages to <%s>\n", num_spooled, target_node); return(num_spooled); } @@ -1454,7 +1479,7 @@ void network_bounce(struct CtdlMessage *msg, char *reason) { static int serialnum = 0; size_t size; - CtdlLogPrintf(CTDL_DEBUG, "entering network_bounce()\n"); + syslog(LOG_DEBUG, "entering network_bounce()\n"); if (msg == NULL) return; @@ -1543,7 +1568,7 @@ void network_bounce(struct CtdlMessage *msg, char *reason) { /* Clean up */ if (valid != NULL) free_recipients(valid); CtdlFreeMessage(msg); - CtdlLogPrintf(CTDL_DEBUG, "leaving network_bounce()\n"); + syslog(LOG_DEBUG, "leaving network_bounce()\n"); } @@ -1567,13 +1592,13 @@ void network_process_buffer(char *buffer, long size) { unsigned char firstbyte; unsigned char lastbyte; - CtdlLogPrintf(CTDL_DEBUG, "network_process_buffer() processing %ld bytes\n", size); + syslog(LOG_DEBUG, "network_process_buffer() processing %ld bytes\n", size); /* Validate just a little bit. First byte should be FF and * last byte should be 00. */ firstbyte = buffer[0]; lastbyte = buffer[size-1]; if ( (firstbyte != 255) || (lastbyte != 0) ) { - CtdlLogPrintf(CTDL_ERR, "Corrupt message ignored. Length=%ld, firstbyte = %d, lastbyte = %d\n", + syslog(LOG_ERR, "Corrupt message ignored. Length=%ld, firstbyte = %d, lastbyte = %d\n", size, firstbyte, lastbyte); return; } @@ -1630,14 +1655,14 @@ void network_process_buffer(char *buffer, long size) { time(NULL), rand() ); - CtdlLogPrintf(CTDL_DEBUG, "Appending to %s\n", filename); + syslog(LOG_DEBUG, "Appending to %s\n", filename); fp = fopen(filename, "ab"); if (fp != NULL) { fwrite(sermsg.ser, sermsg.len, 1, fp); fclose(fp); } else { - CtdlLogPrintf(CTDL_ERR, "%s: %s\n", filename, strerror(errno)); + syslog(LOG_ERR, "%s: %s\n", filename, strerror(errno)); } free(sermsg.ser); CtdlFreeMessage(msg); @@ -1688,7 +1713,7 @@ void network_process_buffer(char *buffer, long size) { "Please check the address and try sending the message again.\n"); msg = NULL; free_recipients(recp); - CtdlLogPrintf(CTDL_DEBUG, "Bouncing message due to invalid recipient address.\n"); + syslog(LOG_DEBUG, "Bouncing message due to invalid recipient address.\n"); return; } strcpy(target_room, ""); /* no target room if mail */ @@ -1757,12 +1782,12 @@ void network_process_file(char *filename) { fp = fopen(filename, "rb"); if (fp == NULL) { - CtdlLogPrintf(CTDL_CRIT, "Error opening %s: %s\n", filename, strerror(errno)); + syslog(LOG_CRIT, "Error opening %s: %s\n", filename, strerror(errno)); return; } fseek(fp, 0L, SEEK_END); - CtdlLogPrintf(CTDL_INFO, "network: processing %ld bytes from %s\n", ftell(fp), filename); + syslog(LOG_INFO, "network: processing %ld bytes from %s\n", ftell(fp), filename); rewind(fp); /* Look for messages in the data stream and break them out */ @@ -1805,11 +1830,11 @@ void network_do_spoolin(void) { */ if (stat(ctdl_netin_dir, &statbuf)) return; if (statbuf.st_mtime == last_spoolin_mtime) { - CtdlLogPrintf(CTDL_DEBUG, "network: nothing in inbound queue\n"); + syslog(LOG_DEBUG, "network: nothing in inbound queue\n"); return; } last_spoolin_mtime = statbuf.st_mtime; - CtdlLogPrintf(CTDL_DEBUG, "network: processing inbound queue\n"); + syslog(LOG_DEBUG, "network: processing inbound queue\n"); /* * Ok, there's something interesting in there, so scan it. @@ -1865,9 +1890,9 @@ void network_consolidate_spoolout(void) { d->d_name ); - CtdlLogPrintf(CTDL_DEBUG, "Consolidate %s to %s\n", filename, nexthop); + syslog(LOG_DEBUG, "Consolidate %s to %s\n", filename, nexthop); if (network_talking_to(nexthop, NTT_CHECK)) { - CtdlLogPrintf(CTDL_DEBUG, + syslog(LOG_DEBUG, "Currently online with %s - skipping for now\n", nexthop ); @@ -1921,13 +1946,12 @@ void network_consolidate_spoolout(void) { * receive network spool from the remote system */ void receive_spool(int *sock, char *remote_nodename) { - long download_len = 0L; - long bytes_received = 0L; + int download_len = 0L; + int bytes_received = 0L; char buf[SIZ]; - static char pbuf[IGNET_PACKET_SIZE]; char tempfilename[PATH_MAX]; char permfilename[PATH_MAX]; - long plen; + int plen; FILE *fp; snprintf(tempfilename, @@ -1950,65 +1974,72 @@ void receive_spool(int *sock, char *remote_nodename) { if (sock_puts(sock, "NDOP") < 0) return; if (sock_getln(sock, buf, sizeof buf) < 0) return; - CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf); + syslog(LOG_DEBUG, "<%s\n", buf); if (buf[0] != '2') { return; } + download_len = extract_long(&buf[4], 0); + if (download_len <= 0) { + return; + } - if (download_len>0) { - bytes_received = 0L; - fp = fopen(tempfilename, "w"); - if (fp == NULL) { - CtdlLogPrintf(CTDL_CRIT, "cannot open download file locally: %s\n", - strerror(errno)); + bytes_received = 0L; + fp = fopen(tempfilename, "w"); + if (fp == NULL) { + syslog(LOG_CRIT, "Cannot create %s: %s\n", tempfilename, strerror(errno)); + return; + } + + syslog(LOG_DEBUG, "Expecting to transfer %d bytes\n", download_len); + while (bytes_received < download_len) { + /* + * If shutting down we can exit here and unlink the temp file. + * this shouldn't loose us any messages. + */ + if (server_shutting_down) + { + fclose(fp); + unlink(tempfilename); return; } - - CtdlLogPrintf(CTDL_DEBUG, "For this download we are expecting %d bytes\n", download_len); - while (bytes_received < download_len) { - /* - * If shutting down we can exit here and unlink the temp file. - * this shouldn't loose us any messages. - */ - if (CtdlThreadCheckStop()) - { - fclose(fp); - unlink(tempfilename); - return; - } - snprintf(buf, sizeof buf, "READ %ld|%ld", - bytes_received, - ((download_len - bytes_received > IGNET_PACKET_SIZE) - ? IGNET_PACKET_SIZE : (download_len - bytes_received))); - - if (sock_puts(sock, buf) < 0) { - fclose(fp); - unlink(tempfilename); - return; - } - if (sock_getln(sock, buf, sizeof buf) < 0) { + snprintf(buf, sizeof buf, "READ %d|%d", + bytes_received, + ((download_len - bytes_received > IGNET_PACKET_SIZE) + ? IGNET_PACKET_SIZE : (download_len - bytes_received)) + ); + + if (sock_puts(sock, buf) < 0) { + fclose(fp); + unlink(tempfilename); + return; + } + if (sock_getln(sock, buf, sizeof buf) < 0) { + fclose(fp); + unlink(tempfilename); + return; + } + + if (buf[0] == '6') { + plen = extract_int(&buf[4], 0); + StrBuf *pbuf = NewStrBuf(); + if (socket_read_blob(sock, pbuf, plen, CLIENT_TIMEOUT) != plen) { + syslog(LOG_INFO, "Short read from peer; aborting.\n"); fclose(fp); unlink(tempfilename); + FreeStrBuf(&pbuf); return; } - - if (buf[0] == '6') { - plen = extract_long(&buf[4], 0); - if (sock_read(sock, pbuf, plen, 1) < 0) { - fclose(fp); - unlink(tempfilename); - return; - } - fwrite((char *) pbuf, plen, 1, fp); - bytes_received = bytes_received + plen; - } + fwrite(ChrPtr(pbuf), plen, 1, fp); + bytes_received += plen; + FreeStrBuf(&pbuf); } - - fclose(fp); } + + fclose(fp); + /* Last chance for shutdown exit */ - if (CtdlThreadCheckStop()) + if (server_shutting_down) { unlink(tempfilename); return; @@ -2027,17 +2058,15 @@ void receive_spool(int *sock, char *remote_nodename) { return; } - CtdlLogPrintf(CTDL_DEBUG, "%s\n", buf); - if (download_len > 0) { - CtdlLogPrintf(CTDL_NOTICE, "Received %ld octets from <%s>\n", download_len, remote_nodename); - /* - * Now move the temp file to its permanent location. - */ - if (link(tempfilename, permfilename) != 0) { - CtdlLogPrintf(CTDL_ALERT, "Could not link %s to %s: %s\n", - tempfilename, permfilename, strerror(errno) - ); - } + syslog(LOG_DEBUG, "%s\n", buf); + + /* + * Now move the temp file to its permanent location. + */ + if (link(tempfilename, permfilename) != 0) { + syslog(LOG_ALERT, "Could not link %s to %s: %s\n", + tempfilename, permfilename, strerror(errno) + ); } unlink(tempfilename); @@ -2059,7 +2088,7 @@ void transmit_spool(int *sock, char *remote_nodename) if (sock_puts(sock, "NUOP") < 0) return; if (sock_getln(sock, buf, sizeof buf) < 0) return; - CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf); + syslog(LOG_DEBUG, "<%s\n", buf); if (buf[0] != '2') { return; } @@ -2072,7 +2101,7 @@ void transmit_spool(int *sock, char *remote_nodename) fd = open(sfname, O_RDONLY); if (fd < 0) { if (errno != ENOENT) { - CtdlLogPrintf(CTDL_CRIT, "cannot open %s: %s\n", sfname, strerror(errno)); + syslog(LOG_CRIT, "cannot open %s: %s\n", sfname, strerror(errno)); } return; } @@ -2081,7 +2110,7 @@ void transmit_spool(int *sock, char *remote_nodename) bytes_to_write = plen; while (bytes_to_write > 0L) { /* Exit if shutting down */ - if (CtdlThreadCheckStop()) + if (server_shutting_down) { close(fd); return; @@ -2114,7 +2143,7 @@ ABORTUPL: close(fd); /* Last chance for shutdown exit */ - if(CtdlThreadCheckStop()) + if(server_shutting_down) return; if (sock_puts(sock, "UCLS 1") < 0) return; @@ -2123,10 +2152,10 @@ ABORTUPL: * From here on we must complete or messages will get lost */ if (sock_getln(sock, buf, sizeof buf) < 0) return; - CtdlLogPrintf(CTDL_NOTICE, "Sent %ld octets to <%s>\n", bytes_written, remote_nodename); - CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf); + syslog(LOG_NOTICE, "Sent %ld octets to <%s>\n", bytes_written, remote_nodename); + syslog(LOG_DEBUG, "<%s\n", buf); if (buf[0] == '2') { - CtdlLogPrintf(CTDL_DEBUG, "Removing <%s>\n", sfname); + syslog(LOG_DEBUG, "Removing <%s>\n", sfname); unlink(sfname); } } @@ -2145,24 +2174,24 @@ void network_poll_node(char *node, char *secret, char *host, char *port) { if (network_talking_to(node, NTT_CHECK)) return; network_talking_to(node, NTT_ADD); - CtdlLogPrintf(CTDL_DEBUG, "network: polling <%s>\n", node); - CtdlLogPrintf(CTDL_NOTICE, "Connecting to <%s> at %s:%s\n", node, host, port); + syslog(LOG_DEBUG, "network: polling <%s>\n", node); + syslog(LOG_NOTICE, "Connecting to <%s> at %s:%s\n", node, host, port); sock = sock_connect(host, port); if (sock < 0) { - CtdlLogPrintf(CTDL_ERR, "Could not connect: %s\n", strerror(errno)); + syslog(LOG_ERR, "Could not connect: %s\n", strerror(errno)); network_talking_to(node, NTT_REMOVE); return; } - CtdlLogPrintf(CTDL_DEBUG, "Connected!\n"); - CCC->sReadBuf = NewStrBuf(); + syslog(LOG_DEBUG, "Connected!\n"); + CCC->SBuf.Buf = NewStrBuf(); CCC->sMigrateBuf = NewStrBuf(); - CCC->sPos = NULL; + CCC->SBuf.ReadWritePointer = NULL; /* Read the server greeting */ if (sock_getln(&sock, buf, sizeof buf) < 0) goto bail; - CtdlLogPrintf(CTDL_DEBUG, ">%s\n", buf); + syslog(LOG_DEBUG, ">%s\n", buf); /* Check that the remote is who we think it is and warn the Aide if not */ extract_token (connected_to, buf, 1, ' ', sizeof connected_to); @@ -2172,30 +2201,30 @@ void network_poll_node(char *node, char *secret, char *host, char *port) { "Connected to node \"%s\" but I was expecting to connect to node \"%s\".", connected_to, node ); - CtdlLogPrintf(CTDL_ERR, "%s\n", err_buf); + syslog(LOG_ERR, "%s\n", err_buf); CtdlAideMessage(err_buf, "Network error"); } else { /* We're talking to the correct node. Now identify ourselves. */ snprintf(buf, sizeof buf, "NETP %s|%s", config.c_nodename, secret); - CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf); + syslog(LOG_DEBUG, "<%s\n", buf); if (sock_puts(&sock, buf) <0) goto bail; if (sock_getln(&sock, buf, sizeof buf) < 0) goto bail; - CtdlLogPrintf(CTDL_DEBUG, ">%s\n", buf); + syslog(LOG_DEBUG, ">%s\n", buf); if (buf[0] != '2') { goto bail; } /* At this point we are authenticated. */ - if (!CtdlThreadCheckStop()) + if (!server_shutting_down) receive_spool(&sock, node); - if (!CtdlThreadCheckStop()) + if (!server_shutting_down) transmit_spool(&sock, node); } sock_puts(&sock, "QUIT"); bail: - FreeStrBuf(&CCC->sReadBuf); + FreeStrBuf(&CCC->SBuf.Buf); FreeStrBuf(&CCC->sMigrateBuf); if (sock != -1) sock_close(sock); @@ -2220,13 +2249,13 @@ void network_poll_other_citadel_nodes(int full_poll) { char spoolfile[256]; if (working_ignetcfg == NULL) { - CtdlLogPrintf(CTDL_DEBUG, "network: no neighbor nodes are configured - not polling.\n"); + syslog(LOG_DEBUG, "network: no neighbor nodes are configured - not polling.\n"); return; } /* Use the string tokenizer to grab one line at a time */ for (i=0; iname, sizeof spoolroomname); begin_critical_section(S_RPLIST); @@ -2367,7 +2397,7 @@ void network_do_queue(void) { } /* If there is anything in the inbound queue, process it */ - if (!CtdlThreadCheckStop()) { + if (!server_shutting_down) { network_do_spoolin(); } @@ -2380,7 +2410,7 @@ void network_do_queue(void) { network_consolidate_spoolout(); - CtdlLogPrintf(CTDL_DEBUG, "network: queue run completed\n"); + syslog(LOG_DEBUG, "network: queue run completed\n"); if (full_processing) { last_run = time(NULL); @@ -2417,7 +2447,7 @@ void cmd_netp(char *cmdbuf) "An unknown Citadel server called \"%s\" attempted to connect from %s [%s].\n", node, CC->cs_host, CC->cs_addr ); - CtdlLogPrintf(CTDL_WARNING, err_buf); + syslog(LOG_WARNING, "%s", err_buf); cprintf("%d authentication failed\n", ERROR + PASSWORD_REQUIRED); CtdlAideMessage(err_buf, "IGNet Networking."); return; @@ -2428,21 +2458,21 @@ void cmd_netp(char *cmdbuf) "A Citadel server at %s [%s] failed to authenticate as network node \"%s\".\n", CC->cs_host, CC->cs_addr, node ); - CtdlLogPrintf(CTDL_WARNING, err_buf); + syslog(LOG_WARNING, "%s", err_buf); cprintf("%d authentication failed\n", ERROR + PASSWORD_REQUIRED); CtdlAideMessage(err_buf, "IGNet Networking."); return; } if (network_talking_to(node, NTT_CHECK)) { - CtdlLogPrintf(CTDL_WARNING, "Duplicate session for network node <%s>", node); + syslog(LOG_WARNING, "Duplicate session for network node <%s>", node); cprintf("%d Already talking to %s right now\n", ERROR + RESOURCE_BUSY, node); return; } safestrncpy(CC->net_node, node, sizeof CC->net_node); network_talking_to(node, NTT_ADD); - CtdlLogPrintf(CTDL_NOTICE, "Network node <%s> logged in from %s [%s]\n", + syslog(LOG_NOTICE, "Network node <%s> logged in from %s [%s]\n", CC->net_node, CC->cs_host, CC->cs_addr ); cprintf("%d authenticated as network node '%s'\n", CIT_OK, CC->net_node); @@ -2455,24 +2485,6 @@ int network_room_handler (struct ctdlroom *room) return 0; } -void *ignet_thread(void *arg) { - struct CitContext ignet_thread_CC; - - CtdlLogPrintf(CTDL_DEBUG, "ignet_thread() initializing\n"); - CtdlFillSystemContext(&ignet_thread_CC, "IGnet Queue"); - citthread_setspecific(MyConKey, (void *)&ignet_thread_CC); - - while (!CtdlThreadCheckStop()) { - network_do_queue(); - CtdlThreadSleep(60); - } - - CtdlClearSystemContext(); - return(NULL); -} - - - /* * Module entry point @@ -2488,7 +2500,7 @@ CTDL_MODULE_INIT(network) CtdlRegisterProtoHook(cmd_nsyn, "NSYN", "Synchronize room to node"); CtdlRegisterRoomHook(network_room_handler); CtdlRegisterCleanupHook(destroy_network_queue_room); - CtdlThreadCreate("SMTP Send", CTDLTHREAD_BIGSTACK, ignet_thread, NULL); + CtdlRegisterSessionHook(network_do_queue, EVT_TIMER); } return "network"; }