]> code.citadel.org Git - citadel.git/blobdiff - citadel/utils/setup.c
Gratuitous style cleanup
[citadel.git] / citadel / utils / setup.c
index 35b04dfb22b18e9cbd0e4f25a419baa19157434a..99bba3eefe3e64a36dbb741a1733238fe43f7556 100644 (file)
@@ -1,15 +1,9 @@
 /*
- * $Id$
- *
  * Citadel setup utility
- *
  */
 
 #define SHOW_ME_VAPPEND_PRINTF
-
 #include "ctdl_module.h"
-
-
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -92,7 +86,6 @@ const char *EnvNames [eMaxQuestions] = {
 };
 
 int setup_type;
-char setup_directory[PATH_MAX];
 int using_web_installer = 0;
 int enable_home = 1;
 char admin_pass[SIZ];
@@ -116,8 +109,8 @@ void SetTitles(void)
        setup_titles[eLDAP_Bind_PW] = _("LDAP bind password:");//
 }
 
-/**
- * \brief print the actual stack frame.
+/*
+ * print the actual stack frame.
  */
 void cit_backtrace(void)
 {
@@ -126,7 +119,6 @@ void cit_backtrace(void)
        size_t size, i;
        char **strings;
 
-
        size = backtrace(stack_frames, sizeof(stack_frames) / sizeof(void*));
        strings = backtrace_symbols(stack_frames, size);
        for (i = 0; i < size; i++) {
@@ -141,8 +133,8 @@ void cit_backtrace(void)
 
 struct config config;
 
-       /* calculate all our path on a central place */
-    /* where to keep our config */
+/* calculate all our path on a central place */
+/* where to keep our config */
        
 
 char *setup_text[] = {
@@ -174,9 +166,11 @@ char *setup_text[] = {
 "user ID here.  You may specify either a user name or a numeric\n"
 "UID.\n",
 
-"Specify the IP address on which your server will run.  If you\n"
-"leave this blank, or if you specify 0.0.0.0, Citadel will listen\n"
-"on all addresses.  You can usually skip this unless you are\n"
+"Specify the IP address on which your server will run.\n"
+"You can name a specific IPv4 or IPv6 address, or you can specify\n"
+"'*' for 'any address', '::' for 'any IPv6 address', or '0.0.0.0'\n"
+"for 'any IPv4 address'.  If you leave this blank, Citadel will\n"
+"listen on all addresses.  You can usually skip this unless you are\n"
 "running multiple instances of Citadel on the same computer.\n",
 
 "Specify the TCP port number on which your server will run.\n"
@@ -186,8 +180,6 @@ char *setup_text[] = {
 "of Citadel on the same computer and there is something else\n"
 "already using port 504.\n",
 
-
-
 "Specify which authentication mode you wish to use.\n"
 "\n"
 " 0. Self contained authentication\n"
@@ -335,8 +327,7 @@ void progress(char *text, long int curr, long int cmax)
        case UI_TEXT:
                if (curr == 0) {
                        printf("%s\n", text);
-                       printf("..........................");
-                       printf("..........................");
+                       printf("....................................................");
                        printf("..........................\r");
                        fflush(stdout);
                        dots_printed = 0;
@@ -420,7 +411,6 @@ void check_services_entry(void)
 
 /*
  * delete_inittab_entry()  -- Remove obsolete /etc/inittab entry for Citadel
- *
  */
 void delete_inittab_entry(void)
 {
@@ -490,7 +480,6 @@ void delete_inittab_entry(void)
 
 /*
  * install_init_scripts()  -- Try to configure to start Citadel at boot
- *
  */
 void install_init_scripts(void)
 {
@@ -544,8 +533,8 @@ void install_init_scripts(void)
                "\n"
                "CITADEL_DIR=%s\n"
                ,
-               setup_directory,
-               setup_directory
+               ctdl_run_dir,
+               ctdl_sbin_dir
                );
        fprintf(fp,     "\n"
                "test -d /var/run || exit 0\n"
@@ -553,7 +542,7 @@ void install_init_scripts(void)
                "case \"$1\" in\n"
                "\n"
                "start)         echo -n \"Starting Citadel... \"\n"
-               "               if $CITADEL_DIR/citserver -lmail -d -h$CITADEL_DIR\n"
+               "               if $CITADEL_DIR/citserver -lmail -d\n"
                "               then\n"
                "                       echo \"ok\"\n"
                "               else\n"
@@ -568,7 +557,7 @@ void install_init_scripts(void)
                "               fi\n"
                "               rm -f %s/citadel.pid 2>/dev/null\n"
                ,
-               setup_directory
+               ctdl_run_dir
                );
        fprintf(fp,     "               ;;\n"
                "restart)       if $CITADEL_DIR/sendcommand DOWN 1 >/dev/null 2>&1 ; then\n"
@@ -597,9 +586,6 @@ void install_init_scripts(void)
 
 
 
-
-
-
 /*
  * On systems which use xinetd, see if we can offer to install Citadel as
  * the default telnet target.
@@ -615,7 +601,7 @@ void check_xinetd_entry(void) {
        if (fp == NULL) return;         /* Not there.  Oh well... */
 
        while (fgets(buf, sizeof buf, fp) != NULL) {
-               if (strstr(buf, setup_directory) != NULL) already_citadel = 1;
+               if (strstr(buf, "/citadel") != NULL) already_citadel = 1;
        }
        fclose(fp);
        if (already_citadel) return;    /* Already set up this way. */
@@ -747,7 +733,7 @@ void disable_other_mtas(void)
 /* 
  * Check to see if our server really works.  Returns 0 on success.
  */
-int test_server(char *setup_directory, char *relhomestr, int relhome) {
+int test_server(char *relhomestr, int relhome) {
        char cmd[256];
        char cookie[256];
        FILE *fp;
@@ -835,12 +821,14 @@ void strprompt(const char *prompt_title, char *prompt_text, char *Target, char *
        }
 }
 
-void set_bool_val(int msgpos, int *ip, char *DefValue) {
+void set_bool_val(int msgpos, int *ip, char *DefValue) 
+{
        title(setup_titles[msgpos]);
        *ip = yesno(setup_text[msgpos], *ip);
 }
 
-void set_str_val(int msgpos, char *Target, char *DefValue) {
+void set_str_val(int msgpos, char *Target, char *DefValue) 
+{
        strprompt(setup_titles[msgpos], 
                  setup_text[msgpos], 
                  Target, 
@@ -885,6 +873,8 @@ void edit_value(int curr)
        {
                Value = getenv(EnvNames[curr]);
        }
+       if (Value == NULL)
+               Value = "";
 
 
        switch (curr) {
@@ -1126,7 +1116,68 @@ void fixnss(void) {
        unlink(new_filename);
 }
 
+void check_init_script (char *relhome)
+{
+       int rv;
+       FILE *fp;
+
+       /* 
+        * If we're running on SysV, install init scripts.
+        */
+       if (!access("/var/run", W_OK)) {
+
+               if (getenv("NO_INIT_SCRIPTS") == NULL) {
+                       install_init_scripts();
+               }
+
+               if (!access("/etc/init.d/citadel", X_OK)) {
+                       rv = system("/etc/init.d/citadel start");
+                       sleep(3);
+               }
 
+               if (test_server(relhome, enable_home) == 0) {
+                       char buf[SIZ];
+                       int found_it = 0;
+
+                       if (config.c_auth_mode == AUTHMODE_NATIVE) {
+                               snprintf (admin_cmd, sizeof(admin_cmd), "%s/sendcommand \"CREU %s|%s\" 2>&1", 
+                                       ctdl_sbin_dir, config.c_sysadm, admin_pass);
+                               fp = popen(admin_cmd, "r");
+                               if (fp != NULL) {
+                                       while (fgets(buf, sizeof buf, fp) != NULL) 
+                                       {
+                                               if ((atol(buf) == 574) || (atol(buf) == 200))
+                                                       ++found_it;
+                                       }
+                                       pclose(fp);
+                               }
+                       
+                               if (found_it == 0) {
+                                       important_message("Error","Setup failed to create your admin user");
+                               }
+                       }
+
+                       if (setup_type != UI_SILENT)
+                               important_message("Setup finished",
+                                                 "Setup of the Citadel server is complete.\n"
+                                                 "If you will be using WebCit, please run its\n"
+                                                 "setup program now; otherwise, run './citadel'\n"
+                                                 "to log in.\n");
+               }
+               else {
+                       important_message("Setup failed",
+                               "Setup is finished, but the Citadel server failed to start.\n"
+                               "Go back and check your configuration.\n"
+                       );
+               }
+
+       }
+
+       else {
+               important_message("Setup finished",
+                       "Setup is finished.  You may now start the server.");
+       }
+}
 
 void set_default_values(void)
 {
@@ -1221,21 +1272,59 @@ void set_default_values(void)
 }
 
 
+void get_config (void)
+{
+       int a;
+       int rv;
+       FILE *fp;
+
+       /*
+        * What we're going to try to do here is append a whole bunch of
+        * nulls to the citadel.config file, so we can keep the old config
+        * values if they exist, but if the file is missing or from an
+        * earlier version with a shorter config structure, when setup tries
+        * to read the old config parameters, they'll all come up zero.
+        * The length of the config file will be set to what it's supposed
+        * to be when we rewrite it, because we replace the old file with a
+        * completely new copy.
+        */
+       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);
+       }
+       fp = fdopen(a, "ab");
+       if (fp == NULL) {
+               display_error("setup: cannot append citadel.config");
+               cleanup(errno);
+       }
+       for (a = 0; a < sizeof(struct config); ++a) {
+               putc(0, fp);
+       }
+       fclose(fp);
+
+       /* now we re-open it, and read the old or blank configuration */
+       fp = fopen(file_citadel_config, "rb");
+       if (fp == NULL) {
+               display_error("setup: cannot open citadel.config");
+               cleanup(errno);
+       }
+       rv = fread((char *) &config, sizeof(struct config), 1, fp);
+       fclose(fp);
 
+}
 
 int main(int argc, char *argv[])
 {
        int a;
        int curr; 
        char aaa[128];
-       FILE *fp;
        int old_setup_level = 0;
        int info_only = 0;
        int relh=0;
        int home=0;
        char relhome[PATH_MAX]="";
        char ctdldir[PATH_MAX]=CTDLDIR;
-       char DefValue[PATH_MAX];
        int rv;
        struct passwd *pw;
        gid_t gid;
@@ -1274,6 +1363,7 @@ int main(int argc, char *argv[])
        }
 
        calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
+       SetTitles();
 
        /* If a setup type was not specified, try to determine automatically
         * the best one to use out of all available types.
@@ -1286,21 +1376,11 @@ int main(int argc, char *argv[])
                cleanup(0);
        }
 
-       /* Get started in a valid setup directory. */
-       strcpy(setup_directory, ctdl_run_dir);
-       strcpy(DefValue, ctdl_run_dir);
-       if ( (using_web_installer) && (getenv("CITADEL") != NULL) ) {
-               strcpy(setup_directory, getenv("CITADEL"));
-       }
-       else {
-               set_str_val(0, setup_directory, DefValue);
-       }
-
        enable_home = ( relh | home );
 
-       if (chdir(setup_directory) != 0) {
+       if (chdir(ctdl_run_dir) != 0) {
                char errmsg[SIZ];
-               sprintf(errmsg, "The directory you specified does not exist: [%s]\n", setup_directory);
+               sprintf(errmsg, "The directory you specified does not exist: [%s]\n", ctdl_run_dir);
                
                important_message("Citadel Setup", errmsg);
                cleanup(errno);
@@ -1313,7 +1393,7 @@ int main(int argc, char *argv[])
        }
 
        /* Make sure Citadel is not running. */
-       if (test_server(setup_directory, relhome, enable_home) == 0) {
+       if (test_server(relhome, enable_home) == 0) {
                important_message("Citadel Setup",
                        "The Citadel service is still running.\n"
                        "Please stop the service manually and run "
@@ -1331,39 +1411,7 @@ int main(int argc, char *argv[])
 
        }
 
-       /*
-        * What we're going to try to do here is append a whole bunch of
-        * nulls to the citadel.config file, so we can keep the old config
-        * values if they exist, but if the file is missing or from an
-        * earlier version with a shorter config structure, when setup tries
-        * to read the old config parameters, they'll all come up zero.
-        * The length of the config file will be set to what it's supposed
-        * to be when we rewrite it, because we replace the old file with a
-        * completely new copy.
-        */
-       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);
-       }
-       fp = fdopen(a, "ab");
-       if (fp == NULL) {
-               display_error("setup: cannot append citadel.config");
-               cleanup(errno);
-       }
-       for (a = 0; a < sizeof(struct config); ++a) {
-               putc(0, fp);
-       }
-       fclose(fp);
-
-       /* now we re-open it, and read the old or blank configuration */
-       fp = fopen(file_citadel_config, "rb");
-       if (fp == NULL) {
-               display_error("setup: cannot open citadel.config");
-               cleanup(errno);
-       }
-       rv = fread((char *) &config, sizeof(struct config), 1, fp);
-       fclose(fp);
+       get_config ();
 
        set_default_values();
 
@@ -1375,8 +1423,7 @@ int main(int argc, char *argv[])
                }
        }
 
-/***** begin version update section ***** */
-       /* take care of any updating that is necessary */
+       /***** begin version update section *****/
 
        old_setup_level = config.c_setup_level;
 
@@ -1385,21 +1432,21 @@ int main(int argc, char *argv[])
        }
 
        if (old_setup_level < 555) {
-               important_message("Citadel Setup",
-                                 "This Citadel installation is too old "
-                                 "to be upgraded.");
+               important_message(
+                       "Citadel Setup",
+                       "This Citadel installation is too old to be upgraded."
+               );
                cleanup(1);
        }
        write_config_to_disk();
 
        old_setup_level = config.c_setup_level;
 
-       /* end of version update section */
+       /***** end of version update section *****/
 
 NEW_INST:
        config.c_setup_level = REV_LEVEL;
 
-/******************************************/
        if ((pw = getpwuid(config.c_ctdluid)) == NULL) {
                gid = getgid();
        } else {
@@ -1412,82 +1459,27 @@ NEW_INST:
 
         migrate_old_installs();        /* Delete files and directories used by older Citadel versions */
 
-       if (((setup_type == UI_SILENT) && (getenv("ALTER_ETC_SERVICES")!=NULL)) || 
-           (setup_type != UI_SILENT))
+       if (    ((setup_type == UI_SILENT)
+               && (getenv("ALTER_ETC_SERVICES")!=NULL))
+               || (setup_type != UI_SILENT)
+       ) {
                check_services_entry(); /* Check /etc/services */
+       }
+
 #ifndef __CYGWIN__
        delete_inittab_entry(); /* Remove obsolete /etc/inittab entry */
        check_xinetd_entry();   /* Check /etc/xinetd.d/telnet */
        disable_other_mtas();   /* Offer to disable other MTAs */
-
+       fixnss();               /* Check for the 'db' nss and offer to disable it */
 #endif
 
-       /* Check for the 'db' nss and offer to disable it */
-       fixnss();
-
        progress("Setting file permissions", 1, 3);
        rv = chown(file_citadel_config, config.c_ctdluid, gid);
        progress("Setting file permissions", 2, 3);
        rv = chmod(file_citadel_config, S_IRUSR | S_IWUSR);
        progress("Setting file permissions", 3, 3);
 
-       /* 
-        * If we're running on SysV, install init scripts.
-        */
-       if (!access("/var/run", W_OK)) {
-
-               if (getenv("NO_INIT_SCRIPTS") == NULL) {
-                       install_init_scripts();
-               }
-
-               if (!access("/etc/init.d/citadel", X_OK)) {
-                       rv = system("/etc/init.d/citadel start");
-                       sleep(3);
-               }
-
-               if (test_server(setup_directory, relhome, enable_home) == 0) {
-                       char buf[SIZ];
-                       int found_it = 0;
-
-                       if (config.c_auth_mode == AUTHMODE_NATIVE) {
-                               snprintf (admin_cmd, sizeof(admin_cmd), "%s/sendcommand \"CREU %s|%s\" 2>&1", 
-                                       ctdl_sbin_dir, config.c_sysadm, admin_pass);
-                               fp = popen(admin_cmd, "r");
-                               if (fp != NULL) {
-                                       while (fgets(buf, sizeof buf, fp) != NULL) 
-                                       {
-                                               if ((atol(buf) == 574) || (atol(buf) == 200))
-                                                       ++found_it;
-                                       }
-                                       pclose(fp);
-                               }
-                       
-                               if (found_it == 0) {
-                                       important_message("Error","Setup failed to create your admin user");
-                               }
-                       }
-
-                       if (setup_type != UI_SILENT)
-                               important_message("Setup finished",
-                                                 "Setup of the Citadel server is complete.\n"
-                                                 "If you will be using WebCit, please run its\n"
-                                                 "setup program now; otherwise, run './citadel'\n"
-                                                 "to log in.\n");
-               }
-               else {
-                       important_message("Setup failed",
-                               "Setup is finished, but the Citadel server failed to start.\n"
-                               "Go back and check your configuration.\n"
-                       );
-               }
-
-       }
-
-       else {
-               important_message("Setup finished",
-                       "Setup is finished.  You may now start the server.");
-       }
-
+       check_init_script(relhome);
        cleanup(0);
        return 0;
 }