| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 | /* $Id$ *//* *   Copyright (c) 2001-2010 Aaron Turner <aturner at synfin dot net> *   Copyright (c) 2013-2017 Fred Klassen <tcpreplay at appneta dot com> - AppNeta * *   The Tcpreplay Suite of tools is free software: you can redistribute it  *   and/or modify it under the terms of the GNU General Public License as  *   published by the Free Software Foundation, either version 3 of the  *   License, or with the authors permission any later version. * *   The Tcpreplay Suite is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with the Tcpreplay Suite.  If not, see <http://www.gnu.org/licenses/>. *//* * A generic method to parse a list of integers which are * delimited by commas and dashes to indicate individual * numbers and ranges * Provides both a way to process the list and determine * if an integer exists in the list. */#include "config.h"#include "defines.h"#include "common.h"#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <regex.h>#include <errno.h>/** * Creates a new tcpr_list entry.  Malloc's memory. */tcpr_list_t *new_list(){    tcpr_list_t *newlist;    newlist = (tcpr_list_t *)safe_malloc(sizeof(tcpr_list_t));    return (newlist);}/** * Processes a string (ourstr) containing the list in human readable * format and places the data in **list and finally returns 1 for  * success, 0 for fail. */intparse_list(tcpr_list_t ** listdata, char *ourstr){    tcpr_list_t *listcur, *list_ptr;    char *this = NULL;    char *first, *second;    int rcode;    regex_t preg;    char ebuf[EBUF_SIZE];    char regex[] = "^[0-9]+(-[0-9]+)?$";    char *token = NULL;    u_int i;    /* compile the regex first */    if ((rcode = regcomp(&preg, regex, REG_EXTENDED | REG_NOSUB)) != 0) {        regerror(rcode, &preg, ebuf, sizeof(ebuf));        errx(-1, "Unable to compile regex (%s): %s", regex, ebuf);    }    /* first iteration */    this = strtok_r(ourstr, ",", &token);    first = this;    second = NULL;    /* regex test */    if (regexec(&preg, this, 0, NULL, 0) != 0) {        warnx("Unable to parse: %s", this);        return 0;    }    *listdata = new_list();    list_ptr = *listdata;    listcur = list_ptr;    for (i = 0; i < strlen(this); i++) {        if (this[i] == '-') {            this[i] = '\0';            second = &this[i + 1];        }    }    list_ptr->min = strtoull(first, NULL, 0);    if (second != NULL) {        list_ptr->max = strtoull(second, NULL, 0);    }    else {        list_ptr->max = list_ptr->min;    }    while (1) {        this = strtok_r(NULL, ",", &token);        if (this == NULL)            break;        first = this;        second = NULL;        /* regex test */        if (regexec(&preg, this, 0, NULL, 0) != 0) {            warnx("Unable to parse: %s", this);            return 0;        }        listcur->next = new_list();        listcur = listcur->next;        for (i = 0; i < strlen(this); i++) {            if (this[i] == '-') {                this[i] = '\0';                second = &this[i + 1];            }        }        listcur->min = strtoull(first, NULL, 0);        if (second != NULL) {            listcur->max = strtoull(second, NULL, 0);        }        else {            listcur->max = listcur->min;        }    }    return 1;}/** * Checks to see if the given integer exists in the LIST. */tcpr_dir_tcheck_list(tcpr_list_t * list, COUNTER value){    tcpr_list_t *current;    current = list;    do {        if ((current->min != 0) && (current->max != 0)) {            if ((value >= current->min) && (value <= current->max))                return TCPR_DIR_C2S;        }        else if (current->min == 0) {            if (value <= current->max)                return TCPR_DIR_C2S;        }        else if (current->max == 0) {            if (value >= current->min)                return TCPR_DIR_C2S;        }        if (current->next != NULL) {            current = current->next;        }        else {            current = NULL;        }    } while (current != NULL);    return TCPR_DIR_S2C;}/** * Free's all the memory associated with the given LIST */voidfree_list(tcpr_list_t * list){    /* recursively go down the list */    if (list->next != NULL)        free_list(list->next);    safe_free(list);}
 |