ff624707408c15484dd1051169705489c714323c
[citadel.git] / citadel / utillib / citadel_dirs.c
1 /*
2  * citadel_dirs.c : calculate pathnames for various files used in the Citadel system
3  *
4  * Copyright (c) 1987-2012 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 #include <unistd.h>
15 #include <stdio.h>
16 #include <sys/stat.h>
17 #include <ctype.h>
18 #include <string.h>
19 #include <limits.h>
20
21 #if TIME_WITH_SYS_TIME
22 # include <sys/time.h>
23 # include <time.h>
24 #else
25 # if HAVE_SYS_TIME_H
26 #  include <sys/time.h>
27 # else
28 #  include <time.h>
29 # endif
30 #endif
31
32 #include <errno.h>
33 #include <libcitadel.h>
34
35
36 #include "citadel.h"
37
38 /* our directories... */
39 char ctdl_home_directory[PATH_MAX] = "";
40 char ctdl_bio_dir[PATH_MAX]="bio";
41 char ctdl_bb_dir[PATH_MAX]="bitbucket";
42 char ctdl_data_dir[PATH_MAX]="data";
43 char ctdl_dspam_dir[PATH_MAX]="dspam";
44 char ctdl_file_dir[PATH_MAX]="files";
45 char ctdl_hlp_dir[PATH_MAX]="help";
46 char ctdl_shared_dir[PATH_MAX]="";
47 char ctdl_image_dir[PATH_MAX]="images";
48 char ctdl_info_dir[PATH_MAX]="info";
49 char ctdl_key_dir[PATH_MAX]=SSL_DIR;
50 char ctdl_message_dir[PATH_MAX]="messages";
51 char ctdl_usrpic_dir[PATH_MAX]="userpics";
52 char ctdl_bbsbase_dir[PATH_MAX]="";
53 char ctdl_etc_dir[PATH_MAX]="";
54 char ctdl_autoetc_dir[PATH_MAX]="";
55 /* attention! this may be non volatile on some oses */
56 char ctdl_run_dir[PATH_MAX]="";
57 char ctdl_spool_dir[PATH_MAX]="network";
58 char ctdl_netout_dir[PATH_MAX]="network/spoolout";
59 char ctdl_netin_dir[PATH_MAX]="network/spoolin";
60 char ctdl_nettmp_dir[PATH_MAX]="network/spooltmp";
61 char ctdl_netcfg_dir[PATH_MAX]="netconfigs";
62 char ctdl_utilbin_dir[PATH_MAX]="";
63 char ctdl_sbin_dir[PATH_MAX]="";
64 char ctdl_bin_dir[PATH_MAX]="";
65
66 /* some of our files, that are needed in several places */
67 char file_citadel_control[PATH_MAX]="";
68 char file_citadel_config[PATH_MAX]="";
69 char file_citadel_urlshorteners[PATH_MAX]="";
70 char file_lmtp_socket[PATH_MAX]="";
71 char file_lmtp_unfiltered_socket[PATH_MAX]="";
72 char file_arcq[PATH_MAX]="";
73 char file_citadel_socket[PATH_MAX]="";
74 char file_citadel_admin_socket[PATH_MAX]="";
75 char file_mail_aliases[PATH_MAX]="";
76 char file_pid_file[PATH_MAX]="";
77 char file_pid_paniclog[PATH_MAX]="";
78 char file_crpt_file_key[PATH_MAX]="";
79 char file_crpt_file_csr[PATH_MAX]="";
80 char file_crpt_file_cer[PATH_MAX]="";
81 char file_chkpwd[PATH_MAX]="";
82 char file_base64[PATH_MAX]="";
83 char file_guesstimezone[PATH_MAX]="";
84 char file_funambol_msg[PATH_MAX] = "";
85 char file_dpsam_conf[PATH_MAX] = "";
86 char file_dspam_log[PATH_MAX] = "";
87
88
89
90
91
92 #define COMPUTE_DIRECTORY(SUBDIR) memcpy(dirbuffer,SUBDIR, sizeof dirbuffer);\
93         snprintf(SUBDIR,sizeof SUBDIR,  "%s%s%s%s%s%s%s", \
94                          (home&!relh)?ctdl_home_directory:basedir, \
95              ((basedir!=ctdldir)&(home&!relh))?basedir:"/", \
96              ((basedir!=ctdldir)&(home&!relh))?"/":"", \
97                          relhome, \
98              (relhome[0]!='\0')?"/":"",\
99                          dirbuffer,\
100                          (dirbuffer[0]!='\0')?"/":"");
101
102 #define DBG_PRINT(A) if (dbg==1) fprintf (stderr,"%s : %s \n", #A, A)
103
104
105 void calc_dirs_n_files(int relh, int home, const char *relhome, char  *ctdldir, int dbg)
106 {
107         const char* basedir = "";
108         char dirbuffer[PATH_MAX] = "";
109
110         /*
111          * Ok, we keep our binaries either in the citadel base dir,
112          * or in /usr/sbin / /usr/bin
113          */
114         StripSlashes(ctdldir, 1);
115 #ifdef HAVE_ETC_DIR
116         snprintf(ctdl_sbin_dir, sizeof ctdl_sbin_dir, "/usr/sbin/");
117         snprintf(ctdl_bin_dir, sizeof ctdl_bin_dir, "/usr/bin/");
118 #else
119         snprintf(ctdl_sbin_dir, sizeof ctdl_sbin_dir, ctdldir);
120         snprintf(ctdl_bin_dir, sizeof ctdl_bin_dir, ctdldir);
121 #endif
122         StripSlashes(ctdl_sbin_dir, 1);
123         StripSlashes(ctdl_bin_dir, 1);
124
125 #ifndef HAVE_AUTO_ETC_DIR
126         basedir=ctdldir;
127 #else
128         basedir=AUTO_ETC_DIR;
129 #endif
130         COMPUTE_DIRECTORY(ctdl_autoetc_dir);
131         StripSlashes(ctdl_autoetc_dir, 1);
132
133 #ifndef HAVE_ETC_DIR
134         basedir=ctdldir;
135 #else
136         basedir=ETC_DIR;
137 #endif
138         COMPUTE_DIRECTORY(ctdl_netcfg_dir);
139         COMPUTE_DIRECTORY(ctdl_etc_dir);
140         StripSlashes(ctdl_netcfg_dir, 1);
141         StripSlashes(ctdl_etc_dir, 1);
142
143 #ifndef HAVE_UTILBIN_DIR
144         basedir=ctdldir;
145 #else
146         basedir=UTILBIN_DIR;
147 #endif
148         COMPUTE_DIRECTORY(ctdl_utilbin_dir);
149         StripSlashes(ctdl_utilbin_dir, 1);
150
151 #ifndef HAVE_RUN_DIR
152         basedir=ctdldir;
153 #else
154         basedir=RUN_DIR;
155 #endif
156         COMPUTE_DIRECTORY(ctdl_run_dir);
157         StripSlashes(ctdl_run_dir, 1);
158
159 #ifndef HAVE_STATICDATA_DIR
160         basedir=ctdldir;
161 #else
162         basedir=STATICDATA_DIR;
163 #endif
164         COMPUTE_DIRECTORY(ctdl_message_dir);
165         StripSlashes(ctdl_message_dir, 1);
166
167 #ifndef HAVE_HELP_DIR
168         basedir=ctdldir;
169 #else
170         basedir=HELP_DIR;
171 #endif
172         COMPUTE_DIRECTORY(ctdl_hlp_dir);
173         StripSlashes(ctdl_hlp_dir, 1);
174         COMPUTE_DIRECTORY(ctdl_shared_dir);
175         StripSlashes(ctdl_shared_dir, 1);
176
177 #ifndef HAVE_DATA_DIR
178         basedir=ctdldir;
179 #else
180         basedir=DATA_DIR;
181 #endif
182         COMPUTE_DIRECTORY(ctdl_bio_dir);
183         COMPUTE_DIRECTORY(ctdl_bb_dir);
184         COMPUTE_DIRECTORY(ctdl_data_dir);
185         COMPUTE_DIRECTORY(ctdl_dspam_dir);
186         COMPUTE_DIRECTORY(ctdl_file_dir);
187         COMPUTE_DIRECTORY(ctdl_image_dir);
188         COMPUTE_DIRECTORY(ctdl_info_dir);
189         COMPUTE_DIRECTORY(ctdl_usrpic_dir);
190         COMPUTE_DIRECTORY(ctdl_bbsbase_dir);
191
192         StripSlashes(ctdl_bio_dir, 1);
193         StripSlashes(ctdl_bb_dir, 1);
194         StripSlashes(ctdl_data_dir, 1);
195         StripSlashes(ctdl_dspam_dir, 1);
196         StripSlashes(ctdl_file_dir, 1);
197         StripSlashes(ctdl_image_dir, 1);
198         StripSlashes(ctdl_info_dir, 1);
199         StripSlashes(ctdl_usrpic_dir, 1);
200         StripSlashes(ctdl_bbsbase_dir, 1);
201
202 #ifndef HAVE_SPOOL_DIR
203         basedir=ctdldir;
204 #else
205         basedir=SPOOL_DIR;
206 #endif
207         COMPUTE_DIRECTORY(ctdl_spool_dir);
208         COMPUTE_DIRECTORY(ctdl_netout_dir);
209         COMPUTE_DIRECTORY(ctdl_netin_dir);
210         COMPUTE_DIRECTORY(ctdl_nettmp_dir);
211
212         StripSlashes(ctdl_spool_dir, 1);
213         StripSlashes(ctdl_netout_dir, 1);
214         StripSlashes(ctdl_netin_dir, 1);
215         StripSlashes(ctdl_nettmp_dir, 1);
216
217         /* ok, now we know the dirs, calc some commonly used files */
218
219         snprintf(file_arcq, 
220                          sizeof file_arcq,
221                          "%srefcount_adjustments.dat",
222                          ctdl_autoetc_dir);
223         StripSlashes(file_arcq, 0);
224         snprintf(file_citadel_control, 
225                          sizeof file_citadel_control,
226                          "%scitadel.control",
227                          ctdl_autoetc_dir
228                          );
229         StripSlashes(file_citadel_control, 0);
230         snprintf(file_citadel_config, 
231                          sizeof file_citadel_config,
232                          "%scitadel.config",
233                          ctdl_autoetc_dir);
234         StripSlashes(file_citadel_config, 0);
235         snprintf(file_citadel_urlshorteners, 
236                          sizeof file_citadel_urlshorteners,
237                          "%scitadel_urlshorteners.rc",
238                          ctdl_etc_dir);
239         StripSlashes(file_citadel_urlshorteners, 0);
240         snprintf(file_lmtp_socket, 
241                          sizeof file_lmtp_socket,
242                          "%slmtp.socket",
243                          ctdl_run_dir);
244         StripSlashes(file_lmtp_socket, 0);
245         snprintf(file_lmtp_unfiltered_socket, 
246                          sizeof file_lmtp_socket,
247                          "%slmtp-unfiltered.socket",
248                          ctdl_run_dir);
249         StripSlashes(file_lmtp_unfiltered_socket, 0);
250         snprintf(file_citadel_socket, 
251                          sizeof file_citadel_socket,
252                                 "%scitadel.socket",
253                          ctdl_run_dir);
254         StripSlashes(file_citadel_socket, 0);
255         snprintf(file_citadel_admin_socket, 
256                          sizeof file_citadel_admin_socket,
257                                 "%scitadel-admin.socket",
258                          ctdl_run_dir);
259         StripSlashes(file_citadel_admin_socket, 0);
260         snprintf(file_pid_file, 
261                  sizeof file_pid_file,
262                  "%scitadel.pid",
263                  ctdl_run_dir);
264         StripSlashes(file_pid_file, 0);
265         snprintf(file_pid_paniclog, 
266                  sizeof file_pid_paniclog, 
267                  "%spanic.log",
268                  ctdl_home_directory);
269         StripSlashes(file_pid_paniclog, 0);
270         snprintf(file_crpt_file_key,
271                  sizeof file_crpt_file_key, 
272                  "%s/citadel.key",
273                  ctdl_key_dir);
274         StripSlashes(file_crpt_file_key, 0);
275         snprintf(file_crpt_file_csr,
276                  sizeof file_crpt_file_csr, 
277                  "%s/citadel.csr",
278                  ctdl_key_dir);
279         StripSlashes(file_crpt_file_csr, 0);
280         snprintf(file_crpt_file_cer,
281                  sizeof file_crpt_file_cer, 
282                  "%s/citadel.cer",
283                  ctdl_key_dir);
284         StripSlashes(file_crpt_file_cer, 0);
285         snprintf(file_chkpwd,
286                  sizeof file_chkpwd, 
287                  "%schkpwd",
288                  ctdl_utilbin_dir);
289         StripSlashes(file_chkpwd, 0);
290         snprintf(file_base64,
291                  sizeof file_base64,
292                  "%sbase64",
293                  ctdl_utilbin_dir);
294         StripSlashes(file_base64, 0);
295         snprintf(file_guesstimezone,
296                  sizeof file_guesstimezone,
297                  "%sguesstimezone.sh",
298                  ctdl_utilbin_dir);
299
300         snprintf(file_dpsam_conf,
301                  sizeof file_dpsam_conf,
302                  "%sdspam.conf",
303                  ctdl_etc_dir);
304         StripSlashes(file_dpsam_conf, 0);
305         snprintf(file_dspam_log, 
306                  sizeof file_dspam_log, 
307                  "%sdspam.log",
308                  ctdl_home_directory);
309         StripSlashes(file_dspam_log, 0);
310         /* 
311          * DIRTY HACK FOLLOWS! due to configs in the network dir in the 
312          * legacy installations, we need to calculate ifdeffed here.
313          */
314         snprintf(file_mail_aliases, 
315                  sizeof file_mail_aliases,
316                  "%smail.aliases",
317 #ifdef HAVE_ETC_DIR
318                  ctdl_etc_dir
319 #else
320                  ctdl_spool_dir
321 #endif
322                 );
323         StripSlashes(file_mail_aliases, 0);
324         snprintf(file_funambol_msg,
325                 sizeof file_funambol_msg,
326                 "%sfunambol_newmail_soap.xml",
327                 ctdl_shared_dir);
328         StripSlashes(file_funambol_msg, 0);
329
330         DBG_PRINT(ctdl_bio_dir);
331         DBG_PRINT(ctdl_bb_dir);
332         DBG_PRINT(ctdl_data_dir);
333         DBG_PRINT(ctdl_dspam_dir);
334         DBG_PRINT(ctdl_file_dir);
335         DBG_PRINT(ctdl_hlp_dir);
336         DBG_PRINT(ctdl_image_dir);
337         DBG_PRINT(ctdl_info_dir);
338         DBG_PRINT(ctdl_key_dir);
339         DBG_PRINT(ctdl_message_dir);
340         DBG_PRINT(ctdl_usrpic_dir);
341         DBG_PRINT(ctdl_etc_dir);
342         DBG_PRINT(ctdl_run_dir);
343         DBG_PRINT(ctdl_spool_dir);
344         DBG_PRINT(ctdl_netout_dir);
345         DBG_PRINT(ctdl_netin_dir);
346         DBG_PRINT(ctdl_nettmp_dir);
347         DBG_PRINT(ctdl_netcfg_dir);
348         DBG_PRINT(ctdl_bbsbase_dir);
349         DBG_PRINT(ctdl_sbin_dir);
350         DBG_PRINT(ctdl_bin_dir);
351         DBG_PRINT(ctdl_utilbin_dir);
352         DBG_PRINT(file_citadel_control);
353         DBG_PRINT(file_citadel_config);
354         DBG_PRINT(file_lmtp_socket);
355         DBG_PRINT(file_lmtp_unfiltered_socket);
356         DBG_PRINT(file_arcq);
357         DBG_PRINT(file_citadel_socket);
358         DBG_PRINT(file_mail_aliases);
359         DBG_PRINT(file_pid_file);
360         DBG_PRINT(file_pid_paniclog);
361         DBG_PRINT(file_crpt_file_key);
362         DBG_PRINT(file_crpt_file_csr);
363         DBG_PRINT(file_crpt_file_cer);
364         DBG_PRINT(file_chkpwd);
365         DBG_PRINT(file_base64);
366         DBG_PRINT(file_guesstimezone);
367         DBG_PRINT(file_funambol_msg);
368 }
369
370
371 /*
372  * Generate an associated file name for a room
373  */
374 size_t assoc_file_name(char *buf, size_t n,
375                      struct ctdlroom *qrbuf, const char *prefix)
376 {
377         return snprintf(buf, n, "%s%ld", prefix, qrbuf->QRnumber);
378 }
379
380
381 int create_dir(char *which, long ACCESS, long UID, long GID)
382 {
383         int rv;
384         rv = mkdir(which, ACCESS);
385         if ((rv == -1) && (errno == EEXIST))
386                 return rv;
387         rv = chmod(which, ACCESS);
388         if (rv == -1)
389                 return rv;
390         rv = chown(which, UID, GID);
391         return rv;
392 }
393
394 int create_run_directories(long UID, long GID)
395 {
396         int rv;
397
398         rv = create_dir(ctdl_info_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
399         if (rv != -1)
400                 rv = create_dir(ctdl_bio_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
401         if (rv != -1)
402                 rv = create_dir(ctdl_usrpic_dir  , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
403         if (rv != -1)
404                 rv = create_dir(ctdl_message_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
405         if (rv != -1)
406                 rv = create_dir(ctdl_hlp_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
407         if (rv != -1)
408                 rv = create_dir(ctdl_image_dir   , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
409         if (rv != -1)
410                 rv = create_dir(ctdl_bb_dir      , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
411         if (rv != -1)
412                 rv = create_dir(ctdl_file_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
413         if (rv != -1)
414                 rv = create_dir(ctdl_netcfg_dir  , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
415         if (rv != -1)
416                 rv = create_dir(ctdl_key_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
417         if (rv != -1)
418                 rv = create_dir(ctdl_run_dir     , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID);
419         return rv;
420 }