X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsetup.c;h=ebac8d2ca193ba5dae5a07c0cd99456a0a397fbe;hb=b6845a37c842070f70b8fbb98fb49c5e2cfc9644;hp=da9a1b973948f5ecc2ff80b8149656a0e14c9302;hpb=726deecced09f12e5bcc677802f35f1bb168a564;p=citadel.git diff --git a/webcit/setup.c b/webcit/setup.c index da9a1b973..ebac8d2ca 100644 --- a/webcit/setup.c +++ b/webcit/setup.c @@ -1,13 +1,10 @@ /* - * $Id$ - * * WebCit setup utility * * (This is basically just an install wizard. It's not required.) - * */ -#include "config.h" +#include "sysdep.h" #include "webcit.h" #include "webserver.h" @@ -21,6 +18,32 @@ char setup_directory[SIZ]; int using_web_installer = 0; char suggested_url[SIZ]; +/* some copies... +int syslog(int loglevel, const char *format, ...){return 0;} */ +void wc_printf(const char *format,...){} + +void RegisterNS(const char *NSName, long len, + int nMinArgs, + int nMaxArgs, + WCHandlerFunc HandlerFunc, + WCPreevalFunc PreEvalFunc, + int ContextRequired){} +void StrBufAppendTemplateStr(StrBuf *Target, + WCTemplputParams *TP, + const char *Source, + int FormatTypeIndex){} +void RegisterHeaderHandler(const char *Name, long Len, Header_Evaluator F){} +pthread_key_t MyConKey; + +#ifdef ENABLE_NLS + +#ifdef HAVE_USELOCALE +int localeoffset = 1; +#else +int localeoffset = 0; +#endif + +#endif /* * Delete an entry from /etc/inittab */ @@ -90,11 +113,11 @@ void delete_the_old_way(void) { strcpy(init_entry, ""); - /* Determine the fully qualified path name of webserver */ - snprintf(looking_for, sizeof looking_for, "%s/webserver ", setup_directory); + /* Determine the fully qualified path name of webcit */ + snprintf(looking_for, sizeof looking_for, "%s/webcit ", setup_directory); /* Pound through /etc/inittab line by line. Set have_entry to 1 if - * an entry is found which we believe starts webserver. + * an entry is found which we believe starts webcit. */ infp = fopen("/etc/inittab", "r"); if (infp == NULL) { @@ -142,7 +165,7 @@ int yesno(char *question, int default_value) { int i = 0; int answer = 0; - char buf[SIZ]; + char buf[SIZ] = ""; switch (setup_type) { @@ -152,14 +175,17 @@ int yesno(char *question, int default_value) question, ( default_value ? "Yes" : "No" ) ); - 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; + 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; @@ -186,7 +212,7 @@ int yesno(char *question, int default_value) void set_value(char *prompt, char str[]) { - char buf[SIZ]; + char buf[SIZ] = ""; char dialog_result[PATH_MAX]; char setupmsg[SIZ]; FILE *fp; @@ -199,12 +225,12 @@ void set_value(char *prompt, char str[]) printf("\n%s\n", prompt); printf("This is currently set to:\n%s\n", str); printf("Enter new value or press return to leave unchanged:\n"); - fgets(buf, sizeof buf, stdin); - buf[strlen(buf) - 1] = 0; + if (fgets(buf, sizeof buf, stdin)) { + buf[strlen(buf) - 1] = 0; + } if (strlen(buf) != 0) strcpy(str, buf); break; - case UI_DIALOG: CtdlMakeTempFileName(dialog_result, sizeof dialog_result); sprintf(buf, "exec %s --inputbox '%s' 19 72 '%s' 2>%s", @@ -215,9 +241,10 @@ void set_value(char *prompt, char str[]) system(buf); fp = fopen(dialog_result, "r"); if (fp != NULL) { - fgets(str, sizeof buf, fp); - if (str[strlen(str)-1] == 10) { - str[strlen(str)-1] = 0; + if (fgets(str, sizeof buf, fp)){ + if (str[strlen(str)-1] == 10) { + str[strlen(str)-1] = 0; + } } fclose(fp); unlink(dialog_result); @@ -228,6 +255,69 @@ void set_value(char *prompt, char str[]) } +extern const char *AvailLang[]; +int GetLocalePrefs(void) +{ + int nLocales; + StrBuf *Buf; + char buf[SIZ]; + char dialog_result[PATH_MAX]; + FILE *fp; + int i = 0; + int offs = 0; + + nLocales = 0; + while (!IsEmptyStr(AvailLang[nLocales])) + nLocales++; + + Buf = NewStrBuf(); + + StrBufAppendBufPlain(Buf, HKEY("Select the locale webcit should use : \n"), 0); +#ifdef HAVE_USELOCALE + StrBufAppendBufPlain(Buf, HKEY(" 0 Let the user select it at the login prompt (default)\n"), 0); + offs ++; +#endif + for (i = 0; i < nLocales; i++) { + StrBufAppendPrintf(Buf, " %ld: %s\n", i + offs, AvailLang[i]); + + } + + switch (setup_type) { + case UI_TEXT: + title("WebCit setup"); + printf("\n%s\n", ChrPtr(Buf)); + printf("This is currently set to:\n%ld\n", 0L); + printf("Enter new value or press return to leave unchanged:\n"); + if (fgets(buf, sizeof buf, stdin)) + return atoi(buf); + break; + + case UI_DIALOG: + CtdlMakeTempFileName(dialog_result, sizeof dialog_result); + sprintf(buf, "exec %s --inputbox '%s' 19 72 '%ld' 2>%s", + getenv("CTDL_DIALOG"), + ChrPtr(Buf), + 0L, + dialog_result); + system(buf); + fp = fopen(dialog_result, "r"); + if (fp != NULL) { + char *str = &buf[0]; + if (fgets(str, sizeof buf, fp)){ + if (str[strlen(str)-1] == 10) { + str[strlen(str)-1] = 0; + } + } + fclose(fp); + unlink(dialog_result); + return atoi(buf); + } + break; + + } + return 0; +} + void important_message(char *title, char *msgtext) { char buf[SIZ]; @@ -238,7 +328,7 @@ void important_message(char *title, char *msgtext) 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..."); - fgets(buf, sizeof buf, stdin); + if (fgets(buf, sizeof buf, stdin)); break; case UI_DIALOG: @@ -325,6 +415,9 @@ void progress(char *text, long int curr, long int cmax) */ void install_init_scripts(void) { +#ifdef ENABLE_NLS + int localechoice; +#endif char question[1024]; char buf[256]; char http_port[128]; @@ -333,17 +426,35 @@ void install_init_scripts(void) #endif char hostname[128]; char portname[128]; + char command[SIZ]; struct utsname my_utsname; - + struct stat etcinitd; FILE *fp; + char *initfile = "/etc/init.d/webcit"; + + fp = fopen(initfile, "r"); + if (fp != NULL) { + if (yesno("WebCit 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); + + } /* Otherwise, prompt the user to create an entry. */ snprintf(question, sizeof question, - "Would you like to automatically start WebCit at boot?" - ); + "Would you like to automatically start WebCit at boot?" + ); if (yesno(question, 1) == 0) return; + +#ifdef ENABLE_NLS + + localechoice = GetLocalePrefs(); + +#endif /* Defaults */ sprintf(http_port, "2000"); #ifdef HAVE_OPENSSL @@ -356,7 +467,17 @@ void install_init_scripts(void) * in a previous install, if we are upgrading: read them out of * the existing init script. */ - fp = fopen("/etc/init.d/webcit", "r"); + if ((stat("/etc/init.d/", &etcinitd) == -1) && + (errno == ENOENT)) + { + if ((stat("/etc/rc.d/init.d/", &etcinitd) == -1) && + (errno == ENOENT)) + initfile = WEBCITDIR"/webcit.init"; + else + initfile = "/etc/rc.d/init.d/webcit"; + } + + fp = fopen(initfile, "r"); if (fp != NULL) { while (fgets(buf, sizeof buf, fp) != NULL) { if (strlen(buf) > 0) { @@ -382,20 +503,20 @@ void install_init_scripts(void) /* Now ask for the port numbers */ snprintf(question, sizeof question, - "On which port do you want WebCit to listen for HTTP " - "requests?\n\nYou can use the standard port (80) if you are " - "not running another\nweb server (such as Apache), otherwise " - "select another port."); + "On which port do you want WebCit to listen for HTTP " + "requests?\n\nYou can use the standard port (80) if you are " + "not running another\nweb server (such as Apache), otherwise " + "select another port."); set_value(question, http_port); uname(&my_utsname); sprintf(suggested_url, "http://%s:%s/", my_utsname.nodename, http_port); #ifdef HAVE_OPENSSL snprintf(question, sizeof question, - "On which port do you want WebCit to listen for HTTPS " - "requests?\n\nYou can use the standard port (443) if you are " - "not running another\nweb server (such as Apache), otherwise " - "select another port."); + "On which port do you want WebCit to listen for HTTPS " + "requests?\n\nYou can use the standard port (443) if you are " + "not running another\nweb server (such as Apache), otherwise " + "select another port."); set_value(question, https_port); #endif @@ -406,7 +527,7 @@ void install_init_scripts(void) } else { snprintf(question, sizeof question, - "Is the Citadel service running on the same host as WebCit?"); + "Is the Citadel service running on the same host as WebCit?"); if (yesno(question, ((!strcasecmp(hostname, "uds")) ? 1 : 0))) { strcpy(hostname, "uds"); if (atoi(portname) != 0) strcpy(portname, "/usr/local/citadel"); @@ -416,21 +537,20 @@ void install_init_scripts(void) if (!strcasecmp(hostname, "uds")) strcpy(hostname, "127.0.0.1"); if (atoi(portname) == 0) strcpy(portname, "504"); set_value("Enter the host name or IP address of your " - "Citadel server.", hostname); + "Citadel server.", hostname); set_value("Enter the port number on which Citadel is " - "running (usually 504)", portname); + "running (usually 504)", portname); } } - fp = fopen("/etc/init.d/webcit", "w"); - if (fp == NULL) { - display_error("Cannot create /etc/init.d/webcit"); - return; - } + fp = fopen(initfile, "w"); fprintf(fp, "#!/bin/sh\n" - "\n" + "\n" + "# uncomment this to create coredumps as described in\n" + "# http://www.citadel.org/doku.php/faq:mastering_your_os:gdb#how.do.i.make.my.system.produce.core-files\n" + "# ulimit -c unlimited\n" "WEBCIT_DIR=%s\n", setup_directory); fprintf(fp, "HTTP_PORT=%s\n", http_port); #ifdef HAVE_OPENSSL @@ -438,12 +558,29 @@ void install_init_scripts(void) #endif fprintf(fp, "CTDL_HOSTNAME=%s\n", hostname); fprintf(fp, "CTDL_PORTNAME=%s\n", portname); + +#ifdef ENABLE_NLS + + if (localechoice == 0) { +#ifdef HAVE_USELOCALE + fprintf(fp, "unset LANG\n"); +#else + fprintf(fp, "export WEBCIT_LANG=c\n"); +#endif + } + else { + fprintf(fp, "export WEBCIT_LANG=%s\n", AvailLang[localechoice - localeoffset]); + + } +#else + fprintf(fp, "# your system doesn't support locales\n"); +#endif fprintf(fp, "\n" "\n" "case \"$1\" in\n" "\n" "start) echo -n \"Starting WebCit... \"\n" - " if $WEBCIT_DIR/webserver " + " if $WEBCIT_DIR/webcit " "-D/var/run/webcit.pid " "-p$HTTP_PORT $CTDL_HOSTNAME $CTDL_PORTNAME\n" " then\n" @@ -453,7 +590,7 @@ void install_init_scripts(void) " fi\n"); #ifdef HAVE_OPENSSL fprintf(fp, " echo -n \"Starting WebCit SSL... \"\n" - " if $WEBCIT_DIR/webserver " + " if $WEBCIT_DIR/webcit " "-D/var/run/webcit-ssl.pid " "-s -p$HTTPS_PORT $CTDL_HOSTNAME $CTDL_PORTNAME\n" " then\n" @@ -492,12 +629,14 @@ void install_init_scripts(void) ); fclose(fp); - chmod("/etc/init.d/webcit", 0755); + chmod(initfile, 0755); /* Set up the run levels. */ system("/bin/rm -f /etc/rc?.d/[SK]??webcit 2>/dev/null"); - system("for x in 2 3 4 5 ; do [ -d /etc/rc$x.d ] && ln -s /etc/init.d/webcit /etc/rc$x.d/S84webcit ; done 2>/dev/null"); - system("for x in 0 6 S; do [ -d /etc/rc$x.d ] && ln -s /etc/init.d/webcit /etc/rc$x.d/K15webcit ; done 2>/dev/null"); + snprintf(command, sizeof(command), "for x in 2 3 4 5 ; do [ -d /etc/rc$x.d ] && ln -s %s /etc/rc$x.d/S84webcit ; done 2>/dev/null", initfile); + system(command); + snprintf(command, sizeof(command), "for x in 0 6 S; do [ -d /etc/rc$x.d ] && ln -s %s /etc/rc$x.d/K15webcit ; done 2>/dev/null", initfile); + system(command); } @@ -527,6 +666,7 @@ int main(int argc, char *argv[]) int a; char aaa[256]; int info_only = 0; + strcpy(suggested_url, "http://:/"); /* set an invalid setup type */ @@ -565,7 +705,7 @@ int main(int argc, char *argv[]) } /* Get started in a valid setup directory. */ - strcpy(setup_directory, PREFIX); + strcpy(setup_directory, WEBCITDIR); if ( (using_web_installer) && (getenv("WEBCIT") != NULL) ) { strcpy(setup_directory, getenv("WEBCIT")); }