X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Futillib%2Fcitadel_dirs.c;h=95f644e244bfed9b1415426623a53fa1c2eb6460;hb=6cd4b62a62098566ed73d7662d22e29fc509b9f3;hp=1aecdcded837b4ed4046fed42ba496169aab899c;hpb=f15df94047f9c4f9a2faddd4700ac24b46afd923;p=citadel.git diff --git a/citadel/utillib/citadel_dirs.c b/citadel/utillib/citadel_dirs.c index 1aecdcded..95f644e24 100644 --- a/citadel/utillib/citadel_dirs.c +++ b/citadel/utillib/citadel_dirs.c @@ -1,21 +1,15 @@ /* * citadel_dirs.c : calculate pathnames for various files used in the Citadel system * - * Copyright (c) 1987-2009 by the citadel.org team + * Copyright (c) 1987-2017 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include @@ -23,33 +17,19 @@ #include #include #include - - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include +#include #include - - #include "citadel.h" +#include "citadel_dirs.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_dspam_dir[PATH_MAX]="dspam"; char ctdl_file_dir[PATH_MAX]="files"; -char ctdl_hlp_dir[PATH_MAX]="help"; char ctdl_shared_dir[PATH_MAX]=""; char ctdl_image_dir[PATH_MAX]="images"; char ctdl_info_dir[PATH_MAX]="info"; @@ -64,6 +44,7 @@ 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_netdigest_dir[PATH_MAX]="network/digest"; char ctdl_nettmp_dir[PATH_MAX]="network/spooltmp"; char ctdl_netcfg_dir[PATH_MAX]="netconfigs"; char ctdl_utilbin_dir[PATH_MAX]=""; @@ -72,12 +53,13 @@ char ctdl_bin_dir[PATH_MAX]=""; /* 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_citadel_urlshorteners[PATH_MAX]=""; char file_lmtp_socket[PATH_MAX]=""; char file_lmtp_unfiltered_socket[PATH_MAX]=""; char file_arcq[PATH_MAX]=""; char file_citadel_socket[PATH_MAX]=""; +char file_citadel_admin_socket[PATH_MAX]=""; char file_mail_aliases[PATH_MAX]=""; char file_pid_file[PATH_MAX]=""; char file_pid_paniclog[PATH_MAX]=""; @@ -87,7 +69,6 @@ char file_crpt_file_cer[PATH_MAX]=""; char file_chkpwd[PATH_MAX]=""; char file_base64[PATH_MAX]=""; char file_guesstimezone[PATH_MAX]=""; -char file_funambol_msg[PATH_MAX] = ""; char file_dpsam_conf[PATH_MAX] = ""; char file_dspam_log[PATH_MAX] = ""; @@ -170,23 +151,12 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, COMPUTE_DIRECTORY(ctdl_message_dir); StripSlashes(ctdl_message_dir, 1); -#ifndef HAVE_HELP_DIR - basedir=ctdldir; -#else - basedir=HELP_DIR; -#endif - COMPUTE_DIRECTORY(ctdl_hlp_dir); - StripSlashes(ctdl_hlp_dir, 1); - COMPUTE_DIRECTORY(ctdl_shared_dir); - StripSlashes(ctdl_shared_dir, 1); - #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_dspam_dir); COMPUTE_DIRECTORY(ctdl_file_dir); @@ -196,7 +166,6 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, COMPUTE_DIRECTORY(ctdl_bbsbase_dir); StripSlashes(ctdl_bio_dir, 1); - StripSlashes(ctdl_bb_dir, 1); StripSlashes(ctdl_data_dir, 1); StripSlashes(ctdl_dspam_dir, 1); StripSlashes(ctdl_file_dir, 1); @@ -213,11 +182,13 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, COMPUTE_DIRECTORY(ctdl_spool_dir); COMPUTE_DIRECTORY(ctdl_netout_dir); COMPUTE_DIRECTORY(ctdl_netin_dir); + COMPUTE_DIRECTORY(ctdl_netdigest_dir); COMPUTE_DIRECTORY(ctdl_nettmp_dir); StripSlashes(ctdl_spool_dir, 1); StripSlashes(ctdl_netout_dir, 1); StripSlashes(ctdl_netin_dir, 1); + StripSlashes(ctdl_netdigest_dir, 1); StripSlashes(ctdl_nettmp_dir, 1); /* ok, now we know the dirs, calc some commonly used files */ @@ -238,11 +209,11 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, "%scitadel.config", ctdl_autoetc_dir); StripSlashes(file_citadel_config, 0); - snprintf(file_citadel_rc, - sizeof file_citadel_rc, - "%scitadel.rc", + snprintf(file_citadel_urlshorteners, + sizeof file_citadel_urlshorteners, + "%scitadel_urlshorteners.rc", ctdl_etc_dir); - StripSlashes(file_citadel_rc, 0); + StripSlashes(file_citadel_urlshorteners, 0); snprintf(file_lmtp_socket, sizeof file_lmtp_socket, "%slmtp.socket", @@ -258,6 +229,11 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, "%scitadel.socket", ctdl_run_dir); StripSlashes(file_citadel_socket, 0); + snprintf(file_citadel_admin_socket, + sizeof file_citadel_admin_socket, + "%scitadel-admin.socket", + ctdl_run_dir); + StripSlashes(file_citadel_admin_socket, 0); snprintf(file_pid_file, sizeof file_pid_file, "%scitadel.pid", @@ -322,18 +298,11 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, #endif ); StripSlashes(file_mail_aliases, 0); - snprintf(file_funambol_msg, - sizeof file_funambol_msg, - "%sfunambol_newmail_soap.xml", - ctdl_shared_dir); - StripSlashes(file_funambol_msg, 0); DBG_PRINT(ctdl_bio_dir); - DBG_PRINT(ctdl_bb_dir); DBG_PRINT(ctdl_data_dir); DBG_PRINT(ctdl_dspam_dir); DBG_PRINT(ctdl_file_dir); - DBG_PRINT(ctdl_hlp_dir); DBG_PRINT(ctdl_image_dir); DBG_PRINT(ctdl_info_dir); DBG_PRINT(ctdl_key_dir); @@ -344,6 +313,7 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, DBG_PRINT(ctdl_spool_dir); DBG_PRINT(ctdl_netout_dir); DBG_PRINT(ctdl_netin_dir); + DBG_PRINT(ctdl_netdigest_dir); DBG_PRINT(ctdl_nettmp_dir); DBG_PRINT(ctdl_netcfg_dir); DBG_PRINT(ctdl_bbsbase_dir); @@ -351,7 +321,6 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, DBG_PRINT(ctdl_bin_dir); DBG_PRINT(ctdl_utilbin_dir); DBG_PRINT(file_citadel_control); - DBG_PRINT(file_citadel_rc); DBG_PRINT(file_citadel_config); DBG_PRINT(file_lmtp_socket); DBG_PRINT(file_lmtp_unfiltered_socket); @@ -366,16 +335,97 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, DBG_PRINT(file_chkpwd); DBG_PRINT(file_base64); DBG_PRINT(file_guesstimezone); - DBG_PRINT(file_funambol_msg); } /* * Generate an associated file name for a room */ -void assoc_file_name(char *buf, size_t n, +size_t assoc_file_name(char *buf, size_t n, struct ctdlroom *qrbuf, const char *prefix) { - snprintf(buf, n, "%s%ld", prefix, qrbuf->QRnumber); + return snprintf(buf, n, "%s%ld", prefix, qrbuf->QRnumber); } +void remove_digest_file(struct ctdlroom *room) +{ + char buf[PATH_MAX]; + + snprintf(buf, PATH_MAX, "%s/%ld.eml", + ctdl_netdigest_dir, + room->QRnumber); + StripSlashes(buf, 0); + unlink(buf); +} + +FILE *create_digest_file(struct ctdlroom *room, int forceCreate) +{ + struct stat stbuf; + char fn[PATH_MAX]; + int exists; + FILE *fp; + + snprintf(fn, PATH_MAX, "%s/%ld.eml", + ctdl_netdigest_dir, + room->QRnumber); + StripSlashes(fn, 0); + + exists = stat(fn, &stbuf); + if (!forceCreate && (exists == -1)) + return NULL; + + fp = fopen(fn, "w+"); + if (fp == NULL) { + syslog(LOG_EMERG, + "failed to create digest file %s: %s", + fn, + strerror(errno)); + } + return fp; +} + + +int create_dir(char *which, long ACCESS, long UID, long GID) +{ + int rv; + rv = mkdir(which, ACCESS); + if ((rv == -1) && (errno != EEXIST)) { + syslog(LOG_EMERG, + "failed to create directory %s: %s", + which, + strerror(errno)); + return rv; + } + rv = chmod(which, ACCESS); + if (rv == -1) { + syslog(LOG_EMERG, + "failed to set permissions for directory %s: %s", + which, + strerror(errno)); + return rv; + } + rv = chown(which, UID, GID); + if (rv == -1) { + syslog(LOG_EMERG, + "failed to set owner for directory %s: %s", + which, + strerror(errno)); + return rv; + } + return rv; +} + +int create_run_directories(long UID, long GID) +{ + int rv = 0; + rv += create_dir(ctdl_message_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_file_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_spool_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_netout_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_netin_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_netdigest_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_nettmp_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_key_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1); + rv += create_dir(ctdl_run_dir , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID); + return rv; +}