1/*	$KAME: misc.c,v 1.23 2001/08/16 14:37:29 itojun Exp $	*/
2
3/*
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include "config.h"
33
34#include <sys/types.h>
35#include <sys/param.h>
36#include <sys/stat.h>
37#include <sys/time.h>
38
39#include <stdlib.h>
40#include <stdio.h>
41#include <string.h>
42#include <errno.h>
43#include <syslog.h>
44#include <ctype.h>
45
46#include "var.h"
47#include "misc.h"
48#include "debug.h"
49
50#if 0
51static int bindump (void *, size_t);
52
53static int
54bindump(buf0, len)
55        void *buf0;
56        size_t len;
57{
58	unsigned char *buf = (unsigned char *)buf0;
59	size_t i;
60
61	for (i = 0; i < len; i++) {
62		if ((buf[i] & 0x80) || !isprint(buf[i]))
63			printf("\\x%x", buf[i]);
64		else
65			printf("%c", buf[i]);
66	}
67	printf("\n");
68
69	return 0;
70}
71#endif
72
73int
74hexdump(buf0, len)
75	void *buf0;
76	size_t len;
77{
78	caddr_t buf = (caddr_t)buf0;
79	size_t i;
80
81	for (i = 0; i < len; i++) {
82		if (i != 0 && i % 32 == 0)
83			printf("\n");
84		if (i % 4 == 0)
85			printf(" ");
86		printf("%02x", (unsigned char)buf[i]);
87	}
88	printf("\n");
89
90	return 0;
91}
92
93char *
94bit2str(n, bl)
95	int n, bl;
96{
97#define MAXBITLEN 128
98	static char b[MAXBITLEN + 1];
99	int i;
100
101	if (bl > MAXBITLEN)
102		return "Failed to convert.";	/* NG */
103	memset(b, '0', bl);
104	b[bl] = '\0';
105
106	for (i = 0; i < bl; i++) {
107		if (n & (1 << i))
108			b[bl - 1 - i] = '1';
109	}
110
111	return b;
112}
113
114const char *
115debug_location(file, line, func)
116	const char *file;
117	int line;
118	const char *func;
119{
120	static char buf[1024];
121	const char *p;
122
123	/* truncate pathname */
124	p = strrchr(file, '/');
125	if (p)
126		p++;
127	else
128		p = file;
129
130	if (func)
131		snprintf(buf, sizeof(buf), "%s:%d:%s()", p, line, func);
132	else
133		snprintf(buf, sizeof(buf), "%s:%d", p, line);
134
135	return buf;
136}
137
138/*
139 * get file size.
140 * -1: error occured.
141 */
142int
143getfsize(path)
144	char *path;
145{
146        struct stat st;
147
148        if (stat(path, &st) != 0)
149                return -1;
150        else
151                return st.st_size;
152}
153
154/*
155 * calculate the difference between two times.
156 * t1: start
157 * t2: end
158 */
159double
160timedelta(t1, t2)
161	struct timeval *t1, *t2;
162{
163	if (t2->tv_usec >= t1->tv_usec)
164		return t2->tv_sec - t1->tv_sec +
165			(double)(t2->tv_usec - t1->tv_usec) / 1000000;
166
167	return t2->tv_sec - t1->tv_sec - 1 +
168		(double)(1000000 + t2->tv_usec - t1->tv_usec) / 1000000;
169}
170
171/*
172 * Returns a printable string from (possibly) binary data ;
173 * concatenates all unprintable chars to one space.
174 * XXX Maybe the printable chars range is too large...
175 */
176char*
177binsanitize(binstr, n)
178	char *binstr;
179	size_t n;
180{
181	int p,q;
182	for (p = 0, q = 0; p < n; p++) {
183		if (isgraph((int)binstr[p])) {
184			binstr[q++] = binstr[p];
185		} else {
186			if (q && binstr[q - 1] != ' ')
187				binstr[q++] = ' ';
188		}
189	}
190	binstr[q++] = '\0';
191	return binstr;
192}
193