util.c revision 39297
1/* 2 * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that: (1) source code distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 */ 21 22#ifndef lint 23static const char rcsid[] = 24 "@(#) $Header: util.c,v 1.58 97/05/09 14:52:17 leres Exp $ (LBL)"; 25#endif 26 27#include <sys/types.h> 28#include <sys/time.h> 29#include <sys/file.h> 30#include <sys/stat.h> 31 32#include <ctype.h> 33#include <errno.h> 34#ifdef HAVE_FCNTL_H 35#include <fcntl.h> 36#endif 37#ifdef HAVE_MALLOC_H 38#include <malloc.h> 39#endif 40#include <pcap.h> 41#include <stdio.h> 42#if __STDC__ 43#include <stdarg.h> 44#else 45#include <varargs.h> 46#endif 47#include <stdlib.h> 48#include <string.h> 49#ifdef TIME_WITH_SYS_TIME 50#include <time.h> 51#endif 52#include <unistd.h> 53 54#include "interface.h" 55 56/* 57 * Print out a filename (or other ascii string). 58 * If ep is NULL, assume no truncation check is needed. 59 * Return true if truncated. 60 */ 61int 62fn_print(register const u_char *s, register const u_char *ep) 63{ 64 register int ret; 65 register u_char c; 66 67 ret = 1; /* assume truncated */ 68 while (ep == NULL || s < ep) { 69 c = *s++; 70 if (c == '\0') { 71 ret = 0; 72 break; 73 } 74 if (!isascii(c)) { 75 c = toascii(c); 76 putchar('M'); 77 putchar('-'); 78 } 79 if (!isprint(c)) { 80 c ^= 0x40; /* DEL to ?, others to alpha */ 81 putchar('^'); 82 } 83 putchar(c); 84 } 85 return(ret); 86} 87 88/* 89 * Print out a counted filename (or other ascii string). 90 * If ep is NULL, assume no truncation check is needed. 91 * Return true if truncated. 92 */ 93int 94fn_printn(register const u_char *s, register u_int n, 95 register const u_char *ep) 96{ 97 register int ret; 98 register u_char c; 99 100 ret = 1; /* assume truncated */ 101 while (ep == NULL || s < ep) { 102 if (n-- <= 0) { 103 ret = 0; 104 break; 105 } 106 c = *s++; 107 if (!isascii(c)) { 108 c = toascii(c); 109 putchar('M'); 110 putchar('-'); 111 } 112 if (!isprint(c)) { 113 c ^= 0x40; /* DEL to ?, others to alpha */ 114 putchar('^'); 115 } 116 putchar(c); 117 } 118 return(ret); 119} 120 121/* 122 * Print the timestamp 123 */ 124void 125ts_print(register const struct timeval *tvp) 126{ 127 register int s; 128 129 if (tflag > 0) { 130 /* Default */ 131 s = (tvp->tv_sec + thiszone) % 86400; 132 (void)printf("%02d:%02d:%02d.%06u ", 133 s / 3600, (s % 3600) / 60, s % 60, (u_int32_t)tvp->tv_usec); 134 } else if (tflag < 0) { 135 /* Unix timeval style */ 136 (void)printf("%u.%06u ", 137 (u_int32_t)tvp->tv_sec, (u_int32_t)tvp->tv_usec); 138 } 139} 140 141/* 142 * Convert a token value to a string; use "fmt" if not found. 143 */ 144const char * 145tok2str(register const struct tok *lp, register const char *fmt, 146 register int v) 147{ 148 static char buf[128]; 149 150 while (lp->s != NULL) { 151 if (lp->v == v) 152 return (lp->s); 153 ++lp; 154 } 155 if (fmt == NULL) 156 fmt = "#%d"; 157 (void)sprintf(buf, fmt, v); 158 return (buf); 159} 160 161 162/* VARARGS */ 163__dead void 164#if __STDC__ 165error(const char *fmt, ...) 166#else 167error(fmt, va_alist) 168 const char *fmt; 169 va_dcl 170#endif 171{ 172 va_list ap; 173 174 (void)fprintf(stderr, "%s: ", program_name); 175#if __STDC__ 176 va_start(ap, fmt); 177#else 178 va_start(ap); 179#endif 180 (void)vfprintf(stderr, fmt, ap); 181 va_end(ap); 182 if (*fmt) { 183 fmt += strlen(fmt); 184 if (fmt[-1] != '\n') 185 (void)fputc('\n', stderr); 186 } 187 exit(1); 188 /* NOTREACHED */ 189} 190 191/* VARARGS */ 192void 193#if __STDC__ 194warning(const char *fmt, ...) 195#else 196warning(fmt, va_alist) 197 const char *fmt; 198 va_dcl 199#endif 200{ 201 va_list ap; 202 203 (void)fprintf(stderr, "%s: WARNING: ", program_name); 204#if __STDC__ 205 va_start(ap, fmt); 206#else 207 va_start(ap); 208#endif 209 (void)vfprintf(stderr, fmt, ap); 210 va_end(ap); 211 if (*fmt) { 212 fmt += strlen(fmt); 213 if (fmt[-1] != '\n') 214 (void)fputc('\n', stderr); 215 } 216} 217 218/* 219 * Copy arg vector into a new buffer, concatenating arguments with spaces. 220 */ 221char * 222copy_argv(register char **argv) 223{ 224 register char **p; 225 register u_int len = 0; 226 char *buf; 227 char *src, *dst; 228 229 p = argv; 230 if (*p == 0) 231 return 0; 232 233 while (*p) 234 len += strlen(*p++) + 1; 235 236 buf = (char *)malloc(len); 237 if (buf == NULL) 238 error("copy_argv: malloc"); 239 240 p = argv; 241 dst = buf; 242 while ((src = *p++) != NULL) { 243 while ((*dst++ = *src++) != '\0') 244 ; 245 dst[-1] = ' '; 246 } 247 dst[-1] = '\0'; 248 249 return buf; 250} 251 252char * 253read_infile(char *fname) 254{ 255 register int fd, cc; 256 register char *cp; 257 struct stat buf; 258 259 fd = open(fname, O_RDONLY); 260 if (fd < 0) 261 error("can't open %s: %s", fname, pcap_strerror(errno)); 262 263 if (fstat(fd, &buf) < 0) 264 error("can't stat %s: %s", fname, pcap_strerror(errno)); 265 266 cp = malloc((u_int)buf.st_size + 1); 267 cc = read(fd, cp, (int)buf.st_size); 268 if (cc < 0) 269 error("read %s: %s", fname, pcap_strerror(errno)); 270 if (cc != buf.st_size) 271 error("short read %s (%d != %d)", fname, cc, (int)buf.st_size); 272 cp[(int)buf.st_size] = '\0'; 273 274 return (cp); 275} 276