2fe3bcec50dd898371908f2f62e7c9a36c7d030c
[citadel.git] / citadel / modules / listdeliver / serv_listdeliver.c
1 /*
2  * This module delivers messages to mailing lists.
3  *
4  * Copyright (c) 2002-2021 by the citadel.org team
5  *
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.
8  *  
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.
13  */
14
15 #include "sysdep.h"
16 #include <stdlib.h>
17 #include <unistd.h>
18 #include <stdio.h>
19 #include <fcntl.h>
20 #include <ctype.h>
21 #include <signal.h>
22 #include <pwd.h>
23 #include <errno.h>
24 #include <sys/types.h>
25 #include <dirent.h>
26 #include <time.h>
27 #include <sys/wait.h>
28 #include <string.h>
29 #include <limits.h>
30 #include <libcitadel.h>
31 #include "citadel.h"
32 #include "server.h"
33 #include "citserver.h"
34 #include "support.h"
35 #include "config.h"
36 #include "user_ops.h"
37 #include "database.h"
38 #include "msgbase.h"
39 #include "internet_addressing.h"
40 #include "clientsocket.h"
41 #include "ctdl_module.h"
42
43 int doing_listdeliver = 0;
44
45
46
47 void listdeliver_sweep_room(struct ctdlroom *qrbuf, void *data) {
48 }
49
50
51
52 void listdeliver_sweep(void) {
53         static time_t last_run = 0L;
54
55         /*
56          * Run mailing list delivery no more frequently than once every 15 minutes (we should make this configurable)
57          */
58         if ( (time(NULL) - last_run) < 900 ) {
59                 return;
60         }
61
62         /*
63          * This is a simple concurrency check to make sure only one listdeliver
64          * run is done at a time.  We could do this with a mutex, but since we
65          * don't really require extremely fine granularity here, we'll do it
66          * with a static variable instead.
67          */
68         if (doing_listdeliver) return;
69         doing_listdeliver = 1;
70
71         /*
72          * Go through each room looking for mailing lists to process
73          */
74         syslog(LOG_DEBUG, "listdeliver: sweep started");
75         CtdlForEachRoom(listdeliver_sweep_room, NULL);
76         syslog(LOG_DEBUG, "listdeliver: ended");
77         last_run = time(NULL);
78         doing_listdeliver = 0;
79 }
80
81
82
83 /*
84  * Module entry point
85  */
86 CTDL_MODULE_INIT(listdeliver)
87 {
88         if (!threading)
89         {
90                 CtdlRegisterSessionHook(listdeliver_sweep, EVT_TIMER, PRIO_AGGR + 50);
91         }
92         
93         /* return our module name for the log */
94         return "listsub";
95 }