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