Annotation of embedaddon/ipsec-tools/src/setkey/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:
! 67:
! 68: /* Copy the first part of user declarations. */
! 69:
! 70: /* Line 189 of yacc.c */
! 71: #line 34 "parse.y"
! 72:
! 73: #ifdef HAVE_CONFIG_H
! 74: #include "config.h"
! 75: #endif
! 76:
! 77: #include <sys/types.h>
! 78: #include <sys/param.h>
! 79: #include <sys/socket.h>
! 80:
! 81: #include <netinet/in.h>
! 82: #include <net/pfkeyv2.h>
! 83: #include PATH_IPSEC_H
! 84: #include <arpa/inet.h>
! 85:
! 86: #include <string.h>
! 87: #include <unistd.h>
! 88: #include <stdio.h>
! 89: #include <netdb.h>
! 90: #include <ctype.h>
! 91: #include <errno.h>
! 92: #include <stdlib.h>
! 93:
! 94: #include "libpfkey.h"
! 95: #include "vchar.h"
! 96: #include "extern.h"
! 97:
! 98: #define DEFAULT_NATT_PORT 4500
! 99:
! 100: #ifndef UDP_ENCAP_ESPINUDP
! 101: #define UDP_ENCAP_ESPINUDP 2
! 102: #endif
! 103:
! 104: #define ATOX(c) \
! 105: (isdigit((int)c) ? (c - '0') : \
! 106: (isupper((int)c) ? (c - 'A' + 10) : (c - 'a' + 10)))
! 107:
! 108: u_int32_t p_spi;
! 109: u_int p_ext, p_alg_enc, p_alg_auth, p_replay, p_mode;
! 110: u_int32_t p_reqid;
! 111: u_int p_key_enc_len, p_key_auth_len;
! 112: const char *p_key_enc;
! 113: const char *p_key_auth;
! 114: time_t p_lt_hard, p_lt_soft;
! 115: size_t p_lb_hard, p_lb_soft;
! 116:
! 117: struct security_ctx {
! 118: u_int8_t doi;
! 119: u_int8_t alg;
! 120: u_int16_t len;
! 121: char *buf;
! 122: };
! 123:
! 124: struct security_ctx sec_ctx;
! 125:
! 126: static u_int p_natt_type;
! 127: static struct addrinfo * p_natt_oa = NULL;
! 128:
! 129: static int p_aiflags = 0, p_aifamily = PF_UNSPEC;
! 130:
! 131: static struct addrinfo *parse_addr __P((char *, char *));
! 132: static int fix_portstr __P((int, vchar_t *, vchar_t *, vchar_t *));
! 133: static int setvarbuf __P((char *, int *, struct sadb_ext *, int,
! 134: const void *, int));
! 135: void parse_init __P((void));
! 136: void free_buffer __P((void));
! 137:
! 138: int setkeymsg0 __P((struct sadb_msg *, unsigned int, unsigned int, size_t));
! 139: static int setkeymsg_spdaddr __P((unsigned int, unsigned int, vchar_t *,
! 140: struct addrinfo *, int, struct addrinfo *, int));
! 141: static int setkeymsg_spdaddr_tag __P((unsigned int, char *, vchar_t *));
! 142: static int setkeymsg_addr __P((unsigned int, unsigned int,
! 143: struct addrinfo *, struct addrinfo *, int));
! 144: static int setkeymsg_add __P((unsigned int, unsigned int,
! 145: struct addrinfo *, struct addrinfo *));
! 146:
! 147:
! 148: /* Line 189 of yacc.c */
! 149: #line 150 "parse.c"
! 150:
! 151: /* Enabling traces. */
! 152: #ifndef YYDEBUG
! 153: # define YYDEBUG 0
! 154: #endif
! 155:
! 156: /* Enabling verbose error messages. */
! 157: #ifdef YYERROR_VERBOSE
! 158: # undef YYERROR_VERBOSE
! 159: # define YYERROR_VERBOSE 1
! 160: #else
! 161: # define YYERROR_VERBOSE 0
! 162: #endif
! 163:
! 164: /* Enabling the token table. */
! 165: #ifndef YYTOKEN_TABLE
! 166: # define YYTOKEN_TABLE 0
! 167: #endif
! 168:
! 169:
! 170: /* Tokens. */
! 171: #ifndef YYTOKENTYPE
! 172: # define YYTOKENTYPE
! 173: /* Put the tokens into the symbol table, so that GDB and other debuggers
! 174: know about them. */
! 175: enum yytokentype {
! 176: EOT = 258,
! 177: SLASH = 259,
! 178: BLCL = 260,
! 179: ELCL = 261,
! 180: ADD = 262,
! 181: GET = 263,
! 182: DELETE = 264,
! 183: DELETEALL = 265,
! 184: FLUSH = 266,
! 185: DUMP = 267,
! 186: EXIT = 268,
! 187: PR_ESP = 269,
! 188: PR_AH = 270,
! 189: PR_IPCOMP = 271,
! 190: PR_ESPUDP = 272,
! 191: PR_TCP = 273,
! 192: F_PROTOCOL = 274,
! 193: F_AUTH = 275,
! 194: F_ENC = 276,
! 195: F_REPLAY = 277,
! 196: F_COMP = 278,
! 197: F_RAWCPI = 279,
! 198: F_MODE = 280,
! 199: MODE = 281,
! 200: F_REQID = 282,
! 201: F_EXT = 283,
! 202: EXTENSION = 284,
! 203: NOCYCLICSEQ = 285,
! 204: ALG_AUTH = 286,
! 205: ALG_AUTH_NOKEY = 287,
! 206: ALG_ENC = 288,
! 207: ALG_ENC_NOKEY = 289,
! 208: ALG_ENC_DESDERIV = 290,
! 209: ALG_ENC_DES32IV = 291,
! 210: ALG_ENC_OLD = 292,
! 211: ALG_COMP = 293,
! 212: F_LIFETIME_HARD = 294,
! 213: F_LIFETIME_SOFT = 295,
! 214: F_LIFEBYTE_HARD = 296,
! 215: F_LIFEBYTE_SOFT = 297,
! 216: DECSTRING = 298,
! 217: QUOTEDSTRING = 299,
! 218: HEXSTRING = 300,
! 219: STRING = 301,
! 220: ANY = 302,
! 221: SPDADD = 303,
! 222: SPDUPDATE = 304,
! 223: SPDDELETE = 305,
! 224: SPDDUMP = 306,
! 225: SPDFLUSH = 307,
! 226: F_POLICY = 308,
! 227: PL_REQUESTS = 309,
! 228: F_AIFLAGS = 310,
! 229: TAGGED = 311,
! 230: SECURITY_CTX = 312
! 231: };
! 232: #endif
! 233: /* Tokens. */
! 234: #define EOT 258
! 235: #define SLASH 259
! 236: #define BLCL 260
! 237: #define ELCL 261
! 238: #define ADD 262
! 239: #define GET 263
! 240: #define DELETE 264
! 241: #define DELETEALL 265
! 242: #define FLUSH 266
! 243: #define DUMP 267
! 244: #define EXIT 268
! 245: #define PR_ESP 269
! 246: #define PR_AH 270
! 247: #define PR_IPCOMP 271
! 248: #define PR_ESPUDP 272
! 249: #define PR_TCP 273
! 250: #define F_PROTOCOL 274
! 251: #define F_AUTH 275
! 252: #define F_ENC 276
! 253: #define F_REPLAY 277
! 254: #define F_COMP 278
! 255: #define F_RAWCPI 279
! 256: #define F_MODE 280
! 257: #define MODE 281
! 258: #define F_REQID 282
! 259: #define F_EXT 283
! 260: #define EXTENSION 284
! 261: #define NOCYCLICSEQ 285
! 262: #define ALG_AUTH 286
! 263: #define ALG_AUTH_NOKEY 287
! 264: #define ALG_ENC 288
! 265: #define ALG_ENC_NOKEY 289
! 266: #define ALG_ENC_DESDERIV 290
! 267: #define ALG_ENC_DES32IV 291
! 268: #define ALG_ENC_OLD 292
! 269: #define ALG_COMP 293
! 270: #define F_LIFETIME_HARD 294
! 271: #define F_LIFETIME_SOFT 295
! 272: #define F_LIFEBYTE_HARD 296
! 273: #define F_LIFEBYTE_SOFT 297
! 274: #define DECSTRING 298
! 275: #define QUOTEDSTRING 299
! 276: #define HEXSTRING 300
! 277: #define STRING 301
! 278: #define ANY 302
! 279: #define SPDADD 303
! 280: #define SPDUPDATE 304
! 281: #define SPDDELETE 305
! 282: #define SPDDUMP 306
! 283: #define SPDFLUSH 307
! 284: #define F_POLICY 308
! 285: #define PL_REQUESTS 309
! 286: #define F_AIFLAGS 310
! 287: #define TAGGED 311
! 288: #define SECURITY_CTX 312
! 289:
! 290:
! 291:
! 292:
! 293: #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
! 294: typedef union YYSTYPE
! 295: {
! 296:
! 297: /* Line 214 of yacc.c */
! 298: #line 110 "parse.y"
! 299:
! 300: int num;
! 301: unsigned long ulnum;
! 302: vchar_t val;
! 303: struct addrinfo *res;
! 304:
! 305:
! 306:
! 307: /* Line 214 of yacc.c */
! 308: #line 309 "parse.c"
! 309: } YYSTYPE;
! 310: # define YYSTYPE_IS_TRIVIAL 1
! 311: # define yystype YYSTYPE /* obsolescent; will be withdrawn */
! 312: # define YYSTYPE_IS_DECLARED 1
! 313: #endif
! 314:
! 315:
! 316: /* Copy the second part of user declarations. */
! 317:
! 318:
! 319: /* Line 264 of yacc.c */
! 320: #line 321 "parse.c"
! 321:
! 322: #ifdef short
! 323: # undef short
! 324: #endif
! 325:
! 326: #ifdef YYTYPE_UINT8
! 327: typedef YYTYPE_UINT8 yytype_uint8;
! 328: #else
! 329: typedef unsigned char yytype_uint8;
! 330: #endif
! 331:
! 332: #ifdef YYTYPE_INT8
! 333: typedef YYTYPE_INT8 yytype_int8;
! 334: #elif (defined __STDC__ || defined __C99__FUNC__ \
! 335: || defined __cplusplus || defined _MSC_VER)
! 336: typedef signed char yytype_int8;
! 337: #else
! 338: typedef short int yytype_int8;
! 339: #endif
! 340:
! 341: #ifdef YYTYPE_UINT16
! 342: typedef YYTYPE_UINT16 yytype_uint16;
! 343: #else
! 344: typedef unsigned short int yytype_uint16;
! 345: #endif
! 346:
! 347: #ifdef YYTYPE_INT16
! 348: typedef YYTYPE_INT16 yytype_int16;
! 349: #else
! 350: typedef short int yytype_int16;
! 351: #endif
! 352:
! 353: #ifndef YYSIZE_T
! 354: # ifdef __SIZE_TYPE__
! 355: # define YYSIZE_T __SIZE_TYPE__
! 356: # elif defined size_t
! 357: # define YYSIZE_T size_t
! 358: # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
! 359: || defined __cplusplus || defined _MSC_VER)
! 360: # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
! 361: # define YYSIZE_T size_t
! 362: # else
! 363: # define YYSIZE_T unsigned int
! 364: # endif
! 365: #endif
! 366:
! 367: #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
! 368:
! 369: #ifndef YY_
! 370: # if YYENABLE_NLS
! 371: # if ENABLE_NLS
! 372: # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
! 373: # define YY_(msgid) dgettext ("bison-runtime", msgid)
! 374: # endif
! 375: # endif
! 376: # ifndef YY_
! 377: # define YY_(msgid) msgid
! 378: # endif
! 379: #endif
! 380:
! 381: /* Suppress unused-variable warnings by "using" E. */
! 382: #if ! defined lint || defined __GNUC__
! 383: # define YYUSE(e) ((void) (e))
! 384: #else
! 385: # define YYUSE(e) /* empty */
! 386: #endif
! 387:
! 388: /* Identity function, used to suppress warnings about constant conditions. */
! 389: #ifndef lint
! 390: # define YYID(n) (n)
! 391: #else
! 392: #if (defined __STDC__ || defined __C99__FUNC__ \
! 393: || defined __cplusplus || defined _MSC_VER)
! 394: static int
! 395: YYID (int yyi)
! 396: #else
! 397: static int
! 398: YYID (yyi)
! 399: int yyi;
! 400: #endif
! 401: {
! 402: return yyi;
! 403: }
! 404: #endif
! 405:
! 406: #if ! defined yyoverflow || YYERROR_VERBOSE
! 407:
! 408: /* The parser invokes alloca or malloc; define the necessary symbols. */
! 409:
! 410: # ifdef YYSTACK_USE_ALLOCA
! 411: # if YYSTACK_USE_ALLOCA
! 412: # ifdef __GNUC__
! 413: # define YYSTACK_ALLOC __builtin_alloca
! 414: # elif defined __BUILTIN_VA_ARG_INCR
! 415: # include <alloca.h> /* INFRINGES ON USER NAME SPACE */
! 416: # elif defined _AIX
! 417: # define YYSTACK_ALLOC __alloca
! 418: # elif defined _MSC_VER
! 419: # include <malloc.h> /* INFRINGES ON USER NAME SPACE */
! 420: # define alloca _alloca
! 421: # else
! 422: # define YYSTACK_ALLOC alloca
! 423: # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
! 424: || defined __cplusplus || defined _MSC_VER)
! 425: # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
! 426: # ifndef _STDLIB_H
! 427: # define _STDLIB_H 1
! 428: # endif
! 429: # endif
! 430: # endif
! 431: # endif
! 432: # endif
! 433:
! 434: # ifdef YYSTACK_ALLOC
! 435: /* Pacify GCC's `empty if-body' warning. */
! 436: # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
! 437: # ifndef YYSTACK_ALLOC_MAXIMUM
! 438: /* The OS might guarantee only one guard page at the bottom of the stack,
! 439: and a page size can be as small as 4096 bytes. So we cannot safely
! 440: invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
! 441: to allow for a few compiler-allocated temporary stack slots. */
! 442: # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
! 443: # endif
! 444: # else
! 445: # define YYSTACK_ALLOC YYMALLOC
! 446: # define YYSTACK_FREE YYFREE
! 447: # ifndef YYSTACK_ALLOC_MAXIMUM
! 448: # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
! 449: # endif
! 450: # if (defined __cplusplus && ! defined _STDLIB_H \
! 451: && ! ((defined YYMALLOC || defined malloc) \
! 452: && (defined YYFREE || defined free)))
! 453: # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
! 454: # ifndef _STDLIB_H
! 455: # define _STDLIB_H 1
! 456: # endif
! 457: # endif
! 458: # ifndef YYMALLOC
! 459: # define YYMALLOC malloc
! 460: # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
! 461: || defined __cplusplus || defined _MSC_VER)
! 462: void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
! 463: # endif
! 464: # endif
! 465: # ifndef YYFREE
! 466: # define YYFREE free
! 467: # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
! 468: || defined __cplusplus || defined _MSC_VER)
! 469: void free (void *); /* INFRINGES ON USER NAME SPACE */
! 470: # endif
! 471: # endif
! 472: # endif
! 473: #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
! 474:
! 475:
! 476: #if (! defined yyoverflow \
! 477: && (! defined __cplusplus \
! 478: || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
! 479:
! 480: /* A type that is properly aligned for any stack member. */
! 481: union yyalloc
! 482: {
! 483: yytype_int16 yyss_alloc;
! 484: YYSTYPE yyvs_alloc;
! 485: };
! 486:
! 487: /* The size of the maximum gap between one aligned stack and the next. */
! 488: # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
! 489:
! 490: /* The size of an array large to enough to hold all stacks, each with
! 491: N elements. */
! 492: # define YYSTACK_BYTES(N) \
! 493: ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
! 494: + YYSTACK_GAP_MAXIMUM)
! 495:
! 496: /* Copy COUNT objects from FROM to TO. The source and destination do
! 497: not overlap. */
! 498: # ifndef YYCOPY
! 499: # if defined __GNUC__ && 1 < __GNUC__
! 500: # define YYCOPY(To, From, Count) \
! 501: __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
! 502: # else
! 503: # define YYCOPY(To, From, Count) \
! 504: do \
! 505: { \
! 506: YYSIZE_T yyi; \
! 507: for (yyi = 0; yyi < (Count); yyi++) \
! 508: (To)[yyi] = (From)[yyi]; \
! 509: } \
! 510: while (YYID (0))
! 511: # endif
! 512: # endif
! 513:
! 514: /* Relocate STACK from its old location to the new one. The
! 515: local variables YYSIZE and YYSTACKSIZE give the old and new number of
! 516: elements in the stack, and YYPTR gives the new location of the
! 517: stack. Advance YYPTR to a properly aligned location for the next
! 518: stack. */
! 519: # define YYSTACK_RELOCATE(Stack_alloc, Stack) \
! 520: do \
! 521: { \
! 522: YYSIZE_T yynewbytes; \
! 523: YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
! 524: Stack = &yyptr->Stack_alloc; \
! 525: yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
! 526: yyptr += yynewbytes / sizeof (*yyptr); \
! 527: } \
! 528: while (YYID (0))
! 529:
! 530: #endif
! 531:
! 532: /* YYFINAL -- State number of the termination state. */
! 533: #define YYFINAL 2
! 534: /* YYLAST -- Last index in YYTABLE. */
! 535: #define YYLAST 174
! 536:
! 537: /* YYNTOKENS -- Number of terminals. */
! 538: #define YYNTOKENS 58
! 539: /* YYNNTS -- Number of nonterminals. */
! 540: #define YYNNTS 37
! 541: /* YYNRULES -- Number of rules. */
! 542: #define YYNRULES 90
! 543: /* YYNRULES -- Number of states. */
! 544: #define YYNSTATES 188
! 545:
! 546: /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
! 547: #define YYUNDEFTOK 2
! 548: #define YYMAXUTOK 312
! 549:
! 550: #define YYTRANSLATE(YYX) \
! 551: ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
! 552:
! 553: /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
! 554: static const yytype_uint8 yytranslate[] =
! 555: {
! 556: 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 557: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 558: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 559: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 560: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 561: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 562: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 563: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 564: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 565: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 566: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 567: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 568: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 569: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 570: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 571: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 572: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 573: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 574: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 575: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 576: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 577: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 578: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 579: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 580: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 581: 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
! 582: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
! 583: 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
! 584: 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
! 585: 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
! 586: 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
! 587: 55, 56, 57
! 588: };
! 589:
! 590: #if YYDEBUG
! 591: /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
! 592: YYRHS. */
! 593: static const yytype_uint16 yyprhs[] =
! 594: {
! 595: 0, 0, 3, 4, 7, 9, 11, 13, 15, 17,
! 596: 19, 21, 23, 25, 27, 29, 31, 41, 50, 57,
! 597: 66, 70, 74, 75, 77, 79, 81, 83, 86, 88,
! 598: 90, 92, 94, 96, 98, 103, 106, 109, 112, 116,
! 599: 118, 121, 123, 126, 129, 132, 134, 136, 138, 139,
! 600: 142, 145, 148, 151, 154, 157, 160, 163, 166, 169,
! 601: 172, 177, 191, 197, 211, 217, 231, 234, 237, 238,
! 602: 241, 243, 245, 247, 250, 251, 254, 255, 259, 263,
! 603: 267, 269, 271, 273, 275, 276, 278, 279, 284, 287,
! 604: 289
! 605: };
! 606:
! 607: /* YYRHS -- A `-1'-separated list of the rules' RHS. */
! 608: static const yytype_int8 yyrhs[] =
! 609: {
! 610: 59, 0, -1, -1, 59, 60, -1, 61, -1, 64,
! 611: -1, 62, -1, 63, -1, 65, -1, 66, -1, 94,
! 612: -1, 78, -1, 79, -1, 80, -1, 81, -1, 82,
! 613: -1, 7, 83, 86, 86, 67, 68, 76, 69, 3,
! 614: -1, 9, 83, 86, 86, 67, 68, 76, 3, -1,
! 615: 10, 83, 85, 85, 67, 3, -1, 8, 83, 86,
! 616: 86, 67, 68, 76, 3, -1, 11, 67, 3, -1,
! 617: 12, 67, 3, -1, -1, 14, -1, 15, -1, 16,
! 618: -1, 17, -1, 17, 85, -1, 18, -1, 43, -1,
! 619: 45, -1, 70, -1, 71, -1, 72, -1, 21, 73,
! 620: 20, 74, -1, 21, 73, -1, 20, 74, -1, 23,
! 621: 38, -1, 23, 38, 24, -1, 34, -1, 33, 75,
! 622: -1, 37, -1, 35, 75, -1, 36, 75, -1, 31,
! 623: 75, -1, 32, -1, 44, -1, 45, -1, -1, 76,
! 624: 77, -1, 28, 29, -1, 28, 30, -1, 25, 26,
! 625: -1, 25, 47, -1, 27, 43, -1, 22, 43, -1,
! 626: 39, 43, -1, 40, 43, -1, 41, 43, -1, 42,
! 627: 43, -1, 57, 43, 43, 44, -1, 48, 83, 46,
! 628: 87, 88, 46, 87, 88, 89, 90, 91, 92, 3,
! 629: -1, 48, 56, 44, 92, 3, -1, 49, 83, 46,
! 630: 87, 88, 46, 87, 88, 89, 90, 91, 92, 3,
! 631: -1, 49, 56, 44, 92, 3, -1, 50, 83, 46,
! 632: 87, 88, 46, 87, 88, 89, 90, 91, 92, 3,
! 633: -1, 51, 3, -1, 52, 3, -1, -1, 83, 84,
! 634: -1, 55, -1, 46, -1, 46, -1, 46, 88, -1,
! 635: -1, 4, 43, -1, -1, 5, 47, 6, -1, 5,
! 636: 43, 6, -1, 5, 46, 6, -1, 43, -1, 47,
! 637: -1, 18, -1, 46, -1, -1, 46, -1, -1, 57,
! 638: 43, 43, 44, -1, 53, 93, -1, 54, -1, 13,
! 639: 3, -1
! 640: };
! 641:
! 642: /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
! 643: static const yytype_uint16 yyrline[] =
! 644: {
! 645: 0, 151, 151, 153, 161, 162, 163, 164, 165, 166,
! 646: 167, 168, 169, 170, 171, 172, 178, 190, 209, 237,
! 647: 252, 262, 272, 275, 283, 291, 295, 302, 309, 318,
! 648: 319, 340, 341, 342, 346, 347, 351, 355, 363, 375,
! 649: 390, 405, 421, 442, 466, 491, 504, 508, 537, 539,
! 650: 543, 544, 545, 546, 547, 548, 557, 558, 559, 560,
! 651: 561, 573, 606, 619, 652, 664, 696, 707, 716, 718,
! 652: 722, 747, 758, 766, 777, 778, 783, 791, 800, 811,
! 653: 818, 819, 820, 823, 846, 850, 861, 863, 872, 896,
! 654: 901
! 655: };
! 656: #endif
! 657:
! 658: #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
! 659: /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
! 660: First, the terminals, then, starting at YYNTOKENS, nonterminals. */
! 661: static const char *const yytname[] =
! 662: {
! 663: "$end", "error", "$undefined", "EOT", "SLASH", "BLCL", "ELCL", "ADD",
! 664: "GET", "DELETE", "DELETEALL", "FLUSH", "DUMP", "EXIT", "PR_ESP", "PR_AH",
! 665: "PR_IPCOMP", "PR_ESPUDP", "PR_TCP", "F_PROTOCOL", "F_AUTH", "F_ENC",
! 666: "F_REPLAY", "F_COMP", "F_RAWCPI", "F_MODE", "MODE", "F_REQID", "F_EXT",
! 667: "EXTENSION", "NOCYCLICSEQ", "ALG_AUTH", "ALG_AUTH_NOKEY", "ALG_ENC",
! 668: "ALG_ENC_NOKEY", "ALG_ENC_DESDERIV", "ALG_ENC_DES32IV", "ALG_ENC_OLD",
! 669: "ALG_COMP", "F_LIFETIME_HARD", "F_LIFETIME_SOFT", "F_LIFEBYTE_HARD",
! 670: "F_LIFEBYTE_SOFT", "DECSTRING", "QUOTEDSTRING", "HEXSTRING", "STRING",
! 671: "ANY", "SPDADD", "SPDUPDATE", "SPDDELETE", "SPDDUMP", "SPDFLUSH",
! 672: "F_POLICY", "PL_REQUESTS", "F_AIFLAGS", "TAGGED", "SECURITY_CTX",
! 673: "$accept", "commands", "command", "add_command", "delete_command",
! 674: "deleteall_command", "get_command", "flush_command", "dump_command",
! 675: "protocol_spec", "spi", "algorithm_spec", "esp_spec", "ah_spec",
! 676: "ipcomp_spec", "enc_alg", "auth_alg", "key_string", "extension_spec",
! 677: "extension", "spdadd_command", "spdupdate_command", "spddelete_command",
! 678: "spddump_command", "spdflush_command", "ipaddropts", "ipaddropt",
! 679: "ipaddr", "ipandport", "prefix", "portstr", "upper_spec",
! 680: "upper_misc_spec", "context_spec", "policy_spec", "policy_requests",
! 681: "exit_command", 0
! 682: };
! 683: #endif
! 684:
! 685: # ifdef YYPRINT
! 686: /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
! 687: token YYLEX-NUM. */
! 688: static const yytype_uint16 yytoknum[] =
! 689: {
! 690: 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
! 691: 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
! 692: 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
! 693: 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
! 694: 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
! 695: 305, 306, 307, 308, 309, 310, 311, 312
! 696: };
! 697: # endif
! 698:
! 699: /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
! 700: static const yytype_uint8 yyr1[] =
! 701: {
! 702: 0, 58, 59, 59, 60, 60, 60, 60, 60, 60,
! 703: 60, 60, 60, 60, 60, 60, 61, 62, 63, 64,
! 704: 65, 66, 67, 67, 67, 67, 67, 67, 67, 68,
! 705: 68, 69, 69, 69, 70, 70, 71, 72, 72, 73,
! 706: 73, 73, 73, 73, 74, 74, 75, 75, 76, 76,
! 707: 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
! 708: 77, 78, 78, 79, 79, 80, 81, 82, 83, 83,
! 709: 84, 85, 86, 86, 87, 87, 88, 88, 88, 88,
! 710: 89, 89, 89, 89, 90, 90, 91, 91, 92, 93,
! 711: 94
! 712: };
! 713:
! 714: /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
! 715: static const yytype_uint8 yyr2[] =
! 716: {
! 717: 0, 2, 0, 2, 1, 1, 1, 1, 1, 1,
! 718: 1, 1, 1, 1, 1, 1, 9, 8, 6, 8,
! 719: 3, 3, 0, 1, 1, 1, 1, 2, 1, 1,
! 720: 1, 1, 1, 1, 4, 2, 2, 2, 3, 1,
! 721: 2, 1, 2, 2, 2, 1, 1, 1, 0, 2,
! 722: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
! 723: 4, 13, 5, 13, 5, 13, 2, 2, 0, 2,
! 724: 1, 1, 1, 2, 0, 2, 0, 3, 3, 3,
! 725: 1, 1, 1, 1, 0, 1, 0, 4, 2, 1,
! 726: 2
! 727: };
! 728:
! 729: /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
! 730: STATE-NUM when YYTABLE doesn't specify something else to do. Zero
! 731: means the default is an error. */
! 732: static const yytype_uint8 yydefact[] =
! 733: {
! 734: 2, 0, 1, 68, 68, 68, 68, 22, 22, 0,
! 735: 68, 68, 68, 0, 0, 3, 4, 6, 7, 5,
! 736: 8, 9, 11, 12, 13, 14, 15, 10, 0, 0,
! 737: 0, 0, 23, 24, 25, 26, 28, 0, 0, 90,
! 738: 0, 0, 0, 0, 0, 66, 67, 72, 70, 69,
! 739: 0, 0, 0, 71, 0, 27, 20, 21, 0, 74,
! 740: 0, 74, 74, 0, 73, 22, 22, 22, 22, 0,
! 741: 0, 0, 76, 0, 76, 76, 0, 0, 0, 0,
! 742: 0, 0, 0, 89, 88, 62, 75, 0, 64, 0,
! 743: 0, 78, 79, 77, 29, 30, 48, 48, 48, 18,
! 744: 74, 74, 74, 0, 0, 0, 76, 76, 76, 0,
! 745: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
! 746: 0, 0, 31, 32, 33, 49, 19, 17, 0, 0,
! 747: 0, 0, 45, 36, 0, 39, 0, 0, 41, 35,
! 748: 55, 37, 52, 53, 54, 50, 51, 56, 57, 58,
! 749: 59, 0, 16, 82, 80, 83, 81, 84, 84, 84,
! 750: 46, 47, 44, 40, 42, 43, 0, 38, 0, 85,
! 751: 86, 86, 86, 34, 60, 0, 0, 0, 0, 0,
! 752: 0, 0, 0, 0, 61, 63, 65, 87
! 753: };
! 754:
! 755: /* YYDEFGOTO[NTERM-NUM]. */
! 756: static const yytype_int16 yydefgoto[] =
! 757: {
! 758: -1, 1, 15, 16, 17, 18, 19, 20, 21, 37,
! 759: 96, 121, 122, 123, 124, 139, 133, 162, 103, 125,
! 760: 22, 23, 24, 25, 26, 28, 49, 54, 50, 72,
! 761: 64, 157, 170, 176, 70, 84, 27
! 762: };
! 763:
! 764: /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
! 765: STATE-NUM. */
! 766: #define YYPACT_NINF -61
! 767: static const yytype_int16 yypact[] =
! 768: {
! 769: -61, 3, -61, -61, -61, -61, -61, 96, 96, 17,
! 770: -12, 1, -61, 78, 106, -61, -61, -61, -61, -61,
! 771: -61, -61, -61, -61, -61, -61, -61, -61, -38, -38,
! 772: -38, 29, -61, -61, -61, 69, -61, 122, 130, -61,
! 773: 92, 31, 93, 39, 49, -61, -61, 133, -61, -61,
! 774: 94, 94, 94, -61, 69, -61, -61, -61, 88, 135,
! 775: 88, 135, 135, -24, -61, 96, 96, 96, 96, 89,
! 776: 139, 101, 133, 142, 133, 133, 140, 141, 143, 81,
! 777: 81, 81, 145, -61, -61, -61, -61, 104, -61, 105,
! 778: 107, -61, -61, -61, -61, -61, -61, -61, -61, -61,
! 779: 135, 135, 135, 51, -1, 6, 133, 133, 133, -26,
! 780: 86, 109, 116, -22, 112, 13, 113, 114, 115, 117,
! 781: 118, 156, -61, -61, -61, -61, -61, -61, -11, -11,
! 782: -11, 5, -61, -61, 5, -61, 5, 5, -61, 144,
! 783: -61, 138, -61, -61, -61, -61, -61, -61, -61, -61,
! 784: -61, 120, -61, -61, -61, -61, -61, 119, 119, 119,
! 785: -61, -61, -61, -61, -61, -61, -26, -61, 123, -61,
! 786: 111, 111, 111, -61, -61, 126, 88, 88, 88, 127,
! 787: 163, 168, 169, 129, -61, -61, -61, -61
! 788: };
! 789:
! 790: /* YYPGOTO[NTERM-NUM]. */
! 791: static const yytype_int8 yypgoto[] =
! 792: {
! 793: -61, -61, -61, -61, -61, -61, -61, -61, -61, -7,
! 794: 22, -61, -61, -61, -61, -61, 8, -54, 30, -61,
! 795: -61, -61, -61, -61, -61, 95, -61, -17, 37, -32,
! 796: -10, 0, -27, -37, -60, -61, -61
! 797: };
! 798:
! 799: /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
! 800: positive, shift that token. If negative, reduce the rule which
! 801: number is the opposite. If zero, do what YYDEFACT says.
! 802: If YYTABLE_NINF, syntax error. */
! 803: #define YYTABLE_NINF -1
! 804: static const yytype_uint8 yytable[] =
! 805: {
! 806: 73, 38, 126, 2, 142, 131, 132, 153, 47, 127,
! 807: 3, 4, 5, 6, 7, 8, 9, 48, 55, 76,
! 808: 39, 111, 77, 78, 113, 143, 114, 115, 111, 74,
! 809: 75, 113, 154, 114, 115, 155, 156, 68, 116, 117,
! 810: 118, 119, 145, 146, 40, 116, 117, 118, 119, 160,
! 811: 161, 10, 11, 12, 13, 14, 120, 42, 79, 80,
! 812: 81, 82, 87, 120, 89, 90, 51, 52, 106, 107,
! 813: 108, 109, 110, 111, 112, 53, 113, 59, 114, 115,
! 814: 163, 45, 164, 165, 48, 61, 48, 65, 66, 67,
! 815: 116, 117, 118, 119, 48, 62, 128, 129, 130, 29,
! 816: 30, 31, 97, 98, 48, 41, 43, 44, 120, 46,
! 817: 32, 33, 34, 35, 36, 53, 180, 181, 182, 134,
! 818: 135, 136, 137, 138, 94, 56, 95, 104, 105, 158,
! 819: 159, 171, 172, 57, 177, 178, 58, 60, 63, 71,
! 820: 47, 69, 85, 83, 86, 88, 91, 92, 99, 93,
! 821: 100, 101, 140, 102, 141, 144, 147, 148, 149, 152,
! 822: 150, 151, 167, 168, 166, 169, 184, 174, 175, 179,
! 823: 183, 185, 186, 187, 173
! 824: };
! 825:
! 826: static const yytype_uint8 yycheck[] =
! 827: {
! 828: 60, 8, 3, 0, 26, 31, 32, 18, 46, 3,
! 829: 7, 8, 9, 10, 11, 12, 13, 55, 35, 43,
! 830: 3, 22, 46, 47, 25, 47, 27, 28, 22, 61,
! 831: 62, 25, 43, 27, 28, 46, 47, 54, 39, 40,
! 832: 41, 42, 29, 30, 56, 39, 40, 41, 42, 44,
! 833: 45, 48, 49, 50, 51, 52, 57, 56, 65, 66,
! 834: 67, 68, 72, 57, 74, 75, 29, 30, 100, 101,
! 835: 102, 20, 21, 22, 23, 46, 25, 46, 27, 28,
! 836: 134, 3, 136, 137, 55, 46, 55, 50, 51, 52,
! 837: 39, 40, 41, 42, 55, 46, 106, 107, 108, 4,
! 838: 5, 6, 80, 81, 55, 10, 11, 12, 57, 3,
! 839: 14, 15, 16, 17, 18, 46, 176, 177, 178, 33,
! 840: 34, 35, 36, 37, 43, 3, 45, 97, 98, 129,
! 841: 130, 158, 159, 3, 171, 172, 44, 44, 5, 4,
! 842: 46, 53, 3, 54, 43, 3, 6, 6, 3, 6,
! 843: 46, 46, 43, 46, 38, 43, 43, 43, 43, 3,
! 844: 43, 43, 24, 43, 20, 46, 3, 44, 57, 43,
! 845: 43, 3, 3, 44, 166
! 846: };
! 847:
! 848: /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
! 849: symbol of state STATE-NUM. */
! 850: static const yytype_uint8 yystos[] =
! 851: {
! 852: 0, 59, 0, 7, 8, 9, 10, 11, 12, 13,
! 853: 48, 49, 50, 51, 52, 60, 61, 62, 63, 64,
! 854: 65, 66, 78, 79, 80, 81, 82, 94, 83, 83,
! 855: 83, 83, 14, 15, 16, 17, 18, 67, 67, 3,
! 856: 56, 83, 56, 83, 83, 3, 3, 46, 55, 84,
! 857: 86, 86, 86, 46, 85, 85, 3, 3, 44, 46,
! 858: 44, 46, 46, 5, 88, 86, 86, 86, 85, 53,
! 859: 92, 4, 87, 92, 87, 87, 43, 46, 47, 67,
! 860: 67, 67, 67, 54, 93, 3, 43, 88, 3, 88,
! 861: 88, 6, 6, 6, 43, 45, 68, 68, 68, 3,
! 862: 46, 46, 46, 76, 76, 76, 87, 87, 87, 20,
! 863: 21, 22, 23, 25, 27, 28, 39, 40, 41, 42,
! 864: 57, 69, 70, 71, 72, 77, 3, 3, 88, 88,
! 865: 88, 31, 32, 74, 33, 34, 35, 36, 37, 73,
! 866: 43, 38, 26, 47, 43, 29, 30, 43, 43, 43,
! 867: 43, 43, 3, 18, 43, 46, 47, 89, 89, 89,
! 868: 44, 45, 75, 75, 75, 75, 20, 24, 43, 46,
! 869: 90, 90, 90, 74, 44, 57, 91, 91, 91, 43,
! 870: 92, 92, 92, 43, 3, 3, 3, 44
! 871: };
! 872:
! 873: #define yyerrok (yyerrstatus = 0)
! 874: #define yyclearin (yychar = YYEMPTY)
! 875: #define YYEMPTY (-2)
! 876: #define YYEOF 0
! 877:
! 878: #define YYACCEPT goto yyacceptlab
! 879: #define YYABORT goto yyabortlab
! 880: #define YYERROR goto yyerrorlab
! 881:
! 882:
! 883: /* Like YYERROR except do call yyerror. This remains here temporarily
! 884: to ease the transition to the new meaning of YYERROR, for GCC.
! 885: Once GCC version 2 has supplanted version 1, this can go. */
! 886:
! 887: #define YYFAIL goto yyerrlab
! 888:
! 889: #define YYRECOVERING() (!!yyerrstatus)
! 890:
! 891: #define YYBACKUP(Token, Value) \
! 892: do \
! 893: if (yychar == YYEMPTY && yylen == 1) \
! 894: { \
! 895: yychar = (Token); \
! 896: yylval = (Value); \
! 897: yytoken = YYTRANSLATE (yychar); \
! 898: YYPOPSTACK (1); \
! 899: goto yybackup; \
! 900: } \
! 901: else \
! 902: { \
! 903: yyerror (YY_("syntax error: cannot back up")); \
! 904: YYERROR; \
! 905: } \
! 906: while (YYID (0))
! 907:
! 908:
! 909: #define YYTERROR 1
! 910: #define YYERRCODE 256
! 911:
! 912:
! 913: /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
! 914: If N is 0, then set CURRENT to the empty location which ends
! 915: the previous symbol: RHS[0] (always defined). */
! 916:
! 917: #define YYRHSLOC(Rhs, K) ((Rhs)[K])
! 918: #ifndef YYLLOC_DEFAULT
! 919: # define YYLLOC_DEFAULT(Current, Rhs, N) \
! 920: do \
! 921: if (YYID (N)) \
! 922: { \
! 923: (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
! 924: (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
! 925: (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
! 926: (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
! 927: } \
! 928: else \
! 929: { \
! 930: (Current).first_line = (Current).last_line = \
! 931: YYRHSLOC (Rhs, 0).last_line; \
! 932: (Current).first_column = (Current).last_column = \
! 933: YYRHSLOC (Rhs, 0).last_column; \
! 934: } \
! 935: while (YYID (0))
! 936: #endif
! 937:
! 938:
! 939: /* YY_LOCATION_PRINT -- Print the location on the stream.
! 940: This macro was not mandated originally: define only if we know
! 941: we won't break user code: when these are the locations we know. */
! 942:
! 943: #ifndef YY_LOCATION_PRINT
! 944: # if YYLTYPE_IS_TRIVIAL
! 945: # define YY_LOCATION_PRINT(File, Loc) \
! 946: fprintf (File, "%d.%d-%d.%d", \
! 947: (Loc).first_line, (Loc).first_column, \
! 948: (Loc).last_line, (Loc).last_column)
! 949: # else
! 950: # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
! 951: # endif
! 952: #endif
! 953:
! 954:
! 955: /* YYLEX -- calling `yylex' with the right arguments. */
! 956:
! 957: #ifdef YYLEX_PARAM
! 958: # define YYLEX yylex (YYLEX_PARAM)
! 959: #else
! 960: # define YYLEX yylex ()
! 961: #endif
! 962:
! 963: /* Enable debugging if requested. */
! 964: #if YYDEBUG
! 965:
! 966: # ifndef YYFPRINTF
! 967: # include <stdio.h> /* INFRINGES ON USER NAME SPACE */
! 968: # define YYFPRINTF fprintf
! 969: # endif
! 970:
! 971: # define YYDPRINTF(Args) \
! 972: do { \
! 973: if (yydebug) \
! 974: YYFPRINTF Args; \
! 975: } while (YYID (0))
! 976:
! 977: # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
! 978: do { \
! 979: if (yydebug) \
! 980: { \
! 981: YYFPRINTF (stderr, "%s ", Title); \
! 982: yy_symbol_print (stderr, \
! 983: Type, Value); \
! 984: YYFPRINTF (stderr, "\n"); \
! 985: } \
! 986: } while (YYID (0))
! 987:
! 988:
! 989: /*--------------------------------.
! 990: | Print this symbol on YYOUTPUT. |
! 991: `--------------------------------*/
! 992:
! 993: /*ARGSUSED*/
! 994: #if (defined __STDC__ || defined __C99__FUNC__ \
! 995: || defined __cplusplus || defined _MSC_VER)
! 996: static void
! 997: yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
! 998: #else
! 999: static void
! 1000: yy_symbol_value_print (yyoutput, yytype, yyvaluep)
! 1001: FILE *yyoutput;
! 1002: int yytype;
! 1003: YYSTYPE const * const yyvaluep;
! 1004: #endif
! 1005: {
! 1006: if (!yyvaluep)
! 1007: return;
! 1008: # ifdef YYPRINT
! 1009: if (yytype < YYNTOKENS)
! 1010: YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
! 1011: # else
! 1012: YYUSE (yyoutput);
! 1013: # endif
! 1014: switch (yytype)
! 1015: {
! 1016: default:
! 1017: break;
! 1018: }
! 1019: }
! 1020:
! 1021:
! 1022: /*--------------------------------.
! 1023: | Print this symbol on YYOUTPUT. |
! 1024: `--------------------------------*/
! 1025:
! 1026: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1027: || defined __cplusplus || defined _MSC_VER)
! 1028: static void
! 1029: yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
! 1030: #else
! 1031: static void
! 1032: yy_symbol_print (yyoutput, yytype, yyvaluep)
! 1033: FILE *yyoutput;
! 1034: int yytype;
! 1035: YYSTYPE const * const yyvaluep;
! 1036: #endif
! 1037: {
! 1038: if (yytype < YYNTOKENS)
! 1039: YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
! 1040: else
! 1041: YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
! 1042:
! 1043: yy_symbol_value_print (yyoutput, yytype, yyvaluep);
! 1044: YYFPRINTF (yyoutput, ")");
! 1045: }
! 1046:
! 1047: /*------------------------------------------------------------------.
! 1048: | yy_stack_print -- Print the state stack from its BOTTOM up to its |
! 1049: | TOP (included). |
! 1050: `------------------------------------------------------------------*/
! 1051:
! 1052: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1053: || defined __cplusplus || defined _MSC_VER)
! 1054: static void
! 1055: yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
! 1056: #else
! 1057: static void
! 1058: yy_stack_print (yybottom, yytop)
! 1059: yytype_int16 *yybottom;
! 1060: yytype_int16 *yytop;
! 1061: #endif
! 1062: {
! 1063: YYFPRINTF (stderr, "Stack now");
! 1064: for (; yybottom <= yytop; yybottom++)
! 1065: {
! 1066: int yybot = *yybottom;
! 1067: YYFPRINTF (stderr, " %d", yybot);
! 1068: }
! 1069: YYFPRINTF (stderr, "\n");
! 1070: }
! 1071:
! 1072: # define YY_STACK_PRINT(Bottom, Top) \
! 1073: do { \
! 1074: if (yydebug) \
! 1075: yy_stack_print ((Bottom), (Top)); \
! 1076: } while (YYID (0))
! 1077:
! 1078:
! 1079: /*------------------------------------------------.
! 1080: | Report that the YYRULE is going to be reduced. |
! 1081: `------------------------------------------------*/
! 1082:
! 1083: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1084: || defined __cplusplus || defined _MSC_VER)
! 1085: static void
! 1086: yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
! 1087: #else
! 1088: static void
! 1089: yy_reduce_print (yyvsp, yyrule)
! 1090: YYSTYPE *yyvsp;
! 1091: int yyrule;
! 1092: #endif
! 1093: {
! 1094: int yynrhs = yyr2[yyrule];
! 1095: int yyi;
! 1096: unsigned long int yylno = yyrline[yyrule];
! 1097: YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
! 1098: yyrule - 1, yylno);
! 1099: /* The symbols being reduced. */
! 1100: for (yyi = 0; yyi < yynrhs; yyi++)
! 1101: {
! 1102: YYFPRINTF (stderr, " $%d = ", yyi + 1);
! 1103: yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
! 1104: &(yyvsp[(yyi + 1) - (yynrhs)])
! 1105: );
! 1106: YYFPRINTF (stderr, "\n");
! 1107: }
! 1108: }
! 1109:
! 1110: # define YY_REDUCE_PRINT(Rule) \
! 1111: do { \
! 1112: if (yydebug) \
! 1113: yy_reduce_print (yyvsp, Rule); \
! 1114: } while (YYID (0))
! 1115:
! 1116: /* Nonzero means print parse trace. It is left uninitialized so that
! 1117: multiple parsers can coexist. */
! 1118: int yydebug;
! 1119: #else /* !YYDEBUG */
! 1120: # define YYDPRINTF(Args)
! 1121: # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
! 1122: # define YY_STACK_PRINT(Bottom, Top)
! 1123: # define YY_REDUCE_PRINT(Rule)
! 1124: #endif /* !YYDEBUG */
! 1125:
! 1126:
! 1127: /* YYINITDEPTH -- initial size of the parser's stacks. */
! 1128: #ifndef YYINITDEPTH
! 1129: # define YYINITDEPTH 200
! 1130: #endif
! 1131:
! 1132: /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
! 1133: if the built-in stack extension method is used).
! 1134:
! 1135: Do not make this value too large; the results are undefined if
! 1136: YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
! 1137: evaluated with infinite-precision integer arithmetic. */
! 1138:
! 1139: #ifndef YYMAXDEPTH
! 1140: # define YYMAXDEPTH 10000
! 1141: #endif
! 1142:
! 1143:
! 1144:
! 1145: #if YYERROR_VERBOSE
! 1146:
! 1147: # ifndef yystrlen
! 1148: # if defined __GLIBC__ && defined _STRING_H
! 1149: # define yystrlen strlen
! 1150: # else
! 1151: /* Return the length of YYSTR. */
! 1152: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1153: || defined __cplusplus || defined _MSC_VER)
! 1154: static YYSIZE_T
! 1155: yystrlen (const char *yystr)
! 1156: #else
! 1157: static YYSIZE_T
! 1158: yystrlen (yystr)
! 1159: const char *yystr;
! 1160: #endif
! 1161: {
! 1162: YYSIZE_T yylen;
! 1163: for (yylen = 0; yystr[yylen]; yylen++)
! 1164: continue;
! 1165: return yylen;
! 1166: }
! 1167: # endif
! 1168: # endif
! 1169:
! 1170: # ifndef yystpcpy
! 1171: # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
! 1172: # define yystpcpy stpcpy
! 1173: # else
! 1174: /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
! 1175: YYDEST. */
! 1176: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1177: || defined __cplusplus || defined _MSC_VER)
! 1178: static char *
! 1179: yystpcpy (char *yydest, const char *yysrc)
! 1180: #else
! 1181: static char *
! 1182: yystpcpy (yydest, yysrc)
! 1183: char *yydest;
! 1184: const char *yysrc;
! 1185: #endif
! 1186: {
! 1187: char *yyd = yydest;
! 1188: const char *yys = yysrc;
! 1189:
! 1190: while ((*yyd++ = *yys++) != '\0')
! 1191: continue;
! 1192:
! 1193: return yyd - 1;
! 1194: }
! 1195: # endif
! 1196: # endif
! 1197:
! 1198: # ifndef yytnamerr
! 1199: /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
! 1200: quotes and backslashes, so that it's suitable for yyerror. The
! 1201: heuristic is that double-quoting is unnecessary unless the string
! 1202: contains an apostrophe, a comma, or backslash (other than
! 1203: backslash-backslash). YYSTR is taken from yytname. If YYRES is
! 1204: null, do not copy; instead, return the length of what the result
! 1205: would have been. */
! 1206: static YYSIZE_T
! 1207: yytnamerr (char *yyres, const char *yystr)
! 1208: {
! 1209: if (*yystr == '"')
! 1210: {
! 1211: YYSIZE_T yyn = 0;
! 1212: char const *yyp = yystr;
! 1213:
! 1214: for (;;)
! 1215: switch (*++yyp)
! 1216: {
! 1217: case '\'':
! 1218: case ',':
! 1219: goto do_not_strip_quotes;
! 1220:
! 1221: case '\\':
! 1222: if (*++yyp != '\\')
! 1223: goto do_not_strip_quotes;
! 1224: /* Fall through. */
! 1225: default:
! 1226: if (yyres)
! 1227: yyres[yyn] = *yyp;
! 1228: yyn++;
! 1229: break;
! 1230:
! 1231: case '"':
! 1232: if (yyres)
! 1233: yyres[yyn] = '\0';
! 1234: return yyn;
! 1235: }
! 1236: do_not_strip_quotes: ;
! 1237: }
! 1238:
! 1239: if (! yyres)
! 1240: return yystrlen (yystr);
! 1241:
! 1242: return yystpcpy (yyres, yystr) - yyres;
! 1243: }
! 1244: # endif
! 1245:
! 1246: /* Copy into YYRESULT an error message about the unexpected token
! 1247: YYCHAR while in state YYSTATE. Return the number of bytes copied,
! 1248: including the terminating null byte. If YYRESULT is null, do not
! 1249: copy anything; just return the number of bytes that would be
! 1250: copied. As a special case, return 0 if an ordinary "syntax error"
! 1251: message will do. Return YYSIZE_MAXIMUM if overflow occurs during
! 1252: size calculation. */
! 1253: static YYSIZE_T
! 1254: yysyntax_error (char *yyresult, int yystate, int yychar)
! 1255: {
! 1256: int yyn = yypact[yystate];
! 1257:
! 1258: if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
! 1259: return 0;
! 1260: else
! 1261: {
! 1262: int yytype = YYTRANSLATE (yychar);
! 1263: YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
! 1264: YYSIZE_T yysize = yysize0;
! 1265: YYSIZE_T yysize1;
! 1266: int yysize_overflow = 0;
! 1267: enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
! 1268: char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
! 1269: int yyx;
! 1270:
! 1271: # if 0
! 1272: /* This is so xgettext sees the translatable formats that are
! 1273: constructed on the fly. */
! 1274: YY_("syntax error, unexpected %s");
! 1275: YY_("syntax error, unexpected %s, expecting %s");
! 1276: YY_("syntax error, unexpected %s, expecting %s or %s");
! 1277: YY_("syntax error, unexpected %s, expecting %s or %s or %s");
! 1278: YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
! 1279: # endif
! 1280: char *yyfmt;
! 1281: char const *yyf;
! 1282: static char const yyunexpected[] = "syntax error, unexpected %s";
! 1283: static char const yyexpecting[] = ", expecting %s";
! 1284: static char const yyor[] = " or %s";
! 1285: char yyformat[sizeof yyunexpected
! 1286: + sizeof yyexpecting - 1
! 1287: + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
! 1288: * (sizeof yyor - 1))];
! 1289: char const *yyprefix = yyexpecting;
! 1290:
! 1291: /* Start YYX at -YYN if negative to avoid negative indexes in
! 1292: YYCHECK. */
! 1293: int yyxbegin = yyn < 0 ? -yyn : 0;
! 1294:
! 1295: /* Stay within bounds of both yycheck and yytname. */
! 1296: int yychecklim = YYLAST - yyn + 1;
! 1297: int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
! 1298: int yycount = 1;
! 1299:
! 1300: yyarg[0] = yytname[yytype];
! 1301: yyfmt = yystpcpy (yyformat, yyunexpected);
! 1302:
! 1303: for (yyx = yyxbegin; yyx < yyxend; ++yyx)
! 1304: if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
! 1305: {
! 1306: if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
! 1307: {
! 1308: yycount = 1;
! 1309: yysize = yysize0;
! 1310: yyformat[sizeof yyunexpected - 1] = '\0';
! 1311: break;
! 1312: }
! 1313: yyarg[yycount++] = yytname[yyx];
! 1314: yysize1 = yysize + yytnamerr (0, yytname[yyx]);
! 1315: yysize_overflow |= (yysize1 < yysize);
! 1316: yysize = yysize1;
! 1317: yyfmt = yystpcpy (yyfmt, yyprefix);
! 1318: yyprefix = yyor;
! 1319: }
! 1320:
! 1321: yyf = YY_(yyformat);
! 1322: yysize1 = yysize + yystrlen (yyf);
! 1323: yysize_overflow |= (yysize1 < yysize);
! 1324: yysize = yysize1;
! 1325:
! 1326: if (yysize_overflow)
! 1327: return YYSIZE_MAXIMUM;
! 1328:
! 1329: if (yyresult)
! 1330: {
! 1331: /* Avoid sprintf, as that infringes on the user's name space.
! 1332: Don't have undefined behavior even if the translation
! 1333: produced a string with the wrong number of "%s"s. */
! 1334: char *yyp = yyresult;
! 1335: int yyi = 0;
! 1336: while ((*yyp = *yyf) != '\0')
! 1337: {
! 1338: if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
! 1339: {
! 1340: yyp += yytnamerr (yyp, yyarg[yyi++]);
! 1341: yyf += 2;
! 1342: }
! 1343: else
! 1344: {
! 1345: yyp++;
! 1346: yyf++;
! 1347: }
! 1348: }
! 1349: }
! 1350: return yysize;
! 1351: }
! 1352: }
! 1353: #endif /* YYERROR_VERBOSE */
! 1354:
! 1355:
! 1356: /*-----------------------------------------------.
! 1357: | Release the memory associated to this symbol. |
! 1358: `-----------------------------------------------*/
! 1359:
! 1360: /*ARGSUSED*/
! 1361: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1362: || defined __cplusplus || defined _MSC_VER)
! 1363: static void
! 1364: yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
! 1365: #else
! 1366: static void
! 1367: yydestruct (yymsg, yytype, yyvaluep)
! 1368: const char *yymsg;
! 1369: int yytype;
! 1370: YYSTYPE *yyvaluep;
! 1371: #endif
! 1372: {
! 1373: YYUSE (yyvaluep);
! 1374:
! 1375: if (!yymsg)
! 1376: yymsg = "Deleting";
! 1377: YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
! 1378:
! 1379: switch (yytype)
! 1380: {
! 1381:
! 1382: default:
! 1383: break;
! 1384: }
! 1385: }
! 1386:
! 1387: /* Prevent warnings from -Wmissing-prototypes. */
! 1388: #ifdef YYPARSE_PARAM
! 1389: #if defined __STDC__ || defined __cplusplus
! 1390: int yyparse (void *YYPARSE_PARAM);
! 1391: #else
! 1392: int yyparse ();
! 1393: #endif
! 1394: #else /* ! YYPARSE_PARAM */
! 1395: #if defined __STDC__ || defined __cplusplus
! 1396: int yyparse (void);
! 1397: #else
! 1398: int yyparse ();
! 1399: #endif
! 1400: #endif /* ! YYPARSE_PARAM */
! 1401:
! 1402:
! 1403: /* The lookahead symbol. */
! 1404: int yychar;
! 1405:
! 1406: /* The semantic value of the lookahead symbol. */
! 1407: YYSTYPE yylval;
! 1408:
! 1409: /* Number of syntax errors so far. */
! 1410: int yynerrs;
! 1411:
! 1412:
! 1413:
! 1414: /*-------------------------.
! 1415: | yyparse or yypush_parse. |
! 1416: `-------------------------*/
! 1417:
! 1418: #ifdef YYPARSE_PARAM
! 1419: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1420: || defined __cplusplus || defined _MSC_VER)
! 1421: int
! 1422: yyparse (void *YYPARSE_PARAM)
! 1423: #else
! 1424: int
! 1425: yyparse (YYPARSE_PARAM)
! 1426: void *YYPARSE_PARAM;
! 1427: #endif
! 1428: #else /* ! YYPARSE_PARAM */
! 1429: #if (defined __STDC__ || defined __C99__FUNC__ \
! 1430: || defined __cplusplus || defined _MSC_VER)
! 1431: int
! 1432: yyparse (void)
! 1433: #else
! 1434: int
! 1435: yyparse ()
! 1436:
! 1437: #endif
! 1438: #endif
! 1439: {
! 1440:
! 1441:
! 1442: int yystate;
! 1443: /* Number of tokens to shift before error messages enabled. */
! 1444: int yyerrstatus;
! 1445:
! 1446: /* The stacks and their tools:
! 1447: `yyss': related to states.
! 1448: `yyvs': related to semantic values.
! 1449:
! 1450: Refer to the stacks thru separate pointers, to allow yyoverflow
! 1451: to reallocate them elsewhere. */
! 1452:
! 1453: /* The state stack. */
! 1454: yytype_int16 yyssa[YYINITDEPTH];
! 1455: yytype_int16 *yyss;
! 1456: yytype_int16 *yyssp;
! 1457:
! 1458: /* The semantic value stack. */
! 1459: YYSTYPE yyvsa[YYINITDEPTH];
! 1460: YYSTYPE *yyvs;
! 1461: YYSTYPE *yyvsp;
! 1462:
! 1463: YYSIZE_T yystacksize;
! 1464:
! 1465: int yyn;
! 1466: int yyresult;
! 1467: /* Lookahead token as an internal (translated) token number. */
! 1468: int yytoken;
! 1469: /* The variables used to return semantic value and location from the
! 1470: action routines. */
! 1471: YYSTYPE yyval;
! 1472:
! 1473: #if YYERROR_VERBOSE
! 1474: /* Buffer for error messages, and its allocated size. */
! 1475: char yymsgbuf[128];
! 1476: char *yymsg = yymsgbuf;
! 1477: YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
! 1478: #endif
! 1479:
! 1480: #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
! 1481:
! 1482: /* The number of symbols on the RHS of the reduced rule.
! 1483: Keep to zero when no symbol should be popped. */
! 1484: int yylen = 0;
! 1485:
! 1486: yytoken = 0;
! 1487: yyss = yyssa;
! 1488: yyvs = yyvsa;
! 1489: yystacksize = YYINITDEPTH;
! 1490:
! 1491: YYDPRINTF ((stderr, "Starting parse\n"));
! 1492:
! 1493: yystate = 0;
! 1494: yyerrstatus = 0;
! 1495: yynerrs = 0;
! 1496: yychar = YYEMPTY; /* Cause a token to be read. */
! 1497:
! 1498: /* Initialize stack pointers.
! 1499: Waste one element of value and location stack
! 1500: so that they stay on the same level as the state stack.
! 1501: The wasted elements are never initialized. */
! 1502: yyssp = yyss;
! 1503: yyvsp = yyvs;
! 1504:
! 1505: goto yysetstate;
! 1506:
! 1507: /*------------------------------------------------------------.
! 1508: | yynewstate -- Push a new state, which is found in yystate. |
! 1509: `------------------------------------------------------------*/
! 1510: yynewstate:
! 1511: /* In all cases, when you get here, the value and location stacks
! 1512: have just been pushed. So pushing a state here evens the stacks. */
! 1513: yyssp++;
! 1514:
! 1515: yysetstate:
! 1516: *yyssp = yystate;
! 1517:
! 1518: if (yyss + yystacksize - 1 <= yyssp)
! 1519: {
! 1520: /* Get the current used size of the three stacks, in elements. */
! 1521: YYSIZE_T yysize = yyssp - yyss + 1;
! 1522:
! 1523: #ifdef yyoverflow
! 1524: {
! 1525: /* Give user a chance to reallocate the stack. Use copies of
! 1526: these so that the &'s don't force the real ones into
! 1527: memory. */
! 1528: YYSTYPE *yyvs1 = yyvs;
! 1529: yytype_int16 *yyss1 = yyss;
! 1530:
! 1531: /* Each stack pointer address is followed by the size of the
! 1532: data in use in that stack, in bytes. This used to be a
! 1533: conditional around just the two extra args, but that might
! 1534: be undefined if yyoverflow is a macro. */
! 1535: yyoverflow (YY_("memory exhausted"),
! 1536: &yyss1, yysize * sizeof (*yyssp),
! 1537: &yyvs1, yysize * sizeof (*yyvsp),
! 1538: &yystacksize);
! 1539:
! 1540: yyss = yyss1;
! 1541: yyvs = yyvs1;
! 1542: }
! 1543: #else /* no yyoverflow */
! 1544: # ifndef YYSTACK_RELOCATE
! 1545: goto yyexhaustedlab;
! 1546: # else
! 1547: /* Extend the stack our own way. */
! 1548: if (YYMAXDEPTH <= yystacksize)
! 1549: goto yyexhaustedlab;
! 1550: yystacksize *= 2;
! 1551: if (YYMAXDEPTH < yystacksize)
! 1552: yystacksize = YYMAXDEPTH;
! 1553:
! 1554: {
! 1555: yytype_int16 *yyss1 = yyss;
! 1556: union yyalloc *yyptr =
! 1557: (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
! 1558: if (! yyptr)
! 1559: goto yyexhaustedlab;
! 1560: YYSTACK_RELOCATE (yyss_alloc, yyss);
! 1561: YYSTACK_RELOCATE (yyvs_alloc, yyvs);
! 1562: # undef YYSTACK_RELOCATE
! 1563: if (yyss1 != yyssa)
! 1564: YYSTACK_FREE (yyss1);
! 1565: }
! 1566: # endif
! 1567: #endif /* no yyoverflow */
! 1568:
! 1569: yyssp = yyss + yysize - 1;
! 1570: yyvsp = yyvs + yysize - 1;
! 1571:
! 1572: YYDPRINTF ((stderr, "Stack size increased to %lu\n",
! 1573: (unsigned long int) yystacksize));
! 1574:
! 1575: if (yyss + yystacksize - 1 <= yyssp)
! 1576: YYABORT;
! 1577: }
! 1578:
! 1579: YYDPRINTF ((stderr, "Entering state %d\n", yystate));
! 1580:
! 1581: if (yystate == YYFINAL)
! 1582: YYACCEPT;
! 1583:
! 1584: goto yybackup;
! 1585:
! 1586: /*-----------.
! 1587: | yybackup. |
! 1588: `-----------*/
! 1589: yybackup:
! 1590:
! 1591: /* Do appropriate processing given the current state. Read a
! 1592: lookahead token if we need one and don't already have one. */
! 1593:
! 1594: /* First try to decide what to do without reference to lookahead token. */
! 1595: yyn = yypact[yystate];
! 1596: if (yyn == YYPACT_NINF)
! 1597: goto yydefault;
! 1598:
! 1599: /* Not known => get a lookahead token if don't already have one. */
! 1600:
! 1601: /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
! 1602: if (yychar == YYEMPTY)
! 1603: {
! 1604: YYDPRINTF ((stderr, "Reading a token: "));
! 1605: yychar = YYLEX;
! 1606: }
! 1607:
! 1608: if (yychar <= YYEOF)
! 1609: {
! 1610: yychar = yytoken = YYEOF;
! 1611: YYDPRINTF ((stderr, "Now at end of input.\n"));
! 1612: }
! 1613: else
! 1614: {
! 1615: yytoken = YYTRANSLATE (yychar);
! 1616: YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
! 1617: }
! 1618:
! 1619: /* If the proper action on seeing token YYTOKEN is to reduce or to
! 1620: detect an error, take that action. */
! 1621: yyn += yytoken;
! 1622: if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
! 1623: goto yydefault;
! 1624: yyn = yytable[yyn];
! 1625: if (yyn <= 0)
! 1626: {
! 1627: if (yyn == 0 || yyn == YYTABLE_NINF)
! 1628: goto yyerrlab;
! 1629: yyn = -yyn;
! 1630: goto yyreduce;
! 1631: }
! 1632:
! 1633: /* Count tokens shifted since error; after three, turn off error
! 1634: status. */
! 1635: if (yyerrstatus)
! 1636: yyerrstatus--;
! 1637:
! 1638: /* Shift the lookahead token. */
! 1639: YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
! 1640:
! 1641: /* Discard the shifted token. */
! 1642: yychar = YYEMPTY;
! 1643:
! 1644: yystate = yyn;
! 1645: *++yyvsp = yylval;
! 1646:
! 1647: goto yynewstate;
! 1648:
! 1649:
! 1650: /*-----------------------------------------------------------.
! 1651: | yydefault -- do the default action for the current state. |
! 1652: `-----------------------------------------------------------*/
! 1653: yydefault:
! 1654: yyn = yydefact[yystate];
! 1655: if (yyn == 0)
! 1656: goto yyerrlab;
! 1657: goto yyreduce;
! 1658:
! 1659:
! 1660: /*-----------------------------.
! 1661: | yyreduce -- Do a reduction. |
! 1662: `-----------------------------*/
! 1663: yyreduce:
! 1664: /* yyn is the number of a rule to reduce with. */
! 1665: yylen = yyr2[yyn];
! 1666:
! 1667: /* If YYLEN is nonzero, implement the default value of the action:
! 1668: `$$ = $1'.
! 1669:
! 1670: Otherwise, the following line sets YYVAL to garbage.
! 1671: This behavior is undocumented and Bison
! 1672: users should not rely upon it. Assigning to YYVAL
! 1673: unconditionally makes the parser a bit smaller, and it avoids a
! 1674: GCC warning that YYVAL may be used uninitialized. */
! 1675: yyval = yyvsp[1-yylen];
! 1676:
! 1677:
! 1678: YY_REDUCE_PRINT (yyn);
! 1679: switch (yyn)
! 1680: {
! 1681: case 3:
! 1682:
! 1683: /* Line 1455 of yacc.c */
! 1684: #line 154 "parse.y"
! 1685: {
! 1686: free_buffer();
! 1687: parse_init();
! 1688: }
! 1689: break;
! 1690:
! 1691: case 16:
! 1692:
! 1693: /* Line 1455 of yacc.c */
! 1694: #line 179 "parse.y"
! 1695: {
! 1696: int status;
! 1697:
! 1698: status = setkeymsg_add(SADB_ADD, (yyvsp[(5) - (9)].num), (yyvsp[(3) - (9)].res), (yyvsp[(4) - (9)].res));
! 1699: if (status < 0)
! 1700: return -1;
! 1701: }
! 1702: break;
! 1703:
! 1704: case 17:
! 1705:
! 1706: /* Line 1455 of yacc.c */
! 1707: #line 191 "parse.y"
! 1708: {
! 1709: int status;
! 1710:
! 1711: if ((yyvsp[(3) - (8)].res)->ai_next || (yyvsp[(4) - (8)].res)->ai_next) {
! 1712: yyerror("multiple address specified");
! 1713: return -1;
! 1714: }
! 1715: if (p_mode != IPSEC_MODE_ANY)
! 1716: yyerror("WARNING: mode is obsolete");
! 1717:
! 1718: status = setkeymsg_addr(SADB_DELETE, (yyvsp[(5) - (8)].num), (yyvsp[(3) - (8)].res), (yyvsp[(4) - (8)].res), 0);
! 1719: if (status < 0)
! 1720: return -1;
! 1721: }
! 1722: break;
! 1723:
! 1724: case 18:
! 1725:
! 1726: /* Line 1455 of yacc.c */
! 1727: #line 210 "parse.y"
! 1728: {
! 1729: #ifndef __linux__
! 1730: if (setkeymsg_addr(SADB_DELETE, (yyvsp[(5) - (6)].num), (yyvsp[(3) - (6)].res), (yyvsp[(4) - (6)].res), 1) < 0)
! 1731: return -1;
! 1732: #else /* __linux__ */
! 1733: /* linux strictly adheres to RFC2367, and returns
! 1734: * an error if we send an SADB_DELETE request without
! 1735: * an SPI. Therefore, we must first retrieve a list
! 1736: * of SPIs for all matching SADB entries, and then
! 1737: * delete each one separately. */
! 1738: u_int32_t *spi;
! 1739: int i, n;
! 1740:
! 1741: spi = sendkeymsg_spigrep((yyvsp[(5) - (6)].num), (yyvsp[(3) - (6)].res), (yyvsp[(4) - (6)].res), &n);
! 1742: for (i = 0; i < n; i++) {
! 1743: p_spi = spi[i];
! 1744: if (setkeymsg_addr(SADB_DELETE,
! 1745: (yyvsp[(5) - (6)].num), (yyvsp[(3) - (6)].res), (yyvsp[(4) - (6)].res), 0) < 0)
! 1746: return -1;
! 1747: }
! 1748: free(spi);
! 1749: #endif /* __linux__ */
! 1750: }
! 1751: break;
! 1752:
! 1753: case 19:
! 1754:
! 1755: /* Line 1455 of yacc.c */
! 1756: #line 238 "parse.y"
! 1757: {
! 1758: int status;
! 1759:
! 1760: if (p_mode != IPSEC_MODE_ANY)
! 1761: yyerror("WARNING: mode is obsolete");
! 1762:
! 1763: status = setkeymsg_addr(SADB_GET, (yyvsp[(5) - (8)].num), (yyvsp[(3) - (8)].res), (yyvsp[(4) - (8)].res), 0);
! 1764: if (status < 0)
! 1765: return -1;
! 1766: }
! 1767: break;
! 1768:
! 1769: case 20:
! 1770:
! 1771: /* Line 1455 of yacc.c */
! 1772: #line 253 "parse.y"
! 1773: {
! 1774: struct sadb_msg msg;
! 1775: setkeymsg0(&msg, SADB_FLUSH, (yyvsp[(2) - (3)].num), sizeof(msg));
! 1776: sendkeymsg((char *)&msg, sizeof(msg));
! 1777: }
! 1778: break;
! 1779:
! 1780: case 21:
! 1781:
! 1782: /* Line 1455 of yacc.c */
! 1783: #line 263 "parse.y"
! 1784: {
! 1785: struct sadb_msg msg;
! 1786: setkeymsg0(&msg, SADB_DUMP, (yyvsp[(2) - (3)].num), sizeof(msg));
! 1787: sendkeymsg((char *)&msg, sizeof(msg));
! 1788: }
! 1789: break;
! 1790:
! 1791: case 22:
! 1792:
! 1793: /* Line 1455 of yacc.c */
! 1794: #line 272 "parse.y"
! 1795: {
! 1796: (yyval.num) = SADB_SATYPE_UNSPEC;
! 1797: }
! 1798: break;
! 1799:
! 1800: case 23:
! 1801:
! 1802: /* Line 1455 of yacc.c */
! 1803: #line 276 "parse.y"
! 1804: {
! 1805: (yyval.num) = SADB_SATYPE_ESP;
! 1806: if ((yyvsp[(1) - (1)].num) == 1)
! 1807: p_ext |= SADB_X_EXT_OLD;
! 1808: else
! 1809: p_ext &= ~SADB_X_EXT_OLD;
! 1810: }
! 1811: break;
! 1812:
! 1813: case 24:
! 1814:
! 1815: /* Line 1455 of yacc.c */
! 1816: #line 284 "parse.y"
! 1817: {
! 1818: (yyval.num) = SADB_SATYPE_AH;
! 1819: if ((yyvsp[(1) - (1)].num) == 1)
! 1820: p_ext |= SADB_X_EXT_OLD;
! 1821: else
! 1822: p_ext &= ~SADB_X_EXT_OLD;
! 1823: }
! 1824: break;
! 1825:
! 1826: case 25:
! 1827:
! 1828: /* Line 1455 of yacc.c */
! 1829: #line 292 "parse.y"
! 1830: {
! 1831: (yyval.num) = SADB_X_SATYPE_IPCOMP;
! 1832: }
! 1833: break;
! 1834:
! 1835: case 26:
! 1836:
! 1837: /* Line 1455 of yacc.c */
! 1838: #line 296 "parse.y"
! 1839: {
! 1840: (yyval.num) = SADB_SATYPE_ESP;
! 1841: p_ext &= ~SADB_X_EXT_OLD;
! 1842: p_natt_oa = 0;
! 1843: p_natt_type = UDP_ENCAP_ESPINUDP;
! 1844: }
! 1845: break;
! 1846:
! 1847: case 27:
! 1848:
! 1849: /* Line 1455 of yacc.c */
! 1850: #line 303 "parse.y"
! 1851: {
! 1852: (yyval.num) = SADB_SATYPE_ESP;
! 1853: p_ext &= ~SADB_X_EXT_OLD;
! 1854: p_natt_oa = (yyvsp[(2) - (2)].res);
! 1855: p_natt_type = UDP_ENCAP_ESPINUDP;
! 1856: }
! 1857: break;
! 1858:
! 1859: case 28:
! 1860:
! 1861: /* Line 1455 of yacc.c */
! 1862: #line 310 "parse.y"
! 1863: {
! 1864: #ifdef SADB_X_SATYPE_TCPSIGNATURE
! 1865: (yyval.num) = SADB_X_SATYPE_TCPSIGNATURE;
! 1866: #endif
! 1867: }
! 1868: break;
! 1869:
! 1870: case 29:
! 1871:
! 1872: /* Line 1455 of yacc.c */
! 1873: #line 318 "parse.y"
! 1874: { p_spi = (yyvsp[(1) - (1)].ulnum); }
! 1875: break;
! 1876:
! 1877: case 30:
! 1878:
! 1879: /* Line 1455 of yacc.c */
! 1880: #line 320 "parse.y"
! 1881: {
! 1882: char *ep;
! 1883: unsigned long v;
! 1884:
! 1885: ep = NULL;
! 1886: v = strtoul((yyvsp[(1) - (1)].val).buf, &ep, 16);
! 1887: if (!ep || *ep) {
! 1888: yyerror("invalid SPI");
! 1889: return -1;
! 1890: }
! 1891: if (v & ~0xffffffff) {
! 1892: yyerror("SPI too big.");
! 1893: return -1;
! 1894: }
! 1895:
! 1896: p_spi = v;
! 1897: }
! 1898: break;
! 1899:
! 1900: case 37:
! 1901:
! 1902: /* Line 1455 of yacc.c */
! 1903: #line 356 "parse.y"
! 1904: {
! 1905: if ((yyvsp[(2) - (2)].num) < 0) {
! 1906: yyerror("unsupported algorithm");
! 1907: return -1;
! 1908: }
! 1909: p_alg_enc = (yyvsp[(2) - (2)].num);
! 1910: }
! 1911: break;
! 1912:
! 1913: case 38:
! 1914:
! 1915: /* Line 1455 of yacc.c */
! 1916: #line 364 "parse.y"
! 1917: {
! 1918: if ((yyvsp[(2) - (3)].num) < 0) {
! 1919: yyerror("unsupported algorithm");
! 1920: return -1;
! 1921: }
! 1922: p_alg_enc = (yyvsp[(2) - (3)].num);
! 1923: p_ext |= SADB_X_EXT_RAWCPI;
! 1924: }
! 1925: break;
! 1926:
! 1927: case 39:
! 1928:
! 1929: /* Line 1455 of yacc.c */
! 1930: #line 375 "parse.y"
! 1931: {
! 1932: if ((yyvsp[(1) - (1)].num) < 0) {
! 1933: yyerror("unsupported algorithm");
! 1934: return -1;
! 1935: }
! 1936: p_alg_enc = (yyvsp[(1) - (1)].num);
! 1937:
! 1938: p_key_enc_len = 0;
! 1939: p_key_enc = "";
! 1940: if (ipsec_check_keylen(SADB_EXT_SUPPORTED_ENCRYPT,
! 1941: p_alg_enc, PFKEY_UNUNIT64(p_key_enc_len)) < 0) {
! 1942: yyerror(ipsec_strerror());
! 1943: return -1;
! 1944: }
! 1945: }
! 1946: break;
! 1947:
! 1948: case 40:
! 1949:
! 1950: /* Line 1455 of yacc.c */
! 1951: #line 390 "parse.y"
! 1952: {
! 1953: if ((yyvsp[(1) - (2)].num) < 0) {
! 1954: yyerror("unsupported algorithm");
! 1955: return -1;
! 1956: }
! 1957: p_alg_enc = (yyvsp[(1) - (2)].num);
! 1958:
! 1959: p_key_enc_len = (yyvsp[(2) - (2)].val).len;
! 1960: p_key_enc = (yyvsp[(2) - (2)].val).buf;
! 1961: if (ipsec_check_keylen(SADB_EXT_SUPPORTED_ENCRYPT,
! 1962: p_alg_enc, PFKEY_UNUNIT64(p_key_enc_len)) < 0) {
! 1963: yyerror(ipsec_strerror());
! 1964: return -1;
! 1965: }
! 1966: }
! 1967: break;
! 1968:
! 1969: case 41:
! 1970:
! 1971: /* Line 1455 of yacc.c */
! 1972: #line 405 "parse.y"
! 1973: {
! 1974: if ((yyvsp[(1) - (1)].num) < 0) {
! 1975: yyerror("unsupported algorithm");
! 1976: return -1;
! 1977: }
! 1978: yyerror("WARNING: obsolete algorithm");
! 1979: p_alg_enc = (yyvsp[(1) - (1)].num);
! 1980:
! 1981: p_key_enc_len = 0;
! 1982: p_key_enc = "";
! 1983: if (ipsec_check_keylen(SADB_EXT_SUPPORTED_ENCRYPT,
! 1984: p_alg_enc, PFKEY_UNUNIT64(p_key_enc_len)) < 0) {
! 1985: yyerror(ipsec_strerror());
! 1986: return -1;
! 1987: }
! 1988: }
! 1989: break;
! 1990:
! 1991: case 42:
! 1992:
! 1993: /* Line 1455 of yacc.c */
! 1994: #line 422 "parse.y"
! 1995: {
! 1996: if ((yyvsp[(1) - (2)].num) < 0) {
! 1997: yyerror("unsupported algorithm");
! 1998: return -1;
! 1999: }
! 2000: p_alg_enc = (yyvsp[(1) - (2)].num);
! 2001: if (p_ext & SADB_X_EXT_OLD) {
! 2002: yyerror("algorithm mismatched");
! 2003: return -1;
! 2004: }
! 2005: p_ext |= SADB_X_EXT_DERIV;
! 2006:
! 2007: p_key_enc_len = (yyvsp[(2) - (2)].val).len;
! 2008: p_key_enc = (yyvsp[(2) - (2)].val).buf;
! 2009: if (ipsec_check_keylen(SADB_EXT_SUPPORTED_ENCRYPT,
! 2010: p_alg_enc, PFKEY_UNUNIT64(p_key_enc_len)) < 0) {
! 2011: yyerror(ipsec_strerror());
! 2012: return -1;
! 2013: }
! 2014: }
! 2015: break;
! 2016:
! 2017: case 43:
! 2018:
! 2019: /* Line 1455 of yacc.c */
! 2020: #line 443 "parse.y"
! 2021: {
! 2022: if ((yyvsp[(1) - (2)].num) < 0) {
! 2023: yyerror("unsupported algorithm");
! 2024: return -1;
! 2025: }
! 2026: p_alg_enc = (yyvsp[(1) - (2)].num);
! 2027: if (!(p_ext & SADB_X_EXT_OLD)) {
! 2028: yyerror("algorithm mismatched");
! 2029: return -1;
! 2030: }
! 2031: p_ext |= SADB_X_EXT_IV4B;
! 2032:
! 2033: p_key_enc_len = (yyvsp[(2) - (2)].val).len;
! 2034: p_key_enc = (yyvsp[(2) - (2)].val).buf;
! 2035: if (ipsec_check_keylen(SADB_EXT_SUPPORTED_ENCRYPT,
! 2036: p_alg_enc, PFKEY_UNUNIT64(p_key_enc_len)) < 0) {
! 2037: yyerror(ipsec_strerror());
! 2038: return -1;
! 2039: }
! 2040: }
! 2041: break;
! 2042:
! 2043: case 44:
! 2044:
! 2045: /* Line 1455 of yacc.c */
! 2046: #line 466 "parse.y"
! 2047: {
! 2048: if ((yyvsp[(1) - (2)].num) < 0) {
! 2049: yyerror("unsupported algorithm");
! 2050: return -1;
! 2051: }
! 2052: p_alg_auth = (yyvsp[(1) - (2)].num);
! 2053:
! 2054: p_key_auth_len = (yyvsp[(2) - (2)].val).len;
! 2055: p_key_auth = (yyvsp[(2) - (2)].val).buf;
! 2056: #ifdef SADB_X_AALG_TCP_MD5
! 2057: if (p_alg_auth == SADB_X_AALG_TCP_MD5) {
! 2058: if ((p_key_auth_len < 1) ||
! 2059: (p_key_auth_len > 80))
! 2060: return -1;
! 2061: } else
! 2062: #endif
! 2063: {
! 2064: if (ipsec_check_keylen(SADB_EXT_SUPPORTED_AUTH,
! 2065: p_alg_auth,
! 2066: PFKEY_UNUNIT64(p_key_auth_len)) < 0) {
! 2067: yyerror(ipsec_strerror());
! 2068: return -1;
! 2069: }
! 2070: }
! 2071: }
! 2072: break;
! 2073:
! 2074: case 45:
! 2075:
! 2076: /* Line 1455 of yacc.c */
! 2077: #line 491 "parse.y"
! 2078: {
! 2079: if ((yyvsp[(1) - (1)].num) < 0) {
! 2080: yyerror("unsupported algorithm");
! 2081: return -1;
! 2082: }
! 2083: p_alg_auth = (yyvsp[(1) - (1)].num);
! 2084:
! 2085: p_key_auth_len = 0;
! 2086: p_key_auth = NULL;
! 2087: }
! 2088: break;
! 2089:
! 2090: case 46:
! 2091:
! 2092: /* Line 1455 of yacc.c */
! 2093: #line 505 "parse.y"
! 2094: {
! 2095: (yyval.val) = (yyvsp[(1) - (1)].val);
! 2096: }
! 2097: break;
! 2098:
! 2099: case 47:
! 2100:
! 2101: /* Line 1455 of yacc.c */
! 2102: #line 509 "parse.y"
! 2103: {
! 2104: caddr_t pp_key;
! 2105: caddr_t bp;
! 2106: caddr_t yp = (yyvsp[(1) - (1)].val).buf;
! 2107: int l;
! 2108:
! 2109: l = strlen(yp) % 2 + strlen(yp) / 2;
! 2110: if ((pp_key = malloc(l)) == 0) {
! 2111: yyerror("not enough core");
! 2112: return -1;
! 2113: }
! 2114: memset(pp_key, 0, l);
! 2115:
! 2116: bp = pp_key;
! 2117: if (strlen(yp) % 2) {
! 2118: *bp = ATOX(yp[0]);
! 2119: yp++, bp++;
! 2120: }
! 2121: while (*yp) {
! 2122: *bp = (ATOX(yp[0]) << 4) | ATOX(yp[1]);
! 2123: yp += 2, bp++;
! 2124: }
! 2125:
! 2126: (yyval.val).len = l;
! 2127: (yyval.val).buf = pp_key;
! 2128: }
! 2129: break;
! 2130:
! 2131: case 50:
! 2132:
! 2133: /* Line 1455 of yacc.c */
! 2134: #line 543 "parse.y"
! 2135: { p_ext |= (yyvsp[(2) - (2)].num); }
! 2136: break;
! 2137:
! 2138: case 51:
! 2139:
! 2140: /* Line 1455 of yacc.c */
! 2141: #line 544 "parse.y"
! 2142: { p_ext &= ~SADB_X_EXT_CYCSEQ; }
! 2143: break;
! 2144:
! 2145: case 52:
! 2146:
! 2147: /* Line 1455 of yacc.c */
! 2148: #line 545 "parse.y"
! 2149: { p_mode = (yyvsp[(2) - (2)].num); }
! 2150: break;
! 2151:
! 2152: case 53:
! 2153:
! 2154: /* Line 1455 of yacc.c */
! 2155: #line 546 "parse.y"
! 2156: { p_mode = IPSEC_MODE_ANY; }
! 2157: break;
! 2158:
! 2159: case 54:
! 2160:
! 2161: /* Line 1455 of yacc.c */
! 2162: #line 547 "parse.y"
! 2163: { p_reqid = (yyvsp[(2) - (2)].ulnum); }
! 2164: break;
! 2165:
! 2166: case 55:
! 2167:
! 2168: /* Line 1455 of yacc.c */
! 2169: #line 549 "parse.y"
! 2170: {
! 2171: if ((p_ext & SADB_X_EXT_OLD) != 0) {
! 2172: yyerror("replay prevention cannot be used with "
! 2173: "ah/esp-old");
! 2174: return -1;
! 2175: }
! 2176: p_replay = (yyvsp[(2) - (2)].ulnum);
! 2177: }
! 2178: break;
! 2179:
! 2180: case 56:
! 2181:
! 2182: /* Line 1455 of yacc.c */
! 2183: #line 557 "parse.y"
! 2184: { p_lt_hard = (yyvsp[(2) - (2)].ulnum); }
! 2185: break;
! 2186:
! 2187: case 57:
! 2188:
! 2189: /* Line 1455 of yacc.c */
! 2190: #line 558 "parse.y"
! 2191: { p_lt_soft = (yyvsp[(2) - (2)].ulnum); }
! 2192: break;
! 2193:
! 2194: case 58:
! 2195:
! 2196: /* Line 1455 of yacc.c */
! 2197: #line 559 "parse.y"
! 2198: { p_lb_hard = (yyvsp[(2) - (2)].ulnum); }
! 2199: break;
! 2200:
! 2201: case 59:
! 2202:
! 2203: /* Line 1455 of yacc.c */
! 2204: #line 560 "parse.y"
! 2205: { p_lb_soft = (yyvsp[(2) - (2)].ulnum); }
! 2206: break;
! 2207:
! 2208: case 60:
! 2209:
! 2210: /* Line 1455 of yacc.c */
! 2211: #line 561 "parse.y"
! 2212: {
! 2213: sec_ctx.doi = (yyvsp[(2) - (4)].ulnum);
! 2214: sec_ctx.alg = (yyvsp[(3) - (4)].ulnum);
! 2215: sec_ctx.len = (yyvsp[(4) - (4)].val).len+1;
! 2216: sec_ctx.buf = (yyvsp[(4) - (4)].val).buf;
! 2217: }
! 2218: break;
! 2219:
! 2220: case 61:
! 2221:
! 2222: /* Line 1455 of yacc.c */
! 2223: #line 574 "parse.y"
! 2224: {
! 2225: int status;
! 2226: struct addrinfo *src, *dst;
! 2227:
! 2228: #ifdef HAVE_PFKEY_POLICY_PRIORITY
! 2229: last_msg_type = SADB_X_SPDADD;
! 2230: #endif
! 2231:
! 2232: /* fixed port fields if ulp is icmp */
! 2233: if (fix_portstr((yyvsp[(9) - (13)].num), &(yyvsp[(10) - (13)].val), &(yyvsp[(5) - (13)].val), &(yyvsp[(8) - (13)].val)))
! 2234: return -1;
! 2235:
! 2236: src = parse_addr((yyvsp[(3) - (13)].val).buf, (yyvsp[(5) - (13)].val).buf);
! 2237: dst = parse_addr((yyvsp[(6) - (13)].val).buf, (yyvsp[(8) - (13)].val).buf);
! 2238: if (!src || !dst) {
! 2239: /* yyerror is already called */
! 2240: return -1;
! 2241: }
! 2242: if (src->ai_next || dst->ai_next) {
! 2243: yyerror("multiple address specified");
! 2244: freeaddrinfo(src);
! 2245: freeaddrinfo(dst);
! 2246: return -1;
! 2247: }
! 2248:
! 2249: status = setkeymsg_spdaddr(SADB_X_SPDADD, (yyvsp[(9) - (13)].num), &(yyvsp[(12) - (13)].val),
! 2250: src, (yyvsp[(4) - (13)].num), dst, (yyvsp[(7) - (13)].num));
! 2251: freeaddrinfo(src);
! 2252: freeaddrinfo(dst);
! 2253: if (status < 0)
! 2254: return -1;
! 2255: }
! 2256: break;
! 2257:
! 2258: case 62:
! 2259:
! 2260: /* Line 1455 of yacc.c */
! 2261: #line 607 "parse.y"
! 2262: {
! 2263: int status;
! 2264:
! 2265: status = setkeymsg_spdaddr_tag(SADB_X_SPDADD,
! 2266: (yyvsp[(3) - (5)].val).buf, &(yyvsp[(4) - (5)].val));
! 2267: if (status < 0)
! 2268: return -1;
! 2269: }
! 2270: break;
! 2271:
! 2272: case 63:
! 2273:
! 2274: /* Line 1455 of yacc.c */
! 2275: #line 620 "parse.y"
! 2276: {
! 2277: int status;
! 2278: struct addrinfo *src, *dst;
! 2279:
! 2280: #ifdef HAVE_PFKEY_POLICY_PRIORITY
! 2281: last_msg_type = SADB_X_SPDUPDATE;
! 2282: #endif
! 2283:
! 2284: /* fixed port fields if ulp is icmp */
! 2285: if (fix_portstr((yyvsp[(9) - (13)].num), &(yyvsp[(10) - (13)].val), &(yyvsp[(5) - (13)].val), &(yyvsp[(8) - (13)].val)))
! 2286: return -1;
! 2287:
! 2288: src = parse_addr((yyvsp[(3) - (13)].val).buf, (yyvsp[(5) - (13)].val).buf);
! 2289: dst = parse_addr((yyvsp[(6) - (13)].val).buf, (yyvsp[(8) - (13)].val).buf);
! 2290: if (!src || !dst) {
! 2291: /* yyerror is already called */
! 2292: return -1;
! 2293: }
! 2294: if (src->ai_next || dst->ai_next) {
! 2295: yyerror("multiple address specified");
! 2296: freeaddrinfo(src);
! 2297: freeaddrinfo(dst);
! 2298: return -1;
! 2299: }
! 2300:
! 2301: status = setkeymsg_spdaddr(SADB_X_SPDUPDATE, (yyvsp[(9) - (13)].num), &(yyvsp[(12) - (13)].val),
! 2302: src, (yyvsp[(4) - (13)].num), dst, (yyvsp[(7) - (13)].num));
! 2303: freeaddrinfo(src);
! 2304: freeaddrinfo(dst);
! 2305: if (status < 0)
! 2306: return -1;
! 2307: }
! 2308: break;
! 2309:
! 2310: case 64:
! 2311:
! 2312: /* Line 1455 of yacc.c */
! 2313: #line 653 "parse.y"
! 2314: {
! 2315: int status;
! 2316:
! 2317: status = setkeymsg_spdaddr_tag(SADB_X_SPDUPDATE,
! 2318: (yyvsp[(3) - (5)].val).buf, &(yyvsp[(4) - (5)].val));
! 2319: if (status < 0)
! 2320: return -1;
! 2321: }
! 2322: break;
! 2323:
! 2324: case 65:
! 2325:
! 2326: /* Line 1455 of yacc.c */
! 2327: #line 665 "parse.y"
! 2328: {
! 2329: int status;
! 2330: struct addrinfo *src, *dst;
! 2331:
! 2332: /* fixed port fields if ulp is icmp */
! 2333: if (fix_portstr((yyvsp[(9) - (13)].num), &(yyvsp[(10) - (13)].val), &(yyvsp[(5) - (13)].val), &(yyvsp[(8) - (13)].val)))
! 2334: return -1;
! 2335:
! 2336: src = parse_addr((yyvsp[(3) - (13)].val).buf, (yyvsp[(5) - (13)].val).buf);
! 2337: dst = parse_addr((yyvsp[(6) - (13)].val).buf, (yyvsp[(8) - (13)].val).buf);
! 2338: if (!src || !dst) {
! 2339: /* yyerror is already called */
! 2340: return -1;
! 2341: }
! 2342: if (src->ai_next || dst->ai_next) {
! 2343: yyerror("multiple address specified");
! 2344: freeaddrinfo(src);
! 2345: freeaddrinfo(dst);
! 2346: return -1;
! 2347: }
! 2348:
! 2349: status = setkeymsg_spdaddr(SADB_X_SPDDELETE, (yyvsp[(9) - (13)].num), &(yyvsp[(12) - (13)].val),
! 2350: src, (yyvsp[(4) - (13)].num), dst, (yyvsp[(7) - (13)].num));
! 2351: freeaddrinfo(src);
! 2352: freeaddrinfo(dst);
! 2353: if (status < 0)
! 2354: return -1;
! 2355: }
! 2356: break;
! 2357:
! 2358: case 66:
! 2359:
! 2360: /* Line 1455 of yacc.c */
! 2361: #line 697 "parse.y"
! 2362: {
! 2363: struct sadb_msg msg;
! 2364: setkeymsg0(&msg, SADB_X_SPDDUMP, SADB_SATYPE_UNSPEC,
! 2365: sizeof(msg));
! 2366: sendkeymsg((char *)&msg, sizeof(msg));
! 2367: }
! 2368: break;
! 2369:
! 2370: case 67:
! 2371:
! 2372: /* Line 1455 of yacc.c */
! 2373: #line 708 "parse.y"
! 2374: {
! 2375: struct sadb_msg msg;
! 2376: setkeymsg0(&msg, SADB_X_SPDFLUSH, SADB_SATYPE_UNSPEC,
! 2377: sizeof(msg));
! 2378: sendkeymsg((char *)&msg, sizeof(msg));
! 2379: }
! 2380: break;
! 2381:
! 2382: case 70:
! 2383:
! 2384: /* Line 1455 of yacc.c */
! 2385: #line 723 "parse.y"
! 2386: {
! 2387: char *p;
! 2388:
! 2389: for (p = (yyvsp[(1) - (1)].val).buf + 1; *p; p++)
! 2390: switch (*p) {
! 2391: case '4':
! 2392: p_aifamily = AF_INET;
! 2393: break;
! 2394: #ifdef INET6
! 2395: case '6':
! 2396: p_aifamily = AF_INET6;
! 2397: break;
! 2398: #endif
! 2399: case 'n':
! 2400: p_aiflags = AI_NUMERICHOST;
! 2401: break;
! 2402: default:
! 2403: yyerror("invalid flag");
! 2404: return -1;
! 2405: }
! 2406: }
! 2407: break;
! 2408:
! 2409: case 71:
! 2410:
! 2411: /* Line 1455 of yacc.c */
! 2412: #line 748 "parse.y"
! 2413: {
! 2414: (yyval.res) = parse_addr((yyvsp[(1) - (1)].val).buf, NULL);
! 2415: if ((yyval.res) == NULL) {
! 2416: /* yyerror already called by parse_addr */
! 2417: return -1;
! 2418: }
! 2419: }
! 2420: break;
! 2421:
! 2422: case 72:
! 2423:
! 2424: /* Line 1455 of yacc.c */
! 2425: #line 759 "parse.y"
! 2426: {
! 2427: (yyval.res) = parse_addr((yyvsp[(1) - (1)].val).buf, NULL);
! 2428: if ((yyval.res) == NULL) {
! 2429: /* yyerror already called by parse_addr */
! 2430: return -1;
! 2431: }
! 2432: }
! 2433: break;
! 2434:
! 2435: case 73:
! 2436:
! 2437: /* Line 1455 of yacc.c */
! 2438: #line 767 "parse.y"
! 2439: {
! 2440: (yyval.res) = parse_addr((yyvsp[(1) - (2)].val).buf, (yyvsp[(2) - (2)].val).buf);
! 2441: if ((yyval.res) == NULL) {
! 2442: /* yyerror already called by parse_addr */
! 2443: return -1;
! 2444: }
! 2445: }
! 2446: break;
! 2447:
! 2448: case 74:
! 2449:
! 2450: /* Line 1455 of yacc.c */
! 2451: #line 777 "parse.y"
! 2452: { (yyval.num) = -1; }
! 2453: break;
! 2454:
! 2455: case 75:
! 2456:
! 2457: /* Line 1455 of yacc.c */
! 2458: #line 778 "parse.y"
! 2459: { (yyval.num) = (yyvsp[(2) - (2)].ulnum); }
! 2460: break;
! 2461:
! 2462: case 76:
! 2463:
! 2464: /* Line 1455 of yacc.c */
! 2465: #line 783 "parse.y"
! 2466: {
! 2467: (yyval.val).buf = strdup("0");
! 2468: if (!(yyval.val).buf) {
! 2469: yyerror("insufficient memory");
! 2470: return -1;
! 2471: }
! 2472: (yyval.val).len = strlen((yyval.val).buf);
! 2473: }
! 2474: break;
! 2475:
! 2476: case 77:
! 2477:
! 2478: /* Line 1455 of yacc.c */
! 2479: #line 792 "parse.y"
! 2480: {
! 2481: (yyval.val).buf = strdup("0");
! 2482: if (!(yyval.val).buf) {
! 2483: yyerror("insufficient memory");
! 2484: return -1;
! 2485: }
! 2486: (yyval.val).len = strlen((yyval.val).buf);
! 2487: }
! 2488: break;
! 2489:
! 2490: case 78:
! 2491:
! 2492: /* Line 1455 of yacc.c */
! 2493: #line 801 "parse.y"
! 2494: {
! 2495: char buf[20];
! 2496: snprintf(buf, sizeof(buf), "%lu", (yyvsp[(2) - (3)].ulnum));
! 2497: (yyval.val).buf = strdup(buf);
! 2498: if (!(yyval.val).buf) {
! 2499: yyerror("insufficient memory");
! 2500: return -1;
! 2501: }
! 2502: (yyval.val).len = strlen((yyval.val).buf);
! 2503: }
! 2504: break;
! 2505:
! 2506: case 79:
! 2507:
! 2508: /* Line 1455 of yacc.c */
! 2509: #line 812 "parse.y"
! 2510: {
! 2511: (yyval.val) = (yyvsp[(2) - (3)].val);
! 2512: }
! 2513: break;
! 2514:
! 2515: case 80:
! 2516:
! 2517: /* Line 1455 of yacc.c */
! 2518: #line 818 "parse.y"
! 2519: { (yyval.num) = (yyvsp[(1) - (1)].ulnum); }
! 2520: break;
! 2521:
! 2522: case 81:
! 2523:
! 2524: /* Line 1455 of yacc.c */
! 2525: #line 819 "parse.y"
! 2526: { (yyval.num) = IPSEC_ULPROTO_ANY; }
! 2527: break;
! 2528:
! 2529: case 82:
! 2530:
! 2531: /* Line 1455 of yacc.c */
! 2532: #line 820 "parse.y"
! 2533: {
! 2534: (yyval.num) = IPPROTO_TCP;
! 2535: }
! 2536: break;
! 2537:
! 2538: case 83:
! 2539:
! 2540: /* Line 1455 of yacc.c */
! 2541: #line 824 "parse.y"
! 2542: {
! 2543: struct protoent *ent;
! 2544:
! 2545: ent = getprotobyname((yyvsp[(1) - (1)].val).buf);
! 2546: if (ent)
! 2547: (yyval.num) = ent->p_proto;
! 2548: else {
! 2549: if (strcmp("icmp6", (yyvsp[(1) - (1)].val).buf) == 0) {
! 2550: (yyval.num) = IPPROTO_ICMPV6;
! 2551: } else if(strcmp("ip4", (yyvsp[(1) - (1)].val).buf) == 0) {
! 2552: (yyval.num) = IPPROTO_IPV4;
! 2553: } else {
! 2554: yyerror("invalid upper layer protocol");
! 2555: return -1;
! 2556: }
! 2557: }
! 2558: endprotoent();
! 2559: }
! 2560: break;
! 2561:
! 2562: case 84:
! 2563:
! 2564: /* Line 1455 of yacc.c */
! 2565: #line 846 "parse.y"
! 2566: {
! 2567: (yyval.val).buf = NULL;
! 2568: (yyval.val).len = 0;
! 2569: }
! 2570: break;
! 2571:
! 2572: case 85:
! 2573:
! 2574: /* Line 1455 of yacc.c */
! 2575: #line 851 "parse.y"
! 2576: {
! 2577: (yyval.val).buf = strdup((yyvsp[(1) - (1)].val).buf);
! 2578: if (!(yyval.val).buf) {
! 2579: yyerror("insufficient memory");
! 2580: return -1;
! 2581: }
! 2582: (yyval.val).len = strlen((yyval.val).buf);
! 2583: }
! 2584: break;
! 2585:
! 2586: case 87:
! 2587:
! 2588: /* Line 1455 of yacc.c */
! 2589: #line 863 "parse.y"
! 2590: {
! 2591: sec_ctx.doi = (yyvsp[(2) - (4)].ulnum);
! 2592: sec_ctx.alg = (yyvsp[(3) - (4)].ulnum);
! 2593: sec_ctx.len = (yyvsp[(4) - (4)].val).len+1;
! 2594: sec_ctx.buf = (yyvsp[(4) - (4)].val).buf;
! 2595: }
! 2596: break;
! 2597:
! 2598: case 88:
! 2599:
! 2600: /* Line 1455 of yacc.c */
! 2601: #line 873 "parse.y"
! 2602: {
! 2603: char *policy;
! 2604: #ifdef HAVE_PFKEY_POLICY_PRIORITY
! 2605: struct sadb_x_policy *xpl;
! 2606: #endif
! 2607:
! 2608: policy = ipsec_set_policy((yyvsp[(2) - (2)].val).buf, (yyvsp[(2) - (2)].val).len);
! 2609: if (policy == NULL) {
! 2610: yyerror(ipsec_strerror());
! 2611: return -1;
! 2612: }
! 2613:
! 2614: (yyval.val).buf = policy;
! 2615: (yyval.val).len = ipsec_get_policylen(policy);
! 2616:
! 2617: #ifdef HAVE_PFKEY_POLICY_PRIORITY
! 2618: xpl = (struct sadb_x_policy *) (yyval.val).buf;
! 2619: last_priority = xpl->sadb_x_policy_priority;
! 2620: #endif
! 2621: }
! 2622: break;
! 2623:
! 2624: case 89:
! 2625:
! 2626: /* Line 1455 of yacc.c */
! 2627: #line 896 "parse.y"
! 2628: { (yyval.val) = (yyvsp[(1) - (1)].val); }
! 2629: break;
! 2630:
! 2631: case 90:
! 2632:
! 2633: /* Line 1455 of yacc.c */
! 2634: #line 902 "parse.y"
! 2635: {
! 2636: exit_now = 1;
! 2637: YYACCEPT;
! 2638: }
! 2639: break;
! 2640:
! 2641:
! 2642:
! 2643: /* Line 1455 of yacc.c */
! 2644: #line 2645 "parse.c"
! 2645: default: break;
! 2646: }
! 2647: YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
! 2648:
! 2649: YYPOPSTACK (yylen);
! 2650: yylen = 0;
! 2651: YY_STACK_PRINT (yyss, yyssp);
! 2652:
! 2653: *++yyvsp = yyval;
! 2654:
! 2655: /* Now `shift' the result of the reduction. Determine what state
! 2656: that goes to, based on the state we popped back to and the rule
! 2657: number reduced by. */
! 2658:
! 2659: yyn = yyr1[yyn];
! 2660:
! 2661: yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
! 2662: if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
! 2663: yystate = yytable[yystate];
! 2664: else
! 2665: yystate = yydefgoto[yyn - YYNTOKENS];
! 2666:
! 2667: goto yynewstate;
! 2668:
! 2669:
! 2670: /*------------------------------------.
! 2671: | yyerrlab -- here on detecting error |
! 2672: `------------------------------------*/
! 2673: yyerrlab:
! 2674: /* If not already recovering from an error, report this error. */
! 2675: if (!yyerrstatus)
! 2676: {
! 2677: ++yynerrs;
! 2678: #if ! YYERROR_VERBOSE
! 2679: yyerror (YY_("syntax error"));
! 2680: #else
! 2681: {
! 2682: YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
! 2683: if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
! 2684: {
! 2685: YYSIZE_T yyalloc = 2 * yysize;
! 2686: if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
! 2687: yyalloc = YYSTACK_ALLOC_MAXIMUM;
! 2688: if (yymsg != yymsgbuf)
! 2689: YYSTACK_FREE (yymsg);
! 2690: yymsg = (char *) YYSTACK_ALLOC (yyalloc);
! 2691: if (yymsg)
! 2692: yymsg_alloc = yyalloc;
! 2693: else
! 2694: {
! 2695: yymsg = yymsgbuf;
! 2696: yymsg_alloc = sizeof yymsgbuf;
! 2697: }
! 2698: }
! 2699:
! 2700: if (0 < yysize && yysize <= yymsg_alloc)
! 2701: {
! 2702: (void) yysyntax_error (yymsg, yystate, yychar);
! 2703: yyerror (yymsg);
! 2704: }
! 2705: else
! 2706: {
! 2707: yyerror (YY_("syntax error"));
! 2708: if (yysize != 0)
! 2709: goto yyexhaustedlab;
! 2710: }
! 2711: }
! 2712: #endif
! 2713: }
! 2714:
! 2715:
! 2716:
! 2717: if (yyerrstatus == 3)
! 2718: {
! 2719: /* If just tried and failed to reuse lookahead token after an
! 2720: error, discard it. */
! 2721:
! 2722: if (yychar <= YYEOF)
! 2723: {
! 2724: /* Return failure if at end of input. */
! 2725: if (yychar == YYEOF)
! 2726: YYABORT;
! 2727: }
! 2728: else
! 2729: {
! 2730: yydestruct ("Error: discarding",
! 2731: yytoken, &yylval);
! 2732: yychar = YYEMPTY;
! 2733: }
! 2734: }
! 2735:
! 2736: /* Else will try to reuse lookahead token after shifting the error
! 2737: token. */
! 2738: goto yyerrlab1;
! 2739:
! 2740:
! 2741: /*---------------------------------------------------.
! 2742: | yyerrorlab -- error raised explicitly by YYERROR. |
! 2743: `---------------------------------------------------*/
! 2744: yyerrorlab:
! 2745:
! 2746: /* Pacify compilers like GCC when the user code never invokes
! 2747: YYERROR and the label yyerrorlab therefore never appears in user
! 2748: code. */
! 2749: if (/*CONSTCOND*/ 0)
! 2750: goto yyerrorlab;
! 2751:
! 2752: /* Do not reclaim the symbols of the rule which action triggered
! 2753: this YYERROR. */
! 2754: YYPOPSTACK (yylen);
! 2755: yylen = 0;
! 2756: YY_STACK_PRINT (yyss, yyssp);
! 2757: yystate = *yyssp;
! 2758: goto yyerrlab1;
! 2759:
! 2760:
! 2761: /*-------------------------------------------------------------.
! 2762: | yyerrlab1 -- common code for both syntax error and YYERROR. |
! 2763: `-------------------------------------------------------------*/
! 2764: yyerrlab1:
! 2765: yyerrstatus = 3; /* Each real token shifted decrements this. */
! 2766:
! 2767: for (;;)
! 2768: {
! 2769: yyn = yypact[yystate];
! 2770: if (yyn != YYPACT_NINF)
! 2771: {
! 2772: yyn += YYTERROR;
! 2773: if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
! 2774: {
! 2775: yyn = yytable[yyn];
! 2776: if (0 < yyn)
! 2777: break;
! 2778: }
! 2779: }
! 2780:
! 2781: /* Pop the current state because it cannot handle the error token. */
! 2782: if (yyssp == yyss)
! 2783: YYABORT;
! 2784:
! 2785:
! 2786: yydestruct ("Error: popping",
! 2787: yystos[yystate], yyvsp);
! 2788: YYPOPSTACK (1);
! 2789: yystate = *yyssp;
! 2790: YY_STACK_PRINT (yyss, yyssp);
! 2791: }
! 2792:
! 2793: *++yyvsp = yylval;
! 2794:
! 2795:
! 2796: /* Shift the error token. */
! 2797: YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
! 2798:
! 2799: yystate = yyn;
! 2800: goto yynewstate;
! 2801:
! 2802:
! 2803: /*-------------------------------------.
! 2804: | yyacceptlab -- YYACCEPT comes here. |
! 2805: `-------------------------------------*/
! 2806: yyacceptlab:
! 2807: yyresult = 0;
! 2808: goto yyreturn;
! 2809:
! 2810: /*-----------------------------------.
! 2811: | yyabortlab -- YYABORT comes here. |
! 2812: `-----------------------------------*/
! 2813: yyabortlab:
! 2814: yyresult = 1;
! 2815: goto yyreturn;
! 2816:
! 2817: #if !defined(yyoverflow) || YYERROR_VERBOSE
! 2818: /*-------------------------------------------------.
! 2819: | yyexhaustedlab -- memory exhaustion comes here. |
! 2820: `-------------------------------------------------*/
! 2821: yyexhaustedlab:
! 2822: yyerror (YY_("memory exhausted"));
! 2823: yyresult = 2;
! 2824: /* Fall through. */
! 2825: #endif
! 2826:
! 2827: yyreturn:
! 2828: if (yychar != YYEMPTY)
! 2829: yydestruct ("Cleanup: discarding lookahead",
! 2830: yytoken, &yylval);
! 2831: /* Do not reclaim the symbols of the rule which action triggered
! 2832: this YYABORT or YYACCEPT. */
! 2833: YYPOPSTACK (yylen);
! 2834: YY_STACK_PRINT (yyss, yyssp);
! 2835: while (yyssp != yyss)
! 2836: {
! 2837: yydestruct ("Cleanup: popping",
! 2838: yystos[*yyssp], yyvsp);
! 2839: YYPOPSTACK (1);
! 2840: }
! 2841: #ifndef yyoverflow
! 2842: if (yyss != yyssa)
! 2843: YYSTACK_FREE (yyss);
! 2844: #endif
! 2845: #if YYERROR_VERBOSE
! 2846: if (yymsg != yymsgbuf)
! 2847: YYSTACK_FREE (yymsg);
! 2848: #endif
! 2849: /* Make sure YYID is used. */
! 2850: return YYID (yyresult);
! 2851: }
! 2852:
! 2853:
! 2854:
! 2855: /* Line 1675 of yacc.c */
! 2856: #line 907 "parse.y"
! 2857:
! 2858:
! 2859: int
! 2860: setkeymsg0(msg, type, satype, l)
! 2861: struct sadb_msg *msg;
! 2862: unsigned int type;
! 2863: unsigned int satype;
! 2864: size_t l;
! 2865: {
! 2866:
! 2867: msg->sadb_msg_version = PF_KEY_V2;
! 2868: msg->sadb_msg_type = type;
! 2869: msg->sadb_msg_errno = 0;
! 2870: msg->sadb_msg_satype = satype;
! 2871: msg->sadb_msg_reserved = 0;
! 2872: msg->sadb_msg_seq = 0;
! 2873: msg->sadb_msg_pid = getpid();
! 2874: msg->sadb_msg_len = PFKEY_UNIT64(l);
! 2875: return 0;
! 2876: }
! 2877:
! 2878: /* XXX NO BUFFER OVERRUN CHECK! BAD BAD! */
! 2879: static int
! 2880: setkeymsg_spdaddr(type, upper, policy, srcs, splen, dsts, dplen)
! 2881: unsigned int type;
! 2882: unsigned int upper;
! 2883: vchar_t *policy;
! 2884: struct addrinfo *srcs;
! 2885: int splen;
! 2886: struct addrinfo *dsts;
! 2887: int dplen;
! 2888: {
! 2889: struct sadb_msg *msg;
! 2890: char buf[BUFSIZ];
! 2891: int l, l0;
! 2892: struct sadb_address m_addr;
! 2893: struct addrinfo *s, *d;
! 2894: int n;
! 2895: int plen;
! 2896: struct sockaddr *sa;
! 2897: int salen;
! 2898: struct sadb_x_policy *sp;
! 2899: #ifdef HAVE_POLICY_FWD
! 2900: struct sadb_x_ipsecrequest *ps = NULL;
! 2901: int saved_level, saved_id = 0;
! 2902: #endif
! 2903:
! 2904: msg = (struct sadb_msg *)buf;
! 2905:
! 2906: if (!srcs || !dsts)
! 2907: return -1;
! 2908:
! 2909: /* fix up length afterwards */
! 2910: setkeymsg0(msg, type, SADB_SATYPE_UNSPEC, 0);
! 2911: l = sizeof(struct sadb_msg);
! 2912:
! 2913: sp = (struct sadb_x_policy*) (buf + l);
! 2914: memcpy(buf + l, policy->buf, policy->len);
! 2915: l += policy->len;
! 2916:
! 2917: l0 = l;
! 2918: n = 0;
! 2919:
! 2920: /* do it for all src/dst pairs */
! 2921: for (s = srcs; s; s = s->ai_next) {
! 2922: for (d = dsts; d; d = d->ai_next) {
! 2923: /* rewind pointer */
! 2924: l = l0;
! 2925:
! 2926: if (s->ai_addr->sa_family != d->ai_addr->sa_family)
! 2927: continue;
! 2928: switch (s->ai_addr->sa_family) {
! 2929: case AF_INET:
! 2930: plen = sizeof(struct in_addr) << 3;
! 2931: break;
! 2932: #ifdef INET6
! 2933: case AF_INET6:
! 2934: plen = sizeof(struct in6_addr) << 3;
! 2935: break;
! 2936: #endif
! 2937: default:
! 2938: continue;
! 2939: }
! 2940:
! 2941: /* set src */
! 2942: sa = s->ai_addr;
! 2943: salen = sysdep_sa_len(s->ai_addr);
! 2944: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 2945: PFKEY_ALIGN8(salen));
! 2946: m_addr.sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
! 2947: m_addr.sadb_address_proto = upper;
! 2948: m_addr.sadb_address_prefixlen =
! 2949: (splen >= 0 ? splen : plen);
! 2950: m_addr.sadb_address_reserved = 0;
! 2951:
! 2952: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 2953: sizeof(m_addr), (caddr_t)sa, salen);
! 2954:
! 2955: /* set dst */
! 2956: sa = d->ai_addr;
! 2957: salen = sysdep_sa_len(d->ai_addr);
! 2958: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 2959: PFKEY_ALIGN8(salen));
! 2960: m_addr.sadb_address_exttype = SADB_EXT_ADDRESS_DST;
! 2961: m_addr.sadb_address_proto = upper;
! 2962: m_addr.sadb_address_prefixlen =
! 2963: (dplen >= 0 ? dplen : plen);
! 2964: m_addr.sadb_address_reserved = 0;
! 2965:
! 2966: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 2967: sizeof(m_addr), sa, salen);
! 2968: #ifdef SADB_X_EXT_SEC_CTX
! 2969: /* Add security context label */
! 2970: if (sec_ctx.doi) {
! 2971: struct sadb_x_sec_ctx m_sec_ctx;
! 2972: u_int slen = sizeof(struct sadb_x_sec_ctx);
! 2973:
! 2974: memset(&m_sec_ctx, 0, slen);
! 2975:
! 2976: m_sec_ctx.sadb_x_sec_len =
! 2977: PFKEY_UNIT64(slen + PFKEY_ALIGN8(sec_ctx.len));
! 2978:
! 2979: m_sec_ctx.sadb_x_sec_exttype =
! 2980: SADB_X_EXT_SEC_CTX;
! 2981: m_sec_ctx.sadb_x_ctx_len = sec_ctx.len;/*bytes*/
! 2982: m_sec_ctx.sadb_x_ctx_doi = sec_ctx.doi;
! 2983: m_sec_ctx.sadb_x_ctx_alg = sec_ctx.alg;
! 2984: setvarbuf(buf, &l,
! 2985: (struct sadb_ext *)&m_sec_ctx, slen,
! 2986: (caddr_t)sec_ctx.buf, sec_ctx.len);
! 2987: }
! 2988: #endif
! 2989: msg->sadb_msg_len = PFKEY_UNIT64(l);
! 2990:
! 2991: sendkeymsg(buf, l);
! 2992:
! 2993: #ifdef HAVE_POLICY_FWD
! 2994: /* create extra call for FWD policy */
! 2995: if (f_rfcmode && sp->sadb_x_policy_dir == IPSEC_DIR_INBOUND) {
! 2996: sp->sadb_x_policy_dir = IPSEC_DIR_FWD;
! 2997: ps = (struct sadb_x_ipsecrequest*) (sp+1);
! 2998:
! 2999: /* if request level is unique, change it to
! 3000: * require for fwd policy */
! 3001: /* XXX: currently, only first policy is updated
! 3002: * only. Update following too... */
! 3003: saved_level = ps->sadb_x_ipsecrequest_level;
! 3004: if (saved_level == IPSEC_LEVEL_UNIQUE) {
! 3005: saved_id = ps->sadb_x_ipsecrequest_reqid;
! 3006: ps->sadb_x_ipsecrequest_reqid=0;
! 3007: ps->sadb_x_ipsecrequest_level=IPSEC_LEVEL_REQUIRE;
! 3008: }
! 3009:
! 3010: sendkeymsg(buf, l);
! 3011: /* restoring for next message */
! 3012: sp->sadb_x_policy_dir = IPSEC_DIR_INBOUND;
! 3013: if (saved_level == IPSEC_LEVEL_UNIQUE) {
! 3014: ps->sadb_x_ipsecrequest_reqid = saved_id;
! 3015: ps->sadb_x_ipsecrequest_level = saved_level;
! 3016: }
! 3017: }
! 3018: #endif
! 3019:
! 3020: n++;
! 3021: }
! 3022: }
! 3023:
! 3024: if (n == 0)
! 3025: return -1;
! 3026: else
! 3027: return 0;
! 3028: }
! 3029:
! 3030: static int
! 3031: setkeymsg_spdaddr_tag(type, tag, policy)
! 3032: unsigned int type;
! 3033: char *tag;
! 3034: vchar_t *policy;
! 3035: {
! 3036: struct sadb_msg *msg;
! 3037: char buf[BUFSIZ];
! 3038: int l, l0;
! 3039: #ifdef SADB_X_EXT_TAG
! 3040: struct sadb_x_tag m_tag;
! 3041: #endif
! 3042: int n;
! 3043:
! 3044: msg = (struct sadb_msg *)buf;
! 3045:
! 3046: /* fix up length afterwards */
! 3047: setkeymsg0(msg, type, SADB_SATYPE_UNSPEC, 0);
! 3048: l = sizeof(struct sadb_msg);
! 3049:
! 3050: memcpy(buf + l, policy->buf, policy->len);
! 3051: l += policy->len;
! 3052:
! 3053: l0 = l;
! 3054: n = 0;
! 3055:
! 3056: #ifdef SADB_X_EXT_TAG
! 3057: memset(&m_tag, 0, sizeof(m_tag));
! 3058: m_tag.sadb_x_tag_len = PFKEY_UNIT64(sizeof(m_tag));
! 3059: m_tag.sadb_x_tag_exttype = SADB_X_EXT_TAG;
! 3060: if (strlcpy(m_tag.sadb_x_tag_name, tag,
! 3061: sizeof(m_tag.sadb_x_tag_name)) >= sizeof(m_tag.sadb_x_tag_name))
! 3062: return -1;
! 3063: memcpy(buf + l, &m_tag, sizeof(m_tag));
! 3064: l += sizeof(m_tag);
! 3065: #endif
! 3066:
! 3067: msg->sadb_msg_len = PFKEY_UNIT64(l);
! 3068:
! 3069: sendkeymsg(buf, l);
! 3070:
! 3071: return 0;
! 3072: }
! 3073:
! 3074: /* XXX NO BUFFER OVERRUN CHECK! BAD BAD! */
! 3075: static int
! 3076: setkeymsg_addr(type, satype, srcs, dsts, no_spi)
! 3077: unsigned int type;
! 3078: unsigned int satype;
! 3079: struct addrinfo *srcs;
! 3080: struct addrinfo *dsts;
! 3081: int no_spi;
! 3082: {
! 3083: struct sadb_msg *msg;
! 3084: char buf[BUFSIZ];
! 3085: int l, l0, len;
! 3086: struct sadb_sa m_sa;
! 3087: struct sadb_x_sa2 m_sa2;
! 3088: struct sadb_address m_addr;
! 3089: struct addrinfo *s, *d;
! 3090: int n;
! 3091: int plen;
! 3092: struct sockaddr *sa;
! 3093: int salen;
! 3094:
! 3095: msg = (struct sadb_msg *)buf;
! 3096:
! 3097: if (!srcs || !dsts)
! 3098: return -1;
! 3099:
! 3100: /* fix up length afterwards */
! 3101: setkeymsg0(msg, type, satype, 0);
! 3102: l = sizeof(struct sadb_msg);
! 3103:
! 3104: if (!no_spi) {
! 3105: len = sizeof(struct sadb_sa);
! 3106: m_sa.sadb_sa_len = PFKEY_UNIT64(len);
! 3107: m_sa.sadb_sa_exttype = SADB_EXT_SA;
! 3108: m_sa.sadb_sa_spi = htonl(p_spi);
! 3109: m_sa.sadb_sa_replay = p_replay;
! 3110: m_sa.sadb_sa_state = 0;
! 3111: m_sa.sadb_sa_auth = p_alg_auth;
! 3112: m_sa.sadb_sa_encrypt = p_alg_enc;
! 3113: m_sa.sadb_sa_flags = p_ext;
! 3114:
! 3115: memcpy(buf + l, &m_sa, len);
! 3116: l += len;
! 3117:
! 3118: len = sizeof(struct sadb_x_sa2);
! 3119: m_sa2.sadb_x_sa2_len = PFKEY_UNIT64(len);
! 3120: m_sa2.sadb_x_sa2_exttype = SADB_X_EXT_SA2;
! 3121: m_sa2.sadb_x_sa2_mode = p_mode;
! 3122: m_sa2.sadb_x_sa2_reqid = p_reqid;
! 3123:
! 3124: memcpy(buf + l, &m_sa2, len);
! 3125: l += len;
! 3126: }
! 3127:
! 3128: l0 = l;
! 3129: n = 0;
! 3130:
! 3131: /* do it for all src/dst pairs */
! 3132: for (s = srcs; s; s = s->ai_next) {
! 3133: for (d = dsts; d; d = d->ai_next) {
! 3134: /* rewind pointer */
! 3135: l = l0;
! 3136:
! 3137: if (s->ai_addr->sa_family != d->ai_addr->sa_family)
! 3138: continue;
! 3139: switch (s->ai_addr->sa_family) {
! 3140: case AF_INET:
! 3141: plen = sizeof(struct in_addr) << 3;
! 3142: break;
! 3143: #ifdef INET6
! 3144: case AF_INET6:
! 3145: plen = sizeof(struct in6_addr) << 3;
! 3146: break;
! 3147: #endif
! 3148: default:
! 3149: continue;
! 3150: }
! 3151:
! 3152: /* set src */
! 3153: sa = s->ai_addr;
! 3154: salen = sysdep_sa_len(s->ai_addr);
! 3155: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 3156: PFKEY_ALIGN8(salen));
! 3157: m_addr.sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
! 3158: m_addr.sadb_address_proto = IPSEC_ULPROTO_ANY;
! 3159: m_addr.sadb_address_prefixlen = plen;
! 3160: m_addr.sadb_address_reserved = 0;
! 3161:
! 3162: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 3163: sizeof(m_addr), sa, salen);
! 3164:
! 3165: /* set dst */
! 3166: sa = d->ai_addr;
! 3167: salen = sysdep_sa_len(d->ai_addr);
! 3168: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 3169: PFKEY_ALIGN8(salen));
! 3170: m_addr.sadb_address_exttype = SADB_EXT_ADDRESS_DST;
! 3171: m_addr.sadb_address_proto = IPSEC_ULPROTO_ANY;
! 3172: m_addr.sadb_address_prefixlen = plen;
! 3173: m_addr.sadb_address_reserved = 0;
! 3174:
! 3175: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 3176: sizeof(m_addr), sa, salen);
! 3177:
! 3178: msg->sadb_msg_len = PFKEY_UNIT64(l);
! 3179:
! 3180: sendkeymsg(buf, l);
! 3181:
! 3182: n++;
! 3183: }
! 3184: }
! 3185:
! 3186: if (n == 0)
! 3187: return -1;
! 3188: else
! 3189: return 0;
! 3190: }
! 3191:
! 3192: #ifdef SADB_X_EXT_NAT_T_TYPE
! 3193: static u_int16_t get_port (struct addrinfo *addr)
! 3194: {
! 3195: struct sockaddr *s = addr->ai_addr;
! 3196: u_int16_t port = 0;
! 3197:
! 3198: switch (s->sa_family) {
! 3199: case AF_INET:
! 3200: {
! 3201: struct sockaddr_in *sin4 = (struct sockaddr_in *)s;
! 3202: port = ntohs(sin4->sin_port);
! 3203: break;
! 3204: }
! 3205: case AF_INET6:
! 3206: {
! 3207: struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)s;
! 3208: port = ntohs(sin6->sin6_port);
! 3209: break;
! 3210: }
! 3211: }
! 3212:
! 3213: if (port == 0)
! 3214: port = DEFAULT_NATT_PORT;
! 3215:
! 3216: return port;
! 3217: }
! 3218: #endif
! 3219:
! 3220: /* XXX NO BUFFER OVERRUN CHECK! BAD BAD! */
! 3221: static int
! 3222: setkeymsg_add(type, satype, srcs, dsts)
! 3223: unsigned int type;
! 3224: unsigned int satype;
! 3225: struct addrinfo *srcs;
! 3226: struct addrinfo *dsts;
! 3227: {
! 3228: struct sadb_msg *msg;
! 3229: char buf[BUFSIZ];
! 3230: int l, l0, len;
! 3231: struct sadb_sa m_sa;
! 3232: struct sadb_x_sa2 m_sa2;
! 3233: struct sadb_address m_addr;
! 3234: struct addrinfo *s, *d;
! 3235: int n;
! 3236: int plen;
! 3237: struct sockaddr *sa;
! 3238: int salen;
! 3239:
! 3240: msg = (struct sadb_msg *)buf;
! 3241:
! 3242: if (!srcs || !dsts)
! 3243: return -1;
! 3244:
! 3245: /* fix up length afterwards */
! 3246: setkeymsg0(msg, type, satype, 0);
! 3247: l = sizeof(struct sadb_msg);
! 3248:
! 3249: /* set encryption algorithm, if present. */
! 3250: if (satype != SADB_X_SATYPE_IPCOMP && p_key_enc) {
! 3251: union {
! 3252: struct sadb_key key;
! 3253: struct sadb_ext ext;
! 3254: } m;
! 3255:
! 3256: m.key.sadb_key_len =
! 3257: PFKEY_UNIT64(sizeof(m.key)
! 3258: + PFKEY_ALIGN8(p_key_enc_len));
! 3259: m.key.sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
! 3260: m.key.sadb_key_bits = p_key_enc_len * 8;
! 3261: m.key.sadb_key_reserved = 0;
! 3262:
! 3263: setvarbuf(buf, &l, &m.ext, sizeof(m.key),
! 3264: p_key_enc, p_key_enc_len);
! 3265: }
! 3266:
! 3267: /* set authentication algorithm, if present. */
! 3268: if (p_key_auth) {
! 3269: union {
! 3270: struct sadb_key key;
! 3271: struct sadb_ext ext;
! 3272: } m;
! 3273:
! 3274: m.key.sadb_key_len =
! 3275: PFKEY_UNIT64(sizeof(m.key)
! 3276: + PFKEY_ALIGN8(p_key_auth_len));
! 3277: m.key.sadb_key_exttype = SADB_EXT_KEY_AUTH;
! 3278: m.key.sadb_key_bits = p_key_auth_len * 8;
! 3279: m.key.sadb_key_reserved = 0;
! 3280:
! 3281: setvarbuf(buf, &l, &m.ext, sizeof(m.key),
! 3282: p_key_auth, p_key_auth_len);
! 3283: }
! 3284:
! 3285: /* set lifetime for HARD */
! 3286: if (p_lt_hard != 0 || p_lb_hard != 0) {
! 3287: struct sadb_lifetime m_lt;
! 3288: u_int slen = sizeof(struct sadb_lifetime);
! 3289:
! 3290: m_lt.sadb_lifetime_len = PFKEY_UNIT64(slen);
! 3291: m_lt.sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
! 3292: m_lt.sadb_lifetime_allocations = 0;
! 3293: m_lt.sadb_lifetime_bytes = p_lb_hard;
! 3294: m_lt.sadb_lifetime_addtime = p_lt_hard;
! 3295: m_lt.sadb_lifetime_usetime = 0;
! 3296:
! 3297: memcpy(buf + l, &m_lt, slen);
! 3298: l += slen;
! 3299: }
! 3300:
! 3301: /* set lifetime for SOFT */
! 3302: if (p_lt_soft != 0 || p_lb_soft != 0) {
! 3303: struct sadb_lifetime m_lt;
! 3304: u_int slen = sizeof(struct sadb_lifetime);
! 3305:
! 3306: m_lt.sadb_lifetime_len = PFKEY_UNIT64(slen);
! 3307: m_lt.sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
! 3308: m_lt.sadb_lifetime_allocations = 0;
! 3309: m_lt.sadb_lifetime_bytes = p_lb_soft;
! 3310: m_lt.sadb_lifetime_addtime = p_lt_soft;
! 3311: m_lt.sadb_lifetime_usetime = 0;
! 3312:
! 3313: memcpy(buf + l, &m_lt, slen);
! 3314: l += slen;
! 3315: }
! 3316:
! 3317: #ifdef SADB_X_EXT_SEC_CTX
! 3318: /* Add security context label */
! 3319: if (sec_ctx.doi) {
! 3320: struct sadb_x_sec_ctx m_sec_ctx;
! 3321: u_int slen = sizeof(struct sadb_x_sec_ctx);
! 3322:
! 3323: memset(&m_sec_ctx, 0, slen);
! 3324:
! 3325: m_sec_ctx.sadb_x_sec_len = PFKEY_UNIT64(slen +
! 3326: PFKEY_ALIGN8(sec_ctx.len));
! 3327: m_sec_ctx.sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
! 3328: m_sec_ctx.sadb_x_ctx_len = sec_ctx.len; /* bytes */
! 3329: m_sec_ctx.sadb_x_ctx_doi = sec_ctx.doi;
! 3330: m_sec_ctx.sadb_x_ctx_alg = sec_ctx.alg;
! 3331: setvarbuf(buf, &l, (struct sadb_ext *)&m_sec_ctx, slen,
! 3332: (caddr_t)sec_ctx.buf, sec_ctx.len);
! 3333: }
! 3334: #endif
! 3335:
! 3336: len = sizeof(struct sadb_sa);
! 3337: m_sa.sadb_sa_len = PFKEY_UNIT64(len);
! 3338: m_sa.sadb_sa_exttype = SADB_EXT_SA;
! 3339: m_sa.sadb_sa_spi = htonl(p_spi);
! 3340: m_sa.sadb_sa_replay = p_replay;
! 3341: m_sa.sadb_sa_state = 0;
! 3342: m_sa.sadb_sa_auth = p_alg_auth;
! 3343: m_sa.sadb_sa_encrypt = p_alg_enc;
! 3344: m_sa.sadb_sa_flags = p_ext;
! 3345:
! 3346: memcpy(buf + l, &m_sa, len);
! 3347: l += len;
! 3348:
! 3349: len = sizeof(struct sadb_x_sa2);
! 3350: m_sa2.sadb_x_sa2_len = PFKEY_UNIT64(len);
! 3351: m_sa2.sadb_x_sa2_exttype = SADB_X_EXT_SA2;
! 3352: m_sa2.sadb_x_sa2_mode = p_mode;
! 3353: m_sa2.sadb_x_sa2_reqid = p_reqid;
! 3354:
! 3355: memcpy(buf + l, &m_sa2, len);
! 3356: l += len;
! 3357:
! 3358: #ifdef SADB_X_EXT_NAT_T_TYPE
! 3359: if (p_natt_type) {
! 3360: struct sadb_x_nat_t_type natt_type;
! 3361:
! 3362: len = sizeof(struct sadb_x_nat_t_type);
! 3363: memset(&natt_type, 0, len);
! 3364: natt_type.sadb_x_nat_t_type_len = PFKEY_UNIT64(len);
! 3365: natt_type.sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
! 3366: natt_type.sadb_x_nat_t_type_type = p_natt_type;
! 3367:
! 3368: memcpy(buf + l, &natt_type, len);
! 3369: l += len;
! 3370:
! 3371: if (p_natt_oa) {
! 3372: sa = p_natt_oa->ai_addr;
! 3373: switch (sa->sa_family) {
! 3374: case AF_INET:
! 3375: plen = sizeof(struct in_addr) << 3;
! 3376: break;
! 3377: #ifdef INET6
! 3378: case AF_INET6:
! 3379: plen = sizeof(struct in6_addr) << 3;
! 3380: break;
! 3381: #endif
! 3382: default:
! 3383: return -1;
! 3384: }
! 3385: salen = sysdep_sa_len(sa);
! 3386: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 3387: PFKEY_ALIGN8(salen));
! 3388: m_addr.sadb_address_exttype = SADB_X_EXT_NAT_T_OA;
! 3389: m_addr.sadb_address_proto = IPSEC_ULPROTO_ANY;
! 3390: m_addr.sadb_address_prefixlen = plen;
! 3391: m_addr.sadb_address_reserved = 0;
! 3392:
! 3393: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 3394: sizeof(m_addr), sa, salen);
! 3395: }
! 3396: }
! 3397: #endif
! 3398:
! 3399: l0 = l;
! 3400: n = 0;
! 3401:
! 3402: /* do it for all src/dst pairs */
! 3403: for (s = srcs; s; s = s->ai_next) {
! 3404: for (d = dsts; d; d = d->ai_next) {
! 3405: /* rewind pointer */
! 3406: l = l0;
! 3407:
! 3408: if (s->ai_addr->sa_family != d->ai_addr->sa_family)
! 3409: continue;
! 3410: switch (s->ai_addr->sa_family) {
! 3411: case AF_INET:
! 3412: plen = sizeof(struct in_addr) << 3;
! 3413: break;
! 3414: #ifdef INET6
! 3415: case AF_INET6:
! 3416: plen = sizeof(struct in6_addr) << 3;
! 3417: break;
! 3418: #endif
! 3419: default:
! 3420: continue;
! 3421: }
! 3422:
! 3423: /* set src */
! 3424: sa = s->ai_addr;
! 3425: salen = sysdep_sa_len(s->ai_addr);
! 3426: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 3427: PFKEY_ALIGN8(salen));
! 3428: m_addr.sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
! 3429: m_addr.sadb_address_proto = IPSEC_ULPROTO_ANY;
! 3430: m_addr.sadb_address_prefixlen = plen;
! 3431: m_addr.sadb_address_reserved = 0;
! 3432:
! 3433: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 3434: sizeof(m_addr), sa, salen);
! 3435:
! 3436: /* set dst */
! 3437: sa = d->ai_addr;
! 3438: salen = sysdep_sa_len(d->ai_addr);
! 3439: m_addr.sadb_address_len = PFKEY_UNIT64(sizeof(m_addr) +
! 3440: PFKEY_ALIGN8(salen));
! 3441: m_addr.sadb_address_exttype = SADB_EXT_ADDRESS_DST;
! 3442: m_addr.sadb_address_proto = IPSEC_ULPROTO_ANY;
! 3443: m_addr.sadb_address_prefixlen = plen;
! 3444: m_addr.sadb_address_reserved = 0;
! 3445:
! 3446: setvarbuf(buf, &l, (struct sadb_ext *)&m_addr,
! 3447: sizeof(m_addr), sa, salen);
! 3448:
! 3449: #ifdef SADB_X_EXT_NAT_T_TYPE
! 3450: if (p_natt_type) {
! 3451: struct sadb_x_nat_t_port natt_port;
! 3452:
! 3453: /* NATT_SPORT */
! 3454: len = sizeof(struct sadb_x_nat_t_port);
! 3455: memset(&natt_port, 0, len);
! 3456: natt_port.sadb_x_nat_t_port_len = PFKEY_UNIT64(len);
! 3457: natt_port.sadb_x_nat_t_port_exttype =
! 3458: SADB_X_EXT_NAT_T_SPORT;
! 3459: natt_port.sadb_x_nat_t_port_port = htons(get_port(s));
! 3460:
! 3461: memcpy(buf + l, &natt_port, len);
! 3462: l += len;
! 3463:
! 3464: /* NATT_DPORT */
! 3465: natt_port.sadb_x_nat_t_port_exttype =
! 3466: SADB_X_EXT_NAT_T_DPORT;
! 3467: natt_port.sadb_x_nat_t_port_port = htons(get_port(d));
! 3468:
! 3469: memcpy(buf + l, &natt_port, len);
! 3470: l += len;
! 3471: }
! 3472: #endif
! 3473: msg->sadb_msg_len = PFKEY_UNIT64(l);
! 3474:
! 3475: sendkeymsg(buf, l);
! 3476:
! 3477: n++;
! 3478: }
! 3479: }
! 3480:
! 3481: if (n == 0)
! 3482: return -1;
! 3483: else
! 3484: return 0;
! 3485: }
! 3486:
! 3487: static struct addrinfo *
! 3488: parse_addr(host, port)
! 3489: char *host;
! 3490: char *port;
! 3491: {
! 3492: struct addrinfo hints, *res = NULL;
! 3493: int error;
! 3494:
! 3495: memset(&hints, 0, sizeof(hints));
! 3496: hints.ai_family = p_aifamily;
! 3497: hints.ai_socktype = SOCK_DGRAM; /*dummy*/
! 3498: hints.ai_protocol = IPPROTO_UDP; /*dummy*/
! 3499: hints.ai_flags = p_aiflags;
! 3500: error = getaddrinfo(host, port, &hints, &res);
! 3501: if (error != 0) {
! 3502: yyerror(gai_strerror(error));
! 3503: return NULL;
! 3504: }
! 3505: return res;
! 3506: }
! 3507:
! 3508: static int
! 3509: fix_portstr(ulproto, spec, sport, dport)
! 3510: int ulproto;
! 3511: vchar_t *spec, *sport, *dport;
! 3512: {
! 3513: char sp[16], dp[16];
! 3514: int a, b, c, d;
! 3515: unsigned long u;
! 3516:
! 3517: if (spec->buf == NULL)
! 3518: return 0;
! 3519:
! 3520: switch (ulproto) {
! 3521: case IPPROTO_ICMP:
! 3522: case IPPROTO_ICMPV6:
! 3523: case IPPROTO_MH:
! 3524: if (sscanf(spec->buf, "%d,%d", &a, &b) == 2) {
! 3525: sprintf(sp, "%d", a);
! 3526: sprintf(dp, "%d", b);
! 3527: } else if (sscanf(spec->buf, "%d", &a) == 1) {
! 3528: sprintf(sp, "%d", a);
! 3529: } else {
! 3530: yyerror("invalid an upper layer protocol spec");
! 3531: return -1;
! 3532: }
! 3533: break;
! 3534: case IPPROTO_GRE:
! 3535: if (sscanf(spec->buf, "%d.%d.%d.%d", &a, &b, &c, &d) == 4) {
! 3536: sprintf(sp, "%d", (a << 8) + b);
! 3537: sprintf(dp, "%d", (c << 8) + d);
! 3538: } else if (sscanf(spec->buf, "%lu", &u) == 1) {
! 3539: sprintf(sp, "%d", (int) (u >> 16));
! 3540: sprintf(dp, "%d", (int) (u & 0xffff));
! 3541: } else {
! 3542: yyerror("invalid an upper layer protocol spec");
! 3543: return -1;
! 3544: }
! 3545: break;
! 3546: }
! 3547:
! 3548: free(sport->buf);
! 3549: sport->buf = strdup(sp);
! 3550: if (!sport->buf) {
! 3551: yyerror("insufficient memory");
! 3552: return -1;
! 3553: }
! 3554: sport->len = strlen(sport->buf);
! 3555:
! 3556: free(dport->buf);
! 3557: dport->buf = strdup(dp);
! 3558: if (!dport->buf) {
! 3559: yyerror("insufficient memory");
! 3560: return -1;
! 3561: }
! 3562: dport->len = strlen(dport->buf);
! 3563:
! 3564: return 0;
! 3565: }
! 3566:
! 3567: static int
! 3568: setvarbuf(buf, off, ebuf, elen, vbuf, vlen)
! 3569: char *buf;
! 3570: int *off;
! 3571: struct sadb_ext *ebuf;
! 3572: int elen;
! 3573: const void *vbuf;
! 3574: int vlen;
! 3575: {
! 3576: memset(buf + *off, 0, PFKEY_UNUNIT64(ebuf->sadb_ext_len));
! 3577: memcpy(buf + *off, (caddr_t)ebuf, elen);
! 3578: memcpy(buf + *off + elen, vbuf, vlen);
! 3579: (*off) += PFKEY_ALIGN8(elen + vlen);
! 3580:
! 3581: return 0;
! 3582: }
! 3583:
! 3584: void
! 3585: parse_init()
! 3586: {
! 3587: p_spi = 0;
! 3588:
! 3589: p_ext = SADB_X_EXT_CYCSEQ;
! 3590: p_alg_enc = SADB_EALG_NONE;
! 3591: p_alg_auth = SADB_AALG_NONE;
! 3592: p_mode = IPSEC_MODE_ANY;
! 3593: p_reqid = 0;
! 3594: p_replay = 0;
! 3595: p_key_enc_len = p_key_auth_len = 0;
! 3596: p_key_enc = p_key_auth = 0;
! 3597: p_lt_hard = p_lt_soft = 0;
! 3598: p_lb_hard = p_lb_soft = 0;
! 3599:
! 3600: memset(&sec_ctx, 0, sizeof(struct security_ctx));
! 3601:
! 3602: p_aiflags = 0;
! 3603: p_aifamily = PF_UNSPEC;
! 3604:
! 3605: /* Clear out any natt OA information */
! 3606: if (p_natt_oa)
! 3607: freeaddrinfo (p_natt_oa);
! 3608: p_natt_oa = NULL;
! 3609: p_natt_type = 0;
! 3610:
! 3611: return;
! 3612: }
! 3613:
! 3614: void
! 3615: free_buffer()
! 3616: {
! 3617: /* we got tons of memory leaks in the parser anyways, leave them */
! 3618:
! 3619: return;
! 3620: }
! 3621:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>