#include "tools.h"
#include "citadel_dirs.h"
-#ifdef HAVE_NEWT
-#include <newt.h>
-#endif
-
-
-#define MAXSETUP 4 /* How many setup questions to ask */
+#define MAXSETUP 5 /* How many setup questions to ask */
#define UI_TEXT 0 /* Default setup type -- text only */
#define UI_DIALOG 2 /* Use the 'dialog' program */
#define UI_SILENT 3 /* Silent running, for use in scripts */
-#define UI_NEWT 4 /* Use the "newt" window library */
#define SERVICE_NAME "citadel"
#define PROTO_NAME "tcp"
"Citadel User ID",
"Server IP address",
"Server port number",
+ "Authentication mode"
};
"of Citadel on the same computer and there is something else\n"
"already using port 504.\n",
+"Normally, a Citadel system uses a \"black box\" authentication mode.\n"
+"This means that users do not have accounts or home directories on\n"
+"the underlying host system -- Citadel manages its own user database.\n"
+"However, if you wish to override this behavior, you can enable the\n"
+"host based authentication mode which is traditional for Unix systems.\n"
+"WARNING: do *not* change this setting once your system is installed.\n"
+"\n"
+"(Answer \"no\" unless you completely understand this option)\n"
+"Do you want to enable host based authentication mode?\n"
+
};
struct config config;
void cleanup(int exitcode)
{
-#ifdef HAVE_NEWT
- newtCls();
- newtRefresh();
- newtFinished();
-#endif
exit(exitcode);
}
-int yesno(char *question)
+int yesno(char *question, int default_value)
{
-#ifdef HAVE_NEWT
- newtComponent form = NULL;
- newtComponent yesbutton = NULL;
- newtComponent nobutton = NULL;
- int prompt_window_height = 0;
-#endif
int i = 0;
int answer = 0;
char buf[SIZ];
case UI_TEXT:
do {
- printf("%s\nYes/No --> ", question);
+ printf("%s\nYes/No [%s] --> ",
+ question,
+ ( default_value ? "Yes" : "No" )
+ );
fgets(buf, sizeof buf, stdin);
answer = tolower(buf[0]);
- if (answer == 'y')
+ 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;
break;
case UI_DIALOG:
- sprintf(buf, "exec %s --yesno '%s' 10 72",
+ sprintf(buf, "exec %s %s --yesno '%s' 15 75",
getenv("CTDL_DIALOG"),
+ ( default_value ? "" : "--defaultno" ),
question);
i = system(buf);
if (i == 0) {
}
break;
-#ifdef HAVE_NEWT
- case UI_NEWT:
- prompt_window_height = num_tokens(question, '\n') + 5;
- newtCenteredWindow(76, prompt_window_height, "Question");
- form = newtForm(NULL, NULL, 0);
- for (i=0; i<num_tokens(question, '\n'); ++i) {
- extract_token(buf, question, i, '\n', sizeof buf);
- newtFormAddComponent(form, newtLabel(1, 1+i, buf));
- }
- yesbutton = newtButton(10, (prompt_window_height - 4), "Yes");
- nobutton = newtButton(60, (prompt_window_height - 4), "No");
- newtFormAddComponent(form, yesbutton);
- newtFormAddComponent(form, nobutton);
- if (newtRunForm(form) == yesbutton) {
- answer = 1;
- }
- else {
- answer = 0;
- }
- newtPopWindow();
- newtFormDestroy(form);
-
- break;
-#endif
-
}
return (answer);
}
void important_message(char *title, char *msgtext)
{
-#ifdef HAVE_NEWT
- newtComponent form = NULL;
- int i = 0;
-#endif
char buf[SIZ];
switch (setup_type) {
msgtext);
system(buf);
break;
-
-#ifdef HAVE_NEWT
- case UI_NEWT:
- newtCenteredWindow(76, 10, title);
- form = newtForm(NULL, NULL, 0);
- for (i=0; i<num_tokens(msgtext, '\n'); ++i) {
- extract_token(buf, msgtext, i, '\n', sizeof buf);
- newtFormAddComponent(form, newtLabel(1, 1+i, buf));
- }
- newtFormAddComponent(form, newtButton(35, 5, "OK"));
- newtRunForm(form);
- newtPopWindow();
- newtFormDestroy(form);
- break;
-#endif
-
}
}
void progress(char *text, long int curr, long int cmax)
{
-#ifdef HAVE_NEWT
-
- /* These variables are static because progress() gets called
- * multiple times during the course of whatever operation is
- * being performed. This makes setup non-threadsafe, but who
- * cares?
- */
- static newtComponent form = NULL;
- static newtComponent scale = NULL;
-#endif
static long dots_printed = 0L;
long a = 0;
static FILE *fp = NULL;
}
break;
-#ifdef HAVE_NEWT
- case UI_NEWT:
- if (curr == 0) {
- newtCenteredWindow(76, 8, text);
- form = newtForm(NULL, NULL, 0);
- scale = newtScale(1, 3, 74, cmax);
- newtFormAddComponent(form, scale);
- newtDrawForm(form);
- newtRefresh();
- }
- if ((curr > 0) && (curr <= cmax)) {
- newtScaleSet(scale, curr);
- newtRefresh();
- }
- if (curr == cmax) {
- newtFormDestroy(form);
- newtPopWindow();
- newtRefresh();
- }
- break;
-#endif
-
}
}
{
int i;
FILE *sfp;
+ char errmsg[256];
if (getservbyname(SERVICE_NAME, PROTO_NAME) == NULL) {
for (i=0; i<=2; ++i) {
if (i == 0) {
sfp = fopen("/etc/services", "a");
if (sfp == NULL) {
- display_error(strerror(errno));
+ sprintf(errmsg, "Cannot open /etc/services: %s", strerror(errno));
+ display_error(errmsg);
} else {
- fprintf(sfp, "%s 504/tcp\n",
- SERVICE_NAME);
+ fprintf(sfp, "%s 504/tcp\n", SERVICE_NAME);
fclose(sfp);
}
}
/* Now tweak /etc/inittab */
infp = fopen("/etc/inittab", "r");
if (infp == NULL) {
- display_error(strerror(errno));
+
+ /* If /etc/inittab does not exist, return quietly.
+ * Not all host platforms have it.
+ */
+ if (errno == ENOENT) {
+ return;
+ }
+
+ /* Other errors might mean something really did go wrong.
+ */
+ sprintf(buf, "Cannot open /etc/inittab: %s", strerror(errno));
+ display_error(buf);
return;
}
strcpy(outfilename, "/tmp/ctdlsetup.XXXXXX");
outfp = fdopen(mkstemp(outfilename), "w+");
if (outfp == NULL) {
- display_error(strerror(errno));
+ sprintf(buf, "Cannot open %s: %s", outfilename, strerror(errno));
+ display_error(buf);
fclose(infp);
return;
}
while (fgets(buf, sizeof buf, infp) != NULL) {
- if (strstr(buf, looking_for) == NULL) {
- fwrite(buf, strlen(buf), 1, outfp);
- }
- else {
+ if (strstr(buf, looking_for) != NULL) {
+ fwrite("#", 1, 1, outfp);
++changes_made;
}
+ fwrite(buf, strlen(buf), 1, outfp);
}
fclose(infp);
{
FILE *fp;
- if (yesno("Would you like to automatically start Citadel at boot?\n") == 0) {
+ if (yesno("Would you like to automatically start Citadel at boot?\n", 1) == 0) {
return;
}
}
fprintf(fp, "#!/bin/sh\n"
+ "#\n"
+ "# Init file for Citadel\n"
+ "#\n"
+ "# chkconfig: - 79 30\n"
+ "# description: Citadel service\n"
+ "# processname: citserver\n"
+ "# pidfile: %s/citadel.pid\n"
"\n"
- "CITADEL_DIR=%s\n", setup_directory);
+ "CITADEL_DIR=%s\n"
+ ,
+ setup_directory,
+ setup_directory
+ );
fprintf(fp, "\n"
"test -x $CITADEL_DIR/ctdlsvc || exit 0\n"
"test -d /var/run || exit 0\n"
"case \"$1\" in\n"
"\n"
"start) echo -n \"Starting Citadel... \"\n"
- " if $CITADEL_DIR/ctdlsvc /var/run/citadel.pid "
- "$CITADEL_DIR/citserver "
- "-t/dev/null\n"
+ " if $CITADEL_DIR/citserver -d\n"
" then\n"
" echo \"ok\"\n"
" else\n"
" else\n"
" echo \"failed\"\n"
" fi\n"
- " rm -f /var/run/citadel.pid 2>/dev/null\n");
+ " rm -f %s/citadel.pid 2>/dev/null\n"
+ ,
+ setup_directory
+ );
fprintf(fp, " ;;\n"
"restart) $0 stop\n"
" $0 start\n"
"connect incoming telnet sessions to Citadel, bypassing the\n"
"host system login: prompt. Would you like to do this?\n"
);
- if (yesno(buf) == 0) {
+ if (yesno(buf, 1) == 0) {
return;
}
}
"25, 110, and 143?\n",
mta, mta, mta, mta
);
- if (yesno(buf) == 0) {
+ if (yesno(buf, 1) == 0) {
return;
}
}
void strprompt(char *prompt_title, char *prompt_text, char *str)
{
-#ifdef HAVE_NEWT
- newtComponent form;
- char *result;
- int i;
- int prompt_window_height = 0;
-#endif
char buf[SIZ];
char setupmsg[SIZ];
char dialog_result[PATH_MAX];
}
break;
-#ifdef HAVE_NEWT
- case UI_NEWT:
-
- prompt_window_height = num_tokens(prompt_text, '\n') + 5 ;
- newtCenteredWindow(76,
- prompt_window_height,
- prompt_title);
- form = newtForm(NULL, NULL, 0);
- for (i=0; i<num_tokens(prompt_text, '\n'); ++i) {
- extract_token(buf, prompt_text, i, '\n', sizeof buf);
- newtFormAddComponent(form, newtLabel(1, 1+i, buf));
- }
- newtFormAddComponent(form,
- newtEntry(1,
- (prompt_window_height - 2),
- str,
- 74,
- (const char **) &result,
- NEWT_FLAG_RETURNEXIT)
- );
- newtRunForm(form);
- strcpy(str, result);
-
- newtPopWindow();
- newtFormDestroy(form);
-
-#endif
}
}
+void set_bool_val(int msgpos, int *ip) {
+ title(setup_titles[msgpos]);
+ *ip = yesno(setup_text[msgpos], *ip);
+}
+
void set_str_val(int msgpos, char *str) {
strprompt(setup_titles[msgpos], setup_text[msgpos], str);
}
-
-
void set_int_val(int msgpos, int *ip)
{
char buf[16];
{
int i;
struct passwd *pw;
- char ctdluidname[SIZ];
+ char ctdluidname[256];
switch (curr) {
set_int_val(curr, &config.c_port_number);
break;
+ case 5:
+ if (getenv("ENABLE_UNIX_AUTH")) {
+ if (!strcasecmp(getenv("ENABLE_UNIX_AUTH"), "yes")) {
+ config.c_auth_mode = 1;
+ }
+ else {
+ config.c_auth_mode = 0;
+ }
+ }
+ else {
+ set_bool_val(curr, &config.c_auth_mode);
+ }
+ break;
}
}
return UI_DIALOG;
}
-
-#ifdef HAVE_NEWT
- newtInit();
- newtCls();
- newtDrawRootText(0, 0, "Citadel Setup");
- return UI_NEWT;
-#endif
return UI_TEXT;
}
"\n"
);
- if (yesno(question)) {
+ if (yesno(question, 1)) {
sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
system(buf);
}
/* Try to stop Citadel if we can */
if (!access("/etc/init.d/citadel", X_OK)) {
- for (a=0; a<=2; ++a) {
- progress("Stopping the Citadel service...", a, 2);
- if (a == 0) system("/etc/init.d/citadel stop >/dev/null 2>&1");
- sleep(1);
- }
+ system("/etc/init.d/citadel stop");
}
/* Make sure Citadel is not running. */
}
if (!access("/etc/init.d/citadel", X_OK)) {
- for (a=0; a<=2; ++a) {
- progress("Starting the Citadel service...", a, 2);
- if (a == 0) system("/etc/init.d/citadel start >/dev/null 2>&1");
- sleep(1);
- }
+ system("/etc/init.d/citadel start");
+ sleep(3);
}
if (test_server() == 0) {