From e49d5ecbbe51718fa925b6890a735e5937cc2aa2 Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Tue, 8 Feb 2000 19:58:47 +0000 Subject: Some formatting updates (ran the code through indent) -Erik --- networking/hostname.c | 193 ++++++++-------- networking/nslookup.c | 185 +++++++-------- networking/ping.c | 618 ++++++++++++++++++++++++++------------------------ 3 files changed, 511 insertions(+), 485 deletions(-) (limited to 'networking') diff --git a/networking/hostname.c b/networking/hostname.c index 68a560950..8cc334da0 100644 --- a/networking/hostname.c +++ b/networking/hostname.c @@ -1,5 +1,6 @@ +/* vi: set sw=4 ts=4: */ /* - * $Id: hostname.c,v 1.6 2000/02/07 05:29:42 erik Exp $ + * $Id: hostname.c,v 1.7 2000/02/08 19:58:47 erik Exp $ * Mini hostname implementation for busybox * * Copyright (C) 1999 by Randolph Chung @@ -29,110 +30,116 @@ #include #include -static const char* hostname_usage = -"hostname [OPTION] {hostname | -F file}\n\n" -"Get or set the hostname or DNS domain name. If a hostname is given\n" -"(or a file with the -F parameter), the host name will be set.\n\n" -"Options:\n" -"\t-s\t\tShort\n" -"\t-i\t\tAddresses for the hostname\n" -"\t-d\t\tDNS domain name\n" -"\t-F FILE\t\tUse the contents of FILE to specify the hostname\n"; +static const char *hostname_usage = + "hostname [OPTION] {hostname | -F file}\n\n" + "Get or set the hostname or DNS domain name. If a hostname is given\n" + "(or a file with the -F parameter), the host name will be set.\n\n" + "Options:\n" + "\t-s\t\tShort\n" + + "\t-i\t\tAddresses for the hostname\n" + "\t-d\t\tDNS domain name\n" + "\t-F FILE\t\tUse the contents of FILE to specify the hostname\n"; void do_sethostname(char *s, int isfile) { - FILE *f; - char buf[255]; - - if (!s) return; - if (!isfile) { - if (sethostname(s, strlen(s)) < 0) { - if (errno == EPERM) - fprintf(stderr, "hostname: you must be root to change the hostname\n"); - else - perror("sethostname"); - exit(1); - } - } else { - if ((f = fopen(s, "r")) == NULL) { - perror(s); - exit(1); + FILE *f; + char buf[255]; + + if (!s) + return; + if (!isfile) { + if (sethostname(s, strlen(s)) < 0) { + if (errno == EPERM) + fprintf(stderr, + "hostname: you must be root to change the hostname\n"); + else + perror("sethostname"); + exit(1); + } } else { - fgets(buf, 255, f); - fclose(f); - if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = 0; - if (sethostname(buf, strlen(buf)) < 0) { - perror("sethostname"); - exit(1); - } + if ((f = fopen(s, "r")) == NULL) { + perror(s); + exit(1); + } else { + fgets(buf, 255, f); + fclose(f); + if (buf[strlen(buf) - 1] == '\n') + buf[strlen(buf) - 1] = 0; + if (sethostname(buf, strlen(buf)) < 0) { + perror("sethostname"); + exit(1); + } + } } - } } int hostname_main(int argc, char **argv) { - int opt_short = 0; - int opt_domain = 0; - int opt_ip = 0; - struct hostent *h; - char *filename = NULL; - char buf[255]; - char *s = NULL; - - if (argc < 1) usage(hostname_usage); + int opt_short = 0; + int opt_domain = 0; + int opt_ip = 0; + struct hostent *h; + char *filename = NULL; + char buf[255]; + char *s = NULL; - while (--argc > 0 && **(++argv) == '-') { - while (*(++(*argv))) { - switch (**argv) { - case 's': - opt_short = 1; - break; - case 'i': - opt_ip = 1; - break; - case 'd': - opt_domain = 1; - break; - case 'F': - filename = optarg; - if (--argc == 0) { - usage(hostname_usage); - } - filename = *(++argv); - break; - default: + if (argc < 1) usage(hostname_usage); - } - if (filename!=NULL) - break; + + while (--argc > 0 && **(++argv) == '-') { + while (*(++(*argv))) { + switch (**argv) { + case 's': + opt_short = 1; + break; + case 'i': + opt_ip = 1; + break; + case 'd': + opt_domain = 1; + break; + case 'F': + filename = optarg; + if (--argc == 0) { + usage(hostname_usage); + } + filename = *(++argv); + break; + default: + usage(hostname_usage); + } + if (filename != NULL) + break; + } } - } - if (argc >= 1) { - do_sethostname(*argv, 0); - } else if (filename!=NULL) { - do_sethostname(filename, 1); - } else { - gethostname(buf, 255); - if (opt_short) { - s = strchr(buf, '.'); - if (!s) s = buf; *s = 0; - printf("%s\n", buf); - } else if (opt_domain) { - s = strchr(buf, '.'); - printf("%s\n", (s ? s+1 : "")); - } else if (opt_ip) { - h = gethostbyname(buf); - if (!h) { - printf("Host not found\n"); - exit(1); - } - printf("%s\n", inet_ntoa(*(struct in_addr *)(h->h_addr))); - } else { - printf("%s\n", buf); - } - } - exit( 0); + if (argc >= 1) { + do_sethostname(*argv, 0); + } else if (filename != NULL) { + do_sethostname(filename, 1); + } else { + gethostname(buf, 255); + if (opt_short) { + s = strchr(buf, '.'); + if (!s) + s = buf; + *s = 0; + printf("%s\n", buf); + } else if (opt_domain) { + s = strchr(buf, '.'); + printf("%s\n", (s ? s + 1 : "")); + } else if (opt_ip) { + h = gethostbyname(buf); + if (!h) { + printf("Host not found\n"); + exit(1); + } + printf("%s\n", inet_ntoa(*(struct in_addr *) (h->h_addr))); + } else { + printf("%s\n", buf); + } + } + exit(0); } - diff --git a/networking/nslookup.c b/networking/nslookup.c index 969d0b19b..ffa720174 100644 --- a/networking/nslookup.c +++ b/networking/nslookup.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * Mini nslookup implementation for busybox * @@ -41,148 +42,136 @@ | + find out how the real nslookup gets the default name server */ -static const char nslookup_usage[] = - "nslookup [HOST]\n\n" -; +static const char nslookup_usage[] = "nslookup [HOST]\n\n"; /* I have to see how the real nslookup does this. * I could dig through /etc/resolv.conf, but is there a * better (programatic) way? */ -static void -server_fprint(FILE *dst) +static void server_fprint(FILE * dst) { - fprintf(dst, "Server: %s\n", "something"); - fprintf(dst, "Address: %s\n\n", "something"); + fprintf(dst, "Server: %s\n", "something"); + fprintf(dst, "Address: %s\n\n", "something"); } /* only works for IPv4 */ -static int -addr_fprint(char *addr, FILE *dst) +static int addr_fprint(char *addr, FILE * dst) { - uint8_t split[4]; - uint32_t ip; - uint32_t *x = (uint32_t *) addr; - - ip = ntohl(*x); - split[0] = (ip & 0xff000000) >> 24; - split[1] = (ip & 0x00ff0000) >> 16; - split[2] = (ip & 0x0000ff00) >> 8; - split[3] = (ip & 0x000000ff); - fprintf ( - dst, "%d.%d.%d.%d", - split[0], split[1], split[2], split[3] - ); - return 0; + uint8_t split[4]; + uint32_t ip; + uint32_t *x = (uint32_t *) addr; + + ip = ntohl(*x); + split[0] = (ip & 0xff000000) >> 24; + split[1] = (ip & 0x00ff0000) >> 16; + split[2] = (ip & 0x0000ff00) >> 8; + split[3] = (ip & 0x000000ff); + fprintf(dst, "%d.%d.%d.%d", split[0], split[1], split[2], split[3] + ); + return 0; } /* changes a c-string matching the perl regex \d+\.\d+\.\d+\.\d+ * into a uint32_t */ -static uint32_t -str_to_addr(const char *addr) +static uint32_t str_to_addr(const char *addr) { - uint32_t split[4]; - uint32_t ip; + uint32_t split[4]; + uint32_t ip; - sscanf(addr, "%d.%d.%d.%d", - &split[0], &split[1], &split[2], &split[3]); + sscanf(addr, "%d.%d.%d.%d", + &split[0], &split[1], &split[2], &split[3]); - /* assuming sscanf worked */ - ip = (split[0] << 24) | - (split[1] << 16) | - (split[2] << 8) | - (split[3]); + /* assuming sscanf worked */ + ip = (split[0] << 24) | + (split[1] << 16) | (split[2] << 8) | (split[3]); - return htonl(ip); + return htonl(ip); } /* takes the NULL-terminated array h_addr_list, and * prints its contents appropriately */ -static int -addr_list_fprint(char **h_addr_list, FILE *dst) +static int addr_list_fprint(char **h_addr_list, FILE * dst) { - int i, j; - char *addr_string = (h_addr_list[1]) - ? "Addresses" - : "Address"; - - fprintf(dst, "%s: ", addr_string); - for (i = 0, j = 0; h_addr_list[i]; i++, j++) { - addr_fprint(h_addr_list[i], dst); - - /* real nslookup does this */ - if (j == 4) { - if (h_addr_list[i+1]) { - fprintf(dst, "\n "); - } - j = 0; - } else { - if (h_addr_list[i+1]) { - fprintf(dst, ", "); - } - } + int i, j; + char *addr_string = (h_addr_list[1]) + ? "Addresses" : "Address"; + + fprintf(dst, "%s: ", addr_string); + for (i = 0, j = 0; h_addr_list[i]; i++, j++) { + addr_fprint(h_addr_list[i], dst); + + /* real nslookup does this */ + if (j == 4) { + if (h_addr_list[i + 1]) { + fprintf(dst, "\n "); + } + j = 0; + } else { + if (h_addr_list[i + 1]) { + fprintf(dst, ", "); + } + } - } - fprintf(dst,"\n"); - return 0; + } + fprintf(dst, "\n"); + return 0; } /* gethostbyaddr wrapper */ -static struct hostent * -gethostbyaddr_wrapper(const char *address) +static struct hostent *gethostbyaddr_wrapper(const char *address) { - struct in_addr addr; + struct in_addr addr; - addr.s_addr = str_to_addr(address); - return gethostbyaddr((char *) &addr, 4, AF_INET); /* IPv4 only for now */ + addr.s_addr = str_to_addr(address); + return gethostbyaddr((char *) &addr, 4, AF_INET); /* IPv4 only for now */ } /* print the results as nslookup would */ -static struct hostent * -hostent_fprint(struct hostent *host, FILE *dst) +static struct hostent *hostent_fprint(struct hostent *host, FILE * dst) { - if (host) { - fprintf(dst, "Name: %s\n", host->h_name); - addr_list_fprint(host->h_addr_list, dst); - } else { - fprintf(dst, "*** %s\n", hstrerror(h_errno)); - } - return host; + if (host) { + fprintf(dst, "Name: %s\n", host->h_name); + addr_list_fprint(host->h_addr_list, dst); + } else { + fprintf(dst, "*** %s\n", hstrerror(h_errno)); + } + return host; } /* naive function to check whether char *s is an ip address */ -static int -is_ip_address(const char *s) +static int is_ip_address(const char *s) { - while (*s) { - if ((isdigit(*s)) || (*s == '.')) { s++; continue; } - return 0; - } - return 1; + while (*s) { + if ((isdigit(*s)) || (*s == '.')) { + s++; + continue; + } + return 0; + } + return 1; } /* ________________________________________________________________________ */ -int -nslookup_main(int argc, char **argv) +int nslookup_main(int argc, char **argv) { - struct hostent *host; - - if (argc < 2) { - usage(nslookup_usage); - } - - server_fprint(stdout); - if (is_ip_address(argv[1])) { - host = gethostbyaddr_wrapper(argv[1]); - } else { - host = gethostbyname(argv[1]); - } - hostent_fprint(host, stdout); - return 0; + struct hostent *host; + + if (argc < 2) { + usage(nslookup_usage); + } + + server_fprint(stdout); + if (is_ip_address(argv[1])) { + host = gethostbyaddr_wrapper(argv[1]); + } else { + host = gethostbyname(argv[1]); + } + hostent_fprint(host, stdout); + return 0; } -/* $Id: nslookup.c,v 1.3 2000/02/07 05:29:42 erik Exp $ */ +/* $Id: nslookup.c,v 1.4 2000/02/08 19:58:47 erik Exp $ */ diff --git a/networking/ping.c b/networking/ping.c index 3ffbdc553..c9cf5ffb4 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -1,5 +1,6 @@ +/* vi: set sw=4 ts=4: */ /* - * $Id: ping.c,v 1.10 2000/02/07 05:29:42 erik Exp $ + * $Id: ping.c,v 1.11 2000/02/08 19:58:47 erik Exp $ * Mini ping implementation for busybox * * Copyright (C) 1999 by Randolph Chung @@ -53,7 +54,7 @@ #define MAXPACKET 65468 #define MAX_DUP_CHK (8 * 128) #define MAXWAIT 10 -#define PINGINTERVAL 1 /* second */ +#define PINGINTERVAL 1 /* second */ #define O_QUIET (1 << 0) @@ -66,118 +67,124 @@ /* common routines */ static int in_cksum(unsigned short *buf, int sz) { - int nleft = sz; - int sum = 0; - unsigned short *w = buf; - unsigned short ans = 0; - - while (nleft > 1) { - sum += *w++; - nleft -= 2; - } - - if (nleft == 1) { - *(unsigned char *)(&ans) = *(unsigned char *)w; - sum += ans; - } - - sum = (sum >> 16) + (sum & 0xFFFF); - sum += (sum >> 16); - ans = ~sum; - return(ans); -} + int nleft = sz; + int sum = 0; + unsigned short *w = buf; + unsigned short ans = 0; + + while (nleft > 1) { + sum += *w++; + nleft -= 2; + } + + if (nleft == 1) { + *(unsigned char *) (&ans) = *(unsigned char *) w; + sum += ans; + } + + sum = (sum >> 16) + (sum & 0xFFFF); + sum += (sum >> 16); + ans = ~sum; + return (ans); +} /* simple version */ #ifdef BB_SIMPLE_PING -static const char* ping_usage = "ping host\n\n"; +static const char *ping_usage = "ping host\n\n"; -static char* hostname = NULL; +static char *hostname = NULL; static void noresp(int ign) { - printf("No response from %s\n", hostname); - exit(0); + printf("No response from %s\n", hostname); + exit(0); } static int ping(const char *host) { - struct hostent *h; - struct sockaddr_in pingaddr; - struct icmp *pkt; - int pingsock, c; - char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; - - if ((pingsock = socket(AF_INET, SOCK_RAW, 1)) < 0) { /* 1 == ICMP */ - perror("ping"); - exit(1); - } - - /* drop root privs if running setuid */ - setuid(getuid()); - - memset(&pingaddr, 0, sizeof(struct sockaddr_in)); - pingaddr.sin_family = AF_INET; - if (!(h = gethostbyname(host))) { - fprintf(stderr, "ping: unknown host %s\n", host); - exit(1); - } - memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr)); - hostname = h->h_name; - - pkt = (struct icmp *)packet; - memset(pkt, 0, sizeof(packet)); - pkt->icmp_type = ICMP_ECHO; - pkt->icmp_cksum = in_cksum((unsigned short *)pkt, sizeof(packet)); - - 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"); - fprintf(stderr, "ping: write incomplete\n"); - exit(1); - } - - signal(SIGALRM, noresp); - alarm(5); /* give the host 5000ms to respond */ - /* listen for replies */ - while (1) { - struct sockaddr_in from; - size_t fromlen = sizeof(from); - - if ((c = recvfrom(pingsock, packet, sizeof(packet), 0, - (struct sockaddr *)&from, &fromlen)) < 0) { - if (errno == EINTR) continue; - perror("ping"); - continue; + struct hostent *h; + struct sockaddr_in pingaddr; + struct icmp *pkt; + int pingsock, c; + char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; + + if ((pingsock = socket(AF_INET, SOCK_RAW, 1)) < 0) { /* 1 == ICMP */ + perror("ping"); + exit(1); + } + + /* drop root privs if running setuid */ + setuid(getuid()); + + memset(&pingaddr, 0, sizeof(struct sockaddr_in)); + + pingaddr.sin_family = AF_INET; + if (!(h = gethostbyname(host))) { + fprintf(stderr, "ping: unknown host %s\n", host); + exit(1); + } + memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr)); + hostname = h->h_name; + + pkt = (struct icmp *) packet; + memset(pkt, 0, sizeof(packet)); + pkt->icmp_type = ICMP_ECHO; + pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet)); + + 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"); + fprintf(stderr, "ping: write incomplete\n"); + exit(1); + } + + signal(SIGALRM, noresp); + alarm(5); /* give the host 5000ms to respond */ + /* listen for replies */ + while (1) { + struct sockaddr_in from; + size_t fromlen = sizeof(from); + + if ((c = recvfrom(pingsock, packet, sizeof(packet), 0, + (struct sockaddr *) &from, &fromlen)) < 0) { + if (errno == EINTR) + continue; + perror("ping"); + continue; + } + if (c >= 76) { /* ip + icmp */ + struct iphdr *iphdr = (struct iphdr *) packet; + + pkt = (struct icmp *) (packet + (iphdr->ihl << 2)); /* skip ip hdr */ + if (pkt->icmp_type == ICMP_ECHOREPLY) + break; + } } - if (c >= 76) { /* ip + icmp */ - struct iphdr *iphdr = (struct iphdr *)packet; - pkt = (struct icmp *)(packet + (iphdr->ihl << 2)); /* skip ip hdr */ - if (pkt->icmp_type == ICMP_ECHOREPLY) break; - } - } - printf("%s is alive!\n", hostname); - return(TRUE); + printf("%s is alive!\n", hostname); + return (TRUE); } extern int ping_main(int argc, char **argv) { - argc--; - argv++; - if (argc < 1) usage(ping_usage); - ping(*argv); - exit(TRUE); + argc--; + argv++; + if (argc < 1) + usage(ping_usage); + ping(*argv); + exit(TRUE); } -#else +#else /* full(er) version */ -static const char* ping_usage = "ping [OPTION]... host\n\n" -"Send ICMP ECHO_REQUEST packets to network hosts.\n\n" -"Options:\n" -"\t-q\t\tQuiet mode, only displays output at start" -"\t\t\tand when finished.\n" -"\t-c COUNT\tSend only COUNT pings.\n"; +static const char *ping_usage = "ping [OPTION]... host\n\n" + "Send ICMP ECHO_REQUEST packets to network hosts.\n\n" + "Options:\n" + "\t-q\t\tQuiet mode, only displays output at start" + + "\t\t\tand when finished.\n" "\t-c COUNT\tSend only COUNT pings.\n"; static char *hostname = NULL; static struct sockaddr_in pingaddr; @@ -196,224 +203,247 @@ static void ping(char *); /**************************************************************************/ -static void pingstats(int ign) { - signal(SIGINT, SIG_IGN); - - printf("\n--- %s ping statistics ---\n", hostname); - printf("%ld packets transmitted, ", ntransmitted); - printf("%ld packets received, ", nreceived); - if (nrepeats) - printf("%ld duplicates, ", nrepeats); - if (ntransmitted) - printf("%ld%% packet loss\n", - (ntransmitted - nreceived)*100/ntransmitted); - if (nreceived) - printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n", - tmin/10, tmin%10, - (tsum/(nreceived+nrepeats))/10, - (tsum/(nreceived+nrepeats))%10, - tmax/10, tmax%10); - exit(0); +static void pingstats(int ign) +{ + signal(SIGINT, SIG_IGN); + + printf("\n--- %s ping statistics ---\n", hostname); + printf("%ld packets transmitted, ", ntransmitted); + printf("%ld packets received, ", nreceived); + if (nrepeats) + printf("%ld duplicates, ", nrepeats); + if (ntransmitted) + printf("%ld%% packet loss\n", + (ntransmitted - nreceived) * 100 / ntransmitted); + if (nreceived) + printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n", + tmin / 10, tmin % 10, + (tsum / (nreceived + nrepeats)) / 10, + (tsum / (nreceived + nrepeats)) % 10, tmax / 10, tmax % 10); + exit(0); } static void sendping(int ign) { - struct icmp *pkt; - int i; - char packet[DEFDATALEN + 8]; - - pkt = (struct icmp *)packet; - - pkt->icmp_type = ICMP_ECHO; - pkt->icmp_code = 0; - pkt->icmp_cksum = 0; - pkt->icmp_seq = ntransmitted++; - pkt->icmp_id = myid; - CLR(pkt->icmp_seq % MAX_DUP_CHK); - - gettimeofday((struct timeval *)&packet[8], NULL); - pkt->icmp_cksum = in_cksum((unsigned short *)pkt, sizeof(packet)); - - i = sendto(pingsock, packet, sizeof(packet), 0, - (struct sockaddr *)&pingaddr, sizeof(struct sockaddr_in)); - - if (i < 0 || i != sizeof(packet)) { - if (i < 0) perror("ping"); - fprintf(stderr, "ping wrote %d chars; %d expected\n", i, sizeof(packet)); - exit(1); - } - - signal(SIGALRM, sendping); - if (pingcount == 0 || ntransmitted < pingcount) { /* schedule next in 1s */ - alarm(PINGINTERVAL); - } else { /* done, wait for the last ping to come back */ - /* todo, don't necessarily need to wait so long... */ - signal(SIGALRM, pingstats); - alarm(MAXWAIT); - } + struct icmp *pkt; + int i; + char packet[DEFDATALEN + 8]; + + pkt = (struct icmp *) packet; + + pkt->icmp_type = ICMP_ECHO; + pkt->icmp_code = 0; + pkt->icmp_cksum = 0; + pkt->icmp_seq = ntransmitted++; + pkt->icmp_id = myid; + CLR(pkt->icmp_seq % MAX_DUP_CHK); + + gettimeofday((struct timeval *) &packet[8], NULL); + pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet)); + + i = sendto(pingsock, packet, sizeof(packet), 0, + (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in)); + + if (i < 0 || i != sizeof(packet)) { + if (i < 0) + perror("ping"); + fprintf(stderr, "ping wrote %d chars; %d expected\n", i, + sizeof(packet)); + exit(1); + } + + signal(SIGALRM, sendping); + if (pingcount == 0 || ntransmitted < pingcount) { /* schedule next in 1s */ + alarm(PINGINTERVAL); + } else { /* done, wait for the last ping to come back */ + /* todo, don't necessarily need to wait so long... */ + signal(SIGALRM, pingstats); + alarm(MAXWAIT); + } } - + static void unpack(char *buf, int sz, struct sockaddr_in *from) { - struct icmp *icmppkt; - struct iphdr *iphdr; - struct timeval tv, *tp; - int hlen, dupflag; - unsigned long triptime; - - gettimeofday(&tv, NULL); - - /* check IP header */ - iphdr = (struct iphdr *)buf; - hlen = iphdr->ihl << 2; - /* discard if too short */ - if (sz < (DEFDATALEN + ICMP_MINLEN)) return; - - sz -= hlen; - icmppkt = (struct icmp *)(buf + hlen); - - if (icmppkt->icmp_type == ICMP_ECHOREPLY) { - if (icmppkt->icmp_id != myid) return; /* not our ping */ - ++nreceived; - tp = (struct timeval *)icmppkt->icmp_data; - - if ((tv.tv_usec -= tp->tv_usec) < 0) { - --tv.tv_sec; - tv.tv_usec += 1000000; - } - tv.tv_sec -= tp->tv_sec; - - triptime = tv.tv_sec * 10000 + (tv.tv_usec / 100); - tsum += triptime; - if (triptime < tmin) tmin = triptime; - if (triptime > tmax) tmax = triptime; - - if (TST(icmppkt->icmp_seq % MAX_DUP_CHK)) { - ++nrepeats; - --nreceived; - dupflag = 1; + struct icmp *icmppkt; + struct iphdr *iphdr; + struct timeval tv, *tp; + int hlen, dupflag; + unsigned long triptime; + + gettimeofday(&tv, NULL); + + /* check IP header */ + iphdr = (struct iphdr *) buf; + hlen = iphdr->ihl << 2; + /* discard if too short */ + if (sz < (DEFDATALEN + ICMP_MINLEN)) + return; + + sz -= hlen; + icmppkt = (struct icmp *) (buf + hlen); + + if (icmppkt->icmp_type == ICMP_ECHOREPLY) { + if (icmppkt->icmp_id != myid) + return; /* not our ping */ + ++nreceived; + tp = (struct timeval *) icmppkt->icmp_data; + + if ((tv.tv_usec -= tp->tv_usec) < 0) { + --tv.tv_sec; + tv.tv_usec += 1000000; + } + tv.tv_sec -= tp->tv_sec; + + triptime = tv.tv_sec * 10000 + (tv.tv_usec / 100); + tsum += triptime; + if (triptime < tmin) + tmin = triptime; + if (triptime > tmax) + tmax = triptime; + + if (TST(icmppkt->icmp_seq % MAX_DUP_CHK)) { + ++nrepeats; + --nreceived; + dupflag = 1; + } else { + SET(icmppkt->icmp_seq % MAX_DUP_CHK); + dupflag = 0; + } + + if (options & O_QUIET) + return; + + printf("%d bytes from %s: icmp_seq=%u", sz, + inet_ntoa(*(struct in_addr *) &from->sin_addr.s_addr), + icmppkt->icmp_seq); + printf(" ttl=%d", iphdr->ttl); + printf(" time=%lu.%lu ms", triptime / 10, triptime % 10); + if (dupflag) + printf(" (DUP!)"); + printf("\n"); } else { - SET(icmppkt->icmp_seq % MAX_DUP_CHK); - dupflag = 0; + fprintf(stderr, + "Warning: unknown ICMP packet received (not echo-reply)\n"); } - - if (options & O_QUIET) return; - - printf("%d bytes from %s: icmp_seq=%u", sz, - inet_ntoa(*(struct in_addr *)&from->sin_addr.s_addr), - icmppkt->icmp_seq); - printf(" ttl=%d", iphdr->ttl); - printf(" time=%lu.%lu ms", triptime/10, triptime%10); - if (dupflag) printf(" (DUP!)"); - printf("\n"); - } else { - fprintf(stderr, "Warning: unknown ICMP packet received (not echo-reply)\n"); - } } static void ping(char *host) { - struct protoent *proto; - struct hostent *h; - char buf[MAXHOSTNAMELEN]; - char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; - int sockopt; - - proto = getprotobyname("icmp"); - /* if getprotobyname failed, just silently force - * 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) { - fprintf(stderr, "ping: permission denied. (are you root?)\n"); - } else { - perror("ping"); + struct protoent *proto; + struct hostent *h; + char buf[MAXHOSTNAMELEN]; + char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; + int sockopt; + + proto = getprotobyname("icmp"); + /* if getprotobyname failed, just silently force + * 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) { + fprintf(stderr, "ping: permission denied. (are you root?)\n"); + } else { + perror("ping"); + } + exit(1); } - exit(1); - } - - /* drop root privs if running setuid */ - setuid(getuid()); - - memset(&pingaddr, 0, sizeof(struct sockaddr_in)); - pingaddr.sin_family = AF_INET; - if (!(h = gethostbyname(host))) { - fprintf(stderr, "ping: unknown host %s\n", host); - exit(1); - } - - if (h->h_addrtype != AF_INET) { - fprintf(stderr, "ping: unknown address type; only AF_INET is currently supported.\n"); - exit(1); - } - - pingaddr.sin_family = AF_INET; /* h->h_addrtype */ - memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr)); - strncpy(buf, h->h_name, sizeof(buf)-1); - hostname = buf; - - /* enable broadcast pings */ - sockopt = 1; - setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *)&sockopt, sizeof(sockopt)); - - /* set recv buf for broadcast pings */ - sockopt = 48 * 1024; - setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *)&sockopt, sizeof(sockopt)); - - printf("PING %s (%s): %d data bytes\n", - hostname, inet_ntoa(*(struct in_addr *)&pingaddr.sin_addr.s_addr), - DEFDATALEN); - - signal(SIGINT, pingstats); - - /* start the ping's going ... */ - sendping(0); - - /* listen for replies */ - while (1) { - struct sockaddr_in from; - size_t fromlen = sizeof(from); - int c; - - if ((c = recvfrom(pingsock, packet, sizeof(packet), 0, - (struct sockaddr *)&from, &fromlen)) < 0) { - if (errno == EINTR) continue; - perror("ping"); - continue; + + /* drop root privs if running setuid */ + setuid(getuid()); + + memset(&pingaddr, 0, sizeof(struct sockaddr_in)); + + pingaddr.sin_family = AF_INET; + if (!(h = gethostbyname(host))) { + fprintf(stderr, "ping: unknown host %s\n", host); + exit(1); + } + + if (h->h_addrtype != AF_INET) { + fprintf(stderr, + "ping: unknown address type; only AF_INET is currently supported.\n"); + exit(1); } - unpack(packet, c, &from); - if (pingcount > 0 && nreceived >= pingcount) break; - } - pingstats(0); + + pingaddr.sin_family = AF_INET; /* h->h_addrtype */ + memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr)); + strncpy(buf, h->h_name, sizeof(buf) - 1); + hostname = buf; + + /* enable broadcast pings */ + sockopt = 1; + setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt, + sizeof(sockopt)); + + /* set recv buf for broadcast pings */ + sockopt = 48 * 1024; + setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt, + sizeof(sockopt)); + + printf("PING %s (%s): %d data bytes\n", + hostname, + inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr), + DEFDATALEN); + + signal(SIGINT, pingstats); + + /* start the ping's going ... */ + sendping(0); + + /* listen for replies */ + while (1) { + struct sockaddr_in from; + size_t fromlen = sizeof(from); + int c; + + if ((c = recvfrom(pingsock, packet, sizeof(packet), 0, + (struct sockaddr *) &from, &fromlen)) < 0) { + if (errno == EINTR) + continue; + perror("ping"); + continue; + } + unpack(packet, c, &from); + if (pingcount > 0 && nreceived >= pingcount) + break; + } + pingstats(0); } extern int ping_main(int argc, char **argv) { - char *thisarg; - - argc--; - argv++; - options = 0; - /* Parse any options */ - while (argc > 1) { - if (**argv != '-') usage(ping_usage); - thisarg = *argv; thisarg++; - switch (*thisarg) { - case 'q': options |= O_QUIET; break; - case 'c': - argc--; argv++; - pingcount = atoi(*argv); - break; - default: - usage(ping_usage); - } - argc--; argv++; - } - if (argc < 1) usage(ping_usage); - - myid = getpid() & 0xFFFF; - ping(*argv); - exit(TRUE); + char *thisarg; + + argc--; + argv++; + options = 0; + /* Parse any options */ + while (argc > 1) { + if (**argv != '-') + usage(ping_usage); + thisarg = *argv; + thisarg++; + switch (*thisarg) { + case 'q': + options |= O_QUIET; + break; + case 'c': + argc--; + argv++; + pingcount = atoi(*argv); + break; + default: + usage(ping_usage); + } + argc--; + argv++; + } + if (argc < 1) + usage(ping_usage); + + myid = getpid() & 0xFFFF; + ping(*argv); + exit(TRUE); } #endif -- cgit v1.2.3