/*- * Copyright (c) 2001-2005 Christian S.J. Peron * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* XXX include tcpdump here too */ #include struct multparams { char *baseptr; char *newptr; int mult; }; #define BYTESPERKILO 1024 #define BYTESPERMEG 1048576 #define BYTESPERGIG 1073741824 static int apply_multiplier(struct multparams *mp) { char *rem; u_long val; if (mp->mult > 1) *mp->newptr = 0; val = strtoul(mp->baseptr, &rem, 0); if (*rem || rem == mp->baseptr || !val) errx(1, "invalid count specification"); val *= mp->mult; return (val); } static void reverse(char *s) { int i, j, c; for (i = 0, j = strlen(s) - 1; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } static void swebitoa(unsigned int n, char *s) { unsigned int i; i = 0; do { s[i++] = n % 10 + '0'; } while ((n /= 10) > 0); s[i] = '\0'; reverse(s); } void dump_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) { struct dump_info *info; extern pcap_t *pd; char name[255]; static int cnt; info = (struct dump_info *)user; if (opts.Cflag && ftell((FILE *)info->p) > opts.Cflag) { pcap_dump_close(info->p); strcpy(name, info->WFileName); swebitoa(cnt, name + strlen(info->WFileName)); cnt++; info->p = pcap_dump_open(info->pd, name); if (info->p == NULL) err(1, "%s", pcap_geterr(pd)); } pcap_dump((caddr_t)info->p, h, sp); } u_long parseCflag(char *Cflagstr) { struct multparams mp; u_long s; mp.baseptr = Cflagstr; while (*Cflagstr) Cflagstr++; s = Cflagstr - mp.baseptr; mp.newptr = Cflagstr; switch (*--mp.newptr) { case 'k': case 'K': mp.mult = BYTESPERKILO; break; case 'm': case 'M': mp.mult = BYTESPERMEG; break; case 'g': case 'G': mp.mult = BYTESPERGIG; break; default: mp.mult = 1; } return (apply_multiplier(&mp)); }