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