Browse Source

Unfinished konfd deamonization.

git-svn-id: https://klish.googlecode.com/svn/trunk@374 0eaa4687-2ee9-07dd-09d9-bcdd2d2dd5fb
Serj Kalichev 13 years ago
parent
commit
2535cbbedf
1 changed files with 65 additions and 61 deletions
  1. 65 61
      bin/konfd.c

+ 65 - 61
bin/konfd.c

@@ -91,10 +91,11 @@ int main(int argc, char **argv)
 	struct options *opts = NULL;
 
 	/* Network vars */
-	int sock;
+	int sock = -1;
 	struct sockaddr_un laddr;
 	struct sockaddr_un raddr;
 	fd_set active_fd_set, read_fd_set;
+	const int reuseaddr = 1;
 
 	/* Signal vars */
 	struct sigaction sig_act, sigpipe_act;
@@ -108,44 +109,7 @@ int main(int argc, char **argv)
 	if (opts_parse(argc, argv, opts))
 		goto err;
 
-	/* Set signal handler */
-	sigemptyset(&sig_set);
-	sigaddset(&sig_set, SIGTERM);
-	sigaddset(&sig_set, SIGINT);
-	sigaddset(&sig_set, SIGQUIT);
-	
-	sig_act.sa_flags = 0;
-	sig_act.sa_mask = sig_set;
-	sig_act.sa_handler = &sighandler;
-	sigaction(SIGTERM, &sig_act, NULL);
-	sigaction(SIGINT, &sig_act, NULL);
-	sigaction(SIGQUIT, &sig_act, NULL);
-
-	/* Ignore SIGPIPE */
-	sigemptyset(&sigpipe_set);
-	sigaddset(&sigpipe_set, SIGPIPE);
-	sigpipe_act.sa_flags = 0;
-	sigpipe_act.sa_mask = sigpipe_set;
-	sigpipe_act.sa_handler = SIG_IGN;
-	sigaction(SIGPIPE, &sigpipe_act, NULL);
-
-	/* Create listen socket */
-	if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
-		syslog(LOG_ERR, "Can't create listen socket: %s\n",
-			strerror(errno));
-		goto err;
-	}
-
-	laddr.sun_family = AF_UNIX;
-	strncpy(laddr.sun_path, opts->socket_path, UNIX_PATH_MAX);
-	laddr.sun_path[UNIX_PATH_MAX - 1] = '\0';
-	if (bind(sock, (struct sockaddr *)&laddr, sizeof(laddr))) {
-		syslog(LOG_ERR, "Can't bind socket: %s\n",
-			strerror(errno));
-		goto err;
-	}
-	listen(sock, 5);
-
+	/* Fork the daemon */
 	if (!opts->debug) {
 		FILE *f_pid = NULL;
 
@@ -167,17 +131,44 @@ int main(int argc, char **argv)
 		}
 	}
 
+	/* Change GID */
+	if (opts->gid) { /* non-root GID */
+		if (setgid(opts->gid)) {
+			syslog(LOG_ERR, "Can't set GID to %u: %s",
+				opts->gid, strerror(errno));
+			goto err;
+		}
+	}
+
 	/* Change UID */
-/*	if (opts.user) {
-		setfsuid(opts.user);
-		if ((setresgid(opts.user, opts.user, opts.user)<0) ||
-			(setresuid(opts.user, opts.user, opts.user)<0)) {
-			syslog(LOG_ERR, "%s", strerror(errno));
-			exit(1);
+	if (opts->uid) { /* non-root UID */
+		if (setuid(opts->uid)) {
+			syslog(LOG_ERR, "Can't set UID to %u: %s",
+				opts->uid, strerror(errno));
+			goto err;
 		}
 	}
-*/
 
+	/* Create listen socket */
+	if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
+		syslog(LOG_ERR, "Can't create listen socket: %s\n",
+			strerror(errno));
+		goto err;
+	}
+	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
+		&reuseaddr, sizeof(reuseaddr))) {
+		syslog(LOG_ERR, "Can't set socket options: %s\n", strerror(errno));
+		goto err;
+	}
+	laddr.sun_family = AF_UNIX;
+	strncpy(laddr.sun_path, opts->socket_path, UNIX_PATH_MAX);
+	laddr.sun_path[UNIX_PATH_MAX - 1] = '\0';
+	if (bind(sock, (struct sockaddr *)&laddr, sizeof(laddr))) {
+		syslog(LOG_ERR, "Can't bind socket: %s\n",
+			strerror(errno));
+		goto err;
+	}
+	listen(sock, 5);
 
 	/* Create configuration tree */
 	conf = konf_tree_new("", 0);
@@ -187,6 +178,28 @@ int main(int argc, char **argv)
 		konf_buf_bt_offset(),
 		konf_buf_bt_compare, konf_buf_bt_getkey);
 
+	/* Set signal handler */
+	sigemptyset(&sig_set);
+	sigaddset(&sig_set, SIGTERM);
+	sigaddset(&sig_set, SIGINT);
+	sigaddset(&sig_set, SIGQUIT);
+	
+	sig_act.sa_flags = 0;
+	sig_act.sa_mask = sig_set;
+	sig_act.sa_handler = &sighandler;
+	sigaction(SIGTERM, &sig_act, NULL);
+	sigaction(SIGINT, &sig_act, NULL);
+	sigaction(SIGQUIT, &sig_act, NULL);
+
+	/* Ignore SIGPIPE */
+	sigemptyset(&sigpipe_set);
+	sigaddset(&sigpipe_set, SIGPIPE);
+	sigpipe_act.sa_flags = 0;
+	sigpipe_act.sa_mask = sigpipe_set;
+	sigpipe_act.sa_handler = SIG_IGN;
+	sigaction(SIGPIPE, &sigpipe_act, NULL);
+
+
 	/* Initialize the set of active sockets. */
 	FD_ZERO(&active_fd_set);
 	FD_SET(sock, &active_fd_set);
@@ -221,7 +234,9 @@ int main(int argc, char **argv)
 						fprintf(stderr, "accept");
 						continue;
 					}
-					fprintf(stderr, "Server: connect %u\n", new);
+#ifdef DEBUG
+					fprintf(stderr, "Connection established %u\n", new);
+#endif
 					konf_buftree_remove(&bufs, new);
 					tbuf = konf_buf_new(new);
 					/* insert it into the binary tree for this conf */
@@ -538,24 +553,13 @@ static int opts_parse(int argc, char *argv[], struct options *opts)
 			opts->debug = 1;
 			break;
 		case 'u': {
-			struct passwd pwd, *result;
-			size_t bufsize;
-			char *buf;
-			int res;
-
-			bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
-			if (bufsize == -1)
-				bufsize = 16384;
-			buf = malloc(bufsize);
-			assert(buf);
-			res = getpwnam_r(optarg, &pwd, buf, bufsize, &result);
-			if (!result) {
+			struct passwd *pwd = getpwnam(optarg);
+			if (!pwd) {
 				syslog(LOG_ERR, "Can't identify user \"%s\"\n",
 					optarg);
 				return -1;
 			}
-			opts->uid = pwd.pw_uid;
-			free(buf);
+			opts->uid = pwd->pw_uid;
 			break;
 		}
 		case 'g': {