HUGE PATCH. This moves all of mime_parser.c and all
[citadel.git] / citadel / setup.c
index e5212930ccfbe0435b0932e813c008b4a8565236..f0ad438a376009f5248b489c1c49a28966bb19d0 100644 (file)
 #include <limits.h>
 #include <pwd.h>
 #include <time.h>
-
+#include <libcitadel.h>
 #include "citadel.h"
 #include "axdefs.h"
 #include "sysdep.h"
 #include "config.h"
-#include "tools.h"
 #include "citadel_dirs.h"
 
 #define MAXSETUP 5     /* How many setup questions to ask */
@@ -292,7 +291,6 @@ void check_services_entry(void)
                                        fclose(sfp);
                                }
                        }
-                       sleep(1);
                }
        }
 }
@@ -315,14 +313,10 @@ void delete_inittab_entry(void)
 
        /* Determine the fully qualified path name of citserver */
        snprintf(looking_for, 
-                        sizeof looking_for,
-                        "%s/citserver", 
-#ifndef HAVE_RUN_DIR
-                        setup_directory
-#else
-                        CTDLDIR
-#endif
-        );
+                sizeof looking_for,
+                "%s/citserver", 
+                ctdl_sbin_dir
+                );
 
        /* Now tweak /etc/inittab */
        infp = fopen("/etc/inittab", "r");
@@ -379,13 +373,36 @@ void delete_inittab_entry(void)
  */
 void install_init_scripts(void)
 {
+       struct stat etcinitd;
        FILE *fp;
+       char *initfile = "/etc/init.d/citadel";
+       char command[SIZ];
+
+       if ((stat("/etc/init.d/", &etcinitd) == -1) && 
+           (errno == ENOENT))
+       {
+               if ((stat("/etc/rc.d/init.d/", &etcinitd) == -1) &&
+                   (errno == ENOENT))
+                       initfile = CTDLDIR"/citadel.init";
+               else
+                       initfile = "/etc/rc.d/init.d/citadel";
+       }
+
+       fp = fopen(initfile, "r");
+       if (fp != NULL) {
+               if (yesno("Citadel already appears to be configured to start at boot.\n"
+                  "Would you like to keep your boot configuration as is?\n", 1) == 1) {
+                       return;
+               }
+               fclose(fp);
+               
+       }
 
        if (yesno("Would you like to automatically start Citadel at boot?\n", 1) == 0) {
                return;
        }
 
-       fp = fopen("/etc/init.d/citadel", "w");
+       fp = fopen(initfile, "w");
        if (fp == NULL) {
                display_error("Cannot create /etc/init.d/citadel");
                return;
@@ -397,20 +414,21 @@ void install_init_scripts(void)
                        "#\n"
                        "# chkconfig: - 79 30\n"
                        "# description: Citadel service\n"
-                       "# processname: ctdlsvc\n"
-                       "# pidfile: /var/run/citadel.pid\n"
+                       "# processname: citserver\n"
+                       "# pidfile: %s/citadel.pid\n"
                        "\n"
-                       "CITADEL_DIR=%s\n", setup_directory);
+                       "CITADEL_DIR=%s\n"
+                       ,
+                               setup_directory,
+                               setup_directory
+                       );
        fprintf(fp,     "\n"
-                       "test -x $CITADEL_DIR/ctdlsvc || exit 0\n"
                        "test -d /var/run || exit 0\n"
                        "\n"
                        "case \"$1\" in\n"
                        "\n"
                        "start)         echo -n \"Starting Citadel... \"\n"
-                       "               if $CITADEL_DIR/ctdlsvc /var/run/citadel.pid "
-                                                       "$CITADEL_DIR/citserver "
-                                                       "-t/dev/null\n"
+                       "               if $CITADEL_DIR/citserver -d -h$CITADEL_DIR\n"
                        "               then\n"
                        "                       echo \"ok\"\n"
                        "               else\n"
@@ -423,7 +441,10 @@ void install_init_scripts(void)
                        "               else\n"
                        "                       echo \"failed\"\n"
                        "               fi\n"
-                       "               rm -f /var/run/citadel.pid 2>/dev/null\n");
+                       "               rm -f %s/citadel.pid 2>/dev/null\n"
+                       ,
+                               setup_directory
+                       );
        fprintf(fp,     "               ;;\n"
                        "restart)       $0 stop\n"
                        "               $0 start\n"
@@ -435,12 +456,14 @@ void install_init_scripts(void)
        );
 
        fclose(fp);
