2 * This module delivers messages to mailing lists.
4 * Copyright (c) 2002-2021 by the citadel.org team
6 * This program is open source software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 3.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
24 #include <sys/types.h>
30 #include <libcitadel.h>
33 #include "citserver.h"
39 #include "internet_addressing.h"
40 #include "clientsocket.h"
41 #include "ctdl_module.h"
43 int doing_listdeliver = 0;
47 void listdeliver_sweep_room(struct ctdlroom *qrbuf, void *data) {
48 char *serialized_config = NULL;
54 serialized_config = LoadRoomNetConfigFile(qrbuf->QRnumber);
55 if (!serialized_config) {
56 syslog(LOG_DEBUG, "\033[31m %s has no netconfig \033[0m", qrbuf->QRname);
60 syslog(LOG_DEBUG, "\033[32m %s has a netconfig \033[0m", qrbuf->QRname);
62 config_lines = num_tokens(serialized_config, '\n');
63 for (i=0; i<config_lines; ++i) {
64 extract_token(buf, serialized_config, i, '\n', sizeof buf);
66 if (!strncasecmp(buf, "lastsent|", 9)) {
67 lastsent = atol(buf[9]);
68 syslog(LOG_DEBUG, "listdeliver: last message delivered = %ld", lastsent);
74 syslog(LOG_DEBUG, "%s", buf);
78 free(serialized_config);
83 void listdeliver_sweep(void) {
84 static time_t last_run = 0L;
87 * Run mailing list delivery no more frequently than once every 15 minutes (we should make this configurable)
89 if ( (time(NULL) - last_run) < 900 ) {
94 * This is a simple concurrency check to make sure only one listdeliver
95 * run is done at a time. We could do this with a mutex, but since we
96 * don't really require extremely fine granularity here, we'll do it
97 * with a static variable instead.
99 if (doing_listdeliver) return;
100 doing_listdeliver = 1;
103 * Go through each room looking for mailing lists to process
105 syslog(LOG_DEBUG, "listdeliver: sweep started");
106 CtdlForEachRoom(listdeliver_sweep_room, NULL);
107 syslog(LOG_DEBUG, "listdeliver: ended");
108 last_run = time(NULL);
109 doing_listdeliver = 0;
117 CTDL_MODULE_INIT(listdeliver)
121 CtdlRegisterSessionHook(listdeliver_sweep, EVT_TIMER, PRIO_AGGR + 50);
124 /* return our module name for the log */