X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Futils%2Fsetup.c;h=1cbc777417dee56b5904c6171802006723da7260;hp=ce99e8f02772212a8a79673d37039e6918397187;hb=51834f3a61644b1f6f5a5f528cf36fbfbc73b2de;hpb=408a64d0f8c3b2a17cb291388f8ada274e6e83e3 diff --git a/citadel/utils/setup.c b/citadel/utils/setup.c index ce99e8f02..1cbc77741 100644 --- a/citadel/utils/setup.c +++ b/citadel/utils/setup.c @@ -1,7 +1,7 @@ /* * Citadel setup utility * - * Copyright (c) 1987-2016 by the citadel.org team + * Copyright (c) 1987-2019 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. @@ -36,9 +36,6 @@ #include "axdefs.h" #include "sysdep.h" #include "citadel_dirs.h" -#if HAVE_BACKTRACE -#include -#endif #ifdef ENABLE_NLS #ifdef HAVE_XLOCALE_H @@ -51,10 +48,6 @@ #define _(string) (string) #endif -#define UI_TEXT 0 /* Default setup type -- text only */ -#define UI_DIALOG 2 /* Use the 'whiptail' or 'dialog' program */ -#define UI_SILENT 3 /* Silent running, for use in scripts */ - #define SERVICE_NAME "citadel" #define PROTO_NAME "tcp" #define NSSCONF "/etc/nsswitch.conf" @@ -115,7 +108,6 @@ void SetTitles(void) #ifdef ENABLE_NLS setlocale(LC_MESSAGES, getenv("LANG")); - bindtextdomain("citadel-setup", LOCALEDIR"/locale"); textdomain("citadel-setup"); bind_textdomain_codeset("citadel-setup","UTF8"); @@ -192,8 +184,8 @@ void SetTitles(void) "\n" " 0. Self contained authentication\n" " 1. Host system integrated authentication\n" -" 2. External LDAP - RFC 2307 compliant directory\n" -" 3. External LDAP - nonstandard MS Active Directory\n" +" 2. External LDAP - RFC 2307 POSIX schema\n" +" 3. External LDAP - MS Active Directory schema\n" "\n" "For help: http://www.citadel.org/doku.php/faq:installation:authmodes\n" "\n" @@ -239,105 +231,52 @@ void SetTitles(void) } - -void title(const char *text) -{ - if (setup_type == UI_TEXT) { - printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<%s>\n", text); - } +void title(const char *text) { + printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<%s>\n", text); } - -int yesno(const char *question, int default_value) -{ - int i = 0; +int yesno(const char *question, int default_value) { int answer = 0; char buf[SIZ]; - switch (setup_type) { - - case UI_TEXT: - do { - printf("%s\n%s [%s] --> ", - question, - _("Yes/No"), - ( default_value ? _("Yes") : _("No") ) - ); - if (fgets(buf, sizeof buf, stdin)) - { - answer = tolower(buf[0]); - if ((buf[0]==0) || (buf[0]==13) || (buf[0]==10)) { - answer = default_value; - } - else if (answer == 'y') { - answer = 1; - } - else if (answer == 'n') { - answer = 0; - } + do { + printf("%s\n%s [%s] --> ", question, _("Yes/No"), ( default_value ? _("Yes") : _("No") )); + if (fgets(buf, sizeof buf, stdin)) { + answer = tolower(buf[0]); + if ((buf[0]==0) || (buf[0]==13) || (buf[0]==10)) { + answer = default_value; + } + else if (answer == 'y') { + answer = 1; + } + else if (answer == 'n') { + answer = 0; } - } while ((answer < 0) || (answer > 1)); - break; - - case UI_DIALOG: - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' %s --yesno '%s' 15 75", - getenv("CTDL_DIALOG"), - program_title, - ( default_value ? "" : "--defaultno" ), - question); - i = system(buf); - if (i == 0) { - answer = 1; - } - else { - answer = 0; } - break; - case UI_SILENT: - break; - } + } while ((answer < 0) || (answer > 1)); return (answer); } -void important_message(const char *title, const char *msgtext) -{ +void important_message(const char *title, const char *msgtext) { char buf[SIZ]; - switch (setup_type) { - - 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("%s", _("Press return to continue...")); - if (fgets(buf, sizeof buf, stdin)) - {;} - break; - - case UI_DIALOG: - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --msgbox '%s' 19 72", - getenv("CTDL_DIALOG"), - program_title, - msgtext); - int rv = system(buf); - if (rv != 0) { - fprintf(stderr, _("failed to run the dialog command\n")); - } - break; - case UI_SILENT: - fprintf(stderr, "%s\n", msgtext); - break; + 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("%s", _("Press return to continue...")); + if (fgets(buf, sizeof buf, stdin)) { + ; } } -void important_msgnum(int msgnum) -{ + +void important_msgnum(int msgnum) { important_message(_("Important Message"), setup_text[msgnum]); } -void display_error(char *error_message_format, ...) -{ + +void display_error(char *error_message_format, ...) { StrBuf *Msg; va_list arg_ptr; @@ -350,80 +289,38 @@ void display_error(char *error_message_format, ...) FreeStrBuf(&Msg); } -void progress(char *text, long int curr, long int cmax) -{ + +void progress(char *text, long int curr, long int cmax) { static long dots_printed = 0L; long a = 0; - static FILE *fp = NULL; - char buf[SIZ]; - switch (setup_type) { - - case UI_TEXT: - if (curr == 0) { - printf("%s\n", text); - printf("...................................................."); - printf("..........................\r"); - dots_printed = 0; - } else if (curr == cmax) { - printf("\r%79s\n", ""); - } else { - a = (curr * 100) / cmax; - a = a * 78; - a = a / 100; - while (dots_printed < a) { - printf("*"); - ++dots_printed; - } - } - fflush(stdout); - break; - - case UI_DIALOG: - if (curr == 0) { - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --gauge '%s' 7 72 0", - getenv("CTDL_DIALOG"), - program_title, - text); - fp = popen(buf, "w"); - if (fp != NULL) { - fprintf(fp, "0\n"); - fflush(fp); - } - } - else if (curr == cmax) { - if (fp != NULL) { - fprintf(fp, "100\n"); - pclose(fp); - fp = NULL; - } - } - else { - a = (curr * 100) / cmax; - if (fp != NULL) { - fprintf(fp, "%ld\n", a); - fflush(fp); - } + if (curr == 0) { + printf("%s\n", text); + printf("...................................................."); + printf("..........................\r"); + dots_printed = 0; + } else if (curr == cmax) { + printf("\r%79s\n", ""); + } else { + a = (curr * 100) / cmax; + a = a * 78; + a = a / 100; + while (dots_printed < a) { + printf("*"); + ++dots_printed; } - break; - case UI_SILENT: - break; - - default: - assert(1==0); /* If we got here then the developer is a moron */ } + fflush(stdout); } - -int uds_connectsock(char *sockpath) -{ +int uds_connectsock(char *sockpath) { int s; struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, sockpath, sizeof addr.sun_path); + strcpy(addr.sun_path, sockpath); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { @@ -442,8 +339,7 @@ int uds_connectsock(char *sockpath) /* * input binary data from socket */ -void serv_read(char *buf, int bytes) -{ +void serv_read(char *buf, int bytes) { int len, rlen; len = 0; @@ -460,8 +356,7 @@ void serv_read(char *buf, int bytes) /* * send binary to server */ -void serv_write(char *buf, int nbytes) -{ +void serv_write(char *buf, int nbytes) { int bytes_written = 0; int retval; while (bytes_written < nbytes) { @@ -474,12 +369,10 @@ void serv_write(char *buf, int nbytes) } - /* * input string from socket - implemented in terms of serv_read() */ -void serv_gets(char *buf) -{ +void serv_gets(char *buf) { int i; /* Read one character at a time. @@ -507,8 +400,7 @@ void serv_gets(char *buf) /* * send line to server - implemented in terms of serv_write() */ -void serv_puts(char *buf) -{ +void serv_puts(char *buf) { serv_write(buf, strlen(buf)); serv_write("\n", 1); } @@ -517,8 +409,7 @@ void serv_puts(char *buf) /* * Convenience functions to get/set system configuration entries */ -void getconf_str(char *buf, char *key) -{ +void getconf_str(char *buf, char *key) { char cmd[SIZ]; char ret[SIZ]; @@ -533,15 +424,15 @@ void getconf_str(char *buf, char *key) } } -int getconf_int(char *key) -{ + +int getconf_int(char *key) { char buf[SIZ]; getconf_str(buf, key); return atoi(buf); } -void setconf_str(char *key, char *val) -{ + +void setconf_str(char *key, char *val) { char buf[SIZ]; sprintf(buf, "CONF PUTVAL|%s|%s", key, val); @@ -550,8 +441,7 @@ void setconf_str(char *key, char *val) } -void setconf_int(char *key, int val) -{ +void setconf_int(char *key, int val) { char buf[SIZ]; sprintf(buf, "CONF PUTVAL|%s|%d", key, val); @@ -560,9 +450,6 @@ void setconf_int(char *key, int val) } - - - /* * On systems which use xinetd, see if we can offer to install Citadel as * the default telnet target. @@ -618,176 +505,56 @@ void check_xinetd_entry(void) " server_args = -h -L %s/citadel\n" " log_on_failure += USERID\n" "}\n", - ctdl_bin_dir); + ctdl_bin_dir + ); fclose(fp); - /* Now try to restart the service */ - rv = system("/etc/init.d/xinetd restart >/dev/null 2>&1"); + /* Now try to restart the service. This will not have the intended effect on Solaris, but who the hell uses Solaris anymore? */ + rv = system("systemctl restart xinetd >/dev/null 2>&1"); if (rv != 0) { - display_error(_("failed to restart xinetd.\n")); + rv = system("service xinetd restart >/dev/null 2>&1"); } -} - - - -/* - * Offer to disable other MTA's - */ -void disable_other_mta(const char *mta) { - char buf[SIZ]; - FILE *fp; - int lines = 0; - int rv; - - snprintf(buf, sizeof buf, - "/bin/ls -l /etc/rc*.d/S*%s 2>/dev/null; " - "/bin/ls -l /etc/rc.d/rc*.d/S*%s 2>/dev/null", - mta, mta - ); - fp = popen(buf, "r"); - if (fp == NULL) return; - - while (fgets(buf, sizeof buf, fp) != NULL) { - ++lines; - } - fclose(fp); - if (lines == 0) return; /* Nothing to do. */ - - /* Offer to replace other MTA with the vastly superior Citadel :) */ - - snprintf(buf, sizeof buf, - "%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; + if (rv != 0) { + display_error(_("failed to restart xinetd.\n")); } - - - snprintf(buf, sizeof 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); - - snprintf(buf, sizeof 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[] = { - "courier-authdaemon", - "courier-imap", - "courier-imap-ssl", - "courier-pop", - "courier-pop3", - "courier-pop3d", - "cyrmaster", - "cyrus", - "dovecot", - "exim", - "exim4", - "imapd", - "mta", - "pop3d", - "popd", - "postfix", - "qmail", - "saslauthd", - "sendmail", - "vmailmgrd", - "" -}; void disable_other_mtas(void) { - int i = 0; - if ((getenv("ACT_AS_MTA") == NULL) || - (getenv("ACT_AS_MTA") && - strcasecmp(getenv("ACT_AS_MTA"), "yes") == 0)) { + if ((getenv("ACT_AS_MTA") == NULL) || (getenv("ACT_AS_MTA") && strcasecmp(getenv("ACT_AS_MTA"), "yes") == 0)) { /* Offer to disable other MTA's on the system. */ - while (!IsEmptyStr(other_mtas[i])) - { - disable_other_mta(other_mtas[i]); - i++; - } + /* FIXME this has to be rewritten to work in the new systemd-based world. */ } } + void strprompt(const char *prompt_title, const char *prompt_text, char *Target, char *DefValue) { char buf[SIZ] = ""; char setupmsg[SIZ]; - char dialog_result[PATH_MAX]; - FILE *fp = NULL; - int rv; strcpy(setupmsg, ""); - switch (setup_type) { - case UI_TEXT: - title(prompt_title); - printf("\n%s\n", prompt_text); - 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; - } - if (!IsEmptyStr(buf)) - strcpy(Target, buf); - break; - - case UI_DIALOG: - CtdlMakeTempFileName(dialog_result, sizeof dialog_result); - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --nocancel --inputbox '%s' 19 72 '%s' 2>%s", - getenv("CTDL_DIALOG"), - program_title, - prompt_text, - Target, - dialog_result); - rv = system(buf); - if (rv != 0) { - fprintf(stderr, "failed to run whiptail or dialog\n"); - } - - fp = fopen(dialog_result, "r"); - if (fp != NULL) { - if (fgets(Target, sizeof buf, fp)) { - if (Target[strlen(Target)-1] == 10) { - Target[strlen(Target)-1] = 0; - } - } - fclose(fp); - unlink(dialog_result); - } - break; - case UI_SILENT: - if (*DefValue != '\0') - strcpy(Target, DefValue); - break; + title(prompt_title); + printf("\n%s\n", prompt_text); + 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; + } + if (!IsEmptyStr(buf)) { + strcpy(Target, buf); } } -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) { strprompt(setup_titles[msgpos], @@ -797,6 +564,7 @@ void set_str_val(int msgpos, char *Target, char *DefValue) ); } + /* like set_str_val() but for numeric values */ void set_int_val(int msgpos, int *target, char *default_value) { @@ -820,10 +588,6 @@ void edit_value(int curr) int auth = 0; int lportnum = 0; - if (setup_type == UI_SILENT) - { - default_value = getenv(EnvNames[curr]); - } if (default_value == NULL) { default_value = ""; } @@ -842,33 +606,20 @@ void edit_value(int curr) case eUID: ctdluid = getconf_int("c_ctdluid"); - if (setup_type == UI_SILENT) - { - if (default_value) { - ctdluid = atoi(default_value); - } + pw = getpwuid(ctdluid); + if (pw == NULL) { + set_int_val(curr, &ctdluid, default_value); } - else - { -#ifdef __CYGWIN__ - ctdluid = 0; /* work-around for Windows */ -#else - pw = getpwuid(ctdluid); - if (pw == NULL) { - set_int_val(curr, &ctdluid, default_value); + else { + strcpy(ctdluidname, pw->pw_name); + set_str_val(curr, ctdluidname, default_value); + pw = getpwnam(ctdluidname); + if (pw != NULL) { + ctdluid = pw->pw_uid; } - else { - strcpy(ctdluidname, pw->pw_name); - set_str_val(curr, ctdluidname, default_value); - pw = getpwnam(ctdluidname); - if (pw != NULL) { - ctdluid = pw->pw_uid; - } - else if (atoi(ctdluidname) > 0) { - ctdluid = atoi(ctdluidname); - } + else if (atoi(ctdluidname) > 0) { + ctdluid = atoi(ctdluidname); } -#endif } setconf_int("c_ctdluid", ctdluid); break; @@ -887,17 +638,7 @@ void edit_value(int curr) case eAuthType: auth = getconf_int("c_auth_mode"); - if (setup_type == UI_SILENT) - { - if ( (default_value) && (!strcasecmp(default_value, "yes")) ) auth = AUTHMODE_HOST; - if ( (default_value) && (!strcasecmp(default_value, "host")) ) auth = AUTHMODE_HOST; - if ( (default_value) && (!strcasecmp(default_value, "ldap")) ) auth = AUTHMODE_LDAP; - if ( (default_value) && (!strcasecmp(default_value, "ldap_ad")) ) auth = AUTHMODE_LDAP_AD; - if ( (default_value) && (!strcasecmp(default_value, "active directory")) ) auth = AUTHMODE_LDAP_AD; - } - else { - set_int_val(curr, &auth, default_value); - } + set_int_val(curr, &auth, default_value); setconf_int("c_auth_mode", auth); break; @@ -940,23 +681,6 @@ void edit_value(int curr) } - -/* - * Figure out what type of user interface we're going to use - */ -int discover_ui(void) -{ - - /* Use "whiptail" or "dialog" if we have it */ - if (getenv("CTDL_DIALOG") != NULL) { - return UI_DIALOG; - } - - return UI_TEXT; -} - - - /* * Strip "db" entries out of /etc/nsswitch.conf */ @@ -1052,21 +776,19 @@ void fixnss(void) { * We keep them here so we don't lose the translations if we need them later. */ #if 0 - 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 failed"), - _("Setup is finished, but the Citadel server failed to start.\n" - "Go back and check your configuration.\n") - important_message(_("Setup finished"), - _("Setup is finished. You may now start the server.")); +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 failed"), +_("Setup is finished, but the Citadel server failed to start.\n" +"Go back and check your configuration.\n"); +important_message(_("Setup finished"), +_("Setup is finished. You may now start the server.")); #endif - - int main(int argc, char *argv[]) { int a, i; @@ -1094,9 +816,6 @@ int main(int argc, char *argv[]) strcpy(aaa, &aaa[2]); setup_type = atoi(aaa); } - else if (!strcmp(argv[a], "-q")) { - setup_type = UI_SILENT; - } else if (!strncmp(argv[a], "-h", 2)) { relh=argv[a][2]!='/'; if (!relh) { @@ -1106,19 +825,11 @@ int main(int argc, char *argv[]) } home = 1; } - } 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. - */ - if (setup_type < 0) { - setup_type = discover_ui(); - } - enable_home = ( relh | home ); if (chdir(ctdl_run_dir) != 0) { @@ -1178,18 +889,7 @@ int main(int argc, char *argv[]) ++a; } - /* - * Now begin. - */ - - - if (setup_type == UI_TEXT) { - printf("\n\n\n *** %s ***\n\n", program_title); - } - - if (setup_type == UI_DIALOG) { - system("clear 2>/dev/null"); - } + printf("\n\n\n *** %s ***\n\n", program_title); /* Go through a series of dialogs prompting for config info */ for (curr = 1; curr < eMaxQuestions; ++curr) { @@ -1235,51 +935,53 @@ int main(int argc, char *argv[]) /* * Create the administrator account. It's ok if the command fails if this user already exists. */ - progress(activity, 1, 5); - snprintf(buf, sizeof buf, "CREU %s|%s", admin_name, admin_pass); - serv_puts(buf); - progress(activity, 2, 5); - serv_gets(buf); + if (getconf_int("c_auth_mode") == AUTHMODE_NATIVE) { + progress(activity, 1, 5); + snprintf(buf, sizeof buf, "CREU %s|%s", admin_name, admin_pass); + serv_puts(buf); + progress(activity, 2, 5); + serv_gets(buf); + } progress(activity, 3, 5); /* * Assign the desired password and access level to the administrator account. */ - snprintf(buf, sizeof buf, "AGUP %s", admin_name); - serv_puts(buf); - progress(activity, 4, 5); - serv_gets(buf); - if (buf[0] == '2') { - int admin_flags = extract_int(&buf[4], 2); - int admin_times_called = extract_int(&buf[4], 3); - int admin_msgs_posted = extract_int(&buf[4], 4); - snprintf(buf, sizeof buf, "ASUP %s|%s|%d|%d|%d|6", - admin_name, admin_pass, admin_flags, admin_times_called, admin_msgs_posted - ); + if (getconf_int("c_auth_mode") == AUTHMODE_NATIVE) { + snprintf(buf, sizeof buf, "AGUP %s", admin_name); serv_puts(buf); + progress(activity, 4, 5); serv_gets(buf); + if (buf[0] == '2') { + int admin_flags = extract_int(&buf[4], 2); + int admin_times_called = extract_int(&buf[4], 3); + int admin_msgs_posted = extract_int(&buf[4], 4); + snprintf(buf, sizeof buf, "ASUP %s|%s|%d|%d|%d|6", + admin_name, admin_pass, admin_flags, admin_times_called, admin_msgs_posted + ); + serv_puts(buf); + serv_gets(buf); + } } progress(activity, 5, 5); -#ifndef __CYGWIN__ 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 /* * Restart citserver */ activity = _("Restarting Citadel server to apply changes"); - progress(activity, 0, 41); + progress(activity, 0, 51); serv_puts("TIME"); serv_gets(buf); long original_start_time = extract_long(&buf[4], 3); - progress(activity, 1, 41); + progress(activity, 1, 51); serv_puts("DOWN 1"); - progress(activity, 2, 41); + progress(activity, 2, 51); serv_gets(buf); if (buf[0] != '2') { display_error("%s\n", buf); @@ -1290,30 +992,28 @@ int main(int argc, char *argv[]) serv_sock = (-1); for (i=3; i<=6; ++i) { /* wait for server to shut down */ - progress(activity, i, 41); + progress(activity, i, 51); sleep(1); } - for (i=7; ((i<=38) && (serv_sock < 0)) ; ++i) { /* wait for server to start up */ - progress(activity, i, 41); + for (i=7; ((i<=48) && (serv_sock < 0)) ; ++i) { /* wait for server to start up */ + progress(activity, i, 51); serv_sock = uds_connectsock(file_citadel_admin_socket); sleep(1); } - progress(activity, 39, 41); + progress(activity, 49, 51); serv_gets(buf); - progress(activity, 40, 41); + progress(activity, 50, 51); serv_puts("TIME"); serv_gets(buf); long new_start_time = extract_long(&buf[4], 3); close(serv_sock); - progress(activity, 41, 41); + progress(activity, 51, 51); - if ( (original_start_time == new_start_time) - || (new_start_time <= 0) - ) { + if ((original_start_time == new_start_time) || (new_start_time <= 0)) { display_error("%s\n", _("Setup failed to restart Citadel server. Please restart it manually.")); exit(7); }