|
@@ -91,10 +91,11 @@ int main(int argc, char **argv)
|
|
|
struct options *opts = NULL;
|
|
|
|
|
|
|
|
|
- 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;
|
|
|
|
|
|
|
|
|
struct sigaction sig_act, sigpipe_act;
|
|
@@ -108,44 +109,7 @@ int main(int argc, char **argv)
|
|
|
if (opts_parse(argc, argv, opts))
|
|
|
goto err;
|
|
|
|
|
|
-
|
|
|
- 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);
|
|
|
-
|
|
|
-
|
|
|
- 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);
|
|
|
-
|
|
|
-
|
|
|
- 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);
|
|
|
-
|
|
|
+
|
|
|
if (!opts->debug) {
|
|
|
FILE *f_pid = NULL;
|
|
|
|
|
@@ -167,17 +131,44 @@ int main(int argc, char **argv)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ if (opts->gid) {
|
|
|
+ if (setgid(opts->gid)) {
|
|
|
+ syslog(LOG_ERR, "Can't set GID to %u: %s",
|
|
|
+ opts->gid, strerror(errno));
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
-
|
|
|
- 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) {
|
|
|
+ if (setuid(opts->uid)) {
|
|
|
+ syslog(LOG_ERR, "Can't set UID to %u: %s",
|
|
|
+ opts->uid, strerror(errno));
|
|
|
+ goto err;
|
|
|
}
|
|
|
}
|
|
|
-*/
|
|
|
|
|
|
+
|
|
|
+ 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);
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+
|
|
|
|
|
|
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);
|
|
|
|
|
@@ -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': {
|