Added our standard 'designed to piss off Richard Stallman' license declaration to...
[citadel.git] / citadel / utils / setup.c
index 7a38bc2f731e5205baba9190c59ef226b59f8e1e..bf6ea963429b907ca9665d7b955a48d254ddadd8 100644 (file)
@@ -1,5 +1,15 @@
 /*
  * Citadel setup utility
+ *
+ * Copyright (c) 1987-2012 by the citadel.org team
+ *
+ * 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.
  */
 
 #define SHOW_ME_VAPPEND_PRINTF
@@ -108,6 +118,15 @@ void SetTitles(void)
 #else
        have_run_dir = 0;
 #endif
+
+#ifdef ENABLE_NLS
+       setlocale(LC_MESSAGES, getenv("LANG"));
+
+       bindtextdomain("citadel-setup", LOCALEDIR"/locale");
+       textdomain("citadel-setup");
+       bind_textdomain_codeset("citadel-setup","UTF8");
+#endif
+
        setup_titles[eCitadelHomeDir] = _("Citadel Home Directory");
        if (have_run_dir)
                setup_text[eCitadelHomeDir] = _(
@@ -124,13 +143,15 @@ void SetTitles(void)
 "note that it may not have a leading /");
 
 
-       setup_titles[eSysAdminName] = _("Citadel administrator username:");////
+       setup_titles[eSysAdminName] = _("Citadel administrator username:");
        setup_text[eSysAdminName] = _(
-"Enter the name of the system administrator (which is probably\n"
-"you).  When an account is created with this name, it will\n"
-"automatically be given administrator-level access.\n");
+"Please enter the name of the Citadel user account that should be granted "
+"administrative privileges once created. If using internal authentication "
+"this user account will be created if it does not exist. For external "
+"authentication this user account has to exist.");
+
 
-       setup_titles[eSysAdminPW] = _("Administrator password:");//
+       setup_titles[eSysAdminPW] = _("Administrator password:");
        setup_text[eSysAdminPW] = _(
 "Enter a password for the system administrator. When setup\n"
 "completes it will attempt to create the administrator user\n"
@@ -145,14 +166,15 @@ void SetTitles(void)
 "user ID here.  You may specify either a user name or a numeric\n"
 "UID.\n");
 
-       setup_titles[eIP_ADDR] = _("Listening address for the Citadel server:");///
+       setup_titles[eIP_ADDR] = _("Listening address for the Citadel server:");
        setup_text[eIP_ADDR] = _(
-"Specify the IP address on which your server will run.\n"
+"Please specify the IP address which the server should be listening to. "
 "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");
+"\"*\" 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. "
+"This can usually be left to the default unless multiple instances of Citadel "
+"are running on the same computer.");
 
        setup_titles[eCTDL_Port] = _("Server port number:");
        setup_text[eCTDL_Port] = _(
@@ -163,9 +185,16 @@ void SetTitles(void)
 "of Citadel on the same computer and there is something else\n"
 "already using port 504.\n");
 
-       setup_titles[eAuthType] = _("Authentication method to use:");////
+       setup_titles[eAuthType] = _("Authentication method to use:");
        setup_text[eAuthType] = _(
-"Specify which authentication mode you wish to use.\n"
+"Please choose the user authentication mode. By default Citadel will use its "
+"own internal user accounts database. If you choose Host, Citadel users will "
+"have accounts on the host system, authenticated via /etc/passwd or a PAM "
+"source. LDAP chooses an RFC 2307 compliant directory server, the last option "
+"chooses the nonstandard MS Active Directory LDAP scheme."
+"\n"
+"Do not change this option unless you are sure it is required, since changing "
+"back requires a full reinstall of Citadel."
 "\n"
 " 0. Self contained authentication\n"
 " 1. Host system integrated authentication\n"
@@ -176,31 +205,47 @@ void SetTitles(void)
 "\n"
 "ANSWER \"0\" UNLESS YOU COMPLETELY UNDERSTAND THIS OPTION.\n");
 
-       setup_titles[eLDAP_Host] = _("LDAP host:");///
+       setup_titles[eLDAP_Host] = _("LDAP host:");
        setup_text[eLDAP_Host] = _(
 "Please enter the host name or IP address of your LDAP server.\n");
 
