Annotation of embedaddon/ipsec-tools/src/libipsec/policy_parse.c, revision 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>