Annotation of embedaddon/ipsec-tools/src/libipsec/policy_parse.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /* A Bison parser, made by GNU Bison 2.4.1.  */
                      3: 
                      4: /* Skeleton implementation for Bison's Yacc-like parsers in C
                      5:    
                      6:       Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
                      7:    Free Software Foundation, Inc.
                      8:    
                      9:    This program is free software: you can redistribute it and/or modify
                     10:    it under the terms of the GNU General Public License as published by
                     11:    the Free Software Foundation, either version 3 of the License, or
                     12:    (at your option) any later version.
                     13:    
                     14:    This program is distributed in the hope that it will be useful,
                     15:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     16:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     17:    GNU General Public License for more details.
                     18:    
                     19:    You should have received a copy of the GNU General Public License
                     20:    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
                     21: 
                     22: /* As a special exception, you may create a larger work that contains
                     23:    part or all of the Bison parser skeleton and distribute that work
                     24:    under terms of your choice, so long as that work isn't itself a
                     25:    parser generator using the skeleton or a modified version thereof
                     26:    as a parser skeleton.  Alternatively, if you modify or redistribute
                     27:    the parser skeleton itself, you may (at your option) remove this
                     28:    special exception, which will cause the skeleton and the resulting
                     29:    Bison output files to be licensed under the GNU General Public
                     30:    License without this special exception.
                     31:    
                     32:    This special exception was added by the Free Software Foundation in
                     33:    version 2.2 of Bison.  */
                     34: 
                     35: /* C LALR(1) parser skeleton written by Richard Stallman, by
                     36:    simplifying the original so-called "semantic" parser.  */
                     37: 
                     38: /* All symbols defined below should begin with yy or YY, to avoid
                     39:    infringing on user name space.  This should be done even for local
                     40:    variables, as they might otherwise be expanded by user macros.
                     41:    There are some unavoidable exceptions within include files to
                     42:    define necessary library symbols; they are noted "INFRINGES ON
                     43:    USER NAME SPACE" below.  */
                     44: 
                     45: /* Identify Bison output.  */
                     46: #define YYBISON 1
                     47: 
                     48: /* Bison version.  */
                     49: #define YYBISON_VERSION "2.4.1"
                     50: 
                     51: /* Skeleton name.  */
                     52: #define YYSKELETON_NAME "yacc.c"
                     53: 
                     54: /* Pure parsers.  */
                     55: #define YYPURE 0
                     56: 
                     57: /* Push parsers.  */
                     58: #define YYPUSH 0
                     59: 
                     60: /* Pull parsers.  */
                     61: #define YYPULL 1
                     62: 
                     63: /* Using locations.  */
                     64: #define YYLSP_NEEDED 0
                     65: 
                     66: /* Substitute the variable and function names.  */
                     67: #define yyparse         __libipsecparse
                     68: #define yylex           __libipseclex
                     69: #define yyerror         __libipsecerror
                     70: #define yylval          __libipseclval
                     71: #define yychar          __libipsecchar
                     72: #define yydebug         __libipsecdebug
                     73: #define yynerrs         __libipsecnerrs
                     74: 
                     75: 
                     76: /* Copy the first part of user declarations.  */
                     77: 
                     78: /* Line 189 of yacc.c  */
                     79: #line 65 "policy_parse.y"
                     80: 
                     81: #ifdef HAVE_CONFIG_H
                     82: #include "config.h"
                     83: #endif
                     84: 
                     85: #include <sys/types.h>
                     86: #include <sys/param.h>
                     87: #include <sys/socket.h>
                     88: 
                     89: #include <netinet/in.h>
                     90: #include PATH_IPSEC_H
                     91: 
                     92: #include <stdlib.h>
                     93: #include <stdio.h>
                     94: #include <string.h>
                     95: #include <netdb.h>
                     96: 
                     97: #include <errno.h>
                     98: 
                     99: #include "config.h"
                    100: 
                    101: #include "ipsec_strerror.h"
                    102: #include "libpfkey.h"
                    103: 
                    104: #ifndef INT32_MAX
                    105: #define INT32_MAX      (0xffffffff)
                    106: #endif
                    107: 
                    108: #ifndef INT32_MIN
                    109: #define INT32_MIN      (-INT32_MAX-1)
                    110: #endif
                    111: 
                    112: #define ATOX(c) \
                    113:   (isdigit(c) ? (c - '0') : (isupper(c) ? (c - 'A' + 10) : (c - 'a' + 10) ))
                    114: 
                    115: static u_int8_t *pbuf = NULL;          /* sadb_x_policy buffer */
                    116: static int tlen = 0;                   /* total length of pbuf */
                    117: static int offset = 0;                 /* offset of pbuf */
                    118: static int p_dir, p_type, p_protocol, p_mode, p_level, p_reqid;
                    119: static u_int32_t p_priority = 0;
                    120: static long p_priority_offset = 0;
                    121: static struct sockaddr *p_src = NULL;
                    122: static struct sockaddr *p_dst = NULL;
                    123: 
                    124: struct _val;
                    125: extern void yyerror __P((char *msg));
                    126: static struct sockaddr *parse_sockaddr __P((struct _val *addrbuf,
                    127:     struct _val *portbuf));
                    128: static int rule_check __P((void));
                    129: static int init_x_policy __P((void));
                    130: static int set_x_request __P((struct sockaddr *, struct sockaddr *));
                    131: static int set_sockaddr __P((struct sockaddr *));
                    132: static void policy_parse_request_init __P((void));
                    133: static void *policy_parse __P((const char *, int));
                    134: 
                    135: extern void __policy__strbuffer__init__ __P((const char *));
                    136: extern void __policy__strbuffer__free__ __P((void));
                    137: extern int yyparse __P((void));
                    138: extern int yylex __P((void));
                    139: 
                    140: extern char *__libipsectext;   /*XXX*/
                    141: 
                    142: 
                    143: 
                    144: /* Line 189 of yacc.c  */
                    145: #line 146 "policy_parse.c"
                    146: 
                    147: /* Enabling traces.  */
                    148: #ifndef YYDEBUG
                    149: # define YYDEBUG 0
                    150: #endif
                    151: 
                    152: /* Enabling verbose error messages.  */
                    153: #ifdef YYERROR_VERBOSE
                    154: # undef YYERROR_VERBOSE
                    155: # define YYERROR_VERBOSE 1
                    156: #else
                    157: # define YYERROR_VERBOSE 0
                    158: #endif
                    159: 
                    160: /* Enabling the token table.  */
                    161: #ifndef YYTOKEN_TABLE
                    162: # define YYTOKEN_TABLE 0
                    163: #endif
                    164: 
                    165: 
                    166: /* Tokens.  */
                    167: #ifndef YYTOKENTYPE
                    168: # define YYTOKENTYPE
                    169:    /* Put the tokens into the symbol table, so that GDB and other debuggers
                    170:       know about them.  */
                    171:    enum yytokentype {
                    172:      DIR = 258,
                    173:      PRIORITY = 259,
                    174:      PLUS = 260,
                    175:      PRIO_BASE = 261,
                    176:      PRIO_OFFSET = 262,
                    177:      ACTION = 263,
                    178:      PROTOCOL = 264,
                    179:      MODE = 265,
                    180:      LEVEL = 266,
                    181:      LEVEL_SPECIFY = 267,
                    182:      IPADDRESS = 268,
                    183:      PORT = 269,
                    184:      ME = 270,
                    185:      ANY = 271,
                    186:      SLASH = 272,
                    187:      HYPHEN = 273
                    188:    };
                    189: #endif
                    190: /* Tokens.  */
                    191: #define DIR 258
                    192: #define PRIORITY 259
                    193: #define PLUS 260
                    194: #define PRIO_BASE 261
                    195: #define PRIO_OFFSET 262
                    196: #define ACTION 263
                    197: #define PROTOCOL 264
                    198: #define MODE 265
                    199: #define LEVEL 266
                    200: #define LEVEL_SPECIFY 267
                    201: #define IPADDRESS 268
                    202: #define PORT 269
                    203: #define ME 270
                    204: #define ANY 271
                    205: #define SLASH 272
                    206: #define HYPHEN 273
                    207: 
                    208: 
                    209: 
                    210: 
                    211: #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
                    212: typedef union YYSTYPE
                    213: {
                    214: 
                    215: /* Line 214 of yacc.c  */
                    216: #line 129 "policy_parse.y"
                    217: 
                    218:        u_int num;
                    219:        u_int32_t num32;
                    220:        struct _val {
                    221:                int len;
                    222:                char *buf;
                    223:        } val;
                    224: 
                    225: 
                    226: 
                    227: /* Line 214 of yacc.c  */
                    228: #line 229 "policy_parse.c"
                    229: } YYSTYPE;
                    230: # define YYSTYPE_IS_TRIVIAL 1
                    231: # define yystype YYSTYPE /* obsolescent; will be withdrawn */
                    232: # define YYSTYPE_IS_DECLARED 1
                    233: #endif
                    234: 
                    235: 
                    236: /* Copy the second part of user declarations.  */
                    237: 
                    238: 
                    239: /* Line 264 of yacc.c  */
                    240: #line 241 "policy_parse.c"
                    241: 
                    242: #ifdef short
                    243: # undef short
                    244: #endif
                    245: 
                    246: #ifdef YYTYPE_UINT8
                    247: typedef YYTYPE_UINT8 yytype_uint8;
                    248: #else
                    249: typedef unsigned char yytype_uint8;
                    250: #endif
                    251: 
                    252: #ifdef YYTYPE_INT8
                    253: typedef YYTYPE_INT8 yytype_int8;
                    254: #elif (defined __STDC__ || defined __C99__FUNC__ \
                    255:      || defined __cplusplus || defined _MSC_VER)
                    256: typedef signed char yytype_int8;
                    257: #else
                    258: typedef short int yytype_int8;
                    259: #endif
                    260: 
                    261: #ifdef YYTYPE_UINT16
                    262: typedef YYTYPE_UINT16 yytype_uint16;
                    263: #else
                    264: typedef unsigned short int yytype_uint16;
                    265: #endif
                    266: 
                    267: #ifdef YYTYPE_INT16
                    268: typedef YYTYPE_INT16 yytype_int16;
                    269: #else
                    270: typedef short int yytype_int16;
                    271: #endif
                    272: 
                    273: #ifndef YYSIZE_T
                    274: # ifdef __SIZE_TYPE__
                    275: #  define YYSIZE_T __SIZE_TYPE__
                    276: # elif defined size_t
                    277: #  define YYSIZE_T size_t
                    278: # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
                    279:      || defined __cplusplus || defined _MSC_VER)
                    280: #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
                    281: #  define YYSIZE_T size_t
                    282: # else
                    283: #  define YYSIZE_T unsigned int
                    284: # endif
                    285: #endif
                    286: 
                    287: #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
                    288: 
                    289: #ifndef YY_
                    290: # if YYENABLE_NLS
                    291: #  if ENABLE_NLS
                    292: #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
                    293: #   define YY_(msgid) dgettext ("bison-runtime", msgid)
                    294: #  endif
                    295: # endif
                    296: # ifndef YY_
                    297: #  define YY_(msgid) msgid
                    298: # endif
                    299: #endif
                    300: 
                    301: /* Suppress unused-variable warnings by "using" E.  */
                    302: #if ! defined lint || defined __GNUC__
                    303: # define YYUSE(e) ((void) (e))
                    304: #else
                    305: # define YYUSE(e) /* empty */
                    306: #endif
                    307: 
                    308: /* Identity function, used to suppress warnings about constant conditions.  */
                    309: #ifndef lint
                    310: # define YYID(n) (n)
                    311: #else
                    312: #if (defined __STDC__ || defined __C99__FUNC__ \
                    313:      || defined __cplusplus || defined _MSC_VER)
                    314: static int
                    315: YYID (int yyi)
                    316: #else
                    317: static int
                    318: YYID (yyi)
                    319:     int yyi;
                    320: #endif
                    321: {
                    322:   return yyi;
                    323: }
                    324: #endif
                    325: 
                    326: #if ! defined yyoverflow || YYERROR_VERBOSE
                    327: 
                    328: /* The parser invokes alloca or malloc; define the necessary symbols.  */
                    329: 
                    330: # ifdef YYSTACK_USE_ALLOCA
                    331: #  if YYSTACK_USE_ALLOCA
                    332: #   ifdef __GNUC__
                    333: #    define YYSTACK_ALLOC __builtin_alloca
                    334: #   elif defined __BUILTIN_VA_ARG_INCR
                    335: #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
                    336: #   elif defined _AIX
                    337: #    define YYSTACK_ALLOC __alloca
                    338: #   elif defined _MSC_VER
                    339: #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
                    340: #    define alloca _alloca
                    341: #   else
                    342: #    define YYSTACK_ALLOC alloca
                    343: #    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
                    344:      || defined __cplusplus || defined _MSC_VER)
                    345: #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
                    346: #     ifndef _STDLIB_H
                    347: #      define _STDLIB_H 1
                    348: #     endif
                    349: #    endif
                    350: #   endif
                    351: #  endif
                    352: # endif
                    353: 
                    354: # ifdef YYSTACK_ALLOC
                    355:    /* Pacify GCC's `empty if-body' warning.  */
                    356: #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
                    357: #  ifndef YYSTACK_ALLOC_MAXIMUM
                    358:     /* The OS might guarantee only one guard page at the bottom of the stack,
                    359:        and a page size can be as small as 4096 bytes.  So we cannot safely
                    360:        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
                    361:        to allow for a few compiler-allocated temporary stack slots.  */
                    362: #   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
                    363: #  endif
                    364: # else
                    365: #  define YYSTACK_ALLOC YYMALLOC
                    366: #  define YYSTACK_FREE YYFREE
                    367: #  ifndef YYSTACK_ALLOC_MAXIMUM
                    368: #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
                    369: #  endif
                    370: #  if (defined __cplusplus && ! defined _STDLIB_H \
                    371:        && ! ((defined YYMALLOC || defined malloc) \
                    372:             && (defined YYFREE || defined free)))
                    373: #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
                    374: #   ifndef _STDLIB_H
                    375: #    define _STDLIB_H 1
                    376: #   endif
                    377: #  endif
                    378: #  ifndef YYMALLOC
                    379: #   define YYMALLOC malloc
                    380: #   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
                    381:      || defined __cplusplus || defined _MSC_VER)
                    382: void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
                    383: #   endif
                    384: #  endif
                    385: #  ifndef YYFREE
                    386: #   define YYFREE free
                    387: #   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
                    388:      || defined __cplusplus || defined _MSC_VER)
                    389: void free (void *); /* INFRINGES ON USER NAME SPACE */
                    390: #   endif
                    391: #  endif
                    392: # endif
                    393: #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
                    394: 
                    395: 
                    396: #if (! defined yyoverflow \
                    397:      && (! defined __cplusplus \
                    398:         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
                    399: 
                    400: /* A type that is properly aligned for any stack member.  */
                    401: union yyalloc
                    402: {
                    403:   yytype_int16 yyss_alloc;
                    404:   YYSTYPE yyvs_alloc;
                    405: };
                    406: 
                    407: /* The size of the maximum gap between one aligned stack and the next.  */
                    408: # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
                    409: 
                    410: /* The size of an array large to enough to hold all stacks, each with
                    411:    N elements.  */
                    412: # define YYSTACK_BYTES(N) \
                    413:      ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
                    414:       + YYSTACK_GAP_MAXIMUM)
                    415: 
                    416: /* Copy COUNT objects from FROM to TO.  The source and destination do
                    417:    not overlap.  */
                    418: # ifndef YYCOPY
                    419: #  if defined __GNUC__ && 1 < __GNUC__
                    420: #   define YYCOPY(To, From, Count) \
                    421:       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
                    422: #  else
                    423: #   define YYCOPY(To, From, Count)             \
                    424:       do                                       \
                    425:        {                                       \
                    426:          YYSIZE_T yyi;                         \
                    427:          for (yyi = 0; yyi < (Count); yyi++)   \
                    428:            (To)[yyi] = (From)[yyi];            \
                    429:        }                                       \
                    430:       while (YYID (0))
                    431: #  endif
                    432: # endif
                    433: 
                    434: /* Relocate STACK from its old location to the new one.  The
                    435:    local variables YYSIZE and YYSTACKSIZE give the old and new number of
                    436:    elements in the stack, and YYPTR gives the new location of the
                    437:    stack.  Advance YYPTR to a properly aligned location for the next
                    438:    stack.  */
                    439: # define YYSTACK_RELOCATE(Stack_alloc, Stack)                          \
                    440:     do                                                                 \
                    441:       {                                                                        \
                    442:        YYSIZE_T yynewbytes;                                            \
                    443:        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
                    444:        Stack = &yyptr->Stack_alloc;                                    \
                    445:        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
                    446:        yyptr += yynewbytes / sizeof (*yyptr);                          \
                    447:       }                                                                        \
                    448:     while (YYID (0))
                    449: 
                    450: #endif
                    451: 
                    452: /* YYFINAL -- State number of the termination state.  */
                    453: #define YYFINAL  5
                    454: /* YYLAST -- Last index in YYTABLE.  */
                    455: #define YYLAST   48
                    456: 
                    457: /* YYNTOKENS -- Number of terminals.  */
                    458: #define YYNTOKENS  19
                    459: /* YYNNTS -- Number of nonterminals.  */
                    460: #define YYNNTS  16
                    461: /* YYNRULES -- Number of rules.  */
                    462: #define YYNRULES  34
                    463: /* YYNRULES -- Number of states.  */
                    464: #define YYNSTATES  60
                    465: 
                    466: /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
                    467: #define YYUNDEFTOK  2
                    468: #define YYMAXUTOK   273
                    469: 
                    470: #define YYTRANSLATE(YYX)                                               \
                    471:   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
                    472: 
                    473: /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
                    474: static const yytype_uint8 yytranslate[] =
                    475: {
                    476:        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    477:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    478:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    479:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    480:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    481:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    482:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    483:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    484:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    485:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    486:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    487:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    488:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    489:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    490:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    491:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    492:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    493:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    494:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    495:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    496:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    497:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    498:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    499:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    500:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
                    501:        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
                    502:        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
                    503:       15,    16,    17,    18
                    504: };
                    505: 
                    506: #if YYDEBUG
                    507: /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
                    508:    YYRHS.  */
                    509: static const yytype_uint8 yyprhs[] =
                    510: {
                    511:        0,     0,     3,     4,     9,    10,    17,    18,    26,    27,
                    512:       34,    35,    44,    45,    54,    56,    57,    60,    68,    75,
                    513:       81,    86,    93,    97,   100,   102,   104,   106,   108,   110,
                    514:      111,   116,   117,   124,   128
                    515: };
                    516: 
                    517: /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
                    518: static const yytype_int8 yyrhs[] =
                    519: {
                    520:       20,     0,    -1,    -1,     3,     8,    21,    27,    -1,    -1,
                    521:        3,     4,     7,     8,    22,    27,    -1,    -1,     3,     4,
                    522:       18,     7,     8,    23,    27,    -1,    -1,     3,     4,     6,
                    523:        8,    24,    27,    -1,    -1,     3,     4,     6,     5,     7,
                    524:        8,    25,    27,    -1,    -1,     3,     4,     6,    18,     7,
                    525:        8,    26,    27,    -1,     3,    -1,    -1,    27,    28,    -1,
                    526:       29,    17,    30,    17,    32,    17,    31,    -1,    29,    17,
                    527:       30,    17,    32,    17,    -1,    29,    17,    30,    17,    32,
                    528:       -1,    29,    17,    30,    17,    -1,    29,    17,    30,    17,
                    529:       17,    31,    -1,    29,    17,    30,    -1,    29,    17,    -1,
                    530:       29,    -1,     9,    -1,    10,    -1,    11,    -1,    12,    -1,
                    531:       -1,    13,    33,    18,    13,    -1,    -1,    13,    14,    34,
                    532:       18,    13,    14,    -1,    15,    18,    16,    -1,    16,    18,
                    533:       15,    -1
                    534: };
                    535: 
                    536: /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
                    537: static const yytype_uint16 yyrline[] =
                    538: {
                    539:        0,   151,   151,   150,   166,   165,   185,   184,   207,   206,
                    540:      218,   217,   240,   239,   261,   273,   275,   287,   288,   289,
                    541:      290,   291,   292,   293,   297,   304,   308,   312,   316,   323,
                    542:      323,   334,   334,   345,   351
                    543: };
                    544: #endif
                    545: 
                    546: #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
                    547: /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
                    548:    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
                    549: static const char *const yytname[] =
                    550: {
                    551:   "$end", "error", "$undefined", "DIR", "PRIORITY", "PLUS", "PRIO_BASE",
                    552:   "PRIO_OFFSET", "ACTION", "PROTOCOL", "MODE", "LEVEL", "LEVEL_SPECIFY",
                    553:   "IPADDRESS", "PORT", "ME", "ANY", "SLASH", "HYPHEN", "$accept",
                    554:   "policy_spec", "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "rules", "rule",
                    555:   "protocol", "mode", "level", "addresses", "$@7", "$@8", 0
                    556: };
                    557: #endif
                    558: 
                    559: # ifdef YYPRINT
                    560: /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
                    561:    token YYLEX-NUM.  */
                    562: static const yytype_uint16 yytoknum[] =
                    563: {
                    564:        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
                    565:      265,   266,   267,   268,   269,   270,   271,   272,   273
                    566: };
                    567: # endif
                    568: 
                    569: /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
                    570: static const yytype_uint8 yyr1[] =
                    571: {
                    572:        0,    19,    21,    20,    22,    20,    23,    20,    24,    20,
                    573:       25,    20,    26,    20,    20,    27,    27,    28,    28,    28,
                    574:       28,    28,    28,    28,    28,    29,    30,    31,    31,    33,
                    575:       32,    34,    32,    32,    32
                    576: };
                    577: 
                    578: /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
                    579: static const yytype_uint8 yyr2[] =
                    580: {
                    581:        0,     2,     0,     4,     0,     6,     0,     7,     0,     6,
                    582:        0,     8,     0,     8,     1,     0,     2,     7,     6,     5,
                    583:        4,     6,     3,     2,     1,     1,     1,     1,     1,     0,
                    584:        4,     0,     6,     3,     3
                    585: };
                    586: 
                    587: /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
                    588:    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
                    589:    means the default is an error.  */
                    590: static const yytype_uint8 yydefact[] =
                    591: {
                    592:        0,    14,     0,     0,     2,     1,     0,     0,     0,    15,
                    593:        0,     8,     0,     4,     0,     3,     0,    15,     0,    15,
                    594:        6,    25,    16,    24,    10,     9,    12,     5,    15,    23,
                    595:       15,    15,     7,    26,    22,    11,    13,    20,    29,     0,
                    596:        0,     0,    19,    31,     0,     0,     0,    27,    28,    21,
                    597:       18,     0,     0,    33,    34,    17,     0,    30,     0,    32
                    598: };
                    599: 
                    600: /* YYDEFGOTO[NTERM-NUM].  */
                    601: static const yytype_int8 yydefgoto[] =
                    602: {
                    603:       -1,     2,     9,    19,    28,    17,    30,    31,    15,    22,
                    604:       23,    34,    49,    42,    44,    51
                    605: };
                    606: 
                    607: /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
                    608:    STATE-NUM.  */
                    609: #define YYPACT_NINF -18
                    610: static const yytype_int8 yypact[] =
                    611: {
                    612:        6,    -3,     4,     1,   -18,   -18,    -2,     2,     8,   -18,
                    613:       10,   -18,    18,   -18,    19,     3,    20,   -18,    21,   -18,
                    614:      -18,   -18,   -18,     9,   -18,     3,   -18,     3,   -18,    22,
                    615:      -18,   -18,     3,   -18,    13,     3,     3,     5,    17,    15,
                    616:       16,    12,    23,   -18,    24,    25,    28,   -18,   -18,   -18,
                    617:       12,    26,    32,   -18,   -18,   -18,    33,   -18,    34,   -18
                    618: };
                    619: 
                    620: /* YYPGOTO[NTERM-NUM].  */
                    621: static const yytype_int8 yypgoto[] =
                    622: {
                    623:      -18,   -18,   -18,   -18,   -18,   -18,   -18,   -18,   -17,   -18,
                    624:      -18,   -18,   -15,   -18,   -18,   -18
                    625: };
                    626: 
                    627: /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
                    628:    positive, shift that token.  If negative, reduce the rule which
                    629:    number is the opposite.  If zero, do what YYDEFACT says.
                    630:    If YYTABLE_NINF, syntax error.  */
                    631: #define YYTABLE_NINF -1
                    632: static const yytype_uint8 yytable[] =
                    633: {
                    634:       25,     3,    27,    10,     5,     4,    11,     6,     7,     1,
                    635:       13,    32,    21,    35,    36,    14,    12,    16,    38,     8,
                    636:       39,    40,    41,    47,    48,    18,    29,    20,    24,    26,
                    637:       37,    43,    33,    45,    46,    55,     0,     0,     0,     0,
                    638:       50,    53,    52,    54,    56,    57,    58,     0,    59
                    639: };
                    640: 
                    641: static const yytype_int8 yycheck[] =
                    642: {
                    643:       17,     4,    19,     5,     0,     8,     8,     6,     7,     3,
                    644:        8,    28,     9,    30,    31,     7,    18,     7,    13,    18,
                    645:       15,    16,    17,    11,    12,     7,    17,     8,     8,     8,
                    646:       17,    14,    10,    18,    18,    50,    -1,    -1,    -1,    -1,
                    647:       17,    16,    18,    15,    18,    13,    13,    -1,    14
                    648: };
                    649: 
                    650: /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
                    651:    symbol of state STATE-NUM.  */
                    652: static const yytype_uint8 yystos[] =
                    653: {
                    654:        0,     3,    20,     4,     8,     0,     6,     7,    18,    21,
                    655:        5,     8,    18,     8,     7,    27,     7,    24,     7,    22,
                    656:        8,     9,    28,    29,     8,    27,     8,    27,    23,    17,
                    657:       25,    26,    27,    10,    30,    27,    27,    17,    13,    15,
                    658:       16,    17,    32,    14,    33,    18,    18,    11,    12,    31,
                    659:       17,    34,    18,    16,    15,    31,    18,    13,    13,    14
                    660: };
                    661: 
                    662: #define yyerrok                (yyerrstatus = 0)
                    663: #define yyclearin      (yychar = YYEMPTY)
                    664: #define YYEMPTY                (-2)
                    665: #define YYEOF          0
                    666: 
                    667: #define YYACCEPT       goto yyacceptlab
                    668: #define YYABORT                goto yyabortlab
                    669: #define YYERROR                goto yyerrorlab
                    670: 
                    671: 
                    672: /* Like YYERROR except do call yyerror.  This remains here temporarily
                    673:    to ease the transition to the new meaning of YYERROR, for GCC.
                    674:    Once GCC version 2 has supplanted version 1, this can go.  */
                    675: 
                    676: #define YYFAIL         goto yyerrlab
                    677: 
                    678: #define YYRECOVERING()  (!!yyerrstatus)
                    679: 
                    680: #define YYBACKUP(Token, Value)                                 \
                    681: do                                                             \
                    682:   if (yychar == YYEMPTY && yylen == 1)                         \
                    683:     {                                                          \
                    684:       yychar = (Token);                                                \
                    685:       yylval = (Value);                                                \
                    686:       yytoken = YYTRANSLATE (yychar);                          \
                    687:       YYPOPSTACK (1);                                          \
                    688:       goto yybackup;                                           \
                    689:     }                                                          \
                    690:   else                                                         \
                    691:     {                                                          \
                    692:       yyerror (YY_("syntax error: cannot back up")); \
                    693:       YYERROR;                                                 \
                    694:     }                                                          \
                    695: while (YYID (0))
                    696: 
                    697: 
                    698: #define YYTERROR       1
                    699: #define YYERRCODE      256
                    700: 
                    701: 
                    702: /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
                    703:    If N is 0, then set CURRENT to the empty location which ends
                    704:    the previous symbol: RHS[0] (always defined).  */
                    705: 
                    706: #define YYRHSLOC(Rhs, K) ((Rhs)[K])
                    707: #ifndef YYLLOC_DEFAULT
                    708: # define YYLLOC_DEFAULT(Current, Rhs, N)                               \
                    709:     do                                                                 \
                    710:       if (YYID (N))                                                    \
                    711:        {                                                               \
                    712:          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
                    713:          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
                    714:          (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
                    715:          (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
                    716:        }                                                               \
                    717:       else                                                             \
                    718:        {                                                               \
                    719:          (Current).first_line   = (Current).last_line   =              \
                    720:            YYRHSLOC (Rhs, 0).last_line;                                \
                    721:          (Current).first_column = (Current).last_column =              \
                    722:            YYRHSLOC (Rhs, 0).last_column;                              \
                    723:        }                                                               \
                    724:     while (YYID (0))
                    725: #endif
                    726: 
                    727: 
                    728: /* YY_LOCATION_PRINT -- Print the location on the stream.
                    729:    This macro was not mandated originally: define only if we know
                    730:    we won't break user code: when these are the locations we know.  */
                    731: 
                    732: #ifndef YY_LOCATION_PRINT
                    733: # if YYLTYPE_IS_TRIVIAL
                    734: #  define YY_LOCATION_PRINT(File, Loc)                 \
                    735:      fprintf (File, "%d.%d-%d.%d",                     \
                    736:              (Loc).first_line, (Loc).first_column,     \
                    737:              (Loc).last_line,  (Loc).last_column)
                    738: # else
                    739: #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
                    740: # endif
                    741: #endif
                    742: 
                    743: 
                    744: /* YYLEX -- calling `yylex' with the right arguments.  */
                    745: 
                    746: #ifdef YYLEX_PARAM
                    747: # define YYLEX yylex (YYLEX_PARAM)
                    748: #else
                    749: # define YYLEX yylex ()
                    750: #endif
                    751: 
                    752: /* Enable debugging if requested.  */
                    753: #if YYDEBUG
                    754: 
                    755: # ifndef YYFPRINTF
                    756: #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
                    757: #  define YYFPRINTF fprintf
                    758: # endif
                    759: 
                    760: # define YYDPRINTF(Args)                       \
                    761: do {                                           \
                    762:   if (yydebug)                                 \
                    763:     YYFPRINTF Args;                            \
                    764: } while (YYID (0))
                    765: 
                    766: # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
                    767: do {                                                                     \
                    768:   if (yydebug)                                                           \
                    769:     {                                                                    \
                    770:       YYFPRINTF (stderr, "%s ", Title);                                          \
                    771:       yy_symbol_print (stderr,                                           \
                    772:                  Type, Value); \
                    773:       YYFPRINTF (stderr, "\n");                                                  \
                    774:     }                                                                    \
                    775: } while (YYID (0))
                    776: 
                    777: 
                    778: /*--------------------------------.
                    779: | Print this symbol on YYOUTPUT.  |
                    780: `--------------------------------*/
                    781: 
                    782: /*ARGSUSED*/
                    783: #if (defined __STDC__ || defined __C99__FUNC__ \
                    784:      || defined __cplusplus || defined _MSC_VER)
                    785: static void
                    786: yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
                    787: #else
                    788: static void
                    789: yy_symbol_value_print (yyoutput, yytype, yyvaluep)
                    790:     FILE *yyoutput;
                    791:     int yytype;
                    792:     YYSTYPE const * const yyvaluep;
                    793: #endif
                    794: {
                    795:   if (!yyvaluep)
                    796:     return;
                    797: # ifdef YYPRINT
                    798:   if (yytype < YYNTOKENS)
                    799:     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
                    800: # else
                    801:   YYUSE (yyoutput);
                    802: # endif
                    803:   switch (yytype)
                    804:     {
                    805:       default:
                    806:        break;
                    807:     }
                    808: }
                    809: 
                    810: 
                    811: /*--------------------------------.
                    812: | Print this symbol on YYOUTPUT.  |
                    813: `--------------------------------*/
                    814: 
                    815: #if (defined __STDC__ || defined __C99__FUNC__ \
                    816:      || defined __cplusplus || defined _MSC_VER)
                    817: static void
                    818: yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
                    819: #else
                    820: static void
                    821: yy_symbol_print (yyoutput, yytype, yyvaluep)
                    822:     FILE *yyoutput;
                    823:     int yytype;
                    824:     YYSTYPE const * const yyvaluep;
                    825: #endif
                    826: {
                    827:   if (yytype < YYNTOKENS)
                    828:     YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
                    829:   else
                    830:     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
                    831: 
                    832:   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
                    833:   YYFPRINTF (yyoutput, ")");
                    834: }
                    835: 
                    836: /*------------------------------------------------------------------.
                    837: | yy_stack_print -- Print the state stack from its BOTTOM up to its |
                    838: | TOP (included).                                                   |
                    839: `------------------------------------------------------------------*/
                    840: 
                    841: #if (defined __STDC__ || defined __C99__FUNC__ \
                    842:      || defined __cplusplus || defined _MSC_VER)
                    843: static void
                    844: yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
                    845: #else
                    846: static void
                    847: yy_stack_print (yybottom, yytop)
                    848:     yytype_int16 *yybottom;
                    849:     yytype_int16 *yytop;
                    850: #endif
                    851: {
                    852:   YYFPRINTF (stderr, "Stack now");
                    853:   for (; yybottom <= yytop; yybottom++)
                    854:     {
                    855:       int yybot = *yybottom;
                    856:       YYFPRINTF (stderr, " %d", yybot);
                    857:     }
                    858:   YYFPRINTF (stderr, "\n");
                    859: }
                    860: 
                    861: # define YY_STACK_PRINT(Bottom, Top)                           \
                    862: do {                                                           \
                    863:   if (yydebug)                                                 \
                    864:     yy_stack_print ((Bottom), (Top));                          \
                    865: } while (YYID (0))
                    866: 
                    867: 
                    868: /*------------------------------------------------.
                    869: | Report that the YYRULE is going to be reduced.  |
                    870: `------------------------------------------------*/
                    871: 
                    872: #if (defined __STDC__ || defined __C99__FUNC__ \
                    873:      || defined __cplusplus || defined _MSC_VER)
                    874: static void
                    875: yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
                    876: #else
                    877: static void
                    878: yy_reduce_print (yyvsp, yyrule)
                    879:     YYSTYPE *yyvsp;
                    880:     int yyrule;
                    881: #endif
                    882: {
                    883:   int yynrhs = yyr2[yyrule];
                    884:   int yyi;
                    885:   unsigned long int yylno = yyrline[yyrule];
                    886:   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
                    887:             yyrule - 1, yylno);
                    888:   /* The symbols being reduced.  */
                    889:   for (yyi = 0; yyi < yynrhs; yyi++)
                    890:     {
                    891:       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
                    892:       yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
                    893:                       &(yyvsp[(yyi + 1) - (yynrhs)])
                    894:                                       );
                    895:       YYFPRINTF (stderr, "\n");
                    896:     }
                    897: }
                    898: 
                    899: # define YY_REDUCE_PRINT(Rule)         \
                    900: do {                                   \
                    901:   if (yydebug)                         \
                    902:     yy_reduce_print (yyvsp, Rule); \
                    903: } while (YYID (0))
                    904: 
                    905: /* Nonzero means print parse trace.  It is left uninitialized so that
                    906:    multiple parsers can coexist.  */
                    907: int yydebug;
                    908: #else /* !YYDEBUG */
                    909: # define YYDPRINTF(Args)
                    910: # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
                    911: # define YY_STACK_PRINT(Bottom, Top)
                    912: # define YY_REDUCE_PRINT(Rule)
                    913: #endif /* !YYDEBUG */
                    914: 
                    915: 
                    916: /* YYINITDEPTH -- initial size of the parser's stacks.  */
                    917: #ifndef        YYINITDEPTH
                    918: # define YYINITDEPTH 200
                    919: #endif
                    920: 
                    921: /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
                    922:    if the built-in stack extension method is used).
                    923: 
                    924:    Do not make this value too large; the results are undefined if
                    925:    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
                    926:    evaluated with infinite-precision integer arithmetic.  */
                    927: 
                    928: #ifndef YYMAXDEPTH
                    929: # define YYMAXDEPTH 10000
                    930: #endif
                    931: 
                    932: 
                    933: 
                    934: #if YYERROR_VERBOSE
                    935: 
                    936: # ifndef yystrlen
                    937: #  if defined __GLIBC__ && defined _STRING_H
                    938: #   define yystrlen strlen
                    939: #  else
                    940: /* Return the length of YYSTR.  */
                    941: #if (defined __STDC__ || defined __C99__FUNC__ \
                    942:      || defined __cplusplus || defined _MSC_VER)
                    943: static YYSIZE_T
                    944: yystrlen (const char *yystr)
                    945: #else
                    946: static YYSIZE_T
                    947: yystrlen (yystr)
                    948:     const char *yystr;
                    949: #endif
                    950: {
                    951:   YYSIZE_T yylen;
                    952:   for (yylen = 0; yystr[yylen]; yylen++)
                    953:     continue;
                    954:   return yylen;
                    955: }
                    956: #  endif
                    957: # endif
                    958: 
                    959: # ifndef yystpcpy
                    960: #  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
                    961: #   define yystpcpy stpcpy
                    962: #  else
                    963: /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
                    964:    YYDEST.  */
                    965: #if (defined __STDC__ || defined __C99__FUNC__ \
                    966:      || defined __cplusplus || defined _MSC_VER)
                    967: static char *
                    968: yystpcpy (char *yydest, const char *yysrc)
                    969: #else
                    970: static char *
                    971: yystpcpy (yydest, yysrc)
                    972:     char *yydest;
                    973:     const char *yysrc;
                    974: #endif
                    975: {
                    976:   char *yyd = yydest;
                    977:   const char *yys = yysrc;
                    978: 
                    979:   while ((*yyd++ = *yys++) != '\0')
                    980:     continue;
                    981: 
                    982:   return yyd - 1;
                    983: }
                    984: #  endif
                    985: # endif
                    986: 
                    987: # ifndef yytnamerr
                    988: /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
                    989:    quotes and backslashes, so that it's suitable for yyerror.  The
                    990:    heuristic is that double-quoting is unnecessary unless the string
                    991:    contains an apostrophe, a comma, or backslash (other than
                    992:    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
                    993:    null, do not copy; instead, return the length of what the result
                    994:    would have been.  */
                    995: static YYSIZE_T
                    996: yytnamerr (char *yyres, const char *yystr)
                    997: {
                    998:   if (*yystr == '"')
                    999:     {
                   1000:       YYSIZE_T yyn = 0;
                   1001:       char const *yyp = yystr;
                   1002: 
                   1003:       for (;;)
                   1004:        switch (*++yyp)
                   1005:          {
                   1006:          case '\'':
                   1007:          case ',':
                   1008:            goto do_not_strip_quotes;
                   1009: 
                   1010:          case '\\':
                   1011:            if (*++yyp != '\\')
                   1012:              goto do_not_strip_quotes;
                   1013:            /* Fall through.  */
                   1014:          default:
                   1015:            if (yyres)
                   1016:              yyres[yyn] = *yyp;
                   1017:            yyn++;
                   1018:            break;
                   1019: 
                   1020:          case '"':
                   1021:            if (yyres)
                   1022:              yyres[yyn] = '\0';
                   1023:            return yyn;
                   1024:          }
                   1025:     do_not_strip_quotes: ;
                   1026:     }
                   1027: 
                   1028:   if (! yyres)
                   1029:     return yystrlen (yystr);
                   1030: 
                   1031:   return yystpcpy (yyres, yystr) - yyres;
                   1032: }
                   1033: # endif
                   1034: 
                   1035: /* Copy into YYRESULT an error message about the unexpected token
                   1036:    YYCHAR while in state YYSTATE.  Return the number of bytes copied,
                   1037:    including the terminating null byte.  If YYRESULT is null, do not
                   1038:    copy anything; just return the number of bytes that would be
                   1039:    copied.  As a special case, return 0 if an ordinary "syntax error"
                   1040:    message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
                   1041:    size calculation.  */
                   1042: static YYSIZE_T
                   1043: yysyntax_error (char *yyresult, int yystate, int yychar)
                   1044: {
                   1045:   int yyn = yypact[yystate];
                   1046: 
                   1047:   if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
                   1048:     return 0;
                   1049:   else
                   1050:     {
                   1051:       int yytype = YYTRANSLATE (yychar);
                   1052:       YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
                   1053:       YYSIZE_T yysize = yysize0;
                   1054:       YYSIZE_T yysize1;
                   1055:       int yysize_overflow = 0;
                   1056:       enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
                   1057:       char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
                   1058:       int yyx;
                   1059: 
                   1060: # if 0
                   1061:       /* This is so xgettext sees the translatable formats that are
                   1062:         constructed on the fly.  */
                   1063:       YY_("syntax error, unexpected %s");
                   1064:       YY_("syntax error, unexpected %s, expecting %s");
                   1065:       YY_("syntax error, unexpected %s, expecting %s or %s");
                   1066:       YY_("syntax error, unexpected %s, expecting %s or %s or %s");
                   1067:       YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
                   1068: # endif
                   1069:       char *yyfmt;
                   1070:       char const *yyf;
                   1071:       static char const yyunexpected[] = "syntax error, unexpected %s";
                   1072:       static char const yyexpecting[] = ", expecting %s";
                   1073:       static char const yyor[] = " or %s";
                   1074:       char yyformat[sizeof yyunexpected
                   1075:                    + sizeof yyexpecting - 1
                   1076:                    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
                   1077:                       * (sizeof yyor - 1))];
                   1078:       char const *yyprefix = yyexpecting;
                   1079: 
                   1080:       /* Start YYX at -YYN if negative to avoid negative indexes in
                   1081:         YYCHECK.  */
                   1082:       int yyxbegin = yyn < 0 ? -yyn : 0;
                   1083: 
                   1084:       /* Stay within bounds of both yycheck and yytname.  */
                   1085:       int yychecklim = YYLAST - yyn + 1;
                   1086:       int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
                   1087:       int yycount = 1;
                   1088: 
                   1089:       yyarg[0] = yytname[yytype];
                   1090:       yyfmt = yystpcpy (yyformat, yyunexpected);
                   1091: 
                   1092:       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
                   1093:        if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
                   1094:          {
                   1095:            if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
                   1096:              {
                   1097:                yycount = 1;
                   1098:                yysize = yysize0;
                   1099:                yyformat[sizeof yyunexpected - 1] = '\0';
                   1100:                break;
                   1101:              }
                   1102:            yyarg[yycount++] = yytname[yyx];
                   1103:            yysize1 = yysize + yytnamerr (0, yytname[yyx]);
                   1104:            yysize_overflow |= (yysize1 < yysize);
                   1105:            yysize = yysize1;
                   1106:            yyfmt = yystpcpy (yyfmt, yyprefix);
                   1107:            yyprefix = yyor;
                   1108:          }
                   1109: 
                   1110:       yyf = YY_(yyformat);
                   1111:       yysize1 = yysize + yystrlen (yyf);
                   1112:       yysize_overflow |= (yysize1 < yysize);
                   1113:       yysize = yysize1;
                   1114: 
                   1115:       if (yysize_overflow)
                   1116:        return YYSIZE_MAXIMUM;
                   1117: 
                   1118:       if (yyresult)
                   1119:        {
                   1120:          /* Avoid sprintf, as that infringes on the user's name space.
                   1121:             Don't have undefined behavior even if the translation
                   1122:             produced a string with the wrong number of "%s"s.  */
                   1123:          char *yyp = yyresult;
                   1124:          int yyi = 0;
                   1125:          while ((*yyp = *yyf) != '\0')
                   1126:            {
                   1127:              if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
                   1128:                {
                   1129:                  yyp += yytnamerr (yyp, yyarg[yyi++]);
                   1130:                  yyf += 2;
                   1131:                }
                   1132:              else
                   1133:                {
                   1134:                  yyp++;
                   1135:                  yyf++;
                   1136:                }
                   1137:            }
                   1138:        }
                   1139:       return yysize;
                   1140:     }
                   1141: }
                   1142: #endif /* YYERROR_VERBOSE */
                   1143: 
                   1144: 
                   1145: /*-----------------------------------------------.
                   1146: | Release the memory associated to this symbol.  |
                   1147: `-----------------------------------------------*/
                   1148: 
                   1149: /*ARGSUSED*/
                   1150: #if (defined __STDC__ || defined __C99__FUNC__ \
                   1151:      || defined __cplusplus || defined _MSC_VER)
                   1152: static void
                   1153: yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
                   1154: #else
                   1155: static void
                   1156: yydestruct (yymsg, yytype, yyvaluep)
                   1157:     const char *yymsg;
                   1158:     int yytype;
                   1159:     YYSTYPE *yyvaluep;
                   1160: #endif
                   1161: {
                   1162:   YYUSE (yyvaluep);
                   1163: 
                   1164:   if (!yymsg)
                   1165:     yymsg = "Deleting";
                   1166:   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
                   1167: 
                   1168:   switch (yytype)
                   1169:     {
                   1170: 
                   1171:       default:
                   1172:        break;
                   1173:     }
                   1174: }
                   1175: 
                   1176: /* Prevent warnings from -Wmissing-prototypes.  */
                   1177: #ifdef YYPARSE_PARAM
                   1178: #if defined __STDC__ || defined __cplusplus
                   1179: int yyparse (void *YYPARSE_PARAM);
                   1180: #else
                   1181: int yyparse ();
                   1182: #endif
                   1183: #else /* ! YYPARSE_PARAM */
                   1184: #if defined __STDC__ || defined __cplusplus
                   1185: int yyparse (void);
                   1186: #else
                   1187: int yyparse ();
                   1188: #endif
                   1189: #endif /* ! YYPARSE_PARAM */
                   1190: 
                   1191: 
                   1192: /* The lookahead symbol.  */
                   1193: int yychar;
                   1194: 
                   1195: /* The semantic value of the lookahead symbol.  */
                   1196: YYSTYPE yylval;
                   1197: 
                   1198: /* Number of syntax errors so far.  */
                   1199: int yynerrs;
                   1200: 
                   1201: 
                   1202: 
                   1203: /*-------------------------.
                   1204: | yyparse or yypush_parse.  |
                   1205: `-------------------------*/
                   1206: 
                   1207: #ifdef YYPARSE_PARAM
                   1208: #if (defined __STDC__ || defined __C99__FUNC__ \
                   1209:      || defined __cplusplus || defined _MSC_VER)
                   1210: int
                   1211: yyparse (void *YYPARSE_PARAM)
                   1212: #else
                   1213: int
                   1214: yyparse (YYPARSE_PARAM)
                   1215:     void *YYPARSE_PARAM;
                   1216: #endif
                   1217: #else /* ! YYPARSE_PARAM */
                   1218: #if (defined __STDC__ || defined __C99__FUNC__ \
                   1219:      || defined __cplusplus || defined _MSC_VER)
                   1220: int
                   1221: yyparse (void)
                   1222: #else
                   1223: int
                   1224: yyparse ()
                   1225: 
                   1226: #endif
                   1227: #endif
                   1228: {
                   1229: 
                   1230: 
                   1231:     int yystate;
                   1232:     /* Number of tokens to shift before error messages enabled.  */
                   1233:     int yyerrstatus;
                   1234: 
                   1235:     /* The stacks and their tools:
                   1236:        `yyss': related to states.
                   1237:        `yyvs': related to semantic values.
                   1238: 
                   1239:        Refer to the stacks thru separate pointers, to allow yyoverflow
                   1240:        to reallocate them elsewhere.  */
                   1241: 
                   1242:     /* The state stack.  */
                   1243:     yytype_int16 yyssa[YYINITDEPTH];
                   1244:     yytype_int16 *yyss;
                   1245:     yytype_int16 *yyssp;
                   1246: 
                   1247:     /* The semantic value stack.  */
                   1248:     YYSTYPE yyvsa[YYINITDEPTH];
                   1249:     YYSTYPE *yyvs;
                   1250:     YYSTYPE *yyvsp;
                   1251: 
                   1252:     YYSIZE_T yystacksize;
                   1253: 
                   1254:   int yyn;
                   1255:   int yyresult;
                   1256:   /* Lookahead token as an internal (translated) token number.  */
                   1257:   int yytoken;
                   1258:   /* The variables used to return semantic value and location from the
                   1259:      action routines.  */
                   1260:   YYSTYPE yyval;
                   1261: 
                   1262: #if YYERROR_VERBOSE
                   1263:   /* Buffer for error messages, and its allocated size.  */
                   1264:   char yymsgbuf[128];
                   1265:   char *yymsg = yymsgbuf;
                   1266:   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
                   1267: #endif
                   1268: 
                   1269: #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
                   1270: 
                   1271:   /* The number of symbols on the RHS of the reduced rule.
                   1272:      Keep to zero when no symbol should be popped.  */
                   1273:   int yylen = 0;
                   1274: 
                   1275:   yytoken = 0;
                   1276:   yyss = yyssa;
                   1277:   yyvs = yyvsa;
                   1278:   yystacksize = YYINITDEPTH;
                   1279: 
                   1280:   YYDPRINTF ((stderr, "Starting parse\n"));
                   1281: 
                   1282:   yystate = 0;
                   1283:   yyerrstatus = 0;
                   1284:   yynerrs = 0;
                   1285:   yychar = YYEMPTY; /* Cause a token to be read.  */
                   1286: 
                   1287:   /* Initialize stack pointers.
                   1288:      Waste one element of value and location stack
                   1289:      so that they stay on the same level as the state stack.
                   1290:      The wasted elements are never initialized.  */
                   1291:   yyssp = yyss;
                   1292:   yyvsp = yyvs;
                   1293: 
                   1294:   goto yysetstate;
                   1295: 
                   1296: /*------------------------------------------------------------.
                   1297: | yynewstate -- Push a new state, which is found in yystate.  |
                   1298: `------------------------------------------------------------*/
                   1299:  yynewstate:
                   1300:   /* In all cases, when you get here, the value and location stacks
                   1301:      have just been pushed.  So pushing a state here evens the stacks.  */
                   1302:   yyssp++;
                   1303: 
                   1304:  yysetstate:
                   1305:   *yyssp = yystate;
                   1306: 
                   1307:   if (yyss + yystacksize - 1 <= yyssp)
                   1308:     {
                   1309:       /* Get the current used size of the three stacks, in elements.  */
                   1310:       YYSIZE_T yysize = yyssp - yyss + 1;
                   1311: 
                   1312: #ifdef yyoverflow
                   1313:       {
                   1314:        /* Give user a chance to reallocate the stack.  Use copies of
                   1315:           these so that the &'s don't force the real ones into
                   1316:           memory.  */
                   1317:        YYSTYPE *yyvs1 = yyvs;
                   1318:        yytype_int16 *yyss1 = yyss;
                   1319: 
                   1320:        /* Each stack pointer address is followed by the size of the
                   1321:           data in use in that stack, in bytes.  This used to be a
                   1322:           conditional around just the two extra args, but that might
                   1323:           be undefined if yyoverflow is a macro.  */
                   1324:        yyoverflow (YY_("memory exhausted"),
                   1325:                    &yyss1, yysize * sizeof (*yyssp),
                   1326:                    &yyvs1, yysize * sizeof (*yyvsp),
                   1327:                    &yystacksize);
                   1328: 
                   1329:        yyss = yyss1;
                   1330:        yyvs = yyvs1;
                   1331:       }
                   1332: #else /* no yyoverflow */
                   1333: # ifndef YYSTACK_RELOCATE
                   1334:       goto yyexhaustedlab;
                   1335: # else
                   1336:       /* Extend the stack our own way.  */
                   1337:       if (YYMAXDEPTH <= yystacksize)
                   1338:        goto yyexhaustedlab;
                   1339:       yystacksize *= 2;
                   1340:       if (YYMAXDEPTH < yystacksize)
                   1341:        yystacksize = YYMAXDEPTH;
                   1342: 
                   1343:       {
                   1344:        yytype_int16 *yyss1 = yyss;
                   1345:        union yyalloc *yyptr =
                   1346:          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
                   1347:        if (! yyptr)
                   1348:          goto yyexhaustedlab;
                   1349:        YYSTACK_RELOCATE (yyss_alloc, yyss);
                   1350:        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
                   1351: #  undef YYSTACK_RELOCATE
                   1352:        if (yyss1 != yyssa)
                   1353:          YYSTACK_FREE (yyss1);
                   1354:       }
                   1355: # endif
                   1356: #endif /* no yyoverflow */
                   1357: 
                   1358:       yyssp = yyss + yysize - 1;
                   1359:       yyvsp = yyvs + yysize - 1;
                   1360: 
                   1361:       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
                   1362:                  (unsigned long int) yystacksize));
                   1363: 
                   1364:       if (yyss + yystacksize - 1 <= yyssp)
                   1365:        YYABORT;
                   1366:     }
                   1367: 
                   1368:   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
                   1369: 
                   1370:   if (yystate == YYFINAL)
                   1371:     YYACCEPT;
                   1372: 
                   1373:   goto yybackup;
                   1374: 
                   1375: /*-----------.
                   1376: | yybackup.  |
                   1377: `-----------*/
                   1378: yybackup:
                   1379: 
                   1380:   /* Do appropriate processing given the current state.  Read a
                   1381:      lookahead token if we need one and don't already have one.  */
                   1382: 
                   1383:   /* First try to decide what to do without reference to lookahead token.  */
                   1384:   yyn = yypact[yystate];
                   1385:   if (yyn == YYPACT_NINF)
                   1386:     goto yydefault;
                   1387: 
                   1388:   /* Not known => get a lookahead token if don't already have one.  */
                   1389: 
                   1390:   /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
                   1391:   if (yychar == YYEMPTY)
                   1392:     {
                   1393:       YYDPRINTF ((stderr, "Reading a token: "));
                   1394:       yychar = YYLEX;
                   1395:     }
                   1396: 
                   1397:   if (yychar <= YYEOF)
                   1398:     {
                   1399:       yychar = yytoken = YYEOF;
                   1400:       YYDPRINTF ((stderr, "Now at end of input.\n"));
                   1401:     }
                   1402:   else
                   1403:     {
                   1404:       yytoken = YYTRANSLATE (yychar);
                   1405:       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
                   1406:     }
                   1407: 
                   1408:   /* If the proper action on seeing token YYTOKEN is to reduce or to
                   1409:      detect an error, take that action.  */
                   1410:   yyn += yytoken;
                   1411:   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
                   1412:     goto yydefault;
                   1413:   yyn = yytable[yyn];
                   1414:   if (yyn <= 0)
                   1415:     {
                   1416:       if (yyn == 0 || yyn == YYTABLE_NINF)
                   1417:        goto yyerrlab;
                   1418:       yyn = -yyn;
                   1419:       goto yyreduce;
                   1420:     }
                   1421: 
                   1422:   /* Count tokens shifted since error; after three, turn off error
                   1423:      status.  */
                   1424:   if (yyerrstatus)
                   1425:     yyerrstatus--;
                   1426: 
                   1427:   /* Shift the lookahead token.  */
                   1428:   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
                   1429: 
                   1430:   /* Discard the shifted token.  */
                   1431:   yychar = YYEMPTY;
                   1432: 
                   1433:   yystate = yyn;
                   1434:   *++yyvsp = yylval;
                   1435: 
                   1436:   goto yynewstate;
                   1437: 
                   1438: 
                   1439: /*-----------------------------------------------------------.
                   1440: | yydefault -- do the default action for the current state.  |
                   1441: `-----------------------------------------------------------*/
                   1442: yydefault:
                   1443:   yyn = yydefact[yystate];
                   1444:   if (yyn == 0)
                   1445:     goto yyerrlab;
                   1446:   goto yyreduce;
                   1447: 
                   1448: 
                   1449: /*-----------------------------.
                   1450: | yyreduce -- Do a reduction.  |
                   1451: `-----------------------------*/
                   1452: yyreduce:
                   1453:   /* yyn is the number of a rule to reduce with.  */
                   1454:   yylen = yyr2[yyn];
                   1455: 
                   1456:   /* If YYLEN is nonzero, implement the default value of the action:
                   1457:      `$$ = $1'.
                   1458: 
                   1459:      Otherwise, the following line sets YYVAL to garbage.
                   1460:      This behavior is undocumented and Bison
                   1461:      users should not rely upon it.  Assigning to YYVAL
                   1462:      unconditionally makes the parser a bit smaller, and it avoids a
                   1463:      GCC warning that YYVAL may be used uninitialized.  */
                   1464:   yyval = yyvsp[1-yylen];
                   1465: 
                   1466: 
                   1467:   YY_REDUCE_PRINT (yyn);
                   1468:   switch (yyn)
                   1469:     {
                   1470:         case 2:
                   1471: 
                   1472: /* Line 1455 of yacc.c  */
                   1473: #line 151 "policy_parse.y"
                   1474:     {
                   1475:                        p_dir = (yyvsp[(1) - (2)].num);
                   1476:                        p_type = (yyvsp[(2) - (2)].num);
                   1477: 
                   1478: #ifdef HAVE_PFKEY_POLICY_PRIORITY
                   1479:                        p_priority = PRIORITY_DEFAULT;
                   1480: #else
                   1481:                        p_priority = 0;
                   1482: #endif
                   1483: 
                   1484:                        if (init_x_policy())
                   1485:                                return -1;
                   1486:                }
                   1487:     break;
                   1488: 
                   1489:   case 4:
                   1490: 
                   1491: /* Line 1455 of yacc.c  */
                   1492: #line 166 "policy_parse.y"
                   1493:     {
                   1494:                        p_dir = (yyvsp[(1) - (4)].num);
                   1495:                        p_type = (yyvsp[(4) - (4)].num);
                   1496:                        p_priority_offset = -atol((yyvsp[(3) - (4)].val).buf);
                   1497: 
                   1498:                        errno = 0;
                   1499:                        if (errno != 0 || p_priority_offset < INT32_MIN)
                   1500:                        {
                   1501:                                __ipsec_errcode = EIPSEC_INVAL_PRIORITY_OFFSET;
                   1502:                                return -1;
                   1503:                        }
                   1504: 
                   1505:                        p_priority = PRIORITY_DEFAULT + (u_int32_t) p_priority_offset;
                   1506: 
                   1507:                        if (init_x_policy())
                   1508:                                return -1;
                   1509:                }
                   1510:     break;
                   1511: 
                   1512:   case 6:
                   1513: 
                   1514: /* Line 1455 of yacc.c  */
                   1515: #line 185 "policy_parse.y"
                   1516:     {
                   1517:                        p_dir = (yyvsp[(1) - (5)].num);
                   1518:                        p_type = (yyvsp[(5) - (5)].num);
                   1519: 
                   1520:                        errno = 0;
                   1521:                        p_priority_offset = atol((yyvsp[(4) - (5)].val).buf);
                   1522: 
                   1523:                        if (errno != 0 || p_priority_offset > INT32_MAX)
                   1524:                        {
                   1525:                                __ipsec_errcode = EIPSEC_INVAL_PRIORITY_OFFSET;
                   1526:                                return -1;
                   1527:                        }
                   1528: 
                   1529:                        /* negative input value means lower priority, therefore higher
                   1530:                           actual value so that is closer to the end of the list */
                   1531:                        p_priority = PRIORITY_DEFAULT + (u_int32_t) p_priority_offset;
                   1532: 
                   1533:                        if (init_x_policy())
                   1534:                                return -1;
                   1535:                }
                   1536:     break;
                   1537: 
                   1538:   case 8:
                   1539: 
                   1540: /* Line 1455 of yacc.c  */
                   1541: #line 207 "policy_parse.y"
                   1542:     {
                   1543:                        p_dir = (yyvsp[(1) - (4)].num);
                   1544:                        p_type = (yyvsp[(4) - (4)].num);
                   1545: 
                   1546:                        p_priority = (yyvsp[(3) - (4)].num32);
                   1547: 
                   1548:                        if (init_x_policy())
                   1549:                                return -1;
                   1550:                }
                   1551:     break;
                   1552: 
                   1553:   case 10:
                   1554: 
                   1555: /* Line 1455 of yacc.c  */
                   1556: #line 218 "policy_parse.y"
                   1557:     {
                   1558:                        p_dir = (yyvsp[(1) - (6)].num);
                   1559:                        p_type = (yyvsp[(6) - (6)].num);
                   1560: 
                   1561:                        errno = 0;
                   1562:                        p_priority_offset = atol((yyvsp[(5) - (6)].val).buf);
                   1563: 
                   1564:                        if (errno != 0 || p_priority_offset > PRIORITY_OFFSET_NEGATIVE_MAX)
                   1565:                        {
                   1566:                                __ipsec_errcode = EIPSEC_INVAL_PRIORITY_BASE_OFFSET;
                   1567:                                return -1;
                   1568:                        }
                   1569: 
                   1570:                        /* adding value means higher priority, therefore lower
                   1571:                           actual value so that is closer to the beginning of the list */
                   1572:                        p_priority = (yyvsp[(3) - (6)].num32) - (u_int32_t) p_priority_offset;
                   1573: 
                   1574:                        if (init_x_policy())
                   1575:                                return -1;
                   1576:                }
                   1577:     break;
                   1578: 
                   1579:   case 12:
                   1580: 
                   1581: /* Line 1455 of yacc.c  */
                   1582: #line 240 "policy_parse.y"
                   1583:     {
                   1584:                        p_dir = (yyvsp[(1) - (6)].num);
                   1585:                        p_type = (yyvsp[(6) - (6)].num);
                   1586: 
                   1587:                        errno = 0;
                   1588:                        p_priority_offset = atol((yyvsp[(5) - (6)].val).buf);
                   1589: 
                   1590:                        if (errno != 0 || p_priority_offset > PRIORITY_OFFSET_POSITIVE_MAX)
                   1591:                        {
                   1592:                                __ipsec_errcode = EIPSEC_INVAL_PRIORITY_BASE_OFFSET;
                   1593:                                return -1;
                   1594:                        }
                   1595: 
                   1596:                        /* subtracting value means lower priority, therefore higher
                   1597:                           actual value so that is closer to the end of the list */
                   1598:                        p_priority = (yyvsp[(3) - (6)].num32) + (u_int32_t) p_priority_offset;
                   1599: 
                   1600:                        if (init_x_policy())
                   1601:                                return -1;
                   1602:                }
                   1603:     break;
                   1604: 
                   1605:   case 14:
                   1606: 
                   1607: /* Line 1455 of yacc.c  */
                   1608: #line 262 "policy_parse.y"
                   1609:     {
                   1610:                        p_dir = (yyvsp[(1) - (1)].num);
                   1611:                        p_type = 0;     /* ignored it by kernel */
                   1612: 
                   1613:                        p_priority = 0;
                   1614: 
                   1615:                        if (init_x_policy())
                   1616:                                return -1;
                   1617:                }
                   1618:     break;
                   1619: 
                   1620:   case 16:
                   1621: 
                   1622: /* Line 1455 of yacc.c  */
                   1623: #line 275 "policy_parse.y"
                   1624:     {
                   1625:                        if (rule_check() < 0)
                   1626:                                return -1;
                   1627: 
                   1628:                        if (set_x_request(p_src, p_dst) < 0)
                   1629:                                return -1;
                   1630: 
                   1631:                        policy_parse_request_init();
                   1632:                }
                   1633:     break;
                   1634: 
                   1635:   case 23:
                   1636: 
                   1637: /* Line 1455 of yacc.c  */
                   1638: #line 293 "policy_parse.y"
                   1639:     {
                   1640:                        __ipsec_errcode = EIPSEC_FEW_ARGUMENTS;
                   1641:                        return -1;
                   1642:                }
                   1643:     break;
                   1644: 
                   1645:   case 24:
                   1646: 
                   1647: /* Line 1455 of yacc.c  */
                   1648: #line 297 "policy_parse.y"
                   1649:     {
                   1650:                        __ipsec_errcode = EIPSEC_FEW_ARGUMENTS;
                   1651:                        return -1;
                   1652:                }
                   1653:     break;
                   1654: 
                   1655:   case 25:
                   1656: 
                   1657: /* Line 1455 of yacc.c  */
                   1658: #line 304 "policy_parse.y"
                   1659:     { p_protocol = (yyvsp[(1) - (1)].num); }
                   1660:     break;
                   1661: 
                   1662:   case 26:
                   1663: 
                   1664: /* Line 1455 of yacc.c  */
                   1665: #line 308 "policy_parse.y"
                   1666:     { p_mode = (yyvsp[(1) - (1)].num); }
                   1667:     break;
                   1668: 
                   1669:   case 27:
                   1670: 
                   1671: /* Line 1455 of yacc.c  */
                   1672: #line 312 "policy_parse.y"
                   1673:     {
                   1674:                        p_level = (yyvsp[(1) - (1)].num);
                   1675:                        p_reqid = 0;
                   1676:                }
                   1677:     break;
                   1678: 
                   1679:   case 28:
                   1680: 
                   1681: /* Line 1455 of yacc.c  */
                   1682: #line 316 "policy_parse.y"
                   1683:     {
                   1684:                        p_level = IPSEC_LEVEL_UNIQUE;
                   1685:                        p_reqid = atol((yyvsp[(1) - (1)].val).buf);     /* atol() is good. */
                   1686:                }
                   1687:     break;
                   1688: 
                   1689:   case 29:
                   1690: 
                   1691: /* Line 1455 of yacc.c  */
                   1692: #line 323 "policy_parse.y"
                   1693:     {
                   1694:                        p_src = parse_sockaddr(&(yyvsp[(1) - (1)].val), NULL);
                   1695:                        if (p_src == NULL)
                   1696:                                return -1;
                   1697:                }
                   1698:     break;
                   1699: 
                   1700:   case 30:
                   1701: 
                   1702: /* Line 1455 of yacc.c  */
                   1703: #line 329 "policy_parse.y"
                   1704:     {
                   1705:                        p_dst = parse_sockaddr(&(yyvsp[(4) - (4)].val), NULL);
                   1706:                        if (p_dst == NULL)
                   1707:                                return -1;
                   1708:                }
                   1709:     break;
                   1710: 
                   1711:   case 31:
                   1712: 
                   1713: /* Line 1455 of yacc.c  */
                   1714: #line 334 "policy_parse.y"
                   1715:     {
                   1716:                        p_src = parse_sockaddr(&(yyvsp[(1) - (2)].val), &(yyvsp[(2) - (2)].val));
                   1717:                        if (p_src == NULL)
                   1718:                                return -1;
                   1719:                }
                   1720:     break;
                   1721: 
                   1722:   case 32:
                   1723: 
                   1724: /* Line 1455 of yacc.c  */
                   1725: #line 340 "policy_parse.y"
                   1726:     {
                   1727:                        p_dst = parse_sockaddr(&(yyvsp[(5) - (6)].val), &(yyvsp[(6) - (6)].val));
                   1728:                        if (p_dst == NULL)
                   1729:                                return -1;
                   1730:                }
                   1731:     break;
                   1732: 
                   1733:   case 33:
                   1734: 
                   1735: /* Line 1455 of yacc.c  */
                   1736: #line 345 "policy_parse.y"
                   1737:     {
                   1738:                        if (p_dir != IPSEC_DIR_OUTBOUND) {
                   1739:                                __ipsec_errcode = EIPSEC_INVAL_DIR;
                   1740:                                return -1;
                   1741:                        }
                   1742:                }
                   1743:     break;
                   1744: 
                   1745:   case 34:
                   1746: 
                   1747: /* Line 1455 of yacc.c  */
                   1748: #line 351 "policy_parse.y"
                   1749:     {
                   1750:                        if (p_dir != IPSEC_DIR_INBOUND) {
                   1751:                                __ipsec_errcode = EIPSEC_INVAL_DIR;
                   1752:                                return -1;
                   1753:                        }
                   1754:                }
                   1755:     break;
                   1756: 
                   1757: 
                   1758: 
                   1759: /* Line 1455 of yacc.c  */
                   1760: #line 1761 "policy_parse.c"
                   1761:       default: break;
                   1762:     }
                   1763:   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
                   1764: 
                   1765:   YYPOPSTACK (yylen);
                   1766:   yylen = 0;
                   1767:   YY_STACK_PRINT (yyss, yyssp);
                   1768: 
                   1769:   *++yyvsp = yyval;
                   1770: 
                   1771:   /* Now `shift' the result of the reduction.  Determine what state
                   1772:      that goes to, based on the state we popped back to and the rule
                   1773:      number reduced by.  */
                   1774: 
                   1775:   yyn = yyr1[yyn];
                   1776: 
                   1777:   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
                   1778:   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
                   1779:     yystate = yytable[yystate];
                   1780:   else
                   1781:     yystate = yydefgoto[yyn - YYNTOKENS];
                   1782: 
                   1783:   goto yynewstate;
                   1784: 
                   1785: 
                   1786: /*------------------------------------.
                   1787: | yyerrlab -- here on detecting error |
                   1788: `------------------------------------*/
                   1789: yyerrlab:
                   1790:   /* If not already recovering from an error, report this error.  */
                   1791:   if (!yyerrstatus)
                   1792:     {
                   1793:       ++yynerrs;
                   1794: #if ! YYERROR_VERBOSE
                   1795:       yyerror (YY_("syntax error"));
                   1796: #else
                   1797:       {
                   1798:        YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
                   1799:        if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
                   1800:          {
                   1801:            YYSIZE_T yyalloc = 2 * yysize;
                   1802:            if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
                   1803:              yyalloc = YYSTACK_ALLOC_MAXIMUM;
                   1804:            if (yymsg != yymsgbuf)
                   1805:              YYSTACK_FREE (yymsg);
                   1806:            yymsg = (char *) YYSTACK_ALLOC (yyalloc);
                   1807:            if (yymsg)
                   1808:              yymsg_alloc = yyalloc;
                   1809:            else
                   1810:              {
                   1811:                yymsg = yymsgbuf;
                   1812:                yymsg_alloc = sizeof yymsgbuf;
                   1813:              }
                   1814:          }
                   1815: 
                   1816:        if (0 < yysize && yysize <= yymsg_alloc)
                   1817:          {
                   1818:            (void) yysyntax_error (yymsg, yystate, yychar);
                   1819:            yyerror (yymsg);
                   1820:          }
                   1821:        else
                   1822:          {
                   1823:            yyerror (YY_("syntax error"));
                   1824:            if (yysize != 0)
                   1825:              goto yyexhaustedlab;
                   1826:          }
                   1827:       }
                   1828: #endif
                   1829:     }
                   1830: 
                   1831: 
                   1832: 
                   1833:   if (yyerrstatus == 3)
                   1834:     {
                   1835:       /* If just tried and failed to reuse lookahead token after an
                   1836:         error, discard it.  */
                   1837: 
                   1838:       if (yychar <= YYEOF)
                   1839:        {
                   1840:          /* Return failure if at end of input.  */
                   1841:          if (yychar == YYEOF)
                   1842:            YYABORT;
                   1843:        }
                   1844:       else
                   1845:        {
                   1846:          yydestruct ("Error: discarding",
                   1847:                      yytoken, &yylval);
                   1848:          yychar = YYEMPTY;
                   1849:        }
                   1850:     }
                   1851: 
                   1852:   /* Else will try to reuse lookahead token after shifting the error
                   1853:      token.  */
                   1854:   goto yyerrlab1;
                   1855: 
                   1856: 
                   1857: /*---------------------------------------------------.
                   1858: | yyerrorlab -- error raised explicitly by YYERROR.  |
                   1859: `---------------------------------------------------*/
                   1860: yyerrorlab:
                   1861: 
                   1862:   /* Pacify compilers like GCC when the user code never invokes
                   1863:      YYERROR and the label yyerrorlab therefore never appears in user
                   1864:      code.  */
                   1865:   if (/*CONSTCOND*/ 0)
                   1866:      goto yyerrorlab;
                   1867: 
                   1868:   /* Do not reclaim the symbols of the rule which action triggered
                   1869:      this YYERROR.  */
                   1870:   YYPOPSTACK (yylen);
                   1871:   yylen = 0;
                   1872:   YY_STACK_PRINT (yyss, yyssp);
                   1873:   yystate = *yyssp;
                   1874:   goto yyerrlab1;
                   1875: 
                   1876: 
                   1877: /*-------------------------------------------------------------.
                   1878: | yyerrlab1 -- common code for both syntax error and YYERROR.  |
                   1879: `-------------------------------------------------------------*/
                   1880: yyerrlab1:
                   1881:   yyerrstatus = 3;     /* Each real token shifted decrements this.  */
                   1882: 
                   1883:   for (;;)
                   1884:     {
                   1885:       yyn = yypact[yystate];
                   1886:       if (yyn != YYPACT_NINF)
                   1887:        {
                   1888:          yyn += YYTERROR;
                   1889:          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
                   1890:            {
                   1891:              yyn = yytable[yyn];
                   1892:              if (0 < yyn)
                   1893:                break;
                   1894:            }
                   1895:        }
                   1896: 
                   1897:       /* Pop the current state because it cannot handle the error token.  */
                   1898:       if (yyssp == yyss)
                   1899:        YYABORT;
                   1900: 
                   1901: 
                   1902:       yydestruct ("Error: popping",
                   1903:                  yystos[yystate], yyvsp);
                   1904:       YYPOPSTACK (1);
                   1905:       yystate = *yyssp;
                   1906:       YY_STACK_PRINT (yyss, yyssp);
                   1907:     }
                   1908: 
                   1909:   *++yyvsp = yylval;
                   1910: 
                   1911: 
                   1912:   /* Shift the error token.  */
                   1913:   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
                   1914: 
                   1915:   yystate = yyn;
                   1916:   goto yynewstate;
                   1917: 
                   1918: 
                   1919: /*-------------------------------------.
                   1920: | yyacceptlab -- YYACCEPT comes here.  |
                   1921: `-------------------------------------*/
                   1922: yyacceptlab:
                   1923:   yyresult = 0;
                   1924:   goto yyreturn;
                   1925: 
                   1926: /*-----------------------------------.
                   1927: | yyabortlab -- YYABORT comes here.  |
                   1928: `-----------------------------------*/
                   1929: yyabortlab:
                   1930:   yyresult = 1;
                   1931:   goto yyreturn;
                   1932: 
                   1933: #if !defined(yyoverflow) || YYERROR_VERBOSE
                   1934: /*-------------------------------------------------.
                   1935: | yyexhaustedlab -- memory exhaustion comes here.  |
                   1936: `-------------------------------------------------*/
                   1937: yyexhaustedlab:
                   1938:   yyerror (YY_("memory exhausted"));
                   1939:   yyresult = 2;
                   1940:   /* Fall through.  */
                   1941: #endif
                   1942: 
                   1943: yyreturn:
                   1944:   if (yychar != YYEMPTY)
                   1945:      yydestruct ("Cleanup: discarding lookahead",
                   1946:                 yytoken, &yylval);
                   1947:   /* Do not reclaim the symbols of the rule which action triggered
                   1948:      this YYABORT or YYACCEPT.  */
                   1949:   YYPOPSTACK (yylen);
                   1950:   YY_STACK_PRINT (yyss, yyssp);
                   1951:   while (yyssp != yyss)
                   1952:     {
                   1953:       yydestruct ("Cleanup: popping",
                   1954:                  yystos[*yyssp], yyvsp);
                   1955:       YYPOPSTACK (1);
                   1956:     }
                   1957: #ifndef yyoverflow
                   1958:   if (yyss != yyssa)
                   1959:     YYSTACK_FREE (yyss);
                   1960: #endif
                   1961: #if YYERROR_VERBOSE
                   1962:   if (yymsg != yymsgbuf)
                   1963:     YYSTACK_FREE (yymsg);
                   1964: #endif
                   1965:   /* Make sure YYID is used.  */
                   1966:   return YYID (yyresult);
                   1967: }
                   1968: 
                   1969: 
                   1970: 
                   1971: /* Line 1675 of yacc.c  */
                   1972: #line 362 "policy_parse.y"
                   1973: 
                   1974: 
                   1975: void
                   1976: yyerror(msg)
                   1977:        char *msg;
                   1978: {
                   1979:        fprintf(stderr, "libipsec: %s while parsing \"%s\"\n",
                   1980:                msg, __libipsectext);
                   1981: 
                   1982:        return;
                   1983: }
                   1984: 
                   1985: static struct sockaddr *
                   1986: parse_sockaddr(addrbuf, portbuf)
                   1987:        struct _val *addrbuf;
                   1988:        struct _val *portbuf;
                   1989: {
                   1990:        struct addrinfo hints, *res;
                   1991:        char *addr;
                   1992:        char *serv = NULL;
                   1993:        int error;
                   1994:        struct sockaddr *newaddr = NULL;
                   1995: 
                   1996:        if ((addr = malloc(addrbuf->len + 1)) == NULL) {
                   1997:                yyerror("malloc failed");
                   1998:                __ipsec_set_strerror(strerror(errno));
                   1999:                return NULL;
                   2000:        }
                   2001: 
                   2002:        if (portbuf && ((serv = malloc(portbuf->len + 1)) == NULL)) {
                   2003:                free(addr);
                   2004:                yyerror("malloc failed");
                   2005:                __ipsec_set_strerror(strerror(errno));
                   2006:                return NULL;
                   2007:        }
                   2008: 
                   2009:        strncpy(addr, addrbuf->buf, addrbuf->len);
                   2010:        addr[addrbuf->len] = '\0';
                   2011: 
                   2012:        if (portbuf) {
                   2013:                strncpy(serv, portbuf->buf, portbuf->len);
                   2014:                serv[portbuf->len] = '\0';
                   2015:        }
                   2016: 
                   2017:        memset(&hints, 0, sizeof(hints));
                   2018:        hints.ai_family = PF_UNSPEC;
                   2019:        hints.ai_flags = AI_NUMERICHOST;
                   2020:        hints.ai_socktype = SOCK_DGRAM;
                   2021:        error = getaddrinfo(addr, serv, &hints, &res);
                   2022:        free(addr);
                   2023:        if (serv != NULL)
                   2024:                free(serv);
                   2025:        if (error != 0) {
                   2026:                yyerror("invalid IP address");
                   2027:                __ipsec_set_strerror(gai_strerror(error));
                   2028:                return NULL;
                   2029:        }
                   2030: 
                   2031:        if (res->ai_addr == NULL) {
                   2032:                yyerror("invalid IP address");
                   2033:                __ipsec_set_strerror(gai_strerror(error));
                   2034:                return NULL;
                   2035:        }
                   2036: 
                   2037:        newaddr = malloc(res->ai_addrlen);
                   2038:        if (newaddr == NULL) {
                   2039:                __ipsec_errcode = EIPSEC_NO_BUFS;
                   2040:                freeaddrinfo(res);
                   2041:                return NULL;
                   2042:        }
                   2043:        memcpy(newaddr, res->ai_addr, res->ai_addrlen);
                   2044: 
                   2045:        freeaddrinfo(res);
                   2046: 
                   2047:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2048:        return newaddr;
                   2049: }
                   2050: 
                   2051: static int
                   2052: rule_check()
                   2053: {
                   2054:        if (p_type == IPSEC_POLICY_IPSEC) {
                   2055:                if (p_protocol == IPPROTO_IP) {
                   2056:                        __ipsec_errcode = EIPSEC_NO_PROTO;
                   2057:                        return -1;
                   2058:                }
                   2059: 
                   2060:                if (p_mode != IPSEC_MODE_TRANSPORT
                   2061:                 && p_mode != IPSEC_MODE_TUNNEL) {
                   2062:                        __ipsec_errcode = EIPSEC_INVAL_MODE;
                   2063:                        return -1;
                   2064:                }
                   2065: 
                   2066:                if (p_src == NULL && p_dst == NULL) {
                   2067:                         if (p_mode != IPSEC_MODE_TRANSPORT) {
                   2068:                                __ipsec_errcode = EIPSEC_INVAL_ADDRESS;
                   2069:                                return -1;
                   2070:                        }
                   2071:                }
                   2072:                else if (p_src->sa_family != p_dst->sa_family) {
                   2073:                        __ipsec_errcode = EIPSEC_FAMILY_MISMATCH;
                   2074:                        return -1;
                   2075:                }
                   2076:        }
                   2077: 
                   2078:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2079:        return 0;
                   2080: }
                   2081: 
                   2082: static int
                   2083: init_x_policy()
                   2084: {
                   2085:        struct sadb_x_policy *p;
                   2086: 
                   2087:        if (pbuf) {
                   2088:                free(pbuf);
                   2089:                tlen = 0;
                   2090:        }
                   2091:        pbuf = malloc(sizeof(struct sadb_x_policy));
                   2092:        if (pbuf == NULL) {
                   2093:                __ipsec_errcode = EIPSEC_NO_BUFS;
                   2094:                return -1;
                   2095:        }
                   2096:        tlen = sizeof(struct sadb_x_policy);
                   2097: 
                   2098:        memset(pbuf, 0, tlen);
                   2099:        p = (struct sadb_x_policy *)pbuf;
                   2100:        p->sadb_x_policy_len = 0;       /* must update later */
                   2101:        p->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
                   2102:        p->sadb_x_policy_type = p_type;
                   2103:        p->sadb_x_policy_dir = p_dir;
                   2104:        p->sadb_x_policy_id = 0;
                   2105: #ifdef HAVE_PFKEY_POLICY_PRIORITY
                   2106:        p->sadb_x_policy_priority = p_priority;
                   2107: #else
                   2108:     /* fail if given a priority and libipsec was not compiled with 
                   2109:           priority support */
                   2110:        if (p_priority != 0)
                   2111:        {
                   2112:                __ipsec_errcode = EIPSEC_PRIORITY_NOT_COMPILED;
                   2113:                return -1;
                   2114:        }
                   2115: #endif
                   2116: 
                   2117:        offset = tlen;
                   2118: 
                   2119:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2120:        return 0;
                   2121: }
                   2122: 
                   2123: static int
                   2124: set_x_request(src, dst)
                   2125:        struct sockaddr *src, *dst;
                   2126: {
                   2127:        struct sadb_x_ipsecrequest *p;
                   2128:        int reqlen;
                   2129:        u_int8_t *n;
                   2130: 
                   2131:        reqlen = sizeof(*p)
                   2132:                + (src ? sysdep_sa_len(src) : 0)
                   2133:                + (dst ? sysdep_sa_len(dst) : 0);
                   2134:        tlen += reqlen;         /* increment to total length */
                   2135: 
                   2136:        n = realloc(pbuf, tlen);
                   2137:        if (n == NULL) {
                   2138:                __ipsec_errcode = EIPSEC_NO_BUFS;
                   2139:                return -1;
                   2140:        }
                   2141:        pbuf = n;
                   2142: 
                   2143:        p = (struct sadb_x_ipsecrequest *)&pbuf[offset];
                   2144:        p->sadb_x_ipsecrequest_len = reqlen;
                   2145:        p->sadb_x_ipsecrequest_proto = p_protocol;
                   2146:        p->sadb_x_ipsecrequest_mode = p_mode;
                   2147:        p->sadb_x_ipsecrequest_level = p_level;
                   2148:        p->sadb_x_ipsecrequest_reqid = p_reqid;
                   2149:        offset += sizeof(*p);
                   2150: 
                   2151:        if (set_sockaddr(src) || set_sockaddr(dst))
                   2152:                return -1;
                   2153: 
                   2154:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2155:        return 0;
                   2156: }
                   2157: 
                   2158: static int
                   2159: set_sockaddr(addr)
                   2160:        struct sockaddr *addr;
                   2161: {
                   2162:        if (addr == NULL) {
                   2163:                __ipsec_errcode = EIPSEC_NO_ERROR;
                   2164:                return 0;
                   2165:        }
                   2166: 
                   2167:        /* tlen has already incremented */
                   2168: 
                   2169:        memcpy(&pbuf[offset], addr, sysdep_sa_len(addr));
                   2170: 
                   2171:        offset += sysdep_sa_len(addr);
                   2172: 
                   2173:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2174:        return 0;
                   2175: }
                   2176: 
                   2177: static void
                   2178: policy_parse_request_init()
                   2179: {
                   2180:        p_protocol = IPPROTO_IP;
                   2181:        p_mode = IPSEC_MODE_ANY;
                   2182:        p_level = IPSEC_LEVEL_DEFAULT;
                   2183:        p_reqid = 0;
                   2184:        if (p_src != NULL) {
                   2185:                free(p_src);
                   2186:                p_src = NULL;
                   2187:        }
                   2188:        if (p_dst != NULL) {
                   2189:                free(p_dst);
                   2190:                p_dst = NULL;
                   2191:        }
                   2192: 
                   2193:        return;
                   2194: }
                   2195: 
                   2196: static void *
                   2197: policy_parse(msg, msglen)
                   2198:        const char *msg;
                   2199:        int msglen;
                   2200: {
                   2201:        int error;
                   2202: 
                   2203:        pbuf = NULL;
                   2204:        tlen = 0;
                   2205: 
                   2206:        /* initialize */
                   2207:        p_dir = IPSEC_DIR_INVALID;
                   2208:        p_type = IPSEC_POLICY_DISCARD;
                   2209:        policy_parse_request_init();
                   2210:        __policy__strbuffer__init__(msg);
                   2211: 
                   2212:        error = yyparse();      /* it must be set errcode. */
                   2213:        __policy__strbuffer__free__();
                   2214: 
                   2215:        if (error) {
                   2216:                if (pbuf != NULL)
                   2217:                        free(pbuf);
                   2218:                return NULL;
                   2219:        }
                   2220: 
                   2221:        /* update total length */
                   2222:        ((struct sadb_x_policy *)pbuf)->sadb_x_policy_len = PFKEY_UNIT64(tlen);
                   2223: 
                   2224:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2225: 
                   2226:        return pbuf;
                   2227: }
                   2228: 
                   2229: ipsec_policy_t
                   2230: ipsec_set_policy(msg, msglen)
                   2231:        __ipsec_const char *msg;
                   2232:        int msglen;
                   2233: {
                   2234:        caddr_t policy;
                   2235: 
                   2236:        policy = policy_parse(msg, msglen);
                   2237:        if (policy == NULL) {
                   2238:                if (__ipsec_errcode == EIPSEC_NO_ERROR)
                   2239:                        __ipsec_errcode = EIPSEC_INVAL_ARGUMENT;
                   2240:                return NULL;
                   2241:        }
                   2242: 
                   2243:        __ipsec_errcode = EIPSEC_NO_ERROR;
                   2244:        return policy;
                   2245: }
                   2246: 

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