-       setup_titles[eLDAP_Port] = _("LDAP port number:");////
+       setup_titles[eLDAP_Port] = _("LDAP port number:");
        setup_text[eLDAP_Port] = _(
 "Please enter the port number of the LDAP service (usually 389).\n");
 
-       setup_titles[eLDAP_Base_DN] = _("LDAP base DN:");///
+       setup_titles[eLDAP_Base_DN] = _("LDAP base DN:");
        setup_text[eLDAP_Base_DN] = _(
 "Please enter the Base DN to search for authentication\n"
 "(for example: dc=example,dc=com)\n");
 
-       setup_titles[eLDAP_Bind_DN] = _("LDAP bind DN:");//
+       setup_titles[eLDAP_Bind_DN] = _("LDAP bind DN:");
        setup_text[eLDAP_Bind_DN] = _(
+"Please enter the DN of an account to use for binding to the LDAP server for "
+"performing queries. The account does not require any other privileges. If "
+"your LDAP server allows anonymous queries, you can leave this blank."
 "Please enter the DN of an account to use for binding to the LDAP server\n"
 "for performing queries.  The account does not require any other\n"
-"privileges.  If your LDAP server allows anonymous queries, you can.\n"
+"privileges.  If your LDAP server allows anonymous queries, you can\n"
 "leave this blank.\n");
 
-       setup_titles[eLDAP_Bind_PW] = _("LDAP bind password:");//
+       setup_titles[eLDAP_Bind_PW] = _("LDAP bind password:");
        setup_text[eLDAP_Bind_PW] = _(
 "If you entered a Bind DN in the previous question, you must now enter\n"
 "the password associated with that account.  Otherwise, you can leave this\n"
 "blank.\n");
+
+#if 0
+// Debug loading of locales... Strace does a better job though.
+       printf("Message catalog directory: %s\n", bindtextdomain("citadel-setup", LOCALEDIR"/locale"));
+       printf("Text domain: %s\n", textdomain("citadel-setup"));
+       printf("Text domain Charset: %s\n", bind_textdomain_codeset("citadel-setup","UTF8"));
+       {
+               int i;
+               for (i = 0; i < eMaxQuestions; i++)
+                       printf("%s - %s\n", setup_titles[i], _(setup_titles[i]));
+               exit(0);
+       }
+#endif
 }
 
 /*
@@ -227,8 +272,6 @@ void cit_backtrace(void)
 
 struct config config;
 
-
-struct config config;
 int direction;
 
 
@@ -260,9 +303,10 @@ int yesno(const char *question, int default_value)
 
        case UI_TEXT:
                do {
-                       printf("%s\nYes/No [%s] --> ",
-                               question,
-                               ( default_value ? "Yes" : "No" )
+                       printf("%s\n%s [%s] --> ",
+                              question,
+                              _("Yes/No"),
+                              ( default_value ? _("Yes") : _("No") )
                        );
                        if (fgets(buf, sizeof buf, stdin))
                        {
@@ -308,7 +352,7 @@ void important_message(const char *title, const char *msgtext)
        case UI_TEXT:
                printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                printf("       %s \n\n%s\n\n", title, msgtext);
-               printf("Press return to continue...");
+               printf("%s", _("Press return to continue..."));
                if (fgets(buf, sizeof buf, stdin));
                break;
 
@@ -317,6 +361,8 @@ void important_message(const char *title, const char *msgtext)
                        getenv("CTDL_DIALOG"),
                        msgtext);
                rv = system(buf);
+               if (rv != 0)
+                       fprintf(stderr, _("failed to run the dialog command\n"));
                break;
        case UI_SILENT:
                fprintf(stderr, "%s\n", msgtext);
@@ -326,12 +372,23 @@ void important_message(const char *title, const char *msgtext)
 
 void important_msgnum(int msgnum)
 {
-       important_message("Important Message", setup_text[msgnum]);
+       important_message(_("Important Message"), setup_text[msgnum]);
 }
 
-void display_error(char *error_message)
+void display_error(char *error_message_format, ...)
 {
-       important_message("Error", error_message);
+       StrBuf *Msg;
+       va_list arg_ptr;
+
+       Msg = NewStrBuf();
+       va_start(arg_ptr, error_message_format);
+       StrBufVAppendPrintf(Msg, 
+                           error_message_format, 
+                           arg_ptr);
+       va_end(arg_ptr);
+
+       important_message(_("Error"), ChrPtr(Msg));
+       FreeStrBuf(&Msg);
 }
 
 void progress(char *text, long int curr, long int cmax)
@@ -410,11 +467,11 @@ void check_services_entry(void)
 
        if (getservbyname(SERVICE_NAME, PROTO_NAME) == NULL) {
                for (i=0; i<=2; ++i) {
-                       progress("Adding service entry...", i, 2);
+                       progress(_("Adding service entry..."), i, 2);
                        if (i == 0) {
                                sfp = fopen("/etc/services", "a");
                                if (sfp == NULL) {
-                                       sprintf(errmsg, "Cannot open /etc/services: %s", strerror(errno));
+                                       sprintf(errmsg, "%s /etc/services: %s", _("Cannot open"), strerror(errno));
                                        display_error(errmsg);
                                } else {
                                        fprintf(sfp, "%s                504/tcp\n", SERVICE_NAME);
@@ -461,7 +518,7 @@ void delete_inittab_entry(void)
 
                /* Other errors might mean something really did go wrong.
                 */
