Hello. I'm not sure it's acceptable way, so I'm waiting for comments. --- ping/ping.c | 29 +++++++++++++++++++++++++---- 1 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/ping/ping.c b/ping/ping.c index b65053e..3cf1571 100644 --- a/ping/ping.c +++ b/ping/ping.c @@ -34,6 +34,9 @@ # include <netinet/ip_var.h> #endif +#include <sys/types.h> +#include <sys/wait.h> + #include <arpa/inet.h> #include <netdb.h> #include <unistd.h> @@ -236,7 +239,7 @@ main (int argc, char **argv) { int index; int one = 1; - int status = 0; + int status = 0, rstatus; set_program_name (argv[0]); @@ -247,6 +250,25 @@ main (int argc, char **argv) iu_argp_init ("ping", program_authors); argp_parse (&argp, argc, argv, 0, &index, NULL); + argv += index; + argc -= index; + + while (argc > 1) /* Don't fork if there is only host to ping. */ + { + pid_t pid = fork(); + if (pid == -1) + break; + else if (pid > 0) + { + argc = 1; + } + else + { + ++argv; + --argc; + } + } + ping = ping_init (ICMP_ECHO, getpid ()); if (ping == NULL) /* ping_init() prints our error message. */ @@ -257,9 +279,6 @@ main (int argc, char **argv) /* Reset root privileges */ setuid (getuid ()); - argv += index; - argc -= index; - if (count != 0) ping_set_count (ping, count); @@ -276,6 +295,8 @@ main (int argc, char **argv) status |= (*(ping_type)) (*argv++); ping_reset (ping); } + while (wait(&rstatus) != -1) + status |= WIFEXITED(rstatus); free (ping); free (data_buffer); -- 1.6.0.3