From 1248e88ae490d17b4896ada5a74a0a9ea23b365c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Mon, 16 Jan 2006 15:32:15 +0000 Subject: [PATCH] centralized filename calculation --- citadel/Makefile.in | 20 ++--- citadel/aidepost.c | 10 +++ citadel/citadel.c | 9 +-- citadel/citadel_dirs.c | 162 +++++++++++++++++++++++++++++++++++++++++ citadel/citadel_dirs.h | 43 +++++++++++ citadel/citmail.c | 16 ++-- citadel/commands.c | 13 +--- citadel/config.c | 50 +++---------- citadel/config.h | 25 +------ citadel/control.c | 21 ++---- citadel/file_ops.c | 4 +- citadel/msgbase.c | 16 ++-- citadel/room_ops.c | 21 ++---- citadel/room_ops.h | 2 - citadel/rooms.c | 1 + citadel/sendcommand.c | 15 +++- citadel/serv_listsub.c | 6 +- citadel/serv_network.c | 9 ++- citadel/serv_smtp.c | 14 +--- citadel/server_main.c | 54 +------------- citadel/setup.c | 84 ++------------------- 21 files changed, 302 insertions(+), 293 deletions(-) create mode 100644 citadel/citadel_dirs.c create mode 100644 citadel/citadel_dirs.h diff --git a/citadel/Makefile.in b/citadel/Makefile.in index 06d1469ac..0794907a6 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -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 diff --git a/citadel/aidepost.c b/citadel/aidepost.c index 082418949..3e60dc976 100644 --- a/citadel/aidepost.c +++ b/citadel/aidepost.c @@ -23,6 +23,7 @@ #include #include #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"); diff --git a/citadel/citadel.c b/citadel/citadel.c index ac21ebc90..6779f8978 100644 --- a/citadel/citadel.c +++ b/citadel/citadel.c @@ -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 index 000000000..424ca8adb --- /dev/null +++ b/citadel/citadel_dirs.c @@ -0,0 +1,162 @@ +#include "sysdep.h" +#include +#include +#include +#include +#include +#include +#include + + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include + + + +#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 index 000000000..9e6b30f95 --- /dev/null +++ b/citadel/citadel_dirs.h @@ -0,0 +1,43 @@ +#ifndef __CITADEL_DIRS_H +#define __CITADEL_DIRS_H + +#include + + +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 */ diff --git a/citadel/citmail.c b/citadel/citmail.c index 69af5958f..09b6c9347 100644 --- a/citadel/citmail.c +++ b/citadel/citmail.c @@ -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); diff --git a/citadel/commands.c b/citadel/commands.c index 17cb60853..d81f41ca7 100644 --- a/citadel/commands.c +++ b/citadel/commands.c @@ -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"); diff --git a/citadel/config.c b/citadel/config.c index 66c09b327..747134506 100644 --- a/citadel/config.c +++ b/citadel/config.c @@ -20,25 +20,6 @@ #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); diff --git a/citadel/config.h b/citadel/config.h index 2550102c0..c9289f960 100644 --- a/citadel/config.h +++ b/citadel/config.h @@ -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]; - - - diff --git a/citadel/control.c b/citadel/control.c index 6704c3edc..2260fa561 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -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; } diff --git a/citadel/file_ops.c b/citadel/file_ops.c index 926d7b357..e5c442515 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -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) { diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 2af13d95e..a8e5e31ea 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -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); diff --git a/citadel/room_ops.c b/citadel/room_ops.c index ea4fc1a08..a0fd86880 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -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"); diff --git a/citadel/room_ops.h b/citadel/room_ops.h index b0fef7fb5..20f2ccae9 100644 --- a/citadel/room_ops.h +++ b/citadel/room_ops.h @@ -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); diff --git a/citadel/rooms.c b/citadel/rooms.c index 465917650..ca9219c79 100644 --- a/citadel/rooms.c +++ b/citadel/rooms.c @@ -30,6 +30,7 @@ #include "snprintf.h" #endif #include "screen.h" +#include "citadel_dirs.h" #define IFNEXPERT if ((userflags&US_EXPERT)==0) diff --git a/citadel/sendcommand.c b/citadel/sendcommand.c index fdbc88d68..5e80465a9 100644 --- a/citadel/sendcommand.c +++ b/citadel/sendcommand.c @@ -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); diff --git a/citadel/serv_listsub.c b/citadel/serv_listsub.c index c838a97f7..638d6f824 100644 --- a/citadel/serv_listsub.c +++ b/citadel/serv_listsub.c @@ -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) { diff --git a/citadel/serv_network.c b/citadel/serv_network.c index d0033e4fd..dc6aab174 100644 --- a/citadel/serv_network.c +++ b/citadel/serv_network.c @@ -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) { diff --git a/citadel/serv_smtp.c b/citadel/serv_smtp.c index 3b5ddb9a9..b16d7804f 100644 --- a/citadel/serv_smtp.c +++ b/citadel/serv_smtp.c @@ -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); diff --git a/citadel/server_main.c b/citadel/server_main.c index 34f49d022..e04fd6286 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -53,6 +53,7 @@ #include "database.h" #include "housekeeping.h" #include "tools.h" +#include "citadel_dirs.c" #ifdef HAVE_SYS_SELECT_H #include @@ -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) { diff --git a/citadel/setup.c b/citadel/setup.c index 5ac145b22..9621127f2 100644 --- a/citadel/setup.c +++ b/citadel/setup.c @@ -27,6 +27,7 @@ #include "sysdep.h" #include "config.h" #include "tools.h" +#include "citadel_dirs.h" #ifdef HAVE_NEWT #include @@ -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); -- 2.30.2