-               sprintf(buf, "Cannot open /etc/inittab: %s", strerror(errno));
+               sprintf(buf, "%s /etc/inittab: %s", _("Cannot open"), strerror(errno));
                display_error(buf);
                return;
        }
@@ -469,7 +526,7 @@ void delete_inittab_entry(void)
        strcpy(outfilename, "/tmp/ctdlsetup.XXXXXX");
        outfp = fdopen(mkstemp(outfilename), "w+");
        if (outfp == NULL) {
-               sprintf(buf, "Cannot open %s: %s", outfilename, strerror(errno));
+               sprintf(buf, "%s %s: %s", _("Cannot open"), outfilename, strerror(errno));
                display_error(buf);
                fclose(infp);
                return;
@@ -478,9 +535,21 @@ void delete_inittab_entry(void)
        while (fgets(buf, sizeof buf, infp) != NULL) {
                if (strstr(buf, looking_for) != NULL) {
                        rv = fwrite("#", 1, 1, outfp);
+                       if (rv == -1)
+                       {
+                               display_error("%s %s\n",
+                                             _("failed to modify inittab"), 
+                                             strerror(errno));
+                       }
                        ++changes_made;
                }
                rv = fwrite(buf, strlen(buf), 1, outfp);
+               if (rv == -1)
+               {
+                       display_error("%s %s\n",
+                                     _("failed to modify inittab"), 
+                                     strerror(errno));
+               }
        }
 
        fclose(infp);
@@ -520,21 +589,21 @@ void install_init_scripts(void)
 
        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) {
+               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) {
+       if (yesno(_("Would you like to automatically start Citadel at boot?\n"), 1) == 0) {
                return;
        }
 
        fp = fopen(initfile, "w");
        if (fp == NULL) {
-               display_error("Cannot create /etc/init.d/citadel");
+               display_error("%s /etc/init.d/citadel", _("Cannot create"));
                return;
        }
 
@@ -596,11 +665,18 @@ void install_init_scripts(void)
 
        /* Set up the run levels. */
        rv = system("/bin/rm -f /etc/rc?.d/[SK]??citadel 2>/dev/null");
+       if (rv != 0)
+               display_error(_("failed to remove system V init links \n"));
+
        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);
        rv = system(command);
+       if (rv != 0)
+               display_error(_("failed to set system V init links \n"));
+
        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);
        rv = system(command);
-
+       if (rv != 0)
+               display_error(_("failed to set system V init links \n"));
 }
 
 
@@ -633,10 +709,10 @@ void check_xinetd_entry(void) {
        }
        else {
                snprintf(buf, sizeof buf,
-                        "Setup can configure the \"xinetd\" service to automatically\n"
-                        "connect incoming telnet sessions to Citadel, bypassing the\n"
-                        "host system login: prompt.  Would you like to do this?\n"
-                       );
+                        _("Setup can configure the \"xinetd\" service to automatically\n"
+                          "connect incoming telnet sessions to Citadel, bypassing the\n"
+                          "host system login: prompt.  Would you like to do this?\n"
+                                ));
                if (yesno(buf, 1) == 0) {
                        return;
                }
@@ -661,6 +737,8 @@ void check_xinetd_entry(void) {
 
        /* Now try to restart the service */
        rv = system("/etc/init.d/xinetd restart >/dev/null 2>&1");
+       if (rv != 0)
+               display_error(_("failed to restart xinetd.\n"));
 }
 
 
