X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Futils%2Fsetup.c;h=bf6ea963429b907ca9665d7b955a48d254ddadd8;hb=0f7b8c91ca57eba48ff548bcbefcaacf9038384b;hp=da770f7d15d9a53130d4275d8d54687b49d13d47;hpb=4539c6b2081290b53592b5ded98099abc0b60939;p=citadel.git diff --git a/citadel/utils/setup.c b/citadel/utils/setup.c index da770f7d1..bf6ea9634 100644 --- a/citadel/utils/setup.c +++ b/citadel/utils/setup.c @@ -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 @@ -102,7 +112,6 @@ const char *setup_text[eMaxQuestions]; void SetTitles(void) { - char *locale; int have_run_dir; #ifndef HAVE_RUN_DIR have_run_dir = 1; @@ -110,11 +119,13 @@ void SetTitles(void) have_run_dir = 0; #endif - locale = setlocale(LC_MESSAGES, getenv("LANG")); +#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) @@ -159,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."); @@ -261,8 +272,6 @@ void cit_backtrace(void) struct config config; - -struct config config; int direction; @@ -352,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); @@ -524,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); @@ -642,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")); } @@ -707,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")); } @@ -760,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[] = { @@ -877,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)) { @@ -889,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; } } @@ -1071,8 +1112,13 @@ void write_config_to_disk(void) if (fp == NULL) { 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); } @@ -1095,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 */ @@ -1114,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; @@ -1132,7 +1168,6 @@ void fixnss(void) { } while (fgets(buf, sizeof buf, fp_read) != NULL) { - changed = 0; strcpy(buf_nc, buf); for (i=0; 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]); @@ -1186,6 +1220,9 @@ void fixnss(void) { 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); @@ -1207,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); } @@ -1254,6 +1293,47 @@ void check_init_script (char *relhome) } } + + +#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; @@ -1264,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) { @@ -1275,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, ""); - 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, ""); + 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) { @@ -1333,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); } @@ -1383,8 +1455,11 @@ void get_config (void) if (fp == NULL) { 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); } @@ -1465,6 +1540,8 @@ 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. */ @@ -1533,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)