12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.109 2007-01-29 09:59:42 hannes Exp $ (LBL)"; 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <sys/stat.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <errno.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_FCNTL_H 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <fcntl.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h> 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdarg.h> 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4753f17a9db278d33517d9888dd77848f554522a38JP Abgrallchar * ts_format(register int, register int); 4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a null-terminated filename (or other ascii string). 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If ep is NULL, assume no truncation check is needed. 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return true if truncated. 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfn_print(register const u_char *s, register const u_char *ep) 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int ret; 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char c; 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = 1; /* assume truncated */ 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (ep == NULL || s < ep) { 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *s++; 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (c == '\0') { 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = 0; 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ND_ISASCII(c)) { 6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall c = ND_TOASCII(c); 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('M'); 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('-'); 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ND_ISPRINT(c)) { 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c ^= 0x40; /* DEL to ?, others to alpha */ 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('^'); 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(c); 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(ret); 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a counted filename (or other ascii string). 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If ep is NULL, assume no truncation check is needed. 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return true if truncated. 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfn_printn(register const u_char *s, register u_int n, 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *ep) 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char c; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (n > 0 && (ep == NULL || s < ep)) { 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project n--; 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *s++; 9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ND_ISASCII(c)) { 9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall c = ND_TOASCII(c); 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('M'); 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('-'); 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ND_ISPRINT(c)) { 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c ^= 0x40; /* DEL to ?, others to alpha */ 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('^'); 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(c); 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (n == 0) ? 0 : 1; 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a null-padded filename (or other ascii string). 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If ep is NULL, assume no truncation check is needed. 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return true if truncated. 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfn_printzp(register const u_char *s, register u_int n, 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *ep) 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int ret; 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char c; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = 1; /* assume truncated */ 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (n > 0 && (ep == NULL || s < ep)) { 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project n--; 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *s++; 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (c == '\0') { 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = 0; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ND_ISASCII(c)) { 13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall c = ND_TOASCII(c); 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('M'); 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('-'); 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!ND_ISPRINT(c)) { 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c ^= 0x40; /* DEL to ?, others to alpha */ 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('^'); 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(c); 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (n == 0) ? 0 : ret; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Format the timestamp 14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 14653f17a9db278d33517d9888dd77848f554522a38JP Abgrallchar * 14753f17a9db278d33517d9888dd77848f554522a38JP Abgrallts_format(register int sec, register int usec) 14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall static char buf[sizeof("00:00:00.000000")]; 15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall (void)snprintf(buf, sizeof(buf), "%02d:%02d:%02d.%06u", 15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall sec / 3600, (sec % 3600) / 60, sec % 60, usec); 15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return buf; 15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the timestamp 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectts_print(register const struct timeval *tvp) 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int s; 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tm *tm; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project time_t Time; 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static unsigned b_sec; 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static unsigned b_usec; 16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall int d_usec; 16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall int d_sec; 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (tflag) { 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 0: /* Default */ 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s = (tvp->tv_sec + thiszone) % 86400; 17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (void)printf("%s ", ts_format(s, tvp->tv_usec)); 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: /* No time stamp */ 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: /* Unix timeval style */ 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%u.%06u ", 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (unsigned)tvp->tv_sec, 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (unsigned)tvp->tv_usec); 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 3: /* Microseconds since previous packet */ 18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 5: /* Microseconds since first packet */ 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (b_sec == 0) { 18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* init timestamp for first packet */ 19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall b_usec = tvp->tv_usec; 19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall b_sec = tvp->tv_sec; 19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall d_usec = tvp->tv_usec - b_usec; 19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall d_sec = tvp->tv_sec - b_sec; 19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (d_usec < 0) { 19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall d_usec += 1000000; 19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall d_sec--; 20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (void)printf("%s ", ts_format(d_sec, d_usec)); 20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tflag == 3) { /* set timestamp for last packet */ 20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall b_sec = tvp->tv_sec; 20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall b_usec = tvp->tv_usec; 20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 4: /* Default + Date*/ 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s = (tvp->tv_sec + thiszone) % 86400; 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Time = (tvp->tv_sec + thiszone) - s; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tm = gmtime (&Time); 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!tm) 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Date fail "); 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%04d-%02d-%02d %s ", 21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, 21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ts_format(s, tvp->tv_usec)); 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print a relative number of seconds (e.g. hold time, prune timer) 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in the form 5m1s. This does no truncation, so 32230861 seconds 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is represented as 1y1w1d1h1m1s. 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrelts_print(int secs) 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const char *lengths[] = {"y", "w", "d", "h", "m", "s"}; 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static const int seconds[] = {31536000, 604800, 86400, 3600, 60, 1}; 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char **l = lengths; 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const int *s = seconds; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (secs == 0) { 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("0s"); 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (secs < 0) { 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("-"); 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project secs = -secs; 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (secs > 0) { 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (secs >= *s) { 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%d%s", secs / *s, *l); 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project secs -= (secs / *s) * *s; 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s++; 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project l++; 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is a generic routine for printing unknown data; 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we pass on the linefeed plus indentation string to 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * get a proper output - returns 0 on error 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_unknown_data(const u_char *cp,const char *ident,int len) 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 0) { 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%sDissector error: print_unknown_data called with negative length", 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ident); 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(0); 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (snapend - cp < len) 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = snapend - cp; 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 0) { 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%sDissector error: print_unknown_data called with pointer past end of packet", 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ident); 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(0); 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hex_print(ident,cp,len); 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(1); /* everything is ok */ 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a token value to a string; use "fmt" if not found. 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttok2strbuf(register const struct tok *lp, register const char *fmt, 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int v, char *buf, size_t bufsize) 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (lp != NULL) { 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (lp->s != NULL) { 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (lp->v == v) 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (lp->s); 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++lp; 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fmt == NULL) 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt = "#%d"; 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, bufsize, fmt, v); 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (const char *)buf; 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a token value to a string; use "fmt" if not found. 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttok2str(register const struct tok *lp, register const char *fmt, 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int v) 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[4][128]; 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static int idx = 0; 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *ret; 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = buf[idx]; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idx = (idx+1) & 3; 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tok2strbuf(lp, fmt, v, ret, sizeof(buf[0])); 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a bit token value to a string; use "fmt" if not found. 31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this is useful for parsing bitfields, the output strings are seperated 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * if the s field is positive. 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 32253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char * 32353f17a9db278d33517d9888dd77848f554522a38JP Abgrallbittok2str_internal(register const struct tok *lp, register const char *fmt, 32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall register int v, register int sep) 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[256]; /* our stringbuffer */ 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int buflen=0; 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int rotbit; /* this is the bit we rotate through all bitpositions */ 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int tokval; 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (lp != NULL && lp->s != NULL) { 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tokval=lp->v; /* load our first value */ 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rotbit=1; 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (rotbit != 0) { 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * lets AND the rotating bit with our token value 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and see if we have got a match 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tokval == (v&rotbit)) { 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ok we have found something */ 34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall buflen+=snprintf(buf+buflen, sizeof(buf)-buflen, "%s%s", 34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall lp->s, sep ? ", " : ""); 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rotbit=rotbit<<1; /* no match - lets shift and try again */ 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lp++; 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* user didn't want string seperation - no need to cut off trailing seperators */ 35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!sep) { 35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (buf); 35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (buflen != 0) { /* did we find anything */ 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* yep, set the the trailing zero 2 bytes before to eliminate the last comma & whitespace */ 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buf[buflen-2] = '\0'; 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (buf); 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* bummer - lets print the "unknown" message as advised in the fmt string if we got one */ 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fmt == NULL) 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt = "#%d"; 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), fmt, v); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (buf); 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Convert a bit token value to a string; use "fmt" if not found. 37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this is useful for parsing bitfields, the output strings are not seperated. 37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 37353f17a9db278d33517d9888dd77848f554522a38JP Abgrallchar * 37453f17a9db278d33517d9888dd77848f554522a38JP Abgrallbittok2str_nosep(register const struct tok *lp, register const char *fmt, 37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall register int v) 37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (bittok2str_internal(lp, fmt, v, 0)); 37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Convert a bit token value to a string; use "fmt" if not found. 38253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this is useful for parsing bitfields, the output strings are comma seperated. 38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 38453f17a9db278d33517d9888dd77848f554522a38JP Abgrallchar * 38553f17a9db278d33517d9888dd77848f554522a38JP Abgrallbittok2str(register const struct tok *lp, register const char *fmt, 38653f17a9db278d33517d9888dd77848f554522a38JP Abgrall register int v) 38753f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (bittok2str_internal(lp, fmt, v, 1)); 38953f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a value to a string using an array; the macro 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * tok2strary() in <interface.h> is the public interface to 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this function and ensures that the second argument is 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * correct for bounds-checking. 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttok2strary_internal(register const char **lp, int n, register const char *fmt, 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int v) 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[128]; 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (v >= 0 && v < n && lp[v] != NULL) 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return lp[v]; 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fmt == NULL) 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt = "#%d"; 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), fmt, v); 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (buf); 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a 32-bit netmask to prefixlen if possible 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the function returns the prefix-len; if plen == -1 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * then conversion was not possible; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 41853f17a9db278d33517d9888dd77848f554522a38JP Abgrallmask2plen(u_int32_t mask) 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t bitmasks[33] = { 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0x00000000, 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000, 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000, 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000, 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00, 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int prefix_len = 32; 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* let's see if we can transform the mask into a prefixlen */ 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (prefix_len >= 0) { 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bitmasks[prefix_len] == mask) 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prefix_len--; 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (prefix_len); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6 44353f17a9db278d33517d9888dd77848f554522a38JP Abgrallint 44453f17a9db278d33517d9888dd77848f554522a38JP Abgrallmask62plen(const u_char *mask) 44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_char bitmasks[9] = { 44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 0x00, 44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 0x80, 0xc0, 0xe0, 0xf0, 44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 0xf8, 0xfc, 0xfe, 0xff 45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }; 45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall int byte; 45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall int cidr_len = 0; 45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (byte = 0; byte < 16; byte++) { 45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int bits; 45653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (bits = 0; bits < (sizeof (bitmasks) / sizeof (bitmasks[0])); bits++) { 45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (mask[byte] == bitmasks[bits]) { 45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall cidr_len += bits; 46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 46353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 46453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (mask[byte] != 0xff) 46553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 46653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 46753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (cidr_len); 46853f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 46953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* INET6 */ 47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */ 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecterror(const char *fmt, ...) 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_list ap; 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)fprintf(stderr, "%s: ", program_name); 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_start(ap, fmt); 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)vfprintf(stderr, fmt, ap); 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_end(ap); 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (*fmt) { 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt += strlen(fmt); 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fmt[-1] != '\n') 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)fputc('\n', stderr); 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project exit(1); 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* NOTREACHED */ 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */ 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectwarning(const char *fmt, ...) 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_list ap; 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)fprintf(stderr, "%s: WARNING: ", program_name); 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_start(ap, fmt); 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)vfprintf(stderr, fmt, ap); 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_end(ap); 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (*fmt) { 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fmt += strlen(fmt); 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fmt[-1] != '\n') 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)fputc('\n', stderr); 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copy arg vector into a new buffer, concatenating arguments with spaces. 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar * 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcopy_argv(register char **argv) 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char **p; 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int len = 0; 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *buf; 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *src, *dst; 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = argv; 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (*p == 0) 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (*p) 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len += strlen(*p++) + 1; 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buf = (char *)malloc(len); 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (buf == NULL) 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("copy_argv: malloc"); 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = argv; 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dst = buf; 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((src = *p++) != NULL) { 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((*dst++ = *src++) != '\0') 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ; 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dst[-1] = ' '; 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dst[-1] = '\0'; 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return buf; 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * On Windows, we need to open the file in binary mode, so that 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we get all the bytes specified by the size we get from "fstat()". 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * On UNIX, that's not necessary. O_BINARY is defined on Windows; 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we define it as 0 if it's not defined, so it does nothing. 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef O_BINARY 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define O_BINARY 0 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar * 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectread_infile(char *fname) 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i, fd, cc; 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct stat buf; 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fd = open(fname, O_RDONLY|O_BINARY); 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fd < 0) 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("can't open %s: %s", fname, pcap_strerror(errno)); 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fstat(fd, &buf) < 0) 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("can't stat %s: %s", fname, pcap_strerror(errno)); 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = malloc((u_int)buf.st_size + 1); 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp == NULL) 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1, 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fname, pcap_strerror(errno)); 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cc = read(fd, cp, (u_int)buf.st_size); 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cc < 0) 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("read %s: %s", fname, pcap_strerror(errno)); 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cc != buf.st_size) 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("short read %s (%d != %d)", fname, cc, (int)buf.st_size); 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project close(fd); 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* replace "# comment" with spaces */ 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < cc; i++) { 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp[i] == '#') 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (i < cc && cp[i] != '\n') 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp[i++] = ' '; 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp[cc] = '\0'; 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (cp); 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsafeputs(const char *s, int maxlen) 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 58953f17a9db278d33517d9888dd77848f554522a38JP Abgrall int idx = 0; 59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (*s && idx < maxlen) { 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safeputchar(*s); 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project idx++; 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s++; 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsafeputchar(int c) 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char ch; 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ch = (unsigned char)(c & 0xff); 60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ch < 0x80 && ND_ISPRINT(ch)) 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%c", ch); 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\\0x%02x", ch); 60853f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 60953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 61053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef LBL_ALIGN 61153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Some compilers try to optimize memcpy(), using the alignment constraint 61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * on the argument pointer type. by using this function, we try to avoid the 61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * optimization. 61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 61653f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid 61753f17a9db278d33517d9888dd77848f554522a38JP Abgrallunaligned_memcpy(void *p, const void *q, size_t l) 61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(p, q, l); 62053f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* As with memcpy(), so with memcmp(). */ 62353f17a9db278d33517d9888dd77848f554522a38JP Abgrallint 62453f17a9db278d33517d9888dd77848f554522a38JP Abgrallunaligned_memcmp(const void *p, const void *q, size_t l) 62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 62653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (memcmp(p, q, l)); 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 62853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif 629