@@ -690,14 +768,22 @@ void disable_other_mta(const char *mta) {
        /* Offer to replace other MTA with the vastly superior Citadel :)  */
 
        snprintf(buf, sizeof buf,
-                "You appear to have the \"%s\" email program\n"
-                "running on your system.  If you want Citadel mail\n"
-                "connected with %s, you will have to manually integrate\n"
-                "them.  It is preferable to disable %s, and use Citadel's\n"
-                "SMTP, POP3, and IMAP services.\n\n"
-                "May we disable %s so that Citadel has access to ports\n"
-                "25, 110, and 143?\n",
-                mta, mta, mta, mta
+                "%s \"%s\" %s%s%s%s%s%s%s", 
+                _("You appear to have the "), 
+                mta, 
+                _(" email program\n"
+                  "running on your system.  If you want Citadel mail\n"
+                  "connected with "), 
+                mta,
+                _(" you will have to manually integrate\n"
+                  "them.  It is preferable to disable "), 
+                mta,
+                _(", and use Citadel's\n"
+                  "SMTP, POP3, and IMAP services.\n\n"
+                  "May we disable "), 
+                mta, 
+                _("so that Citadel has access to ports\n"
+                  "25, 110, and 143?\n")
                );
        if (yesno(buf, 1) == 0) {
                return;
@@ -706,8 +792,13 @@ void disable_other_mta(const char *mta) {
 
        sprintf(buf, "for x in /etc/rc*.d/S*%s; do mv $x `echo $x |sed s/S/K/g`; done >/dev/null 2>&1", mta);
        rv = system(buf);
+       if (rv != 0)
+               display_error("%s %s.\n", _("failed to disable other mta"), mta);
+
        sprintf(buf, "/etc/init.d/%s stop >/dev/null 2>&1", mta);
        rv = system(buf);
+       if (rv != 0)
+               display_error(" %s.\n", _("failed to disable other mta"), mta);
 }
 
 const char *other_mtas[] = {
@@ -806,8 +897,8 @@ void strprompt(const char *prompt_title, const char *prompt_text, char *Target,
        case UI_TEXT:
                title(prompt_title);
                printf("\n%s\n", prompt_text);
-               printf("This is currently set to:\n%s\n", Target);
-               printf("Enter new value or press return to leave unchanged:\n");
+               printf("%s\n%s\n", _("This is currently set to:"), Target);
+               printf("%s\n", _("Enter new value or press return to leave unchanged:"));
                if (fgets(buf, sizeof buf, stdin)){
                        buf[strlen(buf) - 1] = 0;
                }
@@ -823,6 +914,9 @@ void strprompt(const char *prompt_title, const char *prompt_text, char *Target,
                        Target,
                        dialog_result);
                rv = system(buf);
+               if (rv != 0)
+                       fprintf(stderr, "failed to run Dialog.\n");
+               
                fp = fopen(dialog_result, "r");
                if (fp != NULL) {
                        if (fgets(Target, sizeof buf, fp)) {
@@ -835,7 +929,8 @@ void strprompt(const char *prompt_title, const char *prompt_text, char *Target,
                }
                break;
        case UI_SILENT:
-               strcpy(Target, DefValue);
+               if (*DefValue != '\0')
+                       strcpy(Target, DefValue);
                break;
        }
 }
@@ -1010,15 +1105,20 @@ void write_config_to_disk(void)
        int rv;
 
        if ((fd = creat(file_citadel_config, S_IRUSR | S_IWUSR)) == -1) {
-               display_error("setup: cannot open citadel.config");
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot open"), file_citadel_config, strerror(errno));
                cleanup(1);
        }
        fp = fdopen(fd, "wb");
        if (fp == NULL) {
-               display_error("setup: cannot open citadel.config");
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot open"), file_citadel_config, strerror(errno));
                cleanup(1);
+               return;
        }
        rv = fwrite((char *) &config, sizeof(struct config), 1, fp);
+
+       if (rv == -1)
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot write"), file_citadel_config, strerror(errno));
+
        fclose(fp);
 }
 
@@ -1041,15 +1141,6 @@ int discover_ui(void)
 
 
 
-void migrate_old_installs(void)
-{
-       int rv;
-       rv = system("exec /bin/rm -fr ./rooms ./chatpipes ./expressmsgs ./sessions 2>/dev/null");
-       unlink("citadel.log");
-       unlink("weekly");
-}
-
-
 /*
  * Strip "db" entries out of /etc/nsswitch.conf
  */
@@ -1060,7 +1151,6 @@ void fixnss(void) {
        char buf_nc[256];
        char question[512];
        int i;
-       int changed = 0;
        int file_changed = 0;
        char new_filename[64];
        int rv;
@@ -1078,7 +1168,6 @@ void fixnss(void) {
        }
 
        while (fgets(buf, sizeof buf, fp_read) != NULL) {
-               changed = 0;
                strcpy(buf_nc, buf);
                for (i=0; i<strlen(buf_nc); ++i) {
                        if (buf_nc[i] == '#') {
@@ -1089,7 +1178,6 @@ void fixnss(void) {
                        if (!strncasecmp(&buf_nc[i], "db", 2)) {
                                if (i > 0) {
                                        if ((isspace(buf_nc[i+2])) || (buf_nc[i+2]==0)) {
-                                               changed = 1;
                                                file_changed = 1;
                                                strcpy(&buf_nc[i], &buf_nc[i+2]);
                                                strcpy(&buf[i], &buf[i+2]);
@@ -1117,19 +1205,24 @@ void fixnss(void) {
        }
 
        snprintf(question, sizeof question,
-               "\n"
-               "/etc/nsswitch.conf is configured to use the 'db' module for\n"
-               "one or more services.  This is not necessary on most systems,\n"
-               "and it is known to crash the Citadel server when delivering\n"
-               "mail to the Internet.\n"
-               "\n"
-               "Do you want this module to be automatically disabled?\n"
-               "\n"
+                _(
+                        "\n"
+                        "/etc/nsswitch.conf is configured to use the 'db' module for\n"
+                        "one or more services.  This is not necessary on most systems,\n"
+                        "and it is known to crash the Citadel server when delivering\n"
+                        "mail to the Internet.\n"
+                        "\n"
+                        "Do you want this module to be automatically disabled?\n"
+                        "\n"
+                        )
        );
 
        if (yesno(question, 1)) {
                sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
                rv = system(buf);
+               if (rv != 0)
+                       fprintf(stderr, "failed to edit %s.\n", NSSCONF);
+
                chmod(NSSCONF, 0644);
        }
        unlink(new_filename);
@@ -1151,6 +1244,8 @@ void check_init_script (char *relhome)
 
                if (!access("/etc/init.d/citadel", X_OK)) {
                        rv = system("/etc/init.d/citadel start");
+                       if (rv != 0)
+                               fprintf(stderr, "failed to call our initscript.");
                        sleep(3);
                }
 
@@ -1177,26 +1272,67 @@ void check_init_script (char *relhome)
                        }
 
                        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");
+                               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"
-                       );
+                       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.");
+               important_message(_("Setup finished"),
+                                 _("Setup is finished.  You may now start the server."));
+       }
+}
+
+
+
+#define GetDefaultVALINT(CFGNAME, DEFL) GetDefaultValInt(&config.CFGNAME, "CITADEL_"#CFGNAME, DEFL)
+void GetDefaultValInt(int *WhereTo, const char *VarName, int DefVal)
+{
+       const char *ch;
+       if (*WhereTo == 0) *WhereTo = DefVal;
+
+       if ((setup_type == UI_SILENT) &&
+           (ch = getenv(VarName), ch != NULL))
+       {
+               *WhereTo = atoi(ch);
        }
 }
+#define GetDefaultVALCHAR(CFGNAME, DEFL) GetDefaultValChar(&config.CFGNAME, "CITADEL_"#CFGNAME, DEFL)
+void GetDefaultValChar(char *WhereTo, const char *VarName, char DefVal)
+{
+       const char *ch;
+       if (*WhereTo == 0) *WhereTo = DefVal;
+
+       if ((setup_type == UI_SILENT) &&
+           (ch = getenv(VarName), ch != NULL))
+       {
+               *WhereTo = atoi(ch);
+       }
+}
+#define GetDefaultVALSTR(CFGNAME, DEFL) GetDefaultValStr(&config.CFGNAME[0], sizeof(config.CFGNAME), "CITADEL_"#CFGNAME, DEFL)
+void GetDefaultValStr(char *WhereTo, size_t nMax, const char *VarName, const char *DefVal)
+{
+       const char *ch;
+       if (*WhereTo == '\0') 
+               safestrncpy(WhereTo, DefVal, nMax);
+
+       if ((setup_type == UI_SILENT) &&
+           (ch = getenv(VarName), ch != NULL))
+       {
+               safestrncpy(WhereTo, ch, nMax);
+       }
+}
+
 
 void set_default_values(void)
 {
@@ -1208,9 +1344,7 @@ void set_default_values(void)
        uname(&my_utsname);
 
        /* set some sample/default values in place of blanks... */
-       if (IsEmptyStr(config.c_nodename))
-               safestrncpy(config.c_nodename, my_utsname.nodename,
-                           sizeof config.c_nodename);
+       GetDefaultVALSTR(c_nodename, my_utsname.nodename);
        strtok(config.c_nodename, ".");
        if (IsEmptyStr(config.c_fqdn) ) {
                if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
@@ -1219,25 +1353,19 @@ void set_default_values(void)
                        safestrncpy(config.c_fqdn, my_utsname.nodename, sizeof config.c_fqdn);
                }
        }
-       if (IsEmptyStr(config.c_humannode)) {
-               strcpy(config.c_humannode, "My System");
-       }
-       if (IsEmptyStr(config.c_phonenum)) {
-               strcpy(config.c_phonenum, "US 800 555 1212");
-       }
-       if (config.c_initax == 0) {
-               config.c_initax = 4;
-       }
-       if (IsEmptyStr(config.c_moreprompt)) strcpy(config.c_moreprompt, "<more>");
-       if (IsEmptyStr(config.c_twitroom)) strcpy(config.c_twitroom, "Trashcan");
-       if (IsEmptyStr(config.c_baseroom)) strcpy(config.c_baseroom, BASEROOM);
-       if (IsEmptyStr(config.c_aideroom)) strcpy(config.c_aideroom, "Aide");
-       if (config.c_port_number == 0) {
-               config.c_port_number = 504;
-       }
-       if (config.c_sleeping == 0) {
-               config.c_sleeping = 900;
-       }
+       GetDefaultVALSTR(c_humannode, _("My System"));
+       GetDefaultVALSTR(c_phonenum, _("US 800 555 1212"));
+
+       GetDefaultVALCHAR(c_initax, 4);
+
+       GetDefaultVALSTR(c_moreprompt, "<more>");
+       GetDefaultVALSTR(c_twitroom, "Trashcan");
+       GetDefaultVALSTR(c_baseroom, BASEROOM);
+       GetDefaultVALSTR(c_aideroom, "Aide");
+       GetDefaultVALINT(c_port_number, 504);
+       
+       GetDefaultVALINT(c_sleeping, 900);
+
        if (config.c_ctdluid == 0) {
                pw = getpwnam("citadel");
                if (pw != NULL) {
@@ -1277,17 +1405,17 @@ void set_default_values(void)
        /*
         * Default port numbers for various services
         */
-       if (config.c_smtp_port == 0) config.c_smtp_port = 25;
-       if (config.c_pop3_port == 0) config.c_pop3_port = 110;
-       if (config.c_imap_port == 0) config.c_imap_port = 143;
-       if (config.c_msa_port == 0) config.c_msa_port = 587;
-       if (config.c_smtps_port == 0) config.c_smtps_port = 465;
-       if (config.c_pop3s_port == 0) config.c_pop3s_port = 995;
-       if (config.c_imaps_port == 0) config.c_imaps_port = 993;
-       if (config.c_pftcpdict_port == 0) config.c_pftcpdict_port = -1;
-       if (config.c_managesieve_port == 0) config.c_managesieve_port = 2020;
-       if (config.c_xmpp_c2s_port == 0) config.c_xmpp_c2s_port = 5222;
-       if (config.c_xmpp_s2s_port == 0) config.c_xmpp_s2s_port = 5269;
+       GetDefaultVALINT(c_smtp_port, 25);
+       GetDefaultVALINT(c_pop3_port, 110);
+       GetDefaultVALINT(c_imap_port, 143);
+       GetDefaultVALINT(c_msa_port, 587);
+       GetDefaultVALINT(c_smtps_port, 465);
+       GetDefaultVALINT(c_pop3s_port, 995);
+       GetDefaultVALINT(c_imaps_port, 993);
+       GetDefaultVALINT(c_pftcpdict_port, -1);
+       GetDefaultVALINT(c_managesieve_port, 2020);
+       GetDefaultVALINT(c_xmpp_c2s_port, 5222);
+       GetDefaultVALINT(c_xmpp_s2s_port, 5269);
 }
 
 
@@ -1309,12 +1437,12 @@ void get_config (void)
         */
        if ((a = open(file_citadel_config, O_WRONLY | O_CREAT | O_APPEND,
                      S_IRUSR | S_IWUSR)) == -1) {
-               display_error("setup: cannot append citadel.config");
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot append"), file_citadel_config, strerror(errno));
                cleanup(errno);
        }
        fp = fdopen(a, "ab");
        if (fp == NULL) {
-               display_error("setup: cannot append citadel.config");
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot append"), file_citadel_config, strerror(errno));
                cleanup(errno);
        }
        for (a = 0; a < sizeof(struct config); ++a) {
@@ -1325,10 +1453,13 @@ void get_config (void)
        /* 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");
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot open"), file_citadel_config, strerror(errno));
                cleanup(errno);
+               return;
        }
        rv = fread((char *) &config, sizeof(struct config), 1, fp);
+       if (rv == -1)
+               display_error("%s citadel.config [%s][%s]\n", _("setup: cannot write"), file_citadel_config, strerror(errno));
        fclose(fp);
 
 }
@@ -1391,17 +1522,17 @@ int main(int argc, char *argv[])
                setup_type = discover_ui();
        }
        if (info_only == 1) {
-               important_message("Citadel Setup", CITADEL);
+               important_message(_("Citadel Setup"), CITADEL);
                cleanup(0);
        }
 
        enable_home = ( relh | home );
 
        if (chdir(ctdl_run_dir) != 0) {
-               char errmsg[SIZ];
-               sprintf(errmsg, "The directory you specified does not exist: [%s]\n", ctdl_run_dir);
-               
-               important_message("Citadel Setup", errmsg);
+               display_error(_("Citadel Setup"), 
+                             "%s: [%s]\n", 
+                             _("The directory you specified does not exist"), 
+                             ctdl_run_dir);
                cleanup(errno);
        }
 
@@ -1409,14 +1540,16 @@ int main(int argc, char *argv[])
        /* Try to stop Citadel if we can */
        if (!access("/etc/init.d/citadel", X_OK)) {
                rv = system("/etc/init.d/citadel stop");
+               if (rv != 0)
+                       fprintf(stderr, _("failed to stop us using the initscript.\n"));
        }
 
        /* Make sure Citadel is not running. */
        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 "
-                       "setup again.");
+               important_message(_("Citadel Setup"),
+                                 _("The Citadel service is still running.\n"
+                                   "Please stop the service manually and run "
+                                   "setup again."));
                cleanup(1);
        }
 
@@ -1425,7 +1558,8 @@ int main(int argc, char *argv[])
 
        case UI_TEXT:
                printf("\n\n\n"
-                       "              *** Citadel setup program ***\n\n");
+                      "               *** %s ***\n\n",
+                      _("Citadel setup program"));
                break;
 
        }
@@ -1452,8 +1586,8 @@ int main(int argc, char *argv[])
 
        if (old_setup_level < 555) {
                important_message(
-                       "Citadel Setup",
-                       "This Citadel installation is too old to be upgraded."
+                       _("Citadel Setup"),
+                       _("This Citadel installation is too old to be upgraded.")
                );
                cleanup(1);
        }
@@ -1476,8 +1610,6 @@ NEW_INST:
 
        write_config_to_disk();
 
-        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)
@@ -1492,11 +1624,11 @@ NEW_INST:
        fixnss();               /* Check for the 'db' nss and offer to disable it */
 #endif
 
-       progress("Setting file permissions", 1, 3);
+       progress(_("Setting file permissions"), 1, 3);
        rv = chown(file_citadel_config, config.c_ctdluid, gid);
-       progress("Setting file permissions", 2, 3);
+       progress(_("Setting file permissions"), 2, 3);
        rv = chmod(file_citadel_config, S_IRUSR | S_IWUSR);
-       progress("Setting file permissions", 3, 3);
+       progress(_("Setting file permissions"), 3, 3);
 
        check_init_script(relhome);
        cleanup(0);