+ 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;
+ struct utsname my_utsname;
+ struct hostent *he;
+
+ /* Determine our host name, in case we need to use it as a default */
+ uname(&my_utsname);
+
+ /* set some sample/default values in place of blanks... */
+ GetDefaultVALSTR(c_nodename, my_utsname.nodename);
+ strtok(config.c_nodename, ".");
+ if (IsEmptyStr(config.c_fqdn) ) {
+ if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
+ safestrncpy(config.c_fqdn, he->h_name, sizeof config.c_fqdn);
+ } else {
+ safestrncpy(config.c_fqdn, my_utsname.nodename, sizeof config.c_fqdn);
+ }
+ }
+ 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) {
+ config.c_ctdluid = pw->pw_uid;
+ }
+ }
+ if (config.c_ctdluid == 0) {
+ pw = getpwnam("bbs");
+ if (pw != NULL) {
+ config.c_ctdluid = pw->pw_uid;
+ }
+ }
+ if (config.c_ctdluid == 0) {
+ pw = getpwnam("guest");
+ if (pw != NULL) {
+ config.c_ctdluid = pw->pw_uid;
+ }
+ }
+ if (config.c_createax == 0) {
+ config.c_createax = 3;
+ }
+ /*
+ * Negative values for maxsessions are not allowed.
+ */
+ if (config.c_maxsessions < 0) {
+ config.c_maxsessions = 0;
+ }
+ /* We need a system default message expiry policy, because this is
+ * the top level and there's no 'higher' policy to fall back on.
+ * By default, do not expire messages at all.
+ */
+ if (config.c_ep.expire_mode == 0) {
+ config.c_ep.expire_mode = EXPIRE_MANUAL;
+ config.c_ep.expire_value = 0;
+ }
+
+ /*
+ * Default port numbers for various services
+ */
+ 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);
+}
+
+
+void get_config (void)
+{
+ int a;
+ int rv;
+ FILE *fp;
+
+ /*
+ * What we're going to try to do here is append a whole bunch of
+ * nulls to the citadel.config file, so we can keep the old config
+ * values if they exist, but if the file is missing or from an
+ * earlier version with a shorter config structure, when setup tries
+ * to read the old config parameters, they'll all come up zero.
+ * The length of the config file will be set to what it's supposed
+ * to be when we rewrite it, because we replace the old file with a
+ * completely new copy.
+ */
+ if ((a = open(file_citadel_config, O_WRONLY | O_CREAT | O_APPEND,
+ S_IRUSR | S_IWUSR)) == -1) {
+ 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("%s citadel.config [%s][%s]\n", _("setup: cannot append"), file_citadel_config, strerror(errno));
+ cleanup(errno);
+ }
+ for (a = 0; a < sizeof(struct config); ++a) {
+ putc(0, fp);
+ }
+ fclose(fp);
+
+ /* now we re-open it, and read the old or blank configuration */
+ fp = fopen(file_citadel_config, "rb");
+ 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);
+
+}
+
+int main(int argc, char *argv[])
+{
+ int a;
+ int curr;
+ char aaa[128];
+ int old_setup_level = 0;
+ int info_only = 0;
+ int relh=0;
+ int home=0;
+ char relhome[PATH_MAX]="";
+ char ctdldir[PATH_MAX]=CTDLDIR;
+ int rv;
+ struct passwd *pw;
+ gid_t gid;
+
+ /* set an invalid setup type */
+ setup_type = (-1);
+
+ /* Check to see if we're running the web installer */
+ if (getenv("CITADEL_INSTALLER") != NULL) {
+ using_web_installer = 1;
+ }
+
+ /* parse command line args */