X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=ping.c;h=8ac9630765a81d2a13938d6c59af9621e79f05c1;hb=ce4a586edb6abd90c1036666159f831bd2a58895;hp=52cb07be74b9e37b1d9893a03f11f4d914ab52ce;hpb=d537a95fdbc0b4a5f38edea8593b4c085fdd7fcb;p=oweals%2Fbusybox.git diff --git a/ping.c b/ping.c index 52cb07be7..8ac963076 100644 --- a/ping.c +++ b/ping.c @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /* - * $Id: ping.c,v 1.21 2000/07/14 01:51:25 kraai Exp $ + * $Id: ping.c,v 1.39 2001/03/14 01:23:07 andersen Exp $ * Mini ping implementation for busybox * * Copyright (C) 1999 by Randolph Chung @@ -31,7 +31,6 @@ * Original copyright notice is retained at the end of this file. */ -#include "internal.h" #include #include #include @@ -47,14 +46,16 @@ #include #include #include +#include +#include +#include +#include "busybox.h" /* It turns out that libc5 doesn't have proper icmp support * built into it header files, so we have to supplement it */ #if ! defined __GLIBC__ && ! defined __UCLIBC__ -typedef unsigned int socklen_t; - -#define ICMP_MINLEN 8 /* abs minimum */ +static const int ICMP_MINLEN = 8; /* abs minimum */ struct icmp_ra_addr { @@ -130,13 +131,13 @@ struct icmp }; #endif -#define DEFDATALEN 56 -#define MAXIPLEN 60 -#define MAXICMPLEN 76 -#define MAXPACKET 65468 +static const int DEFDATALEN = 56; +static const int MAXIPLEN = 60; +static const int MAXICMPLEN = 76; +static const int MAXPACKET = 65468; #define MAX_DUP_CHK (8 * 128) -#define MAXWAIT 10 -#define PINGINTERVAL 1 /* second */ +static const int MAXWAIT = 10; +static const int PINGINTERVAL = 1; /* second */ #define O_QUIET (1 << 0) @@ -174,12 +175,6 @@ static int in_cksum(unsigned short *buf, int sz) /* simple version */ #ifdef BB_FEATURE_SIMPLE_PING -static const char *ping_usage = "ping host\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nSend ICMP ECHO_REQUEST packets to network hosts\n" -#endif - ; - static char *hostname = NULL; static void noresp(int ign) @@ -196,10 +191,8 @@ static void ping(const char *host) int pingsock, c; char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; - if ((pingsock = socket(AF_INET, SOCK_RAW, 1)) < 0) { /* 1 == ICMP */ - perror("ping: creating a raw socket"); - exit(1); - } + if ((pingsock = socket(AF_INET, SOCK_RAW, 1)) < 0) /* 1 == ICMP */ + perror_msg_and_die("creating a raw socket"); /* drop root privs if running setuid */ setuid(getuid()); @@ -208,7 +201,7 @@ static void ping(const char *host) pingaddr.sin_family = AF_INET; if (!(h = gethostbyname(host))) { - errorMsg("unknown host %s\n", host); + error_msg("unknown host %s", host); exit(1); } memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr)); @@ -222,12 +215,8 @@ static void ping(const char *host) c = sendto(pingsock, packet, sizeof(packet), 0, (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in)); - if (c < 0 || c != sizeof(packet)) { - if (c < 0) - perror("ping: sendto"); - errorMsg("write incomplete\n"); - exit(1); - } + if (c < 0 || c != sizeof(packet)) + perror_msg_and_die("sendto"); signal(SIGALRM, noresp); alarm(5); /* give the host 5000ms to respond */ @@ -240,7 +229,7 @@ static void ping(const char *host) (struct sockaddr *) &from, &fromlen)) < 0) { if (errno == EINTR) continue; - perror("ping: recvfrom"); + perror_msg("recvfrom"); continue; } if (c >= 76) { /* ip + icmp */ @@ -260,28 +249,17 @@ extern int ping_main(int argc, char **argv) argc--; argv++; if (argc < 1) - usage(ping_usage); + show_usage(); ping(*argv); - exit(TRUE); + return EXIT_SUCCESS; } #else /* ! BB_FEATURE_SIMPLE_PING */ /* full(er) version */ -static const char *ping_usage = "ping [OPTION]... host\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nSend ICMP ECHO_REQUEST packets to network hosts.\n\n" - "Options:\n" - "\t-c COUNT\tSend only COUNT pings.\n" - "\t-s SIZE\t\tSend SIZE data bytes in packets (default=56).\n" - "\t-q\t\tQuiet mode, only displays output at start\n" - "\t\t\tand when finished.\n" -#endif - ; - static char *hostname = NULL; static struct sockaddr_in pingaddr; static int pingsock = -1; -static int datalen = DEFDATALEN; +static int datalen; /* intentionally uninitialized to work around gcc bug */ static long ntransmitted = 0, nreceived = 0, nrepeats = 0, pingcount = 0; static int myid = 0, options = 0; @@ -294,8 +272,10 @@ static void unpack(char *, int, struct sockaddr_in *); /**************************************************************************/ -static void pingstats(int ign) +static void pingstats(int junk) { + int status; + signal(SIGINT, SIG_IGN); printf("\n--- %s ping statistics ---\n", hostname); @@ -311,10 +291,14 @@ static void pingstats(int ign) tmin / 10, tmin % 10, (tsum / (nreceived + nrepeats)) / 10, (tsum / (nreceived + nrepeats)) % 10, tmax / 10, tmax % 10); - exit(0); + if (nreceived != 0) + status = EXIT_SUCCESS; + else + status = EXIT_FAILURE; + exit(status); } -static void sendping(int ign) +static void sendping(int junk) { struct icmp *pkt; int i; @@ -336,9 +320,9 @@ static void sendping(int ign) (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in)); if (i < 0) - fatalError("sendto: %s\n", strerror(errno)); - else if (i != sizeof(packet)) - fatalError("ping wrote %d chars; %d expected\n", i, + perror_msg_and_die("sendto"); + else if ((size_t)i != sizeof(packet)) + error_msg_and_die("ping wrote %d chars; %d expected", i, (int)sizeof(packet)); signal(SIGALRM, sendping); @@ -433,7 +417,7 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from) printf("\n"); } else if (icmppkt->icmp_type != ICMP_ECHO) - errorMsg("Warning: Got ICMP %d (%s)\n", + error_msg("Warning: Got ICMP %d (%s)", icmppkt->icmp_type, icmp_type_name (icmppkt->icmp_type)); } @@ -450,12 +434,10 @@ static void ping(const char *host) * proto->p_proto to have the correct value for "icmp" */ if ((pingsock = socket(AF_INET, SOCK_RAW, (proto ? proto->p_proto : 1))) < 0) { /* 1 == ICMP */ - if (errno == EPERM) { - errorMsg("permission denied. (are you root?)\n"); - } else { - perror("ping: creating a raw socket"); - } - exit(1); + if (errno == EPERM) + error_msg_and_die("permission denied. (are you root?)"); + else + perror_msg_and_die("creating a raw socket"); } /* drop root privs if running setuid */ @@ -465,12 +447,12 @@ static void ping(const char *host) pingaddr.sin_family = AF_INET; if (!(h = gethostbyname(host))) { - errorMsg("unknown host %s\n", host); + error_msg("unknown host %s", host); exit(1); } if (h->h_addrtype != AF_INET) { - errorMsg("unknown address type; only AF_INET is currently supported.\n"); + error_msg("unknown address type; only AF_INET is currently supported."); exit(1); } @@ -509,7 +491,7 @@ static void ping(const char *host) (struct sockaddr *) &from, &fromlen)) < 0) { if (errno == EINTR) continue; - perror("ping: recvfrom"); + perror_msg("recvfrom"); continue; } unpack(packet, c, &from); @@ -523,6 +505,8 @@ extern int ping_main(int argc, char **argv) { char *thisarg; + datalen = DEFDATALEN; /* initialized here rather than in global scope to work around gcc bug */ + argc--; argv++; options = 0; @@ -536,28 +520,28 @@ extern int ping_main(int argc, char **argv) break; case 'c': if (--argc <= 0) - usage(ping_usage); + show_usage(); argv++; pingcount = atoi(*argv); break; case 's': if (--argc <= 0) - usage(ping_usage); + show_usage(); argv++; datalen = atoi(*argv); break; default: - usage(ping_usage); + show_usage(); } argc--; argv++; } if (argc < 1) - usage(ping_usage); + show_usage(); myid = getpid() & 0xFFFF; ping(*argv); - return(TRUE); + return EXIT_SUCCESS; } #endif /* ! BB_FEATURE_SIMPLE_PING */ @@ -576,10 +560,10 @@ extern int ping_main(int argc, char **argv) * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. + * + * 3. + * * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission.