Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
[citadel.git] / citadel / server_main.c
index 6a7d293fb8ef7cf6265fa3b4e4d044b1d117a339..a015876e5beedd803790e92aa0dda78093a5825d 100644 (file)
@@ -26,6 +26,7 @@
 #include "user_ops.h"
 #include "ecrash.h"
 
+uid_t ctdluid = 0;
 const char *CitadelServiceUDS="citadel-UDS";
 const char *CitadelServiceTCP="citadel-TCP";
 
@@ -51,6 +52,8 @@ int main(int argc, char **argv)
        char ctdldir[PATH_MAX]=CTDLDIR;
        int syslog_facility = LOG_DAEMON;
        const char *eDebuglist[] = {NULL, NULL};
+       uid_t u = 0;
+       struct passwd *p = NULL;
 #ifdef HAVE_RUN_DIR
        struct stat filestats;
 #endif
@@ -64,7 +67,7 @@ int main(int argc, char **argv)
        InitializeMasterTSD();
 
        /* parse command-line arguments */
-       while ((a=getopt(argc, argv, "l:dh:x:t:B:Dr")) != EOF) switch(a) {
+       while ((a=getopt(argc, argv, "l:dh:x:t:B:Dru:")) != EOF) switch(a) {
 
                case 'l':
                        safestrncpy(facility, optarg, sizeof(facility));
@@ -108,16 +111,57 @@ int main(int argc, char **argv)
                        drop_root_perms = 0;
                        break;
 
+               /* -u tells the server what uid to run under... */
+               case 'u':
+                       u = atoi(optarg);
+                       if (u > 0) {
+                               ctdluid = u;
+                       }
+                       else {
+                               p = getpwnam(optarg);
+                               if (p) {
+                                       u = p->pw_uid;
+                               }
+                       }
+                       if (u > 0) {
+                               ctdluid = u;
+                       }
+                       break;
+
                default:
                /* any other parameter makes it crash and burn */
                        fprintf(stderr, "citserver: usage: "
                                        "citserver "
                                        "[-l LogFacility] "
                                        "[-d] [-D] [-r] "
+                                       "[-u user] "
                                        "[-h HomeDir]\n"
                        );
                        exit(1);
        }
+
+       /* Last ditch effort to determine the user name ... if there's a user called "citadel" then use that */
+       if (ctdluid == 0) {
+               p = getpwnam("citadel");
+               if (!p) {
+                       p = getpwnam("bbs");
+               }
+               if (!p) {
+                       p = getpwnam("guest");
+               }
+               if (p) {
+                       u = p->pw_uid;
+               }
+               if (u > 0) {
+                       ctdluid = u;
+               }
+       }
+
+       if ((ctdluid == 0) && (drop_root_perms == 0)) {
+               fprintf(stderr, "citserver: cannot determine user to run as; please specify -r or -u options\n");
+               exit(CTDLEXIT_UNUSER);
+       }
+
        StartLibCitadel(basesize);
        openlog("citserver",
                ( running_as_daemon ? (LOG_PID) : (LOG_PID | LOG_PERROR) ),
@@ -161,25 +205,15 @@ int main(int argc, char **argv)
        syslog(LOG_DEBUG, "Called as: %s", argv[0]);
        syslog(LOG_INFO, "%s", libcitadel_version_string());
 
-       /* Load site-specific configuration */
-       syslog(LOG_INFO, "Loading citadel.config");
-       get_config();
-
-       /* get_control() MUST MUST MUST be called BEFORE the databases are opened!! */
-       syslog(LOG_INFO, "Acquiring control record");
-       get_control();
-
-       put_config();
-
 #ifdef HAVE_RUN_DIR
        /* on some dists rundir gets purged on startup. so we need to recreate it. */
 
        if (stat(ctdl_run_dir, &filestats)==-1){
 #ifdef HAVE_GETPWUID_R
 #ifdef SOLARIS_GETPWUID
-               pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf));
+               pwp = getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf));
 #else // SOLARIS_GETPWUID
-               getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
+               getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
 #endif // SOLARIS_GETPWUID
 #else // HAVE_GETPWUID_R
                pwp = NULL;
@@ -190,7 +224,7 @@ int main(int argc, char **argv)
                                      "unable to create run directory [%s]: %s", 
                                      ctdl_run_dir, strerror(errno));
 
-               if (chown(ctdl_run_dir, config.c_ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0)
+               if (chown(ctdl_run_dir, ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0)
                        syslog(LOG_EMERG, 
                                      "unable to set the access rights for [%s]: %s", 
                                      ctdl_run_dir, strerror(errno));
@@ -253,7 +287,7 @@ int main(int argc, char **argv)
        /*
         * Bind the server to our favorite TCP port (usually 504).
         */
-       CtdlRegisterServiceHook(config.c_port_number,
+       CtdlRegisterServiceHook(CtdlGetConfigInt("c_port_number"),
                                NULL,
                                citproto_begin_session,
                                do_command_loop,
@@ -276,7 +310,7 @@ int main(int argc, char **argv)
        /*
         * If we need host auth, start our chkpwd daemon.
         */
-       if (config.c_auth_mode == AUTHMODE_HOST) {
+       if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
                start_chkpwd_daemon();
        }
 
@@ -297,9 +331,9 @@ int main(int argc, char **argv)
 
 #ifdef HAVE_GETPWUID_R
 #ifdef SOLARIS_GETPWUID
-               pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf));
+               pwp = getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf));
 #else // SOLARIS_GETPWUID
-               getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
+               getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
 #endif // SOLARIS_GETPWUID
 #else // HAVE_GETPWUID_R
                pwp = NULL;