centralized filename calculation
authorWilfried Göesgens <willi@citadel.org>
Mon, 16 Jan 2006 15:32:15 +0000 (15:32 +0000)
committerWilfried Göesgens <willi@citadel.org>
Mon, 16 Jan 2006 15:32:15 +0000 (15:32 +0000)
21 files changed:
citadel/Makefile.in
citadel/aidepost.c
citadel/citadel.c
citadel/citadel_dirs.c [new file with mode: 0644]
citadel/citadel_dirs.h [new file with mode: 0644]
citadel/citmail.c
citadel/commands.c
citadel/config.c
citadel/config.h
citadel/control.c
citadel/file_ops.c
citadel/msgbase.c
citadel/room_ops.c
citadel/room_ops.h
citadel/rooms.c
citadel/sendcommand.c
citadel/serv_listsub.c
citadel/serv_network.c
citadel/serv_smtp.c
citadel/server_main.c
citadel/setup.c

index 06d1469ac279927f3716a21854efb13193e61b9d..0794907a61762a96e8a0a4679220f08d7d6be71c 100644 (file)
@@ -51,7 +51,7 @@ SERV_MODULES=serv_chat.o \
        serv_calendar.o \
        ical_dezonify.o \
        serv_ldap.o \
-       serv_autocompletion.o
+       serv_autocompletion.o 
 
 UTIL_TARGETS=aidepost msgform \
        citmail userlist sendcommand \
@@ -102,7 +102,7 @@ SOURCES=aidepost.c auth.c base64.c chkpwd.c citadel.c citadel_ipc.c \
        serv_vandelay.c serv_vcard.c server_main.c setup.c snprintf.c \
        stress.c support.c sysdep.c tools.c user_ops.c userlist.c \
        whobbs.c vcard.c serv_notes.c serv_fulltext.c ft_wordbreaker.c \
-       crc16.c journaling.c
+       crc16.c journaling.c citadel_dirs.c
 
 DEP_FILES=$(SOURCES:.c=.d)
 
@@ -146,17 +146,17 @@ citserver: $(SERV_OBJS)
        $(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) -c $< -o $@
 
 aidepost: aidepost.o config.o
-       $(CC) aidepost.o config.o $(LDFLAGS) -o aidepost $(LIBS)
+       $(CC) aidepost.o config.o citadel_dirs.o $(LDFLAGS) -o aidepost $(LIBS)
 
-citmail: citmail.o config.o
-       $(CC) citmail.o config.o $(LDFLAGS) -o citmail $(LIBS)
+citmail: citmail.o config.o citadel_dirs.o
+       $(CC) citmail.o config.o citadel_dirs.o $(LDFLAGS) -o citmail $(LIBS)
 
 # setup does need LIBS defined, because it uses network functions which are in -lsocket -lnsl on Solaris.
-setup: setup.o tools.o
-       $(CC) setup.o tools.o $(LDFLAGS) -o setup $(LIBS) $(SETUP_LIBS)
+setup: setup.o tools.o citadel_dirs.o
+       $(CC) setup.o tools.o citadel_dirs.o $(LDFLAGS) -o setup $(LIBS) $(SETUP_LIBS)
 
-chkpwd: chkpwd.o auth.o config.o
-       $(CC) chkpwd.o auth.o config.o $(LDFLAGS) -o chkpwd $(chkpwd_LIBS)
+chkpwd: chkpwd.o auth.o config.o citadel_dirs.o
+       $(CC) chkpwd.o auth.o config.o citadel_dirs.o $(LDFLAGS) -o chkpwd $(chkpwd_LIBS)
 
 whobbs$(EXEEXT): whobbs.o ipc_c_tcp.o tools.o citadel_ipc.o $(LIBOBJS)
        $(CC) whobbs.o ipc_c_tcp.o tools.o citadel_ipc.o  $(LIBOBJS) $(LDFLAGS) -o whobbs $(LIBS)
@@ -165,7 +165,7 @@ stress$(EXEEXT): stress.o ipc_c_tcp.o tools.o citadel_ipc.o $(LIBOBJS)
        $(CC) stress.o ipc_c_tcp.o tools.o citadel_ipc.o $(LIBOBJS) $(LDFLAGS) -o stress $(LIBS)
 
 sendcommand: sendcommand.o ipc_c_tcp.o citadel_ipc.o tools.o config.o $(LIBOBJS)
-       $(CC) sendcommand.o ipc_c_tcp.o citadel_ipc.o tools.o config.o \
+       $(CC) sendcommand.o ipc_c_tcp.o citadel_ipc.o tools.o config.o citadel_dirs.o \
         $(LIBOBJS) $(LDFLAGS) -o sendcommand $(LIBS)
 
 base64: base64.o
index 0824189497432b6c29546884b3e374e9af0ba75d..3e60dc97664b97b49aba54b47c66574674534300 100644 (file)
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <string.h>
 #include "citadel.h"
+#include "citadel_dirs.h"
 #include "config.h"
 
 #ifndef HAVE_SNPRINTF
@@ -77,6 +78,15 @@ int main(int argc, char **argv)
        int ch;
        int i;
 
+       int relh=0;
+       int home=0;
+       char relhome[PATH_MAX]="";
+       char ctdldir[PATH_MAX]=CTDLDIR;
+
+       /* TODO: should we be able to calculate relative dirs? */
+       calc_dirs_n_files(relh, home, relhome, ctdldir);
+
+
        get_config();
 
        strcpy(target_room, "Aide");
index ac21ebc9011695c8482d6569f899762181fd6207..6779f8978c8b825a245f87a9eb02d22839be2f53 100644 (file)
@@ -50,6 +50,7 @@
 #include "snprintf.h"
 #endif
 #include "screen.h"