-       chmod("/etc/init.d/citadel", 0755);
+       chmod(initfile, 0755);
 
        /* Set up the run levels. */
        system("/bin/rm -f /etc/rc?.d/[SK]??citadel 2>/dev/null");
-       system("for x in 2 3 4 5 ; do [ -d /etc/rc$x.d ] && ln -s /etc/init.d/citadel /etc/rc$x.d/S79citadel ; done 2>/dev/null");
-       system("for x in 0 6 S; do [ -d /etc/rc$x.d ] && ln -s /etc/init.d/citadel /etc/rc$x.d/K30citadel ; done 2>/dev/null");
+       snprintf(command, sizeof(command), "for x in 2 3 4 5 ; do [ -d /etc/rc$x.d ] && ln -s %s /etc/rc$x.d/S79citadel ; done 2>/dev/null", initfile);
+       system(command);
+       snprintf(command, sizeof(command),"for x in 0 6 S; do [ -d /etc/rc$x.d ] && ln -s %s /etc/rc$x.d/K30citadel ; done 2>/dev/null", initfile);
+       system(command);
 
 }
 
@@ -499,12 +522,7 @@ void check_xinetd_entry(void) {
                "       server_args     = -h -L %s/citadel\n"
                "       log_on_failure  += USERID\n"
                "}\n",
-#ifndef HAVE_RUN_DIR
-                       setup_directory
-#else
-                       RUN_DIR
-#endif
-                       );
+               ctdl_bin_dir);
        fclose(fp);
 
        /* Now try to restart the service */
@@ -583,14 +601,10 @@ int test_server(void) {
        sprintf(cookie, "--test--%d--", getpid());
 
        sprintf(cmd, "%s/sendcommand %s%s ECHO %s 2>&1",
-#ifndef HAVE_RUN_DIR
-                       setup_directory,
-#else
-                       CTDLDIR,
-#endif
-                       (enable_home)?"-h":"", 
-                       (enable_home)?setup_directory:"",
-                       cookie);
+               ctdl_sbin_dir,
+               (enable_home)?"-h":"", 
+               (enable_home)?ctdl_run_dir:"",
+               cookie);
 
        fp = popen(cmd, "r");
        if (fp == NULL) return(errno);
@@ -626,7 +640,7 @@ void strprompt(char *prompt_title, char *prompt_text, char *str)
                printf("Enter new value or press return to leave unchanged:\n");
                fgets(buf, sizeof buf, stdin);
                buf[strlen(buf) - 1] = 0;
-               if (strlen(buf) != 0)
+               if (!IsEmptyStr(buf))
                        strcpy(str, buf);
                break;
 
