summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2015-09-16 10:39:56 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2015-09-16 10:39:56 +0200
commit156c2e03aa7d770fce02efec512b65f3fd3c86e5 (patch)
treee5b4675c058124cc68268490ec26ee61cec318b1
parent30f48528f60ee29c917533026a0facffe530bdc0 (diff)
downloadnlplug-156c2e03aa7d770fce02efec512b65f3fd3c86e5.tar.bz2
nlplug-156c2e03aa7d770fce02efec512b65f3fd3c86e5.tar.xz
nlsockd: add support for initial trigger script
-rw-r--r--nlsockd.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/nlsockd.c b/nlsockd.c
index e4a04ce..95cd751 100644
--- a/nlsockd.c
+++ b/nlsockd.c
@@ -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;
}