diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2015-09-16 10:39:56 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2015-09-16 10:39:56 +0200 |
commit | 156c2e03aa7d770fce02efec512b65f3fd3c86e5 (patch) | |
tree | e5b4675c058124cc68268490ec26ee61cec318b1 | |
parent | 30f48528f60ee29c917533026a0facffe530bdc0 (diff) | |
download | nlplug-156c2e03aa7d770fce02efec512b65f3fd3c86e5.tar.bz2 nlplug-156c2e03aa7d770fce02efec512b65f3fd3c86e5.tar.xz |
nlsockd: add support for initial trigger script
-rw-r--r-- | nlsockd.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -31,7 +31,8 @@ spawn_handler(int fd, char **argv) err(1, "fork"); if (pid == 0) { - dup2(fd, 0); + if (fd > 0) + dup2(fd, 0); execv(argv[0], argv); err(1, argv[0]); } @@ -81,7 +82,9 @@ init_netlink_socket(void) if (fd < 0) err(1, "socket"); - slen = 64*1024; + /* kernel will not create events bigger than 16kb, but we need + buffer up all events during coldplug */ + slen = 1024*1024; if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &slen, sizeof(slen)) < 0) { err(1, "setsockopt"); @@ -102,7 +105,7 @@ init_netlink_socket(void) void usage(void) { - errx(1, "usage: %s [-s] runpath [...]\n", argv0); + errx(1, "usage: %s [-s] [-t triggerpath] runpath [...]\n", argv0); } @@ -111,11 +114,18 @@ main(int argc, char *argv[]) { struct pollfd fds; int single_run = 0; + char *trigger_argv[3] = { NULL, NULL, NULL}; + pid_t childpid; + int status, r; ARGBEGIN { case 's': single_run = 1; break; + case 't': + trigger_argv[0] = EARGF(usage()); + trigger_argv[1] = trigger_argv[0]; + break; default: usage(); } ARGEND; @@ -127,11 +137,14 @@ main(int argc, char *argv[]) fds.fd = init_netlink_socket(); initsignals(); + if (trigger_argv[0]) { + childpid = spawn_handler(0, trigger_argv); + r = waitpid(childpid, &status, 0); + } while (poll(&fds, 1, -1) > -1) { if (fds.revents & POLLIN) { - int status, r; - pid_t childpid = spawn_handler(fds.fd, argv); + childpid = spawn_handler(fds.fd, argv); r = waitpid(childpid, &status, 0); if(r == -1) { warn("waitpid(%d)", childpid); @@ -140,7 +153,6 @@ main(int argc, char *argv[]) } } } - return 0; } |