/*
* Copyright (c) 2000 Paul Herman
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: utils.c,v 1.23 2002/01/02 21:05:55 pherman Exp $
*/
#include "tcpstat.h"
char str[BUF_SIZ];
int is_ethernetarp_packet(packet_data *p) {
return ( (p->link_type & LINK_ETHERNET) &&
(p->ether.ether_type == ETHERTYPE_ARP)
); /* Requires ethernet.h */
}
int is_ip_packet(packet_data *p) {
return ((p->link_type & LINK_NONE_OTHER) == GENERIC_LINK_IP);
}
#ifdef INET6
int is_ip6_packet(packet_data *p) {
return ((p->link_type & LINK_NONE_OTHER) == GENERIC_LINK_IP6);
}
#endif
unsigned char get_ip_proto(packet_data *p) {
struct ip *ip;
if (is_ip_packet(p)) {
ip = &(p->data.ip.hdr);
return ( ip->ip_p );
}
#ifdef INET6
else if (is_ip6_packet(p)) {
struct ip6_hdr *ip6;
ip6 = &(p->data.ip6.hdr);
return ( ip6->ip6_nxt );
}
#endif
return 0;
}
int is_ip_tcp_packet(packet_data *p) {
return ( get_ip_proto(p) == IPPROTO_TCP );
}
int is_ip_udp_packet(packet_data *p) {
return ( get_ip_proto(p) == IPPROTO_UDP );
}
int is_ip_icmp_packet(packet_data *p) {
return ( get_ip_proto(p) == IPPROTO_ICMP
#ifdef INET6
|| get_ip_proto(p) == IPPROTO_ICMPV6
#endif
);
}
char *my_basename(char *p) {
char *s;
s = p;
if (!*s || strlen(s) < 2) return p;
for (s += strlen(p); s>p && *s != '/'; s--) continue;
return (*s == '/')? s+1 : s;
}
u_char count_1bits(u_int x) {
u_char r = 0;
int i;
for (i=0; i<8*(int)sizeof(x); i++)
if ( (x>>i) & 0x1 ) r++;
return r;
}
char *my_get_port(u_short port, int n_only) {
struct servent *srvent;
if (n_only) {
snprintf(str, BUF_SIZ, "%u", port);
}
else {
srvent = getservbyport(htons(port), NULL);
if (srvent == NULL) snprintf(str, BUF_SIZ, "%u", port);
else snprintf(str, BUF_SIZ, "%s (%u)", srvent->s_name, port);
}
return str;
}
char *my_get_proto(u_short proto, int n_only) {
struct protoent *ip_prot;
if (n_only) {
snprintf(str, BUF_SIZ, "%u", proto);
}
else {
ip_prot = getprotobynumber(proto);
if (ip_prot == NULL) snprintf(str, BUF_SIZ, "%u", proto);
else snprintf(str, BUF_SIZ, "%s", ip_prot->p_name);
}
return str;
}
/* XXX: Does this define belong here? */
#define MAX_STRCPY 32768
char *my_safe_strcpy(char **dst, const char *src) {
size_t n;
n = strlen(src)*sizeof(char);
if (n<1) n = 1;
if (n>MAX_STRCPY) n = MAX_STRCPY;
if (*dst != NULL) free(*dst);
*dst = (char *)malloc(n+1);
if (*dst == NULL) {
perror("my_safe_strcpy()");
exit(-1);
}
**dst = '\0';
return strncat(*dst, src, n);
}
void my_alarm(Double seconds) {
#ifdef HAVE_UALARM
ualarm( (u_int) (seconds*1e6 + 0.5), 0);
#else
alarm( (u_int) (seconds));
#endif /* HAVE_UALARM */
}
#ifndef HAVE_INET_NTOP
char *inet_ntop(int af, void *src, char *dst, int n) {
int i;
unsigned char *ui, u;
char c[2];
if (dst == NULL || n<1) return NULL;
dst[0] = '\0';
switch (af) {
case AF_INET: /* Broken, use inet_ntoa() instead */
break;
# ifdef INET6
case AF_INET6:
c[1] = 0;
for (i=0, ui = (unsigned char *)src; i<16; i++, ui++) {
u = (*ui >> 4) & 0x0f;
c[0] = (u < 0x0A)? u + '0' : (u-0x0A) + 'A';
strcat(dst, c);
u = *ui & 0x0f;
c[0] = (u < 0x0A)? u + '0' : (u-0x0A) + 'A';
strcat(dst, c);
}
break;
# endif /* INET6 */
default:
break;
}
return dst;
}
#endif /* HAVE_INET_NTOP */
syntax highlighted by Code2HTML, v. 0.9.1