@@ -697,8 +711,11 @@ void edit_value(int curr)
        switch (curr) {
 
        case 1:
-               if (getenv("SYSADMIN_NAME")) {
-                       strcpy(config.c_sysadm, getenv("SYSADMIN_NAME"));
+               if (setup_type == UI_SILENT)
+               {
+                       if (getenv("SYSADMIN_NAME")) {
+                               strcpy(config.c_sysadm, getenv("SYSADMIN_NAME"));
+                       }
                }
                else {
                        set_str_val(curr, config.c_sysadm);
@@ -706,44 +723,73 @@ void edit_value(int curr)
                break;
 
        case 2:
+               if (setup_type == UI_SILENT)
+               {               
+                       if (getenv("CITADEL_UID")) {
+                               config.c_ctdluid = atoi(getenv("CITADEL_UID"));
+                       }                                       
+               }
+               else
+               {
 #ifdef __CYGWIN__
-               config.c_ctdluid = 0;   /* XXX Windows hack, prob. insecure */
+                       config.c_ctdluid = 0;   /* XXX Windows hack, prob. insecure */
 #else
-               i = config.c_ctdluid;
-               pw = getpwuid(i);
-               if (pw == NULL) {
-                       set_int_val(curr, &i);
-                       config.c_ctdluid = i;
-               }
-               else {
-                       strcpy(ctdluidname, pw->pw_name);
-                       set_str_val(curr, ctdluidname);
-                       pw = getpwnam(ctdluidname);
-                       if (pw != NULL) {
-                               config.c_ctdluid = pw->pw_uid;
+                       i = config.c_ctdluid;
+                       pw = getpwuid(i);
+                       if (pw == NULL) {
+                               set_int_val(curr, &i);
+                               config.c_ctdluid = i;
                        }
-                       else if (atoi(ctdluidname) > 0) {
-                               config.c_ctdluid = atoi(ctdluidname);
+                       else {
+                               strcpy(ctdluidname, pw->pw_name);
+                               set_str_val(curr, ctdluidname);
+                               pw = getpwnam(ctdluidname);
+                               if (pw != NULL) {
+                                       config.c_ctdluid = pw->pw_uid;
+                               }
+                               else if (atoi(ctdluidname) > 0) {
+                                       config.c_ctdluid = atoi(ctdluidname);
+                               }
                        }
-               }
 #endif
+               }
                break;
 
        case 3:
-               set_str_val(curr, config.c_ip_addr);
+               if (setup_type == UI_SILENT)
+               {
+                       if (getenv("IP_ADDR")) {
+                               strcpy(config.c_ip_addr, getenv("IP_ADDR"));
+                       }
+               }
+               else {
+                       set_str_val(curr, config.c_ip_addr);
+               }
                break;
 
        case 4:
-               set_int_val(curr, &config.c_port_number);
+               if (setup_type == UI_SILENT)
+               {
+                       if (getenv("CITADEL_PORT")) {
+                               config.c_port_number = atoi(getenv("CITADEL_PORT"));
+                       }
+               }
+               else
+               {
+                       set_int_val(curr, &config.c_port_number);
+               }
                break;
 
        case 5:
-               if (getenv("ENABLE_UNIX_AUTH")) {
-                       if (!strcasecmp(getenv("ENABLE_UNIX_AUTH"), "yes")) {
-                               config.c_auth_mode = 1;
-                       }
-                       else {
-                               config.c_auth_mode = 0;
+               if (setup_type == UI_SILENT)
+               {
+                       if (getenv("ENABLE_UNIX_AUTH")) {
+                               if (!strcasecmp(getenv("ENABLE_UNIX_AUTH"), "yes")) {
+                                       config.c_auth_mode = 1;
+                               }
+                               else {
+                                       config.c_auth_mode = 0;
+                               }
                        }
                }
                else {
@@ -903,6 +949,8 @@ int main(int argc, char *argv[])
        char relhome[PATH_MAX]="";
        char ctdldir[PATH_MAX]=CTDLDIR;
        
+       CtdlInitBase64Table();
+
        /* set an invalid setup type */
        setup_type = (-1);
 
@@ -939,13 +987,7 @@ int main(int argc, char *argv[])
        }
 
        /* Get started in a valid setup directory. */
-       strcpy(setup_directory, 
-#ifdef HAVE_RUN_DIR
-                  ""
-#else
-                  CTDLDIR
-#endif
-                  );
+       strcpy(setup_directory, ctdl_run_dir);
        if ( (using_web_installer) && (getenv("CITADEL") != NULL) ) {
                strcpy(setup_directory, getenv("CITADEL"));
        }
@@ -962,7 +1004,7 @@ int main(int argc, char *argv[])
                safestrncpy(relhome, ctdl_home_directory, sizeof relhome);
        }
 
-       calc_dirs_n_files(relh, home, relhome, ctdldir);
+       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
        
        enable_home=(relh|home);
 
@@ -1038,11 +1080,11 @@ int main(int argc, char *argv[])
        fclose(fp);
 
        /* set some sample/default values in place of blanks... */
-       if (strlen(config.c_nodename) == 0)
+       if (IsEmptyStr(config.c_nodename))
                safestrncpy(config.c_nodename, my_utsname.nodename,
                            sizeof config.c_nodename);
        strtok(config.c_nodename, ".");
-       if (strlen(config.c_fqdn) == 0) {
+       if (IsEmptyStr(config.c_fqdn) ) {
                if ((he = gethostbyname(my_utsname.nodename)) != NULL)
                        safestrncpy(config.c_fqdn, he->h_name,
                                    sizeof config.c_fqdn);
@@ -1050,20 +1092,20 @@ int main(int argc, char *argv[])
                        safestrncpy(config.c_fqdn, my_utsname.nodename,
                                    sizeof config.c_fqdn);
        }
-       if (strlen(config.c_humannode) == 0)
+       if (IsEmptyStr(config.c_humannode))
                strcpy(config.c_humannode, "My System");
-       if (strlen(config.c_phonenum) == 0)
+       if (IsEmptyStr(config.c_phonenum))
                strcpy(config.c_phonenum, "US 800 555 1212");
        if (config.c_initax == 0) {
                config.c_initax = 4;
        }
-       if (strlen(config.c_moreprompt) == 0)
+       if (IsEmptyStr(config.c_moreprompt))
                strcpy(config.c_moreprompt, "<more>");
-       if (strlen(config.c_twitroom) == 0)
+       if (IsEmptyStr(config.c_twitroom))
                strcpy(config.c_twitroom, "Trashcan");
-       if (strlen(config.c_baseroom) == 0)
+       if (IsEmptyStr(config.c_baseroom))
                strcpy(config.c_baseroom, BASEROOM);
-       if (strlen(config.c_aideroom) == 0)
+       if (IsEmptyStr(config.c_aideroom))
                strcpy(config.c_aideroom, "Aide");
        if (config.c_port_number == 0) {
                config.c_port_number = 504;
@@ -1118,10 +1160,8 @@ int main(int argc, char *argv[])
        if (config.c_managesieve_port == 0) config.c_managesieve_port = 2020;
 
        /* Go through a series of dialogs prompting for config info */
-       if (setup_type != UI_SILENT) {
-               for (curr = 1; curr <= MAXSETUP; ++curr) {
-                       edit_value(curr);
-               }
+       for (curr = 1; curr <= MAXSETUP; ++curr) {
+               edit_value(curr);
        }
 
 /***** begin version update section ***** */
@@ -1188,11 +1228,6 @@ NEW_INST:
        chmod(ctdl_netcfg_dir, 0700);
        chown(ctdl_netcfg_dir, config.c_ctdluid, -1);
 
-       /* TODO: where to put this? */
-       mkdir("netconfigs", 0700);
-       chmod("netconfigs", 0700);
-       chown("netconfigs", config.c_ctdluid, -1);
-
        /* Delete files and directories used by older Citadel versions */
        system("exec /bin/rm -fr ./rooms ./chatpipes ./expressmsgs ./sessions 2>/dev/null");
        unlink("citadel.log");
@@ -1215,7 +1250,6 @@ NEW_INST:
        disable_other_mta("dovecot");
        disable_other_mta("exim");
        disable_other_mta("exim4");
-       disable_other_mta("hula");
        disable_other_mta("imapd");
        disable_other_mta("mta");
        disable_other_mta("pop3d");
@@ -1225,7 +1259,6 @@ NEW_INST:
        disable_other_mta("saslauthd");
        disable_other_mta("sendmail");
        disable_other_mta("vmailmgrd");
-       disable_other_mta("zimbra");
 #endif
 
        /* Check for the 'db' nss and offer to disable it */
@@ -1236,27 +1269,13 @@ NEW_INST:
        else
                gid = pw->pw_gid;
 
-       progress("Setting file permissions", 0, 4);
-       chown(".", config.c_ctdluid, gid);
-       sleep(1);
-       progress("Setting file permissions", 1, 4);
+       progress("Setting file permissions", 0, 3);
+       chown(ctdl_run_dir, config.c_ctdluid, gid);
+       progress("Setting file permissions", 1, 3);
        chown(file_citadel_config, config.c_ctdluid, gid);
-       sleep(1);
-       progress("Setting file permissions", 2, 4);
-
-       snprintf(aaa, sizeof aaa,
-                        "%schkpwd",
-                        ctdl_sbin_dir);
-       chown(aaa,0,0); /*  config.c_ctdluid, gid); chkpwd needs to be root owned*/
-       sleep(1);
-       progress("Setting file permissions", 3, 4);
-       chmod(aaa, 04755); 
-
-       sleep(1);
-       progress("Setting file permissions", 3, 4);
+       progress("Setting file permissions", 2, 3);
        chmod(file_citadel_config, S_IRUSR | S_IWUSR);
-       sleep(1);
-       progress("Setting file permissions", 4, 4);
+       progress("Setting file permissions", 3, 3);
 
        /* 
         * If we're running on SysV, install init scripts.