123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /* $Id: utils.c 767 2004-10-06 12:48:49Z aturner $ */
- /*
- * Copyright (c) 2001-2004 Aaron Turner, Matt Bing.
- * 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.
- * 3. Neither the names of the copyright owners nor the names of its
- * contributors may be used to endorse or promote products derived from * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``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 AUTHORS OR COPYRIGHT HOLDERS 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.
- */
- #include <sys/types.h>
- #include <regex.h>
- #include "config.h"
- #include "tcpreplay.h"
- #include "utils.h"
- #include "err.h"
- extern int maxpacket;
- extern struct options options;
- int
- read_hexstring(char *l2string, char *hex, int hexlen)
- {
- int numbytes = 0;
- unsigned int value;
- char *l2byte;
- u_char databyte;
- char *token = NULL;
- if (hexlen <= 0)
- errx(1, "Hex buffer must be > 0");
- memset(hex, '\0', hexlen);
- /* data is hex, comma seperated, byte by byte */
- /* get the first byte */
- l2byte = strtok_r(l2string, ",", &token);
- sscanf(l2byte, "%x", &value);
- if (value > 0xff)
- errx(1, "Invalid hex byte passed to -2: %s", l2byte);
- databyte = (u_char) value;
- memcpy(&hex[numbytes], &databyte, 1);
- /* get remaining bytes */
- while ((l2byte = strtok_r(NULL, ",", &token)) != NULL) {
- numbytes++;
- if (numbytes + 1 > hexlen) {
- warnx("Hex buffer too small for data- skipping data");
- return (++numbytes);
- }
- sscanf(l2byte, "%x", &value);
- if (value > 0xff)
- errx(1, "Invalid hex byte passed to -2: %s", l2byte);
- databyte = (u_char) value;
- memcpy(&hex[numbytes], &databyte, 1);
- }
- numbytes++;
- dbg(1, "Read %d bytes of layer 2 data", numbytes);
- return (numbytes);
- }
- /* whorishly appropriated from fragroute-1.2 */
- int
- argv_create(char *p, int argc, char *argv[])
- {
- int i;
- for (i = 0; i < argc - 1; i++) {
- while (*p != '\0' && isspace((int)*p))
- *p++ = '\0';
- if (*p == '\0')
- break;
- argv[i] = p;
- while (*p != '\0' && !isspace((int)*p))
- p++;
- }
- p[0] = '\0';
- argv[i] = NULL;
- return (i);
- }
- /*
- * converts a string representation of a MAC address, based on
- * non-portable ether_aton()
- */
- void
- mac2hex(const char *mac, char *dst, int len)
- {
- int i;
- long l;
- char *pp;
- if (len < 6)
- return;
- while (isspace(*mac))
- mac++;
- /* expect 6 hex octets separated by ':' or space/NUL if last octet */
- for (i = 0; i < 6; i++) {
- l = strtol(mac, &pp, 16);
- if (pp == mac || l > 0xFF || l < 0)
- return;
- if (!(*pp == ':' || (i == 5 && (isspace(*pp) || *pp == '\0'))))
- return;
- dst[i] = (u_char) l;
- mac = pp + 1;
- }
- }
- /*
- * returns a pointer to the layer 4 header which is just beyond the IP header
- */
- void *
- get_layer4(ip_hdr_t * ip_hdr)
- {
- void *ptr;
- ptr = (u_int32_t *) ip_hdr + ip_hdr->ip_hl;
- return ((void *)ptr);
- }
|