Module Name: src
Committed By: snj
Date: Tue Apr 14 05:26:20 UTC 2015
Modified Files:
src/sbin/ping [netbsd-7]: ping.c
Log Message:
Pull up following revision(s) (requested by christos in ticket #692):
sbin/ping/ping.c: revisions 1.108, 1.109
PR/49423: Martin Husemann: ping for small packets does not work in -7 or
-current
--
Adjust default packet size to 56 data bytes (64 total).
Make error messages consistent.
To generate a diff of this commit:
cvs rdiff -u -r1.107 -r1.107.4.1 src/sbin/ping/ping.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/ping/ping.c
diff -u src/sbin/ping/ping.c:1.107 src/sbin/ping/ping.c:1.107.4.1
--- src/sbin/ping/ping.c:1.107 Sat Oct 19 01:08:25 2013
+++ src/sbin/ping/ping.c Tue Apr 14 05:26:20 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ping.c,v 1.107 2013/10/19 01:08:25 christos Exp $ */
+/* $NetBSD: ping.c,v 1.107.4.1 2015/04/14 05:26:20 snj Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -58,7 +58,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: ping.c,v 1.107 2013/10/19 01:08:25 christos Exp $");
+__RCSID("$NetBSD: ping.c,v 1.107.4.1 2015/04/14 05:26:20 snj Exp $");
#endif
#include <stdio.h>
@@ -252,12 +252,12 @@ main(int argc, char *argv[])
#endif
if (prog_init && prog_init() == -1)
- err(1, "init failed");
+ err(EXIT_FAILURE, "init failed");
if ((s = prog_socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
- err(1, "Cannot create socket");
+ err(EXIT_FAILURE, "Cannot create socket");
if ((sloop = prog_socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
- err(1, "Cannot create socket");
+ err(EXIT_FAILURE, "Cannot create socket");
/*
* sloop is never read on. This prevents packets from
@@ -267,7 +267,7 @@ main(int argc, char *argv[])
warn("Cannot shutdown for read");
if (prog_setuid(prog_getuid()) == -1)
- err(1, "setuid");
+ err(EXIT_FAILURE, "setuid");
setprogname(argv[0]);
@@ -293,7 +293,9 @@ main(int argc, char *argv[])
case 'c':
npackets = strtol(optarg, &p, 0);
if (*p != '\0' || npackets <= 0)
- errx(1, "Bad/invalid number of packets");
+ errx(EXIT_FAILURE,
+ "Bad/invalid number of packets: %s",
+ optarg);
break;
case 'D':
pingflags |= F_DF;
@@ -310,13 +312,14 @@ main(int argc, char *argv[])
case 'i': /* wait between sending packets */
interval = strtod(optarg, &p);
if (*p != '\0' || interval <= 0)
- errx(1, "Bad/invalid interval %s", optarg);
+ errx(EXIT_FAILURE, "Bad/invalid interval: %s",
+ optarg);
break;
case 'l':
preload = strtol(optarg, &p, 0);
if (*p != '\0' || preload < 0)
- errx(1, "Bad/invalid preload value %s",
- optarg);
+ errx(EXIT_FAILURE, "Bad/invalid preload value: "
+ "%s", optarg);
break;
case 'n':
pingflags |= F_NUMERIC;
@@ -326,13 +329,15 @@ main(int argc, char *argv[])
break;
case 'p': /* fill buffer with user pattern */
if (pingflags & F_PING_RANDOM)
- errx(1, "Only one of -P and -p allowed");
+ errx(EXIT_FAILURE,
+ "Only one of -P and -p allowed");
pingflags |= F_PING_FILLED;
fill_pat = optarg;
break;
case 'P':
if (pingflags & F_PING_FILLED)
- errx(1, "Only one of -P and -p allowed");
+ errx(EXIT_FAILURE,
+ "Only one of -P and -p allowed");
pingflags |= F_PING_RANDOM;
break;
case 'q':
@@ -347,9 +352,10 @@ main(int argc, char *argv[])
case 's': /* size of packet to send */
l = strtol(optarg, &p, 0);
if (*p != '\0' || l < 0)
- errx(1, "Bad/invalid packet size %s", optarg);
+ errx(EXIT_FAILURE,
+ "Bad/invalid packet size: %s", optarg);
if (l > MAXPACKET)
- errx(1, "packet size is too large");
+ errx(EXIT_FAILURE, "packet size is too large");
len = (int)l;
break;
case 'v':
@@ -364,12 +370,13 @@ main(int argc, char *argv[])
case 't':
tos = strtoul(optarg, &p, 0);
if (*p != '\0' || tos > 0xFF)
- errx(1, "bad tos value: %s", optarg);
+ errx(EXIT_FAILURE, "bad tos value: %s", optarg);
break;
case 'T':
l = strtol(optarg, &p, 0);
if (*p != '\0' || l > 255 || l <= 0)
- errx(1, "ttl out of range");
+ errx(EXIT_FAILURE, "ttl out of range: %s",
+ optarg);
ttl = (u_char)l; /* cannot check >255 otherwise */
break;
case 'I':
@@ -383,7 +390,8 @@ main(int argc, char *argv[])
case 'w':
maxwait = strtod(optarg, &p);
if (*p != '\0' || maxwait <= 0)
- errx(1, "Bad/invalid maxwait time %s", optarg);
+ errx(EXIT_FAILURE, "Bad/invalid maxwait time: "
+ "%s", optarg);
break;
#ifdef IPSEC
#ifdef IPSEC_POLICY_IPSEC
@@ -392,13 +400,14 @@ main(int argc, char *argv[])
if (!strncmp("in", optarg, 2)) {
policy_in = strdup(optarg);
if (!policy_in)
- err(1, "strdup");
+ err(EXIT_FAILURE, "strdup");
} else if (!strncmp("out", optarg, 3)) {
policy_out = strdup(optarg);
if (!policy_out)
- err(1, "strdup");
+ err(EXIT_FAILURE, "strdup");
} else
- errx(1, "invalid security policy");
+ errx(EXIT_FAILURE, "invalid security policy: "
+ "%s", optarg);
break;
#else
case 'A':
@@ -419,11 +428,12 @@ main(int argc, char *argv[])
interval = (pingflags & F_FLOOD) ? FLOOD_INTVL : 1.0;
#ifndef sgi
if (pingflags & F_FLOOD && prog_getuid())
- errx(1, "Must be superuser to use -f");
+ errx(EXIT_FAILURE, "Must be superuser to use -f");
if (interval < 1.0 && prog_getuid())
- errx(1, "Must be superuser to use < 1 sec ping interval");
+ errx(EXIT_FAILURE, "Must be superuser to use < 1 sec "
+ "ping interval");
if (preload > 0 && prog_getuid())
- errx(1, "Must be superuser to use -l");
+ errx(EXIT_FAILURE, "Must be superuser to use -l");
#endif
sec_to_timespec(interval, &interval_tv);
@@ -458,7 +468,7 @@ main(int argc, char *argv[])
if (len != -1)
datalen = len;
else
- datalen = 64;
+ datalen = 64 - PHDR_LEN;
if (!compat && datalen >= (int)PHDR64_LEN) { /* can we time them? */
pingflags |= F_TIMING64;
phdrlen = PHDR64_LEN;
@@ -469,9 +479,8 @@ main(int argc, char *argv[])
phdrlen = 0;
packlen = datalen + 60 + 76; /* MAXIP + MAXICMP */
- datalen -= phdrlen;
if ((packet = malloc(packlen)) == NULL)
- err(1, "Out of memory");
+ err(EXIT_FAILURE, "Can't allocate %d bytes", packlen);
if (pingflags & F_PING_FILLED) {
fill();
@@ -526,9 +535,9 @@ main(int argc, char *argv[])
- optlen);
(void) memcpy(opack_ip + 1, optspace, optlen);
- if (prog_setsockopt(s,IPPROTO_IP,IP_HDRINCL,
+ if (prog_setsockopt(s, IPPROTO_IP, IP_HDRINCL,
(char *) &on, sizeof(on)) < 0)
- err(1, "Can't set special IP header");
+ err(EXIT_FAILURE, "Can't set special IP header");
opack_ip->ip_v = IPVERSION;
opack_ip->ip_hl = (sizeof(struct ip)+optlen) >> 2;
@@ -545,25 +554,25 @@ main(int argc, char *argv[])
if (prog_setsockopt(s, IPPROTO_IP,
IP_MULTICAST_LOOP,
(char *) &loop, 1) < 0)
- err(1, "Can't disable multicast loopback");
+ err(EXIT_FAILURE, "Can't disable multicast loopback");
}
if (ttl != 0
&& prog_setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL,
(char *) &ttl, 1) < 0)
- err(1, "Can't set multicast time-to-live");
+ err(EXIT_FAILURE, "Can't set multicast time-to-live");
if ((pingflags & F_SOURCE_ADDR)
&& prog_setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF,
(char *) &src_addr.sin_addr,
sizeof(src_addr.sin_addr)) < 0)
- err(1, "Can't set multicast source interface");
+ err(EXIT_FAILURE, "Can't set multicast source interface");
} else if (pingflags & F_SOURCE_ADDR) {
if (prog_setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF,
(char *) &src_addr.sin_addr,
sizeof(src_addr.sin_addr)) < 0)
- err(1, "Can't set source interface/address");
+ err(EXIT_FAILURE, "Can't set source interface/address");
}
#ifdef IPSEC
#ifdef IPSEC_POLICY_IPSEC
@@ -573,27 +582,29 @@ main(int argc, char *argv[])
if (policy_in != NULL) {
buf = ipsec_set_policy(policy_in, strlen(policy_in));
if (buf == NULL)
- errx(1, "%s", ipsec_strerror());
+ errx(EXIT_FAILURE, "%s", ipsec_strerror());
if (prog_setsockopt(s, IPPROTO_IP, IP_IPSEC_POLICY,
buf, ipsec_get_policylen(buf)) < 0) {
- err(1, "ipsec policy cannot be configured");
+ err(EXIT_FAILURE, "ipsec policy cannot be "
+ "configured");
}
free(buf);
}
if (policy_out != NULL) {
buf = ipsec_set_policy(policy_out, strlen(policy_out));
if (buf == NULL)
- errx(1, "%s", ipsec_strerror());
+ errx(EXIT_FAILURE, "%s", ipsec_strerror());
if (prog_setsockopt(s, IPPROTO_IP, IP_IPSEC_POLICY,
buf, ipsec_get_policylen(buf)) < 0) {
- err(1, "ipsec policy cannot be configured");
+ err(EXIT_FAILURE, "ipsec policy cannot be "
+ "configured");
}
free(buf);
}
}
buf = ipsec_set_policy("out bypass", strlen("out bypass"));
if (buf == NULL)
- errx(1, "%s", ipsec_strerror());
+ errx(EXIT_FAILURE, "%s", ipsec_strerror());
if (prog_setsockopt(sloop, IPPROTO_IP, IP_IPSEC_POLICY,
buf, ipsec_get_policylen(buf)) < 0) {
#if 0
@@ -637,7 +648,7 @@ main(int argc, char *argv[])
#endif /*IPSEC*/
(void)printf("PING %s (%s): %d data bytes\n", hostname,
- inet_ntoa(whereto.sin_addr), datalen + phdrlen);
+ inet_ntoa(whereto.sin_addr), datalen);
/* When pinging the broadcast address, you can get a lot
* of answers. Doing something so evil is useful if you
@@ -647,7 +658,7 @@ main(int argc, char *argv[])
while (0 > prog_setsockopt(s, SOL_SOCKET, SO_RCVBUF,
(char*)&bufspace, sizeof(bufspace))) {
if ((bufspace -= 4096) <= 0)
- err(1, "Cannot set the receive buffer size");
+ err(EXIT_FAILURE, "Cannot set the receive buffer size");
}
/* make it possible to send giant probes, but do not worry now
@@ -737,7 +748,7 @@ doit(void)
if (errno == EINTR)
continue;
jiggle_flush(1);
- err(1, "poll");
+ err(EXIT_FAILURE, "poll");
}
continue;
}
@@ -853,9 +864,9 @@ pinger(void)
opack_icmp.icmp_cksum = in_cksum((u_int16_t *)&opack_icmp,
phdrlen);
sw = 0;
- if (prog_setsockopt(sloop,IPPROTO_IP,IP_HDRINCL,
- (char *)&sw,sizeof(sw)) < 0)
- err(1, "Can't turn off special IP header");
+ if (prog_setsockopt(sloop, IPPROTO_IP, IP_HDRINCL,
+ (char *)&sw, sizeof(sw)) < 0)
+ err(EXIT_FAILURE, "Can't turn off special IP header");
if (prog_sendto(sloop, (char *) &opack_icmp,
ICMP_MINLEN, MSG_DONTROUTE,
(struct sockaddr *)&loc_addr,
@@ -870,9 +881,9 @@ pinger(void)
warn("failed to clear cached route");
}
sw = 1;
- if (prog_setsockopt(sloop,IPPROTO_IP,IP_HDRINCL,
+ if (prog_setsockopt(sloop, IPPROTO_IP, IP_HDRINCL,
(char *)&sw, sizeof(sw)) < 0)
- err(1, "Can't set special IP header");
+ err(EXIT_FAILURE, "Can't set special IP header");
(void)clock_gettime(CLOCK_MONOTONIC, &clear_cache);
}
@@ -887,7 +898,7 @@ pinger(void)
} else if (pingflags & F_TIMING64)
(void) memcpy(&opack_icmp.icmp_data[0], &now, sizeof(now));
- cc = MAX(datalen, ICMP_MINLEN) + phdrlen;
+ cc = MAX(datalen, ICMP_MINLEN) + PHDR_LEN;
opack_icmp.icmp_cksum = 0;
opack_icmp.icmp_cksum = in_cksum((u_int16_t *)&opack_icmp, cc);
@@ -1115,7 +1126,7 @@ pr_pack(u_char *buf,
}
PR_PACK_SUB();
(void)printf("\nwrong data byte #%d should have been"
- " %#x but was %#x", i,
+ " %#x but was %#x", i - phdrlen,
(u_char)opack_icmp.icmp_data[i],
(u_char)icp->icmp_data[i]);
for (i = phdrlen; i < datalen; i++) {
@@ -1350,7 +1361,7 @@ summary(int header)
if (n>1)
variance = (tsumsq - n*avg*avg) /(n-1);
- printf("round-trip min/avg/max/stddev = "
+ (void)printf("round-trip min/avg/max/stddev = "
"%.*f/%.*f/%.*f/%.*f ms\n",
prec, tmin * 1000.0,
prec, avg * 1000.0,
@@ -1798,7 +1809,7 @@ fill(void)
}
if (cp == fill_pat || *cp != '\0' || (cp-fill_pat) > 16*2) {
(void)fflush(stdout);
- errx(1, "\"-p %s\": patterns must be specified with"
+ errx(EXIT_FAILURE, "\"-p %s\": patterns must be specified with"
" 1-32 hex digits\n",
fill_pat);
}
@@ -1810,7 +1821,7 @@ fill(void)
&pat[8], &pat[9], &pat[10], &pat[11],
&pat[12], &pat[13], &pat[14], &pat[15]);
- for (k = phdrlen, j = 0; k <= datalen; k++) {
+ for (k = phdrlen, j = 0; k < datalen; k++) {
opack_icmp.icmp_data[k] = pat[j];
if (++j >= i)
j = 0;
@@ -1862,8 +1873,7 @@ gethost(const char *arg,
hp = 0;
else
hp = gethostbyaddr((char *)&sa->sin_addr,
- sizeof(sa->sin_addr),
- AF_INET);
+ sizeof(sa->sin_addr), AF_INET);
(void)strlcpy(realname, hp ? hp->h_name : name,
realname_len);
}
@@ -1872,10 +1882,11 @@ gethost(const char *arg,
hp = gethostbyname(name);
if (!hp)
- errx(1, "Cannot resolve \"%s\" (%s)",name,hstrerror(h_errno));
+ errx(EXIT_FAILURE, "Cannot resolve \"%s\" (%s)",
+ name, hstrerror(h_errno));
if (hp->h_addrtype != AF_INET)
- errx(1, "%s only supported with IP", arg);
+ errx(EXIT_FAILURE, "%s only supported with IP", arg);
(void)memcpy(&sa->sin_addr, hp->h_addr, sizeof(sa->sin_addr));