diff options
Diffstat (limited to 'tests/recvfd.c')
-rw-r--r-- | tests/recvfd.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/tests/recvfd.c b/tests/recvfd.c index 82455c7..4da42ca 100644 --- a/tests/recvfd.c +++ b/tests/recvfd.c @@ -30,13 +30,13 @@ char const *progname; void -usage (void) +usage (FILE *fp, int status) { - fprintf (stderr, "usage: %s SOCKET COMMAND ARGS...\n", progname); - fprintf (stderr, "Test tool for pass-fd pies components.\n"); - fprintf (stderr, "Listens on the file descriptor obtained from SOCKET.\n"); - fprintf (stderr, "For each connection, execs COMMAND ARGS as a separate process.\n"); - exit (64); + fprintf (fp, "usage: %s [-s SOCKET] COMMAND ARGS...\n", progname); + fprintf (fp, "Test tool for accept and pass-fd pies components.\n"); + fprintf (fp, "Listens on the file descriptor, either 0 or obtained from SOCKET.\n"); + fprintf (fp, "For each connection, execs COMMAND ARGS as a separate process.\n"); + exit (status); } static int @@ -162,20 +162,43 @@ sigquit (int sig) int main (int argc, char **argv) { - int sfd, fd; + int c; + int fd; + char *socket_name = NULL; progname = argv[0]; - if (argc < 3) - usage (); + while ((c = getopt (argc, argv, "hs:")) != EOF) + { + switch (c) + { + case 'h': + usage (stdout, 0); + break; + + case 's': + socket_name = optarg; + break; + + default: + exit (64); + } + } - sfd = listen_socket (argv[1]); + argc -= optind; + argv += optind; - argc -= 2; - argv += 2; + if (argc == 0) + usage (stderr, 64); + if (socket_name) + { + int sfd = listen_socket (socket_name); fd = get_fd (sfd); close (sfd); + } + else + fd = 0; signal (SIGCHLD, sigchld); signal (SIGTERM, sigquit); |