File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / bgpd / bgp_regex.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:10 2016 UTC (8 years ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /* AS regular expression routine
    2:    Copyright (C) 1999 Kunihiro Ishiguro
    3: 
    4: This file is part of GNU Zebra.
    5: 
    6: GNU Zebra is free software; you can redistribute it and/or modify it
    7: under the terms of the GNU General Public License as published by the
    8: Free Software Foundation; either version 2, or (at your option) any
    9: later version.
   10: 
   11: GNU Zebra is distributed in the hope that it will be useful, but
   12: WITHOUT ANY WARRANTY; without even the implied warranty of
   13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14: General Public License for more details.
   15: 
   16: You should have received a copy of the GNU General Public License
   17: along with GNU Zebra; see the file COPYING.  If not, write to the Free
   18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   19: 02111-1307, USA.  */
   20: 
   21: #include <zebra.h>
   22: 
   23: #include "log.h"
   24: #include "command.h"
   25: #include "memory.h"
   26: #include "filter.h"
   27: 
   28: #include "bgpd.h"
   29: #include "bgp_aspath.h"
   30: #include "bgp_regex.h"
   31: 
   32: /* Character `_' has special mean.  It represents [,{}() ] and the
   33:    beginning of the line(^) and the end of the line ($).  
   34: 
   35:    (^|[,{}() ]|$) */
   36: 
   37: regex_t *
   38: bgp_regcomp (const char *regstr)
   39: {
   40:   /* Convert _ character to generic regular expression. */
   41:   int i, j;
   42:   int len;
   43:   int magic = 0;
   44:   char *magic_str;
   45:   char magic_regexp[] = "(^|[,{}() ]|$)";
   46:   int ret;
   47:   regex_t *regex;
   48: 
   49:   len = strlen (regstr);
   50:   for (i = 0; i < len; i++)
   51:     if (regstr[i] == '_')
   52:       magic++;
   53: 
   54:   magic_str = XMALLOC (MTYPE_TMP, len + (14 * magic) + 1);
   55:   
   56:   for (i = 0, j = 0; i < len; i++)
   57:     {
   58:       if (regstr[i] == '_')
   59: 	{
   60: 	  memcpy (magic_str + j, magic_regexp, strlen (magic_regexp));
   61: 	  j += strlen (magic_regexp);
   62: 	}
   63:       else
   64: 	magic_str[j++] = regstr[i];
   65:     }
   66:   magic_str[j] = '\0';
   67: 
   68:   regex = XMALLOC (MTYPE_BGP_REGEXP, sizeof (regex_t));
   69: 
   70:   ret = regcomp (regex, magic_str, REG_EXTENDED|REG_NOSUB);
   71: 
   72:   XFREE (MTYPE_TMP, magic_str);
   73: 
   74:   if (ret != 0)
   75:     {
   76:       XFREE (MTYPE_BGP_REGEXP, regex);
   77:       return NULL;
   78:     }
   79: 
   80:   return regex;
   81: }
   82: 
   83: int
   84: bgp_regexec (regex_t *regex, struct aspath *aspath)
   85: {
   86:   return regexec (regex, aspath->str, 0, NULL, 0);
   87: }
   88: 
   89: void
   90: bgp_regex_free (regex_t *regex)
   91: {
   92:   regfree (regex);
   93:   XFREE (MTYPE_BGP_REGEXP, regex);
   94: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>