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_ =
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.95.2.6 2006/02/08 01:40:09 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
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a null-terminated filename (or other ascii string).
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If ep is NULL, assume no truncation check is needed.
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return true if truncated.
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfn_print(register const u_char *s, register const u_char *ep)
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int ret;
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char c;
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ret = 1;			/* assume truncated */
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (ep == NULL || s < ep) {
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c = *s++;
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (c == '\0') {
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ret = 0;
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isascii(c)) {
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			c = toascii(c);
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('M');
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('-');
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isprint(c)) {
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			c ^= 0x40;	/* DEL to ?, others to alpha */
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('^');
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putchar(c);
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return(ret);
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a counted filename (or other ascii string).
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If ep is NULL, assume no truncation check is needed.
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return true if truncated.
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfn_printn(register const u_char *s, register u_int n,
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  register const u_char *ep)
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char c;
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (n > 0 && (ep == NULL || s < ep)) {
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		n--;
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c = *s++;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isascii(c)) {
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			c = toascii(c);
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('M');
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('-');
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isprint(c)) {
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			c ^= 0x40;	/* DEL to ?, others to alpha */
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('^');
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putchar(c);
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (n == 0) ? 0 : 1;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a null-padded filename (or other ascii string).
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If ep is NULL, assume no truncation check is needed.
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return true if truncated.
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfn_printzp(register const u_char *s, register u_int n,
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  register const u_char *ep)
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int ret;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_char c;
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ret = 1;			/* assume truncated */
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (n > 0 && (ep == NULL || s < ep)) {
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		n--;
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c = *s++;
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (c == '\0') {
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ret = 0;
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isascii(c)) {
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			c = toascii(c);
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('M');
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('-');
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isprint(c)) {
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			c ^= 0x40;	/* DEL to ?, others to alpha */
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('^');
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putchar(c);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (n == 0) ? 0 : ret;
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the timestamp
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectts_print(register const struct timeval *tvp)
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int s;
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct tm *tm;
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	time_t Time;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static unsigned b_sec;
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static unsigned b_usec;
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (tflag) {
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0: /* Default */
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = (tvp->tv_sec + thiszone) % 86400;
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%02d:%02d:%02d.%06u ",
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     s / 3600, (s % 3600) / 60, s % 60,
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     (unsigned)tvp->tv_usec);
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1: /* No time stamp */
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2: /* Unix timeval style */
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%u.%06u ",
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     (unsigned)tvp->tv_sec,
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     (unsigned)tvp->tv_usec);
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3: /* Microseconds since previous packet */
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (b_sec == 0) {
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("000000 ");
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int d_usec = tvp->tv_usec - b_usec;
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int d_sec = tvp->tv_sec - b_sec;
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (d_usec < 0) {
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				d_usec += 1000000;
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				d_sec--;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (d_sec)
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("%d. ", d_sec);
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%06d ", d_usec);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		b_sec = tvp->tv_sec;
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		b_usec = tvp->tv_usec;
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4: /* Default + Date*/
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = (tvp->tv_sec + thiszone) % 86400;
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		Time = (tvp->tv_sec + thiszone) - s;
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		tm = gmtime (&Time);
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!tm)
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("Date fail  ");
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%04d-%02d-%02d ",
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday);
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%02d:%02d:%02d.%06u ",
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			   s / 3600, (s % 3600) / 60, s % 60, (unsigned)tvp->tv_usec);
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print a relative number of seconds (e.g. hold time, prune timer)
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in the form 5m1s.  This does no truncation, so 32230861 seconds
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is represented as 1y1w1d1h1m1s.
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrelts_print(int secs)
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *lengths[] = {"y", "w", "d", "h", "m", "s"};
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const int seconds[] = {31536000, 604800, 86400, 3600, 60, 1};
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char **l = lengths;
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const int *s = seconds;
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (secs == 0) {
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("0s");
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (secs < 0) {
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("-");
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		secs = -secs;
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (secs > 0) {
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (secs >= *s) {
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%d%s", secs / *s, *l);
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			secs -= (secs / *s) * *s;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s++;
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		l++;
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  this is a generic routine for printing unknown data;
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  we pass on the linefeed plus indentation string to
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *  get a proper output - returns 0 on error
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_unknown_data(const u_char *cp,const char *ident,int len)
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (len < 0) {
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%sDissector error: print_unknown_data called with negative length",
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ident);
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(0);
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - cp < len)
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = snapend - cp;
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (len < 0) {
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%sDissector error: print_unknown_data called with pointer past end of packet",
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    ident);
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(0);
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        hex_print(ident,cp,len);
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return(1); /* everything is ok */
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a token value to a string; use "fmt" if not found.
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char *
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttok2strbuf(register const struct tok *lp, register const char *fmt,
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   register int v, char *buf, size_t bufsize)
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (lp != NULL) {
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while (lp->s != NULL) {
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (lp->v == v)
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (lp->s);
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++lp;
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (fmt == NULL)
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt = "#%d";
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)snprintf(buf, bufsize, fmt, v);
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (const char *)buf;
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a token value to a string; use "fmt" if not found.
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char *
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttok2str(register const struct tok *lp, register const char *fmt,
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int v)
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static char buf[4][128];
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static int idx = 0;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *ret;
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ret = buf[idx];
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	idx = (idx+1) & 3;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return tok2strbuf(lp, fmt, v, ret, sizeof(buf[0]));
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a bit token value to a string; use "fmt" if not found.
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is useful for parsing bitfields, the output strings are comma seperated
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar *
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbittok2str(register const struct tok *lp, register const char *fmt,
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   register int v)
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        static char buf[256]; /* our stringbuffer */
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        int buflen=0;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        register int rotbit; /* this is the bit we rotate through all bitpositions */
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        register int tokval;
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (lp->s != NULL && lp != NULL) {
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tokval=lp->v;   /* load our first value */
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            rotbit=1;
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            while (rotbit != 0) {
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /*
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * lets AND the rotating bit with our token value
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * and see if we have got a match
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 */
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (tokval == (v&rotbit)) {
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    /* ok we have found something */
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    buflen+=snprintf(buf+buflen, sizeof(buf)-buflen, "%s, ",lp->s);
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                rotbit=rotbit<<1; /* no match - lets shift and try again */
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            lp++;
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (buflen != 0) { /* did we find anything */
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* yep, set the the trailing zero 2 bytes before to eliminate the last comma & whitespace */
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            buf[buflen-2] = '\0';
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (buf);
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        else {
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* bummer - lets print the "unknown" message as advised in the fmt string if we got one */
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (fmt == NULL)
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt = "#%d";
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            (void)snprintf(buf, sizeof(buf), fmt, v);
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (buf);
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a value to a string using an array; the macro
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * tok2strary() in <interface.h> is the public interface to
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this function and ensures that the second argument is
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * correct for bounds-checking.
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char *
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttok2strary_internal(register const char **lp, int n, register const char *fmt,
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int v)
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static char buf[128];
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v >= 0 && v < n && lp[v] != NULL)
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return lp[v];
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (fmt == NULL)
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt = "#%d";
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)snprintf(buf, sizeof(buf), fmt, v);
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (buf);
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert a 32-bit netmask to prefixlen if possible
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the function returns the prefix-len; if plen == -1
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * then conversion was not possible;
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmask2plen (u_int32_t mask)
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t bitmasks[33] = {
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0x00000000,
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0x80000000, 0xc0000000, 0xe0000000, 0xf0000000,
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xf8000000, 0xfc000000, 0xfe000000, 0xff000000,
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xff800000, 0xffc00000, 0xffe00000, 0xfff00000,
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000,
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000,
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00,
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0,
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int prefix_len = 32;
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* let's see if we can transform the mask into a prefixlen */
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (prefix_len >= 0) {
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bitmasks[prefix_len] == mask)
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		prefix_len--;
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (prefix_len);
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecterror(const char *fmt, ...)
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_list ap;
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s: ", program_name);
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_start(ap, fmt);
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)vfprintf(stderr, fmt, ap);
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_end(ap);
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*fmt) {
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt += strlen(fmt);
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fmt[-1] != '\n')
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fputc('\n', stderr);
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(1);
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* NOTREACHED */
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectwarning(const char *fmt, ...)
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_list ap;
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s: WARNING: ", program_name);
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_start(ap, fmt);
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)vfprintf(stderr, fmt, ap);
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_end(ap);
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*fmt) {
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt += strlen(fmt);
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fmt[-1] != '\n')
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fputc('\n', stderr);
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copy arg vector into a new buffer, concatenating arguments with spaces.
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar *
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcopy_argv(register char **argv)
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register char **p;
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int len = 0;
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *buf;
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *src, *dst;
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = argv;
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*p == 0)
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return 0;
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (*p)
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len += strlen(*p++) + 1;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	buf = (char *)malloc(len);
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (buf == NULL)
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("copy_argv: malloc");
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = argv;
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dst = buf;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while ((src = *p++) != NULL) {
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while ((*dst++ = *src++) != '\0')
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dst[-1] = ' ';
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dst[-1] = '\0';
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return buf;
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * On Windows, we need to open the file in binary mode, so that
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we get all the bytes specified by the size we get from "fstat()".
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * On UNIX, that's not necessary.  O_BINARY is defined on Windows;
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we define it as 0 if it's not defined, so it does nothing.
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef O_BINARY
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define O_BINARY	0
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar *
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectread_infile(char *fname)
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int i, fd, cc;
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register char *cp;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct stat buf;
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fd = open(fname, O_RDONLY|O_BINARY);
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (fd < 0)
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("can't open %s: %s", fname, pcap_strerror(errno));
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (fstat(fd, &buf) < 0)
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("can't stat %s: %s", fname, pcap_strerror(errno));
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = malloc((u_int)buf.st_size + 1);
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cp == NULL)
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1,
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fname, pcap_strerror(errno));
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cc = read(fd, cp, (u_int)buf.st_size);
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cc < 0)
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("read %s: %s", fname, pcap_strerror(errno));
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cc != buf.st_size)
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("short read %s (%d != %d)", fname, cc, (int)buf.st_size);
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	close(fd);
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* replace "# comment" with spaces */
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < cc; i++) {
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (cp[i] == '#')
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (i < cc && cp[i] != '\n')
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cp[i++] = ' ';
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp[cc] = '\0';
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (cp);
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsafeputs(const char *s, int maxlen)
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int idx = 0;
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (*s && idx < maxlen) {
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		safeputchar(*s);
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                idx++;
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s++;
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsafeputchar(int c)
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned char ch;
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ch = (unsigned char)(c & 0xff);
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ch < 0x80 && isprint(ch))
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%c", ch);
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\\%03o", ch);
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
531