- }
-
-#ifndef DEBUG
- if (!config_lookup("nofork")) {
- if (fork())
- exit(0);
- n = open("/dev/tty", O_RDWR|FNDELAY);
- if (n > 0) {
- (void) ioctl(n, TIOCNOTTY, (char *)NULL);
- (void) close(n);
- }
- } else
- gdb_debug(GDB_NOFORK);
-#endif
-
- umask(0022);
- initialize_sms_error_table();
- initialize_krb_error_table();
- mr_update_initialize();
-
- /* wait for connection */
- gdb_init();
- /* If the config file contains a line "port portname", the daemon
- * will listen on the named port rather than SERVICE_NAME "sms_update"
- */
- if ((p = config_lookup("port")) == NULL)
- p = SERVICE_NAME;
- conn = create_forking_server(p, 0);
-
- /* If the config file contains a line "user username", the
- * daemon will run with that user's UID.
- */
- if (p = config_lookup("user")) {
- struct passwd *pw;
- pw = getpwnam(p);
- if (pw == 0) {
- com_err(whoami, errno, "Unable to find user %s\n", p);
- exit(1);
- }
- uid = pw->pw_uid;
- }
-
- /* If the config file contains a line "chroot /dir/name", the
- * daemon will run chrooted to that directory.
- */
- if (p = config_lookup("chroot")) {
- if (chroot(p) < 0) {
- com_err(whoami, errno, "unable to chroot to %s", p);
- exit(1);
- }
- }
-
- if (!conn) {
- com_err(whoami, errno, "can't get connection");
- exit(1);
- }
- if (connection_status(conn) == CON_STOPPED) {
- com_err(whoami, connection_errno(conn), ": can't get connection");
- exit(1);
- }
-
- mr_log_info("got connection");
- /* got a connection; loop forever */
- while (1) {
- register char *cp;
- code = receive_object(conn, (char *)&str, STRING_T);
- if (code) {
- com_err(whoami, connection_errno(conn), "receiving command");
- sever_connection(conn);
- exit(1);
- }
- cp = index(STRING_DATA(str), ' ');
- if (cp)
- *cp = '\0';
- for (d = dispatch_table; d->str; d++) {
- if (!strcmp(d->str, STRING_DATA(str))) {
- if (cp)
- *cp = ' ';
-#ifdef DEBUG
- printf("got request: %s\n", STRING_DATA(str));
-#endif /* DEBUG */
- (void)(d->proc)(STRING_DATA(str));
- goto ok;
- }
- }
- sprintf(buf, "unknown request received: %s\n", STRING_DATA(str));
- mr_log_error(buf);
- code = send_int(MR_UNKNOWN_PROC);
- if (code) {
- com_err(whoami, connection_errno(conn), "sending UNKNOWN_PROC");
- }
- ok:
- string_free(&str);
- }
-}