cnping

Minimal Graphical Ping Tool
git clone https://git.sinitax.com/cnlohr/cnping
Log | Files | Refs | Submodules | README | LICENSE | sfeed.txt

commit 1a130db732387503360a9280f4cfb02769735d68
parent 5c0dd3494dd18880648a578741692df9d3c809d3
Author: CNLohr <lohr85@gmail.com>
Date:   Sun, 22 Sep 2019 22:00:58 -0400

Merge pull request #56 from Michael137/master

Add FreeBSD support for cnping
Diffstat:
Mcnping.c | 4++++
Mping.c | 27++++++++++++++++++++++++---
2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/cnping.c b/cnping.c @@ -11,6 +11,10 @@ #endif #include <windows.h> #else + #ifdef __FreeBSD__ + #include <sys/types.h> + #include <netinet/in.h> + #endif #include <sys/socket.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> diff --git a/ping.c b/ping.c @@ -27,11 +27,14 @@ #include <ws2tcpip.h> #include <stdint.h> #else + #ifdef __FreeBSD__ + #include <netinet/in.h> + #endif #include <unistd.h> #include <sys/socket.h> #include <resolv.h> #include <netdb.h> - #ifdef __APPLE__ + #if defined(__APPLE__) || defined(__FreeBSD__) #ifndef SOL_IP #define SOL_IP IPPROTO_IP #endif @@ -69,8 +72,13 @@ int precise_ping; struct packet { +#ifdef __FreeBSD__ + struct icmp hdr; + unsigned char msg[PACKETSIZE-sizeof(struct icmp)]; +#else struct icmphdr hdr; unsigned char msg[PACKETSIZE-sizeof(struct icmphdr)]; +#endif }; int sd; @@ -131,8 +139,14 @@ void listener() if( buf[9] != 1 ) continue; //ICMP if( addr.sin_addr.s_addr != psaddr.sin_addr.s_addr ) continue; + // sizeof(packet.hdr) + 20 +#ifdef __FreeBSD__ + int offset = 48; +#else + int offset = 28; +#endif if ( bytes > 0 ) - display(buf + 28, bytes - 28 ); + display(buf + offset, bytes - offset ); else { ERRM("Error: recvfrom failed"); @@ -166,12 +180,19 @@ void ping(struct sockaddr_in *addr ) { int rsize = load_ping_packet( pckt.msg, sizeof( pckt.msg ) ); memset( &pckt.hdr, 0, sizeof( pckt.hdr ) ); //This needs to be here, but I don't know why, since I think the struct is fully populated. - +#ifdef __FreeBSD__ + pckt.hdr.icmp_code = 0; + pckt.hdr.icmp_type = ICMP_ECHO; + pckt.hdr.icmp_id = pid; + pckt.hdr.icmp_seq = cnt++; + pckt.hdr.icmp_cksum = checksum((const unsigned char *)&pckt, sizeof( pckt.hdr ) + rsize ); +#else pckt.hdr.code = 0; pckt.hdr.type = ICMP_ECHO; pckt.hdr.un.echo.id = pid; pckt.hdr.un.echo.sequence = cnt++; pckt.hdr.checksum = checksum((const unsigned char *)&pckt, sizeof( pckt.hdr ) + rsize ); +#endif int sr = sendto(sd, (char*)&pckt, sizeof( pckt.hdr ) + rsize , 0, (struct sockaddr*)addr, sizeof(*addr));