+#include "citadel_dirs.h"
 
 #include "md5.h"
 
@@ -1122,13 +1123,7 @@ int main(int argc, char **argv)
                         * guaranteed to have the uid/gid we want.
                         */
                        if (!getuid() || !getgid()) {
-                               if (stat(
-#ifndef HAVE_ETC_DIR
-                                                CTDLDIR 
-#else
-                                                ETC_DIR
-#endif
-                                                "/citadel.config", &st) < 0) {
+                               if (stat(file_citadel_config, &st) < 0) {
                                        perror("couldn't stat citadel.config");
                                        logoff(NULL, 3);
                                }
diff --git a/citadel/citadel_dirs.c b/citadel/citadel_dirs.c
new file mode 100644 (file)
index 0000000..424ca8a
--- /dev/null
@@ -0,0 +1,162 @@
+#include "sysdep.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <ctype.h>
+#include <string.h>
+#include <limits.h>
+
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include <errno.h>
+
+
+
+#include "citadel.h"
+
+/* our directories... */
+char ctdl_home_directory[PATH_MAX] = "";
+char ctdl_bio_dir[PATH_MAX]="bio";
+char ctdl_bb_dir[PATH_MAX]="bitbucket";
+char ctdl_data_dir[PATH_MAX]="data";
+char ctdl_file_dir[PATH_MAX]="files";
+char ctdl_hlp_dir[PATH_MAX]="help";
+char ctdl_image_dir[PATH_MAX]="images";
+char ctdl_info_dir[PATH_MAX]="info";
+char ctdl_key_dir[PATH_MAX]="keys";
+char ctdl_message_dir[PATH_MAX]="messages";
+char ctdl_usrpic_dir[PATH_MAX]="userpics";
+char ctdl_etc_dir[PATH_MAX]="";
+char ctdl_run_dir[PATH_MAX]="";
+char ctdl_spool_dir[PATH_MAX]="network";
+char ctdl_netout_dir[PATH_MAX]="network/spoolout";
+char ctdl_netin_dir[PATH_MAX]="network/spoolin";
+char ctdl_netcfg_dir[PATH_MAX]="netconfigs";
+
+/* some of our files, that are needed in several places */
+char file_citadel_control[PATH_MAX]="";
+char file_citadel_rc[PATH_MAX]="";
+char file_citadel_config[PATH_MAX]="";
+char file_lmtp_socket[PATH_MAX]="";
+char file_lmtp_unfiltered_socket[PATH_MAX]="";
+
+int home_specified = 0;
+
+
+
+
+
+
+
+
+
+       /* calculate all our path on a central place */
+    /* where to keep our config */
+       
+#define COMPUTE_DIRECTORY(SUBDIR) memcpy(dirbuffer,SUBDIR, sizeof dirbuffer);\
+       snprintf(SUBDIR,sizeof SUBDIR,  "%s%s%s%s%s%s%s", \
+                        (home&!relh)?ctdl_home_directory:basedir, \
+             ((basedir!=ctdldir)&(home&!relh))?basedir:"/", \
+             ((basedir!=ctdldir)&(home&!relh))?"/":"", \
+                        relhome, \
+             (relhome[0]!='\0')?"/":"",\
+                        dirbuffer,\
+                        (dirbuffer[0]!='\0')?"/":"");
+
+void calc_dirs_n_files(int relh, int home, const char *relhome,const char  *ctdldir)
+{
+       const char* basedir;
+       char dirbuffer[PATH_MAX]="";
+
+
+
+
+#ifndef HAVE_ETC_DIR
+       basedir=ctdldir;
+#else
+       basedir=ETC_DIR;
+#endif
+       COMPUTE_DIRECTORY(ctdl_netcfg_dir);
+       COMPUTE_DIRECTORY(ctdl_etc_dir);
+
+#ifndef HAVE_RUN_DIR
+       basedir=ctdldir;
+#else
+       basedir=RUN_DIR;
+#endif
+       COMPUTE_DIRECTORY(ctdl_run_dir);
+
+#ifndef HAVE_DATA_DIR
+       basedir=ctdldir;
+#else
+       basedir=DATA_DIR;
+#endif
+       COMPUTE_DIRECTORY(ctdl_bio_dir);
+       COMPUTE_DIRECTORY(ctdl_bb_dir);
+       COMPUTE_DIRECTORY(ctdl_data_dir);
+       COMPUTE_DIRECTORY(ctdl_file_dir);
+       COMPUTE_DIRECTORY(ctdl_hlp_dir);
+       COMPUTE_DIRECTORY(ctdl_image_dir);
+       COMPUTE_DIRECTORY(ctdl_info_dir);
+       COMPUTE_DIRECTORY(ctdl_message_dir);
+       COMPUTE_DIRECTORY(ctdl_usrpic_dir);
+#ifndef HAVE_SPOOL_DIR
+       basedir=ctdldir;
+#else
+       basedir=SPOOL_DIR;
+#endif
+       COMPUTE_DIRECTORY(ctdl_spool_dir);
+       COMPUTE_DIRECTORY(ctdl_netout_dir);
+       COMPUTE_DIRECTORY(ctdl_netin_dir);
+
+       /* ok, now we know the dirs, calc some commonly used files */
+
+       snprintf(file_citadel_control, 
+                        sizeof file_citadel_control,
+                        "%scitadel.control",
+                        ctdl_etc_dir
+                        );
+
+       snprintf(file_citadel_config, 
+                        sizeof file_citadel_config,
+                        "%scitadel.config",
+                        ctdl_etc_dir);
+
+       snprintf(file_citadel_rc, 
+                        sizeof file_citadel_rc,
+                        "%scitadel.rc",
+                        ctdl_etc_dir);
+
+       snprintf(file_lmtp_socket, 
+                        sizeof file_lmtp_socket,
+                        "%slmtp.socket",
+                        ctdl_run_dir);
+
+       snprintf(file_lmtp_unfiltered_socket, 
+                        sizeof file_lmtp_socket,
+                        "%slmtp-unfiltered.sock",
+                        ctdl_run_dir);
+
+}
+
+
+/*
+ * Generate an associated file name for a room
+ */
+void assoc_file_name(char *buf, size_t n,
+                    struct ctdlroom *qrbuf, const char *prefix)
+{
+       snprintf(buf, n, "%s%ld", prefix, qrbuf->QRnumber);
+}
+
diff --git a/citadel/citadel_dirs.h b/citadel/citadel_dirs.h
new file mode 100644 (file)
index 0000000..9e6b30f
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef __CITADEL_DIRS_H
+#define __CITADEL_DIRS_H
+
+#include <limits.h>
+
+
+extern char ctdl_home_directory[PATH_MAX];
+extern int home_specified;
+
+
+/* all our directories */
+extern char ctdl_bio_dir[PATH_MAX];
+extern char ctdl_bb_dir[PATH_MAX];
+extern char ctdl_data_dir[PATH_MAX];
+extern char ctdl_file_dir[PATH_MAX];
+extern char ctdl_hlp_dir[PATH_MAX];
+extern char ctdl_image_dir[PATH_MAX];
+extern char ctdl_info_dir[PATH_MAX];
+extern char ctdl_key_dir[PATH_MAX];
+extern char ctdl_message_dir[PATH_MAX];
+extern char ctdl_usrpic_dir[PATH_MAX];
+extern char ctdl_etc_dir[PATH_MAX];
+extern char ctdl_run_dir[PATH_MAX];
+extern char ctdl_spool_dir[PATH_MAX];
+extern char ctdl_netout_dir[PATH_MAX];
+extern char ctdl_netin_dir[PATH_MAX];
+extern char ctdl_netcfg_dir[PATH_MAX];
+
+/* some of the frequently used files */
+extern char file_citadel_control[PATH_MAX];
+extern char file_citadel_rc[PATH_MAX];
+extern char file_citadel_config[PATH_MAX];
+extern char file_lmtp_socket[PATH_MAX];
+extern char file_lmtp_unfiltered_socket[PATH_MAX];
+
+
+extern void calc_dirs_n_files(int relh, int home, const char *relhome,const char  *ctdldir);
+
+
+void assoc_file_name(char *buf, size_t n,
+                    struct ctdlroom *qrbuf, const char *prefix);
+
+#endif /* __CITADEL_DIRS_H */
index 69af5958f036a5b79aba20bd4bd608b43f84fa09..09b6c93479614b39e9b52826819d257713cc7ebf 100644 (file)
@@ -27,6 +27,7 @@
 #include "snprintf.h"
 #endif
 #include "config.h"
+#include "citadel_dirs.h"
 
 /* #define DEBUG  */   /* uncomment to get protocol traces */
 
@@ -175,6 +176,13 @@ int main(int argc, char **argv) {
        struct passwd *pw;
        int from_header = 0;
        int in_body = 0;
+       int relh=0;
+       int home=0;
+       char relhome[PATH_MAX]="";
+       char ctdldir[PATH_MAX]=CTDLDIR;
+
+       /* TODO: should we be able to calculate relative dirs? */
+       calc_dirs_n_files(relh, home, relhome, ctdldir);
 
        get_config();
 
@@ -203,13 +211,7 @@ int main(int argc, char **argv) {
        }
        strip_trailing_nonprint(fromline);
 
-       serv_sock = uds_connectsock(
-#ifndef HAVE_RUN_DIR
-                                                  "."
-#else
-                                                  RUN_DIR
-#endif
-                                                  "/lmtp.socket");
+       serv_sock = uds_connectsock(file_lmtp_socket);
        serv_gets(buf);
        if (buf[0]!='2') cleanup(1);
 
index 17cb60853a9343c015602885ae92b42d18b5bb65..d81f41ca7039a98a8610643c4085f25f6b619d5e 100644 (file)
@@ -53,6 +53,7 @@
 #include "tools.h"
 #include "rooms.h"
 #include "client_chat.h"
+#include "citadel_dirs.c"
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
 #endif
@@ -763,18 +764,10 @@ void load_command_set(void)
 
        ccfile = NULL;
        if (getenv("HOME") != NULL) {
-               snprintf(buf, sizeof buf, "%s/.citadelrc", getenv("HOME"));
-               ccfile = fopen(buf, "r");
+               ccfile = fopen(file_citadel_rc, "r");
        }
        if (ccfile == NULL) {
-               snprintf(buf, sizeof buf, 
-#ifndef HAVE_ETC_DIR
-                                CTDLDIR
-#else
-                                ETC_DIR
-#endif
-                                "/citadel.rc");
-               ccfile = fopen(buf, "r");
+               ccfile = fopen(file_citadel_rc, "r");
        }
        if (ccfile == NULL) {
                ccfile = fopen("/etc/citadel.rc", "r");
index 66c09b327937b4d1de6f6b6d55d6411128c2ca35..747134506c931ab84798027c622fa211b0ab6ecd 100644 (file)
 #include "config.h"
 
 struct config config;
-/* CTDLDIR */
-char ctdl_home_directory[PATH_MAX] = "";
-char ctdl_bio_dir[PATH_MAX]="bio";
-char ctdl_bb_dir[PATH_MAX]="bitbucket";
-char ctdl_data_dir[PATH_MAX]="data";
-char ctdl_file_dir[PATH_MAX]="files";
-char ctdl_hlp_dir[PATH_MAX]="help";
-char ctdl_image_dir[PATH_MAX]="images";
-char ctdl_info_dir[PATH_MAX]="info";
-char ctdl_key_dir[PATH_MAX]="keys";
-char ctdl_message_dir[PATH_MAX]="messages";
-char ctdl_usrpic_dir[PATH_MAX]="userpics";
-char ctdl_etc_dir[PATH_MAX]="";
-char ctdl_run_dir[PATH_MAX]="";
-char ctdl_spool_dir[PATH_MAX]="network";
-char ctdl_netout_dir[PATH_MAX]="network/spoolout";
-char ctdl_netin_dir[PATH_MAX]="network/spoolin";
-
-int home_specified = 0;
 
 /*
  * get_config() is called during the initialization of any program which
@@ -58,29 +39,24 @@ void get_config(void) {
                        strerror(errno));
                exit(1);
        }
-       cfp = fopen(
-#ifndef HAVE_ETC_DIR
-                               "."
-#else
-                               ETC_DIR
-#endif
-                               "/citadel.config", "rb");
+       cfp = fopen(file_citadel_config, "rb");
        if (cfp == NULL) {
                fprintf(stderr, "This program could not be started.\n"
-                       "Unable to open %s/citadel.config\n"
-                       "Error: %s\n",
-                       (home_specified ? ctdl_home_directory : CTDLDIR),
-                       strerror(errno));
+                               "Unable to open %s\n"
+                               "Error: %s\n",
+                               file_citadel_config,
+                               strerror(errno));
                exit(1);
        }
        fread((char *) &config, sizeof(struct config), 1, cfp);
        if (fstat(fileno(cfp), &st)) {
-               perror("citadel.config");
+               perror(file_citadel_config);
                exit(1);
        }
 #ifndef __CYGWIN__
        if (st.st_uid != CTDLUID || st.st_mode != (S_IFREG | S_IRUSR | S_IWUSR)) {
-               fprintf(stderr, "check the permissions on citadel.config\n");
+               fprintf(stderr, "check the permissions on %s\n", file_citadel_config);
+               //              fprintf(stderr, "check the permissions on citadel.config\n");
                exit(1);
        }
 #endif
@@ -135,14 +111,8 @@ void put_config(void)
 {
        FILE *cfp;
 
-       if ((cfp = fopen(
-#ifndef HAVE_ETC_DIR
-                                        "."
-#else
-                                        ETC_DIR
-#endif
-                                        "/citadel.config", "rb+")) == NULL)
-               perror("citadel.config");
+       if ((cfp = fopen(file_citadel_config, "rb+")) == NULL)
+               perror(file_citadel_config);
        else {
                fwrite((char *) &config, sizeof(struct config), 1, cfp);
                fclose(cfp);
index 2550102c07d26d9162b4c1d3af20d5842b7980cd..c9289f96092074de352e705ce8be1c67113367d0 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 #include "serv_extensions.h"
-
+#include "citadel_dirs.h"
 /* 
  * Global system configuration.
  * 
@@ -78,27 +78,4 @@ struct config {
 void get_config(void);
 void put_config(void);
 extern struct config config;
-extern char ctdl_home_directory[PATH_MAX];
-extern int home_specified;
-
-
-
-extern char ctdl_bio_dir[PATH_MAX];
-extern char ctdl_bb_dir[PATH_MAX];
-extern char ctdl_data_dir[PATH_MAX];
-extern char ctdl_file_dir[PATH_MAX];
-extern char ctdl_hlp_dir[PATH_MAX];
-extern char ctdl_image_dir[PATH_MAX];
-extern char ctdl_info_dir[PATH_MAX];
-extern char ctdl_key_dir[PATH_MAX];
-extern char ctdl_message_dir[PATH_MAX];
-extern char ctdl_usrpic_dir[PATH_MAX];
-extern char ctdl_etc_dir[PATH_MAX];
-extern char ctdl_run_dir[PATH_MAX];
-extern char ctdl_spool_dir[PATH_MAX];
-extern char ctdl_netout_dir[PATH_MAX];
-extern char ctdl_netin_dir[PATH_MAX];
-
-
-
 
index 6704c3edcbb91e91e32d9ef1550cac39936cee08..2260fa5617e716aec948d95edee1c1b509566206 100644 (file)
@@ -60,25 +60,13 @@ void get_control(void)
         */
        memset(&CitControl, 0, sizeof(struct CitControl));
        if (control_fp == NULL) {
-               control_fp = fopen(
-#ifndef HAVE_DATA_DIR
-                                                  "."
-#else
-                                                  DATA_DIR
-#endif
-                                                  "/citadel.control", "rb+");
+               control_fp = fopen(file_citadel_control, "rb+");
                if (control_fp != NULL) {
                        fchown(fileno(control_fp), config.c_ctdluid, -1);
                }
        }
        if (control_fp == NULL) {
-               control_fp = fopen(
-#ifndef HAVE_DATA_DIR
-                                                  "."
-#else
-                                                  DATA_DIR
-#endif
-                                                  "/citadel.control", "wb+");
+               control_fp = fopen(file_citadel_control, "wb+");
                if (control_fp != NULL) {
                        fchown(fileno(control_fp), config.c_ctdluid, -1);
                        memset(&CitControl, 0, sizeof(struct CitControl));
@@ -88,8 +76,9 @@ void get_control(void)
                }
        }
        if (control_fp == NULL) {
-               lprintf(CTDL_ALERT, "ERROR opening citadel.control: %s\n",
-                       strerror(errno));
+               lprintf(CTDL_ALERT, "ERROR opening %s: %s\n",
+                               file_citadel_control,
+                               strerror(errno));
                return;
        }
 
index 926d7b357f700afa2143ada8d7b0ec982e3e91ca..e5c442515644b4c5907b70cb5835eacd149c3cd0 100644 (file)
@@ -432,7 +432,7 @@ void cmd_oimg(char *cmdbuf)
                                 "%s/floor.%d.gif",
                                 ctdl_image_dir, which_floor);
        } else if (!strcasecmp(filename, "_roompic_")) {
-               assoc_file_name(pathname, sizeof pathname, &CC->room, "images");
+               assoc_file_name(pathname, sizeof pathname, &CC->room, ctdl_image_dir);
        } else {
                for (a = 0; a < strlen(filename); ++a) {
                        filename[a] = tolower(filename[a]);
@@ -576,7 +576,7 @@ void cmd_uimg(char *cmdbuf)
        }
 
        if ((!strcasecmp(basenm, "_roompic_")) && (is_room_aide())) {
-               assoc_file_name(CC->upl_path, sizeof CC->upl_path, &CC->room, "images");
+               assoc_file_name(CC->upl_path, sizeof CC->upl_path, &CC->room, ctdl_image_dir);
        }
 
        if (strlen(CC->upl_path) == 0) {
index 2af13d95e80c9e99e73b53d6937ca3942a64e01d..a8e5e31eacf6a91f0677ab619e69dd8a7d07ca00 100644 (file)
@@ -150,7 +150,7 @@ int alias(char *name)
         */
                snprintf(filename, 
                                 sizeof filename,
-                                "%s/mail.aliases",
+                                "%smail.aliases",
 #ifndef HAVE_ETG_DIR
                                 ctdl_spool_dir
 #else
@@ -251,18 +251,12 @@ int alias(char *name)
 void get_mm(void)
 {
        FILE *fp;
-       char filename[256];
-
-       snprintf(filename, 
-                        sizeof filename,
-                        "%s/citadel.control",
-                        ctdl_etc_dir
-                        );
 
-       fp = fopen(filename, "r");
+       fp = fopen(file_citadel_control, "r");
        if (fp == NULL) {
-               lprintf(CTDL_CRIT, "Cannot open citadel.control: %s\n",
-                       strerror(errno));
+               lprintf(CTDL_CRIT, "Cannot open %s: %s\n",
+                               file_citadel_control,
+                               strerror(errno));
                exit(errno);
        }
        fread((char *) &CitControl, sizeof(struct CitControl), 1, fp);
index ea4fc1a0808f8ab3e2c9700c4a9a74c0e606c2c2..a0fd868800c9a33ccdfa414936eb50a149d0c94f 100644 (file)
@@ -39,6 +39,7 @@
 #include "citserver.h"
 #include "control.h"
 #include "tools.h"
+#include "citadel_dirs.h"
 
 struct floor *floorcache[MAXFLOORS];
 
@@ -1513,15 +1514,6 @@ void cmd_seta(char *new_ra)
        cprintf("%d Ok\n", CIT_OK);
 }
 
-/*
- * Generate an associated file name for a room
- */
-void assoc_file_name(char *buf, size_t n,
-                    struct ctdlroom *qrbuf, const char *prefix)
-{
-       snprintf(buf, n, "./%s/%ld", prefix, qrbuf->QRnumber);
-}
-
 /* 
  * retrieve info file for this room
  */
@@ -1531,7 +1523,7 @@ void cmd_rinf(void)
        char buf[SIZ];
        FILE *info_fp;
 
-       assoc_file_name(filename, sizeof filename, &CC->room, "info");
+       assoc_file_name(filename, sizeof filename, &CC->room, ctdl_info_dir);
        info_fp = fopen(filename, "r");
 
        if (info_fp == NULL) {
@@ -1594,19 +1586,20 @@ void delete_room(struct ctdlroom *qrbuf)
 {
        struct floor flbuf;
        char filename[100];
+       /* TODO: filename magic? does this realy work? */
 
        lprintf(CTDL_NOTICE, "Deleting room <%s>\n", qrbuf->QRname);
 
        /* Delete the info file */
-       assoc_file_name(filename, sizeof filename, qrbuf, "info");
+       assoc_file_name(filename, sizeof filename, qrbuf, ctdl_info_dir);
        unlink(filename);
 
        /* Delete the image file */
-       assoc_file_name(filename, sizeof filename, qrbuf, "images");
+       assoc_file_name(filename, sizeof filename, qrbuf, ctdl_image_dir);
        unlink(filename);
 
        /* Delete the room's network config file */
-       assoc_file_name(filename, sizeof filename, qrbuf, "netconfigs");
+       assoc_file_name(filename, sizeof filename, qrbuf, ctdl_netcfg_dir);
        unlink(filename);
 
        /* Delete the messages in the room
@@ -1935,7 +1928,7 @@ void cmd_einf(char *ok)
                cprintf("%d Ok.\n", CIT_OK);
                return;
        }
-       assoc_file_name(infofilename, sizeof infofilename, &CC->room, "info");
+       assoc_file_name(infofilename, sizeof infofilename, &CC->room, ctdl_info_dir);
        lprintf(CTDL_DEBUG, "opening\n");
        fp = fopen(infofilename, "w");
        lprintf(CTDL_DEBUG, "checking\n");
index b0fef7fb5560709b304c41403e493261f6183ad7..20f2ccae9efe4465217291be743d9bba83a69ab1 100644 (file)
@@ -49,8 +49,6 @@ void cmd_kflr (char *argbuf);
 void cmd_eflr (char *argbuf);
 void ForEachRoom(void (*CallBack)(struct ctdlroom *EachRoom, void *out_data),
        void *in_data);
-void assoc_file_name(char *buf, size_t n,
-                    struct ctdlroom *qrbuf, const char *prefix);
 void schedule_room_for_deletion(struct ctdlroom *qrbuf);
 void delete_room(struct ctdlroom *qrbuf);
 void list_roomname(struct ctdlroom *qrbuf, int ra, int view);
index 4659176509c0e7c25629236e4345c307ac12402c..ca9219c797bbd32972fc03fcc1b17164d6cc4662 100644 (file)
@@ -30,6 +30,7 @@
 #include "snprintf.h"
 #endif
 #include "screen.h"
+#include "citadel_dirs.h"
 
 #define IFNEXPERT if ((userflags&US_EXPERT)==0)
 
index fdbc88d68e46cb9659bb0dbc2769894c1161a7a1..5e80465a9abe31db3334809884221b5d922e1137 100644 (file)
@@ -143,6 +143,11 @@ int main(int argc, char **argv)
        char cmd[SIZ];
        char buf[SIZ];
 
+       int relh=0;
+       int home=0;
+       char relhome[PATH_MAX]="";
+       char ctdldir[PATH_MAX]=CTDLDIR;
+
        strcpy(ctdl_home_directory, DEFAULT_PORT);
 
        strcpy(cmd, "");
@@ -151,9 +156,14 @@ int main(int argc, char **argv)
         */
        for (a = 1; a < argc; ++a) {
                if (!strncmp(argv[a], "-h", 2)) {
-                       strcpy(ctdl_home_directory, argv[a]);
-                       strcpy(ctdl_home_directory, &ctdl_home_directory[2]);
+                       relh=argv[a][2]!='/';
+                       if (!relh) safestrncpy(ctdl_home_directory, &argv[a][2],
+                                                                  sizeof ctdl_home_directory);
+                       else
+                               safestrncpy(relhome, &argv[a][2],
+                                                       sizeof relhome);
                        home_specified = 1;
+                       home=1;
                } else {
                        if (strlen(cmd) > 0)
                                strcat(cmd, " ");
@@ -161,6 +171,7 @@ int main(int argc, char **argv)
                }
        }
 
+       calc_dirs_n_files(relh, home, relhome, ctdldir);
        get_config();
 
        signal(SIGINT, cleanup);
index c838a97f759b876703ea655bd8c75d375852fc3a..638d6f8242d90edbfffbdb392fb83baaabf5100d 100644 (file)
@@ -106,7 +106,7 @@ void do_subscribe(char *room, char *email, char *subtype, char *webpage) {
 
        listsub_generate_token(token);
 
-       assoc_file_name(filename, sizeof filename, &qrbuf, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &qrbuf, ctdl_netcfg_dir);
 
        /* 
         * Make sure the requested address isn't already subscribed
@@ -219,7 +219,7 @@ void do_unsubscribe(char *room, char *email, char *webpage) {
 
        listsub_generate_token(token);
 
-       assoc_file_name(filename, sizeof filename, &qrbuf, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &qrbuf, ctdl_netcfg_dir);
 
        /* 
         * Make sure there's actually a subscription there to remove
@@ -344,7 +344,7 @@ void do_confirm(char *room, char *token) {
         * Now start scanning this room's netconfig file for the
         * specified token.
         */
-       assoc_file_name(filename, sizeof filename, &qrbuf, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &qrbuf, ctdl_netcfg_dir);
        begin_critical_section(S_NETCONFIGS);
        ncfp = fopen(filename, "r+");
        if (ncfp != NULL) {
index d0033e4fd8c8b9303c5a35e75eb003af74e8c9b2..dc6aab1743062919931c245b98b8335858c73124 100644 (file)
@@ -65,6 +65,7 @@
 #include "serv_network.h"
 #include "clientsocket.h"
 #include "file_ops.h"
+#include "citadel_dirs.h"
 
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
@@ -363,7 +364,7 @@ void cmd_gnet(char *argbuf) {
        FILE *fp;
 
        if (CtdlAccessCheck(ac_room_aide)) return;
-       assoc_file_name(filename, sizeof filename, &CC->room, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &CC->room, ctdl_netcfg_dir);
        cprintf("%d Network settings for room #%ld <%s>\n",
                LISTING_FOLLOWS,
                CC->room.QRnumber, CC->room.QRname);
@@ -391,7 +392,7 @@ void cmd_snet(char *argbuf) {
 
        if (CtdlAccessCheck(ac_room_aide)) return;
        CtdlMakeTempFileName(tempfilename, sizeof tempfilename);
-       assoc_file_name(filename, sizeof filename, &CC->room, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &CC->room, ctdl_netcfg_dir);
 
        fp = fopen(tempfilename, "w");
        if (fp == NULL) {
@@ -895,7 +896,7 @@ void network_spoolout_room(char *room_to_spool) {
        }
 
        memset(&sc, 0, sizeof(struct SpoolControl));
-       assoc_file_name(filename, sizeof filename, &CC->room, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &CC->room, ctdl_netcfg_dir);
 
        begin_critical_section(S_NETCONFIGS);
 
@@ -1091,7 +1092,7 @@ int network_sync_to(char *target_node) {
        FILE *fp;
 
        /* Grab the configuration line we're looking for */
-       assoc_file_name(filename, sizeof filename, &CC->room, "netconfigs");
+       assoc_file_name(filename, sizeof filename, &CC->room, ctdl_netcfg_dir);
        begin_critical_section(S_NETCONFIGS);
        fp = fopen(filename, "r");
        if (fp == NULL) {
index 3b5ddb9a971564d63656d5cbec01fb8ef89c0f9b..b16d7804f4ce67c7eb5c712ea5cfba63789410e5 100644 (file)
@@ -70,6 +70,7 @@
 #include "domain.h"
 #include "clientsocket.h"
 #include "locate_host.h"
+#include "citadel_dirs.h"
 
 #ifdef HAVE_OPENSSL
 #include "serv_crypto.h"
@@ -1723,7 +1724,6 @@ void smtp_cleanup_function(void) {
 
 char *serv_smtp_init(void)
 {
-       char filename[256];
 
        CtdlRegisterServiceHook(config.c_smtp_port,     /* SMTP MTA */
                                NULL,
@@ -1745,22 +1745,14 @@ char *serv_smtp_init(void)
                                smtp_command_loop,
                                NULL);
 
-       snprintf(filename, 
-                        sizeof filename,
-                        "%s/lmtp.sock",
-                        ctdl_run_dir);
        CtdlRegisterServiceHook(0,                      /* local LMTP */
-                                                       filename,
+                                                       file_lmtp_socket,
                                                        lmtp_greeting,
                                                        smtp_command_loop,
                                                        NULL);
 
-       snprintf(filename, 
-                        sizeof filename,
-                        "%s/lmtp-unfiltered.sock",
-                        ctdl_run_dir);
        CtdlRegisterServiceHook(0,                      /* local LMTP */
-                                                       filename,
+                                                       file_lmtp_unfiltered_socket,
                                                        lmtp_unfiltered_greeting,
                                                        smtp_command_loop,
                                                        NULL);
index 34f49d022b2c047241b1cf1a1905406182edb36b..e04fd6286acb1f54ffbbf7e317e80a7e76a3f779 100644 (file)
@@ -53,6 +53,7 @@
 #include "database.h"
 #include "housekeeping.h"
 #include "tools.h"
+#include "citadel_dirs.c"
 
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
@@ -76,8 +77,6 @@ int main(int argc, char **argv)
        size_t size;
        int relh=0;
        int home=0;
-       const char* basedir;
-       char dirbuffer[PATH_MAX]="";
        char relhome[PATH_MAX]="";
        char ctdldir[PATH_MAX]=CTDLDIR;
        
@@ -141,56 +140,7 @@ int main(int argc, char **argv)
 
        }
 
-       /* calculate all our path on a central place */
-    /* where to keep our config */
-       
-#define COMPUTE_DIRECTORY(SUBDIR) memcpy(dirbuffer,SUBDIR, sizeof dirbuffer);\
-       snprintf(SUBDIR,sizeof SUBDIR,  "%s%s%s%s%s%s%s", \
-                        (home&!relh)?ctdl_home_directory:basedir, \
-             ((basedir!=ctdldir)&(home&!relh))?basedir:"/", \
-             ((basedir!=ctdldir)&(home&!relh))?"/":"", \
-                        relhome, \
-             (relhome[0]!='\0')?"/":"",\
-                        dirbuffer,\
-                        (dirbuffer[0]!='\0')?"/":"");
-
-#ifndef HAVE_ETC_DIR
-       basedir=ctdldir;
-#else
-       basedir=ETC_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_etc_dir);
-
-#ifndef HAVE_RUN_DIR
-       basedir=ctdldir;
-#else
-       basedir=RUN_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_run_dir);
-
-#ifndef HAVE_DATA_DIR
-       basedir=ctdldir;
-#else
-       basedir=DATA_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_bio_dir);
-       COMPUTE_DIRECTORY(ctdl_bb_dir);
-       COMPUTE_DIRECTORY(ctdl_data_dir);
-       COMPUTE_DIRECTORY(ctdl_file_dir);
-       COMPUTE_DIRECTORY(ctdl_hlp_dir);
-       COMPUTE_DIRECTORY(ctdl_image_dir);
-       COMPUTE_DIRECTORY(ctdl_info_dir);
-       COMPUTE_DIRECTORY(ctdl_message_dir);
-       COMPUTE_DIRECTORY(ctdl_usrpic_dir);
-#ifndef HAVE_SPOOL_DIR
-       basedir=ctdldir;
-#else
-       basedir=SPOOL_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_spool_dir);
-       COMPUTE_DIRECTORY(ctdl_netout_dir);
-       COMPUTE_DIRECTORY(ctdl_netin_dir);
-
+       calc_dirs_n_files(relh, home, relhome, ctdldir);
 
        /* daemonize, if we were asked to */
        if (running_as_daemon) {
index 5ac145b22279bf63ee874e3e3f7dedb9361ca415..9621127f231dcb1b64668883a68c84b0ed3d5edf 100644 (file)
@@ -27,6 +27,7 @@
 #include "sysdep.h"
 #include "config.h"
 #include "tools.h"
+#include "citadel_dirs.h"
 
 #ifdef HAVE_NEWT
 #include <newt.h>
@@ -64,40 +65,10 @@ char *setup_titles[] =
 
 
 struct config config;
-/* CTDLDIR */
-char ctdl_home_directory[PATH_MAX] = "";
-char ctdl_bio_dir[PATH_MAX]="bio";
-char ctdl_bb_dir[PATH_MAX]="bitbucket";
-char ctdl_data_dir[PATH_MAX]="data";
-char ctdl_file_dir[PATH_MAX]="files";
-char ctdl_hlp_dir[PATH_MAX]="help";
-char ctdl_image_dir[PATH_MAX]="images";
-char ctdl_info_dir[PATH_MAX]="info";
-char ctdl_key_dir[PATH_MAX]="keys";
-char ctdl_message_dir[PATH_MAX]="messages";
-char ctdl_usrpic_dir[PATH_MAX]="userpics";
-char ctdl_etc_dir[PATH_MAX]="";
-char ctdl_run_dir[PATH_MAX]="";
-char ctdl_spool_dir[PATH_MAX]="network";
-char ctdl_netout_dir[PATH_MAX]="network/spoolout";
-char ctdl_netin_dir[PATH_MAX]="network/spoolin";
-
-
-char citadel_rc_file[PATH_MAX]="";
 
        /* calculate all our path on a central place */
     /* where to keep our config */
        
-#define COMPUTE_DIRECTORY(SUBDIR) memcpy(dirbuffer,SUBDIR, sizeof dirbuffer);\
-       snprintf(SUBDIR,sizeof SUBDIR,  "%s%s%s%s%s%s%s", \
-                        (home&!relh)?ctdl_home_directory:basedir, \
-             ((basedir!=ctdldir)&(home&!relh))?basedir:"/", \
-             ((basedir!=ctdldir)&(home&!relh))?"/":"", \
-                        relhome, \
-             (relhome[0]!='\0')?"/":"",\
-                        dirbuffer,\
-                        (dirbuffer[0]!='\0')?"/":"");
-
 
 char *setup_text[] = {
 #ifndef HAVE_RUN_DIR
@@ -1011,8 +982,6 @@ int main(int argc, char *argv[])
        gid_t gid;
        int relh=0;
        int home=0;
-       const char* basedir;
-       char dirbuffer[PATH_MAX]="";
        char relhome[PATH_MAX]="";
        char ctdldir[PATH_MAX]=CTDLDIR;
        
@@ -1073,44 +1042,8 @@ int main(int argc, char *argv[])
        else
                safestrncpy(relhome, ctdl_home_directory,
                                        sizeof relhome);
-       
-#ifndef HAVE_ETC_DIR
-       basedir=ctdldir;
-#else
-       basedir=ETC_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_etc_dir);
-
-#ifndef HAVE_RUN_DIR
-       basedir=ctdldir;
-#else
-       basedir=RUN_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_run_dir);
-
-#ifndef HAVE_DATA_DIR
-       basedir=ctdldir;
-#else
-       basedir=DATA_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_bio_dir);
-       COMPUTE_DIRECTORY(ctdl_bb_dir);
-       COMPUTE_DIRECTORY(ctdl_data_dir);
-       COMPUTE_DIRECTORY(ctdl_file_dir);
-       COMPUTE_DIRECTORY(ctdl_hlp_dir);
-       COMPUTE_DIRECTORY(ctdl_image_dir);
-       COMPUTE_DIRECTORY(ctdl_info_dir);
-       COMPUTE_DIRECTORY(ctdl_message_dir);
-       COMPUTE_DIRECTORY(ctdl_usrpic_dir);
-#ifndef HAVE_SPOOL_DIR
-       basedir=ctdldir;
-#else
-       basedir=SPOOL_DIR;
-#endif
-       COMPUTE_DIRECTORY(ctdl_spool_dir);
-       COMPUTE_DIRECTORY(ctdl_netout_dir);
-       COMPUTE_DIRECTORY(ctdl_netin_dir);
 
+       calc_dirs_n_files(relh, home, relhome, ctdldir);
 
        if ((home) && (chdir(setup_directory) != 0)) {
                important_message("Citadel Setup",
@@ -1157,12 +1090,7 @@ int main(int argc, char *argv[])
         * to be when we rewrite it, because we replace the old file with a
         * completely new copy.
         */
-       snprintf(citadel_rc_file, 
-                        sizeof citadel_rc_file,
-                        "%s/citadel.config",
-                        ctdl_etc_dir);
-
-       if ((a = open(citadel_rc_file, O_WRONLY | O_CREAT | O_APPEND,
+       if ((a = open(file_citadel_config, O_WRONLY | O_CREAT | O_APPEND,
                      S_IRUSR | S_IWUSR)) == -1) {
                display_error("setup: cannot append citadel.config");
                cleanup(errno);
@@ -1177,7 +1105,7 @@ int main(int argc, char *argv[])
        fclose(fp);
 
        /* now we re-open it, and read the old or blank configuration */
-       fp = fopen(citadel_rc_file, "rb");
+       fp = fopen(file_citadel_config, "rb");
        if (fp == NULL) {
                display_error("setup: cannot open citadel.config");
                cleanup(errno);
@@ -1358,7 +1286,7 @@ NEW_INST:
        chown(".", config.c_ctdluid, gid);
        sleep(1);
        progress("Setting file permissions", 1, 4);
-       chown(citadel_rc_file, config.c_ctdluid, gid);
+       chown(file_citadel_config, config.c_ctdluid, gid);
        sleep(1);
        progress("Setting file permissions", 2, 4);
        snprintf(aaa, sizeof aaa,
@@ -1367,7 +1295,7 @@ NEW_INST:
        system(aaa);
        sleep(1);
        progress("Setting file permissions", 3, 4);
-       chmod(citadel_rc_file, S_IRUSR | S_IWUSR);
+       chmod(file_citadel_config, S_IRUSR | S_IWUSR);
        sleep(1);
        progress("Setting file permissions", 4, 4);