Added our standard 'designed to piss off Richard Stallman' license declaration to...
[citadel.git] / citadel / utils / setup.c
index cbe30e96b4b04d41c77ea3b493d75b60558081b4..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] = _(
@@ -151,8 +170,8 @@ void SetTitles(void)
        setup_text[eIP_ADDR] = _(
 "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"
+"\"*\" 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.");
@@ -214,6 +233,19 @@ void SetTitles(void)
 "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
 }
 
 /*
@@ -240,8 +272,6 @@ void cit_backtrace(void)
 
 struct config config;
 
-
-struct config config;
 int direction;
 
 
@@ -273,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))
                        {
@@ -321,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;
 
@@ -330,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);
@@ -339,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)
@@ -423,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);
@@ -474,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;
        }
@@ -482,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;
@@ -491,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);
@@ -533,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;
        }
 
@@ -609,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"));
 }
 
 
@@ -646,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;
                }
@@ -674,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"));
 }
 
 
@@ -703,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;
@@ -719,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[] = {
@@ -819,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;
                }
@@ -836,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)) {
@@ -848,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;
        }
 }
@@ -1023,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);
 }
 
@@ -1054,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
  */
@@ -1073,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;
@@ -1091,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] == '#') {
@@ -1102,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]);
@@ -1130,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);
@@ -1164,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);
                }
 
@@ -1190,27 +1272,68 @@ 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)
 {
        struct passwd *pw;
@@ -1221,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) {
@@ -1232,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) {
@@ -1290,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);
 }
 
 
@@ -1322,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) {
@@ -1338,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);
 
 }
@@ -1404,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);
        }
 
@@ -1422,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);
        }
 
@@ -1438,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;
 
        }
@@ -1465,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);
        }
@@ -1489,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)
@@ -1505,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);