exterminate u_intXXX.

fix ping6 buglet (memset is too short), minor sync between ping and ping6
This commit is contained in:
Denis Vlasenko
2007-01-22 14:04:27 +00:00
parent 85629f08bc
commit 35d4da0fb5
6 changed files with 73 additions and 67 deletions

View File

@@ -1,13 +1,15 @@
/* vi: set sw=4 ts=4: */
/*
* $Id: ping.c,v 1.56 2004/03/15 08:28:48 andersen Exp $
* Mini ping implementation for busybox
*
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
*
* Adapted from the ping in netkit-base 0.10:
* Copyright (c) 1989 The Regents of the University of California.
* Derived from software contributed to Berkeley by Mike Muuss.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
@@ -74,7 +76,7 @@ static void ping(const char *host)
pingsock = create_icmp_socket();
memset(&pingaddr, 0, sizeof(struct sockaddr_in));
memset(&pingaddr, 0, sizeof(pingaddr));
pingaddr.sin_family = AF_INET;
h = xgethostbyname(host);
@@ -202,7 +204,7 @@ static void sendping(int junk)
pkt->icmp_cksum = 0;
pkt->icmp_seq = htons(ntransmitted); /* don't ++ here, it can be a macro */
pkt->icmp_id = myid;
CLR(ntohs(pkt->icmp_seq) % MAX_DUP_CHK);
CLR((uint16_t)ntransmitted % MAX_DUP_CHK);
ntransmitted++;
gettimeofday((struct timeval *) &pkt->icmp_dun, NULL);
@@ -230,20 +232,20 @@ static void sendping(int junk)
static char *icmp_type_name(int id)
{
switch (id) {
case ICMP_ECHOREPLY: return "Echo Reply";
case ICMP_DEST_UNREACH: return "Destination Unreachable";
case ICMP_SOURCE_QUENCH: return "Source Quench";
case ICMP_REDIRECT: return "Redirect (change route)";
case ICMP_ECHO: return "Echo Request";
case ICMP_TIME_EXCEEDED: return "Time Exceeded";
case ICMP_PARAMETERPROB: return "Parameter Problem";
case ICMP_TIMESTAMP: return "Timestamp Request";
case ICMP_TIMESTAMPREPLY: return "Timestamp Reply";
case ICMP_INFO_REQUEST: return "Information Request";
case ICMP_INFO_REPLY: return "Information Reply";
case ICMP_ADDRESS: return "Address Mask Request";
case ICMP_ADDRESSREPLY: return "Address Mask Reply";
default: return "unknown ICMP type";
case ICMP_ECHOREPLY: return "Echo Reply";
case ICMP_DEST_UNREACH: return "Destination Unreachable";
case ICMP_SOURCE_QUENCH: return "Source Quench";
case ICMP_REDIRECT: return "Redirect (change route)";
case ICMP_ECHO: return "Echo Request";
case ICMP_TIME_EXCEEDED: return "Time Exceeded";
case ICMP_PARAMETERPROB: return "Parameter Problem";
case ICMP_TIMESTAMP: return "Timestamp Request";
case ICMP_TIMESTAMPREPLY: return "Timestamp Reply";
case ICMP_INFO_REQUEST: return "Information Request";
case ICMP_INFO_REPLY: return "Information Reply";
case ICMP_ADDRESS: return "Address Mask Request";
case ICMP_ADDRESSREPLY: return "Address Mask Reply";
default: return "unknown ICMP type";
}
}
@@ -270,7 +272,7 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from)
return; /* not our ping */
if (icmppkt->icmp_type == ICMP_ECHOREPLY) {
u_int16_t recv_seq = ntohs(icmppkt->icmp_seq);
uint16_t recv_seq = ntohs(icmppkt->icmp_seq);
++nreceived;
tp = (struct timeval *) icmppkt->icmp_data;
@@ -307,11 +309,12 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from)
if (dupflag)
printf(" (DUP!)");
puts("");
} else
} else {
if (icmppkt->icmp_type != ICMP_ECHO)
bb_error_msg("warning: got ICMP %d (%s)",
icmppkt->icmp_type,
icmp_type_name(icmppkt->icmp_type));
}
fflush(stdout);
}
@@ -326,7 +329,7 @@ static void ping(const char *host)
xbind(pingsock, (struct sockaddr*)&sourceaddr, sizeof(sourceaddr));
}
memset(&pingaddr, 0, sizeof(struct sockaddr_in));
memset(&pingaddr, 0, sizeof(pingaddr));
pingaddr.sin_family = AF_INET;
hostent = xgethostbyname(host);
@@ -339,7 +342,7 @@ static void ping(const char *host)
setsockopt_broadcast(pingsock);
/* set recv buf for broadcast pings */
sockopt = 48 * 1024;
sockopt = 48 * 1024; /* explain why 48k? */
setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt,
sizeof(sockopt));