summaryrefslogtreecommitdiff
path: root/sbin/ping/ping.c
diff options
context:
space:
mode:
authorFlorian Obser <florian@cvs.openbsd.org>2016-09-11 18:24:45 +0000
committerFlorian Obser <florian@cvs.openbsd.org>2016-09-11 18:24:45 +0000
commit89846886a1ae1b9f33c6a28efa381eb90d029d96 (patch)
tree7e140b3f6bc016098b8f83f5946b56fb261d589c /sbin/ping/ping.c
parente692e174029e94f1dfb8eb97a16a94d7abf02fc3 (diff)
Introduce pr_ipopt() to remove IPv4 specifics from pr_pack(); small
step to make this AF independent.
Diffstat (limited to 'sbin/ping/ping.c')
-rw-r--r--sbin/ping/ping.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
index 5089072fd5c..c28116292d9 100644
--- a/sbin/ping/ping.c
+++ b/sbin/ping/ping.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ping.c,v 1.171 2016/09/11 18:21:09 florian Exp $ */
+/* $OpenBSD: ping.c,v 1.172 2016/09/11 18:24:44 florian Exp $ */
/* $NetBSD: ping.c,v 1.20 1995/08/11 22:37:58 cgd Exp $ */
/*
@@ -180,6 +180,7 @@ const char *pr_addr(struct sockaddr *, socklen_t);
void pr_pack(u_char *, int, struct msghdr *);
__dead void usage(void);
+void pr_ipopt(int, u_char *);
int in_cksum(u_short *, int);
void pr_icmph(struct icmp *);
void pr_retip(struct ip *);
@@ -857,15 +858,11 @@ pinger(void)
void
pr_pack(u_char *buf, int cc, struct msghdr *mhdr)
{
- struct sockaddr_in s_in;
struct sockaddr *from;
socklen_t fromlen;
struct icmp *icp;
- in_addr_t l;
- u_int i, j;
+ u_int i;
u_char *cp, *dp;
- static int old_rrlen;
- static char old_rr[MAX_IPOPTLEN];
struct ip *ip;
struct timespec ts, tp;
char *pkttime;
@@ -873,9 +870,6 @@ pr_pack(u_char *buf, int cc, struct msghdr *mhdr)
int hlen, dupflag;
struct payload payload;
- s_in.sin_len = sizeof(s_in);
- s_in.sin_family = AF_INET;
-
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
err(1, "clock_gettime(CLOCK_MONOTONIC)");
@@ -999,9 +993,33 @@ pr_pack(u_char *buf, int cc, struct msghdr *mhdr)
}
/* Display any IP options */
+ if (hlen > sizeof(struct ip))
+ pr_ipopt(hlen, buf);
+
+ if (!(options & F_FLOOD)) {
+ (void)putchar('\n');
+ (void)fflush(stdout);
+ if (options & F_AUD_RECV)
+ write(STDERR_FILENO, "\a", 1);
+ }
+}
+
+void
+pr_ipopt(int hlen, u_char *buf)
+{
+ static int old_rrlen;
+ static char old_rr[MAX_IPOPTLEN];
+ struct sockaddr_in s_in;
+ in_addr_t l;
+ u_int i, j;
+ u_char *cp;
+
cp = buf + sizeof(struct ip);
- for (; hlen > (int)sizeof(struct ip); --hlen, ++cp)
+ s_in.sin_len = sizeof(s_in);
+ s_in.sin_family = AF_INET;
+
+ for (; hlen > sizeof(struct ip); --hlen, ++cp) {
switch (*cp) {
case IPOPT_EOL:
hlen = 0;
@@ -1100,11 +1118,6 @@ pr_pack(u_char *buf, int cc, struct msghdr *mhdr)
cp = cp + (cp[IPOPT_OLEN] - 1);
break;
}
- if (!(options & F_FLOOD)) {
- (void)putchar('\n');
- (void)fflush(stdout);
- if (options & F_AUD_RECV)
- write(STDERR_FILENO, "\a", 1);
}
}