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