Annotation of embedaddon/sudo/plugins/sudoers/gram.c, revision 1.1

1.1     ! misho       1: #include <config.h>
        !             2: #include <stdlib.h>
        !             3: #include <string.h>
        !             4: #define YYBYACC 1
        !             5: #define YYMAJOR 1
        !             6: #define YYMINOR 9
        !             7: #define YYLEX yylex()
        !             8: #define YYEMPTY -1
        !             9: #define yyclearin (yychar=(YYEMPTY))
        !            10: #define yyerrok (yyerrflag=0)
        !            11: #define YYRECOVERING() (yyerrflag!=0)
        !            12: #define YYPREFIX "yy"
        !            13: #line 2 "gram.y"
        !            14: /*
        !            15:  * Copyright (c) 1996, 1998-2005, 2007-2011
        !            16:  *     Todd C. Miller <Todd.Miller@courtesan.com>
        !            17:  *
        !            18:  * Permission to use, copy, modify, and distribute this software for any
        !            19:  * purpose with or without fee is hereby granted, provided that the above
        !            20:  * copyright notice and this permission notice appear in all copies.
        !            21:  *
        !            22:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            23:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            24:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            25:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            26:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            27:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            28:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            29:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
        !            30:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            31:  *
        !            32:  * Sponsored in part by the Defense Advanced Research Projects
        !            33:  * Agency (DARPA) and Air Force Research Laboratory, Air Force
        !            34:  * Materiel Command, USAF, under agreement number F39502-99-1-0512.
        !            35:  */
        !            36: 
        !            37: #include <config.h>
        !            38: 
        !            39: #include <sys/types.h>
        !            40: #include <sys/param.h>
        !            41: #include <stdio.h>
        !            42: #ifdef STDC_HEADERS
        !            43: # include <stdlib.h>
        !            44: # include <stddef.h>
        !            45: #else
        !            46: # ifdef HAVE_STDLIB_H
        !            47: #  include <stdlib.h>
        !            48: # endif
        !            49: #endif /* STDC_HEADERS */
        !            50: #ifdef HAVE_STRING_H
        !            51: # include <string.h>
        !            52: #endif /* HAVE_STRING_H */
        !            53: #ifdef HAVE_STRINGS_H
        !            54: # include <strings.h>
        !            55: #endif /* HAVE_STRINGS_H */
        !            56: #ifdef HAVE_UNISTD_H
        !            57: # include <unistd.h>
        !            58: #endif /* HAVE_UNISTD_H */
        !            59: #if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__)
        !            60: # include <alloca.h>
        !            61: #endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */
        !            62: #include <limits.h>
        !            63: 
        !            64: #include "sudoers.h" /* XXX */
        !            65: #include "parse.h"
        !            66: #include "toke.h"
        !            67: 
        !            68: /*
        !            69:  * We must define SIZE_MAX for yacc's skeleton.c.
        !            70:  * If there is no SIZE_MAX or SIZE_T_MAX we have to assume that size_t
        !            71:  * could be signed (as it is on SunOS 4.x).
        !            72:  */
        !            73: #ifndef SIZE_MAX
        !            74: # ifdef SIZE_T_MAX
        !            75: #  define SIZE_MAX     SIZE_T_MAX
        !            76: # else
        !            77: #  define SIZE_MAX     INT_MAX
        !            78: # endif /* SIZE_T_MAX */
        !            79: #endif /* SIZE_MAX */
        !            80: 
        !            81: /*
        !            82:  * Globals
        !            83:  */
        !            84: extern int sudolineno;
        !            85: extern char *sudoers;
        !            86: static int verbose = FALSE;
        !            87: int parse_error = FALSE;
        !            88: int pedantic = FALSE;
        !            89: int errorlineno = -1;
        !            90: char *errorfile = NULL;
        !            91: 
        !            92: struct defaults_list defaults;
        !            93: struct userspec_list userspecs;
        !            94: 
        !            95: /*
        !            96:  * Local protoypes
        !            97:  */
        !            98: static void  add_defaults(int, struct member *, struct defaults *);
        !            99: static void  add_userspec(struct member *, struct privilege *);
        !           100: static struct defaults *new_default(char *, char *, int);
        !           101: static struct member *new_member(char *, int);
        !           102:        void  yyerror(const char *);
        !           103: 
        !           104: void
        !           105: yyerror(const char *s)
        !           106: {
        !           107:     /* Save the line the first error occurred on. */
        !           108:     if (errorlineno == -1) {
        !           109:        errorlineno = sudolineno ? sudolineno - 1 : 0;
        !           110:        errorfile = estrdup(sudoers);
        !           111:     }
        !           112:     if (trace_print != NULL) {
        !           113:        LEXTRACE("<*> ");
        !           114:     } else if (verbose && s != NULL) {
        !           115:        warningx(_(">>> %s: %s near line %d <<<"), sudoers, s,
        !           116:            sudolineno ? sudolineno - 1 : 0);
        !           117:     }
        !           118:     parse_error = TRUE;
        !           119: }
        !           120: #line 110 "gram.y"
        !           121: #ifndef YYSTYPE_DEFINED
        !           122: #define YYSTYPE_DEFINED
        !           123: typedef union {
        !           124:     struct cmndspec *cmndspec;
        !           125:     struct defaults *defaults;
        !           126:     struct member *member;
        !           127:     struct runascontainer *runas;
        !           128:     struct privilege *privilege;
        !           129:     struct sudo_command command;
        !           130:     struct cmndtag tag;
        !           131:     struct selinux_info seinfo;
        !           132:     char *string;
        !           133:     int tok;
        !           134: } YYSTYPE;
        !           135: #endif /* YYSTYPE_DEFINED */
        !           136: #line 136 "y.tab.c"
        !           137: #define COMMAND 257
        !           138: #define ALIAS 258
        !           139: #define DEFVAR 259
        !           140: #define NTWKADDR 260
        !           141: #define NETGROUP 261
        !           142: #define USERGROUP 262
        !           143: #define WORD 263
        !           144: #define DEFAULTS 264
        !           145: #define DEFAULTS_HOST 265
        !           146: #define DEFAULTS_USER 266
        !           147: #define DEFAULTS_RUNAS 267
        !           148: #define DEFAULTS_CMND 268
        !           149: #define NOPASSWD 269
        !           150: #define PASSWD 270
        !           151: #define NOEXEC 271
        !           152: #define EXEC 272
        !           153: #define SETENV 273
        !           154: #define NOSETENV 274
        !           155: #define LOG_INPUT 275
        !           156: #define NOLOG_INPUT 276
        !           157: #define LOG_OUTPUT 277
        !           158: #define NOLOG_OUTPUT 278
        !           159: #define ALL 279
        !           160: #define COMMENT 280
        !           161: #define HOSTALIAS 281
        !           162: #define CMNDALIAS 282
        !           163: #define USERALIAS 283
        !           164: #define RUNASALIAS 284
        !           165: #define ERROR 285
        !           166: #define TYPE 286
        !           167: #define ROLE 287
        !           168: #define YYERRCODE 256
        !           169: #if defined(__cplusplus) || defined(__STDC__)
        !           170: const short yylhs[] =
        !           171: #else
        !           172: short yylhs[] =
        !           173: #endif
        !           174:        {                                        -1,
        !           175:     0,    0,   25,   25,   26,   26,   26,   26,   26,   26,
        !           176:    26,   26,   26,   26,   26,   26,    4,    4,    3,    3,
        !           177:     3,    3,    3,   20,   20,   19,   10,   10,    8,    8,
        !           178:     8,    8,    8,    2,    2,    1,    6,    6,   23,   24,
        !           179:    22,   22,   22,   22,   22,   17,   17,   18,   18,   18,
        !           180:    21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        !           181:    21,    5,    5,    5,   28,   28,   31,    9,    9,   29,
        !           182:    29,   32,    7,    7,   30,   30,   33,   27,   27,   34,
        !           183:    13,   13,   11,   11,   12,   12,   12,   12,   12,   16,
        !           184:    16,   14,   14,   15,   15,   15,
        !           185: };
        !           186: #if defined(__cplusplus) || defined(__STDC__)
        !           187: const short yylen[] =
        !           188: #else
        !           189: short yylen[] =
        !           190: #endif
        !           191:        {                                         2,
        !           192:     0,    1,    1,    2,    1,    2,    2,    2,    2,    2,
        !           193:     2,    2,    3,    3,    3,    3,    1,    3,    1,    2,
        !           194:     3,    3,    3,    1,    3,    3,    1,    2,    1,    1,
        !           195:     1,    1,    1,    1,    3,    4,    1,    2,    3,    3,
        !           196:     0,    1,    1,    2,    2,    0,    3,    1,    3,    2,
        !           197:     0,    2,    2,    2,    2,    2,    2,    2,    2,    2,
        !           198:     2,    1,    1,    1,    1,    3,    3,    1,    3,    1,
        !           199:     3,    3,    1,    3,    1,    3,    3,    1,    3,    3,
        !           200:     1,    3,    1,    2,    1,    1,    1,    1,    1,    1,
        !           201:     3,    1,    2,    1,    1,    1,
        !           202: };
        !           203: #if defined(__cplusplus) || defined(__STDC__)
        !           204: const short yydefred[] =
        !           205: #else
        !           206: short yydefred[] =
        !           207: #endif
        !           208:        {                                      0,
        !           209:     0,   85,   87,   88,   89,    0,    0,    0,    0,    0,
        !           210:    86,    5,    0,    0,    0,    0,    0,    0,   81,   83,
        !           211:     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
        !           212:    31,   33,   30,    0,   27,    0,   68,    0,    0,   64,
        !           213:    63,   62,    0,   37,   73,    0,    0,    0,   65,    0,
        !           214:     0,   70,    0,    0,   78,    0,    0,   75,   84,    0,
        !           215:     0,   24,    0,    4,    0,    0,    0,   20,    0,   28,
        !           216:     0,    0,    0,    0,   38,    0,    0,    0,    0,    0,
        !           217:     0,    0,    0,    0,    0,   82,    0,    0,   21,   22,
        !           218:    23,   18,   69,   74,    0,   66,    0,   71,    0,   79,
        !           219:     0,   76,    0,   34,    0,    0,   25,    0,    0,    0,
        !           220:     0,    0,    0,   51,    0,    0,   94,   96,   95,    0,
        !           221:    90,   92,    0,    0,   47,   35,    0,    0,    0,   44,
        !           222:    45,   93,    0,    0,   40,   39,   52,   53,   54,   55,
        !           223:    56,   57,   58,   59,   60,   61,   36,   91,
        !           224: };
        !           225: #if defined(__cplusplus) || defined(__STDC__)
        !           226: const short yydgoto[] =
        !           227: #else
        !           228: short yydgoto[] =
        !           229: #endif
        !           230:        {                                      18,
        !           231:   104,  105,   27,   28,   44,   45,   46,   35,   61,   37,
        !           232:    19,   20,   21,  121,  122,  123,  106,  110,   62,   63,
        !           233:   129,  114,  115,  116,   22,   23,   54,   48,   51,   57,
        !           234:    49,   52,   58,   55,
        !           235: };
        !           236: #if defined(__cplusplus) || defined(__STDC__)
        !           237: const short yysindex[] =
        !           238: #else
        !           239: short yysindex[] =
        !           240: #endif
        !           241:        {                                    475,
        !           242:  -270,    0,    0,    0,    0,  -29,  567,  594,  594,   -2,
        !           243:     0,    0, -240, -222, -216, -212, -241,    0,    0,    0,
        !           244:   -25,  475,    0,    0,  -10, -207,    0,    9,    0,    0,
        !           245:     0,    0,    0, -235,    0,  -33,    0,  -31,  -31,    0,
        !           246:     0,    0, -242,    0,    0,  -30,   -7,    3,    0,   -6,
        !           247:     4,    0,   -5,    6,    0,   -1,    8,    0,    0,  594,
        !           248:   -20,    0,   10,    0, -205, -196, -194,    0,  -29,    0,
        !           249:   567,    9,    9,    9,    0,   -2,    9,  567, -240,   -2,
        !           250:  -222,  594, -216,  594, -212,    0,   31,  567,    0,    0,
        !           251:     0,    0,    0,    0,   26,    0,   28,    0,   29,    0,
        !           252:    29,    0,  541,    0,   32, -247,    0,   86,  -15,   33,
        !           253:    31,   14,   16,    0, -208, -204,    0,    0,    0, -231,
        !           254:     0,    0,   38,   86,    0,    0, -179, -178,  491,    0,
        !           255:     0,    0,   86,   38,    0,    0,    0,    0,    0,    0,
        !           256:     0,    0,    0,    0,    0,    0,    0,    0,};
        !           257: #if defined(__cplusplus) || defined(__STDC__)
        !           258: const short yyrindex[] =
        !           259: #else
        !           260: short yyrindex[] =
        !           261: #endif
        !           262:        {                                     87,
        !           263:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           264:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           265:     0,   90,    0,    0,    1,    0,    0,  177,    0,    0,
        !           266:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           267:     0,    0,    0,    0,    0,    0,    0,  207,    0,    0,
        !           268:   237,    0,    0,  271,    0,    0,  300,    0,    0,    0,
        !           269:     0,    0,  329,    0,    0,    0,    0,    0,    0,    0,
        !           270:     0,  358,  387,  417,    0,    0,  446,    0,    0,    0,
        !           271:     0,    0,    0,    0,    0,    0,  -26,    0,    0,    0,
        !           272:     0,    0,    0,    0,   30,    0,   59,    0,   89,    0,
        !           273:   118,    0,    0,    0,  148,  514,    0,    0,   45,    0,
        !           274:   -26,    0,    0,    0,  537,  565,    0,    0,    0,    0,
        !           275:     0,    0,   50,    0,    0,    0,    0,    0,    0,    0,
        !           276:     0,    0,    0,   52,    0,    0,    0,    0,    0,    0,
        !           277:     0,    0,    0,    0,    0,    0,    0,    0,};
        !           278: #if defined(__cplusplus) || defined(__STDC__)
        !           279: const short yygindex[] =
        !           280: #else
        !           281: short yygindex[] =
        !           282: #endif
        !           283:        {                                      0,
        !           284:   -17,    0,   27,   11,   54,  -64,   15,   64,    2,   34,
        !           285:    39,   84,   -3,  -27,  -18,  -21,    0,    0,   19,    0,
        !           286:     0,    0,  -12,   -4,    0,   88,    0,    0,    0,    0,
        !           287:    35,   40,   23,   37,
        !           288: };
        !           289: #define YYTABLESIZE 873
        !           290: #if defined(__cplusplus) || defined(__STDC__)
        !           291: const short yytable[] =
        !           292: #else
        !           293: short yytable[] =
        !           294: #endif
        !           295:        {                                      26,
        !           296:    19,   26,   26,   26,   38,   39,   46,   34,   36,   24,
        !           297:    71,   94,   60,   76,   40,   41,    2,   47,   60,    3,
        !           298:     4,    5,   29,   71,   30,   31,  117,   32,   60,   67,
        !           299:    43,  118,   66,   19,   67,   50,   42,   11,  112,  113,
        !           300:    87,   53,  124,   33,   19,   56,   72,  119,   73,   74,
        !           301:    65,   68,   69,   78,   80,   82,   77,   89,   72,   84,
        !           302:    79,   81,   67,   83,  147,   85,   90,   88,   91,   71,
        !           303:   103,   76,   60,  125,  127,  111,  128,  112,   99,   95,
        !           304:   101,  133,  113,  135,  136,   48,    1,   67,   80,    2,
        !           305:    50,   72,   49,  126,   97,   92,   75,   70,   86,  109,
        !           306:    59,  132,  134,  131,   93,  148,  107,  102,    0,   64,
        !           307:   130,    0,    0,   96,    0,    0,   72,   77,  120,  100,
        !           308:    98,   80,    0,    0,    0,    0,    0,    0,    0,    0,
        !           309:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           310:     0,    0,    0,    0,    0,    0,   80,   26,    0,    0,
        !           311:    77,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           312:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           313:     0,    0,    0,    0,    0,   77,   12,    0,    0,    0,
        !           314:    26,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           315:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           316:     0,    0,    0,    0,    0,   26,    9,    0,    0,   12,
        !           317:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           318:     0,    0,    0,    0,    0,   25,    0,   25,   25,   25,
        !           319:    46,   46,   29,    0,   30,   31,   10,   32,    0,    9,
        !           320:     0,    0,   46,   46,   46,   46,   46,   46,   46,   46,
        !           321:    46,   46,   46,   33,   40,   41,   19,    0,   19,   46,
        !           322:    46,   19,   19,   19,   19,   19,   19,   19,   19,   10,
        !           323:     8,    0,    0,    0,    0,    0,   42,    0,    0,   19,
        !           324:    19,   19,   19,   19,   19,   67,    0,   67,    0,    0,
        !           325:    67,   67,   67,   67,   67,   67,   67,   67,    0,   11,
        !           326:     0,    0,    0,    8,    0,    0,    0,    0,   67,   67,
        !           327:    67,   67,   67,   67,   72,    0,   72,    0,    0,   72,
        !           328:    72,   72,   72,   72,   72,   72,   72,    0,    7,    0,
        !           329:     0,    0,   11,    0,    0,    0,    0,   72,   72,   72,
        !           330:    72,   72,   72,  117,   80,    0,   80,    0,  118,   80,
        !           331:    80,   80,   80,   80,   80,   80,   80,   15,    0,    0,
        !           332:     0,    7,    0,    0,  119,    0,    0,   80,   80,   80,
        !           333:    80,   80,   80,   77,    0,   77,    0,    0,   77,   77,
        !           334:    77,   77,   77,   77,   77,   77,   13,    0,    0,    0,
        !           335:    15,    0,    0,    0,    0,    0,   77,   77,   77,   77,
        !           336:    77,   77,    0,   26,    0,   26,    0,    0,   26,   26,
        !           337:    26,   26,   26,   26,   26,   26,   14,    0,    0,   13,
        !           338:     0,    0,    0,    0,    0,    0,   26,   26,   26,   26,
        !           339:    26,   26,   12,    0,   12,    0,    0,   12,   12,   12,
        !           340:    12,   12,   12,   12,   12,   16,    0,    0,    0,   14,
        !           341:     0,    0,    0,    0,    0,   12,   12,   12,   12,   12,
        !           342:    12,    0,    9,    0,    9,    0,    0,    9,    9,    9,
        !           343:     9,    9,    9,    9,    9,    0,    0,    0,   16,    0,
        !           344:     0,    0,    0,    0,    0,    9,    9,    9,    9,    9,
        !           345:     9,    0,   10,    0,   10,    0,    0,   10,   10,   10,
        !           346:    10,   10,   10,   10,   10,    0,    0,   17,    0,    0,
        !           347:     0,    0,    0,    0,    0,   10,   10,   10,   10,   10,
        !           348:    10,    0,    0,   43,    0,    0,    8,    0,    8,    0,
        !           349:     0,    8,    8,    8,    8,    8,    8,    8,    8,    0,
        !           350:     0,    0,    0,    0,    0,    0,   41,    0,    0,    8,
        !           351:     8,    8,    8,    8,    8,   11,    0,   11,    0,    0,
        !           352:    11,   11,   11,   11,   11,   11,   11,   11,    0,   42,
        !           353:     0,    0,    0,   17,    0,    0,    0,    0,   11,   11,
        !           354:    11,   11,   11,   11,    7,    0,    7,    0,    0,    7,
        !           355:     7,    7,    7,    7,    7,    7,    7,   43,  108,   34,
        !           356:     0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
        !           357:     7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
        !           358:    15,   15,   15,   15,   15,   15,   17,    0,    0,    0,
        !           359:     0,    0,    0,    0,    0,    0,   15,   15,   15,   15,
        !           360:    15,   15,   13,    0,   13,    0,    0,   13,   13,   13,
        !           361:    13,   13,   13,   13,   13,    0,    0,    0,    0,    0,
        !           362:     0,    0,    0,    0,    0,   13,   13,   13,   13,   13,
        !           363:    13,    0,   14,    0,   14,    0,    0,   14,   14,   14,
        !           364:    14,   14,   14,   14,   14,    0,    0,    0,    0,    0,
        !           365:     0,    0,    0,    0,    0,   14,   14,   14,   14,   14,
        !           366:    14,   16,    0,   16,    0,    0,   16,   16,   16,   16,
        !           367:    16,   16,   16,   16,    0,    0,    0,    0,    0,    0,
        !           368:     0,    0,    0,    0,   16,   16,   16,   16,   16,   16,
        !           369:     1,    0,    2,    0,    0,    3,    4,    5,    6,    7,
        !           370:     8,    9,   10,    0,    0,    0,    0,   40,   41,    0,
        !           371:     0,    0,    0,   11,   12,   13,   14,   15,   16,  137,
        !           372:   138,  139,  140,  141,  142,  143,  144,  145,  146,   42,
        !           373:    41,   41,    0,    0,    0,    0,    0,    0,    0,    0,
        !           374:     0,    0,   41,   41,   41,   41,   41,   41,   41,   41,
        !           375:    41,   41,   41,   42,   42,    0,    0,    0,    2,    0,
        !           376:     0,    3,    4,    5,    0,   42,   42,   42,   42,   42,
        !           377:    42,   42,   42,   42,   42,   42,    0,    0,    0,   11,
        !           378:     0,   43,   43,    0,   29,    0,   30,   31,    0,   32,
        !           379:     0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
        !           380:    43,   43,   43,   43,    0,   33,    0,    0,    0,    0,
        !           381:     0,    2,    0,    0,    3,    4,    5,    0,    0,    0,
        !           382:     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        !           383:     0,    0,   11,
        !           384: };
        !           385: #if defined(__cplusplus) || defined(__STDC__)
        !           386: const short yycheck[] =
        !           387: #else
        !           388: short yycheck[] =
        !           389: #endif
        !           390:        {                                      33,
        !           391:     0,   33,   33,   33,    8,    9,   33,   33,    7,  280,
        !           392:    44,   76,   44,   44,  257,  258,  258,  258,   44,  261,
        !           393:   262,  263,  258,   44,  260,  261,  258,  263,   44,    0,
        !           394:    33,  263,   43,   33,   45,  258,  279,  279,  286,  287,
        !           395:    61,  258,   58,  279,   44,  258,   36,  279,   38,   39,
        !           396:    61,  259,   44,   61,   61,   61,   46,  263,    0,   61,
        !           397:    58,   58,   33,   58,  129,   58,  263,   58,  263,   44,
        !           398:    40,   44,   44,   41,   61,   44,   61,  286,   82,   78,
        !           399:    84,   44,  287,  263,  263,   41,    0,   58,    0,    0,
        !           400:    41,   33,   41,  111,   80,   69,   43,   34,   60,  103,
        !           401:    17,  120,  124,  116,   71,  133,   88,   85,   -1,   22,
        !           402:   115,   -1,   -1,   79,   -1,   -1,   58,    0,   33,   83,
        !           403:    81,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           404:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           405:    -1,   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,
        !           406:    33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           407:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           408:    -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   -1,
        !           409:    33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           410:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           411:    -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   33,
        !           412:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           413:    -1,   -1,   -1,   -1,   -1,  259,   -1,  259,  259,  259,
        !           414:   257,  258,  258,   -1,  260,  261,    0,  263,   -1,   33,
        !           415:    -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
        !           416:   277,  278,  279,  279,  257,  258,  256,   -1,  258,  286,
        !           417:   287,  261,  262,  263,  264,  265,  266,  267,  268,   33,
        !           418:     0,   -1,   -1,   -1,   -1,   -1,  279,   -1,   -1,  279,
        !           419:   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
        !           420:   261,  262,  263,  264,  265,  266,  267,  268,   -1,    0,
        !           421:    -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
        !           422:   281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
        !           423:   262,  263,  264,  265,  266,  267,  268,   -1,    0,   -1,
        !           424:    -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,  281,
        !           425:   282,  283,  284,  258,  256,   -1,  258,   -1,  263,  261,
        !           426:   262,  263,  264,  265,  266,  267,  268,    0,   -1,   -1,
        !           427:    -1,   33,   -1,   -1,  279,   -1,   -1,  279,  280,  281,
        !           428:   282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
        !           429:   263,  264,  265,  266,  267,  268,    0,   -1,   -1,   -1,
        !           430:    33,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
        !           431:   283,  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,
        !           432:   263,  264,  265,  266,  267,  268,    0,   -1,   -1,   33,
        !           433:    -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
        !           434:   283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
        !           435:   264,  265,  266,  267,  268,    0,   -1,   -1,   -1,   33,
        !           436:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
        !           437:   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
        !           438:   264,  265,  266,  267,  268,   -1,   -1,   -1,   33,   -1,
        !           439:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
        !           440:   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
        !           441:   264,  265,  266,  267,  268,   -1,   -1,   33,   -1,   -1,
        !           442:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
        !           443:   284,   -1,   -1,   33,   -1,   -1,  256,   -1,  258,   -1,
        !           444:    -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
        !           445:    -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,  279,
        !           446:   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
        !           447:   261,  262,  263,  264,  265,  266,  267,  268,   -1,   33,
        !           448:    -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
        !           449:   281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
        !           450:   262,  263,  264,  265,  266,  267,  268,   33,   58,   33,
        !           451:    -1,   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,
        !           452:   282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
        !           453:   263,  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,
        !           454:    -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
        !           455:   283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
        !           456:   264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
        !           457:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
        !           458:   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
        !           459:   264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
        !           460:    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
        !           461:   284,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
        !           462:   265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,   -1,
        !           463:    -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,  284,
        !           464:   256,   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,
        !           465:   266,  267,  268,   -1,   -1,   -1,   -1,  257,  258,   -1,
        !           466:    -1,   -1,   -1,  279,  280,  281,  282,  283,  284,  269,
        !           467:   270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
        !           468:   257,  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           469:    -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
        !           470:   277,  278,  279,  257,  258,   -1,   -1,   -1,  258,   -1,
        !           471:    -1,  261,  262,  263,   -1,  269,  270,  271,  272,  273,
        !           472:   274,  275,  276,  277,  278,  279,   -1,   -1,   -1,  279,
        !           473:    -1,  257,  258,   -1,  258,   -1,  260,  261,   -1,  263,
        !           474:    -1,   -1,   -1,  269,  270,  271,  272,  273,  274,  275,
        !           475:   276,  277,  278,  279,   -1,  279,   -1,   -1,   -1,   -1,
        !           476:    -1,  258,   -1,   -1,  261,  262,  263,   -1,   -1,   -1,
        !           477:    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
        !           478:    -1,   -1,  279,
        !           479: };
        !           480: #define YYFINAL 18
        !           481: #ifndef YYDEBUG
        !           482: #define YYDEBUG 0
        !           483: #endif
        !           484: #define YYMAXTOKEN 287
        !           485: #if YYDEBUG
        !           486: #if defined(__cplusplus) || defined(__STDC__)
        !           487: const char * const yyname[] =
        !           488: #else
        !           489: char *yyname[] =
        !           490: #endif
        !           491:        {
        !           492: "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !           493: "'!'",0,0,0,0,0,0,"'('","')'",0,"'+'","','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,"':'",
        !           494: 0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !           495: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !           496: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !           497: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !           498: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !           499: "COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DEFAULTS",
        !           500: "DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","NOPASSWD",
        !           501: "PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT","NOLOG_INPUT",
        !           502: "LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS",
        !           503: "RUNASALIAS","ERROR","TYPE","ROLE",
        !           504: };
        !           505: #if defined(__cplusplus) || defined(__STDC__)
        !           506: const char * const yyrule[] =
        !           507: #else
        !           508: char *yyrule[] =
        !           509: #endif
        !           510:        {"$accept : file",
        !           511: "file :",
        !           512: "file : line",
        !           513: "line : entry",
        !           514: "line : line entry",
        !           515: "entry : COMMENT",
        !           516: "entry : error COMMENT",
        !           517: "entry : userlist privileges",
        !           518: "entry : USERALIAS useraliases",
        !           519: "entry : HOSTALIAS hostaliases",
        !           520: "entry : CMNDALIAS cmndaliases",
        !           521: "entry : RUNASALIAS runasaliases",
        !           522: "entry : DEFAULTS defaults_list",
        !           523: "entry : DEFAULTS_USER userlist defaults_list",
        !           524: "entry : DEFAULTS_RUNAS userlist defaults_list",
        !           525: "entry : DEFAULTS_HOST hostlist defaults_list",
        !           526: "entry : DEFAULTS_CMND cmndlist defaults_list",
        !           527: "defaults_list : defaults_entry",
        !           528: "defaults_list : defaults_list ',' defaults_entry",
        !           529: "defaults_entry : DEFVAR",
        !           530: "defaults_entry : '!' DEFVAR",
        !           531: "defaults_entry : DEFVAR '=' WORD",
        !           532: "defaults_entry : DEFVAR '+' WORD",
        !           533: "defaults_entry : DEFVAR '-' WORD",
        !           534: "privileges : privilege",
        !           535: "privileges : privileges ':' privilege",
        !           536: "privilege : hostlist '=' cmndspeclist",
        !           537: "ophost : host",
        !           538: "ophost : '!' host",
        !           539: "host : ALIAS",
        !           540: "host : ALL",
        !           541: "host : NETGROUP",
        !           542: "host : NTWKADDR",
        !           543: "host : WORD",
        !           544: "cmndspeclist : cmndspec",
        !           545: "cmndspeclist : cmndspeclist ',' cmndspec",
        !           546: "cmndspec : runasspec selinux cmndtag opcmnd",
        !           547: "opcmnd : cmnd",
        !           548: "opcmnd : '!' cmnd",
        !           549: "rolespec : ROLE '=' WORD",
        !           550: "typespec : TYPE '=' WORD",
        !           551: "selinux :",
        !           552: "selinux : rolespec",
        !           553: "selinux : typespec",
        !           554: "selinux : rolespec typespec",
        !           555: "selinux : typespec rolespec",
        !           556: "runasspec :",
        !           557: "runasspec : '(' runaslist ')'",
        !           558: "runaslist : userlist",
        !           559: "runaslist : userlist ':' grouplist",
        !           560: "runaslist : ':' grouplist",
        !           561: "cmndtag :",
        !           562: "cmndtag : cmndtag NOPASSWD",
        !           563: "cmndtag : cmndtag PASSWD",
        !           564: "cmndtag : cmndtag NOEXEC",
        !           565: "cmndtag : cmndtag EXEC",
        !           566: "cmndtag : cmndtag SETENV",
        !           567: "cmndtag : cmndtag NOSETENV",
        !           568: "cmndtag : cmndtag LOG_INPUT",
        !           569: "cmndtag : cmndtag NOLOG_INPUT",
        !           570: "cmndtag : cmndtag LOG_OUTPUT",
        !           571: "cmndtag : cmndtag NOLOG_OUTPUT",
        !           572: "cmnd : ALL",
        !           573: "cmnd : ALIAS",
        !           574: "cmnd : COMMAND",
        !           575: "hostaliases : hostalias",
        !           576: "hostaliases : hostaliases ':' hostalias",
        !           577: "hostalias : ALIAS '=' hostlist",
        !           578: "hostlist : ophost",
        !           579: "hostlist : hostlist ',' ophost",
        !           580: "cmndaliases : cmndalias",
        !           581: "cmndaliases : cmndaliases ':' cmndalias",
        !           582: "cmndalias : ALIAS '=' cmndlist",
        !           583: "cmndlist : opcmnd",
        !           584: "cmndlist : cmndlist ',' opcmnd",
        !           585: "runasaliases : runasalias",
        !           586: "runasaliases : runasaliases ':' runasalias",
        !           587: "runasalias : ALIAS '=' userlist",
        !           588: "useraliases : useralias",
        !           589: "useraliases : useraliases ':' useralias",
        !           590: "useralias : ALIAS '=' userlist",
        !           591: "userlist : opuser",
        !           592: "userlist : userlist ',' opuser",
        !           593: "opuser : user",
        !           594: "opuser : '!' user",
        !           595: "user : ALIAS",
        !           596: "user : ALL",
        !           597: "user : NETGROUP",
        !           598: "user : USERGROUP",
        !           599: "user : WORD",
        !           600: "grouplist : opgroup",
        !           601: "grouplist : grouplist ',' opgroup",
        !           602: "opgroup : group",
        !           603: "opgroup : '!' group",
        !           604: "group : ALIAS",
        !           605: "group : ALL",
        !           606: "group : WORD",
        !           607: };
        !           608: #endif
        !           609: #ifdef YYSTACKSIZE
        !           610: #undef YYMAXDEPTH
        !           611: #define YYMAXDEPTH YYSTACKSIZE
        !           612: #else
        !           613: #ifdef YYMAXDEPTH
        !           614: #define YYSTACKSIZE YYMAXDEPTH
        !           615: #else
        !           616: #define YYSTACKSIZE 10000
        !           617: #define YYMAXDEPTH 10000
        !           618: #endif
        !           619: #endif
        !           620: #define YYINITSTACKSIZE 200
        !           621: /* LINTUSED */
        !           622: int yydebug;
        !           623: int yynerrs;
        !           624: int yyerrflag;
        !           625: int yychar;
        !           626: short *yyssp;
        !           627: YYSTYPE *yyvsp;
        !           628: YYSTYPE yyval;
        !           629: YYSTYPE yylval;
        !           630: short *yyss;
        !           631: short *yysslim;
        !           632: YYSTYPE *yyvs;
        !           633: int yystacksize;
        !           634: #line 604 "gram.y"
        !           635: static struct defaults *
        !           636: new_default(char *var, char *val, int op)
        !           637: {
        !           638:     struct defaults *d;
        !           639: 
        !           640:     d = emalloc(sizeof(struct defaults));
        !           641:     d->var = var;
        !           642:     d->val = val;
        !           643:     tq_init(&d->binding);
        !           644:     d->type = 0;
        !           645:     d->op = op;
        !           646:     d->prev = d;
        !           647:     d->next = NULL;
        !           648: 
        !           649:     return d;
        !           650: }
        !           651: 
        !           652: static struct member *
        !           653: new_member(char *name, int type)
        !           654: {
        !           655:     struct member *m;
        !           656: 
        !           657:     m = emalloc(sizeof(struct member));
        !           658:     m->name = name;
        !           659:     m->type = type;
        !           660:     m->prev = m;
        !           661:     m->next = NULL;
        !           662: 
        !           663:     return m;
        !           664: }
        !           665: 
        !           666: /*
        !           667:  * Add a list of defaults structures to the defaults list.
        !           668:  * The binding, if non-NULL, specifies a list of hosts, users, or
        !           669:  * runas users the entries apply to (specified by the type).
        !           670:  */
        !           671: static void
        !           672: add_defaults(int type, struct member *bmem, struct defaults *defs)
        !           673: {
        !           674:     struct defaults *d;
        !           675:     struct member_list binding;
        !           676: 
        !           677:     /*
        !           678:      * We can only call list2tq once on bmem as it will zero
        !           679:      * out the prev pointer when it consumes bmem.
        !           680:      */
        !           681:     list2tq(&binding, bmem);
        !           682: 
        !           683:     /*
        !           684:      * Set type and binding (who it applies to) for new entries.
        !           685:      */
        !           686:     for (d = defs; d != NULL; d = d->next) {
        !           687:        d->type = type;
        !           688:        d->binding = binding;
        !           689:     }
        !           690:     tq_append(&defaults, defs);
        !           691: }
        !           692: 
        !           693: /*
        !           694:  * Allocate a new struct userspec, populate it, and insert it at the
        !           695:  * and of the userspecs list.
        !           696:  */
        !           697: static void
        !           698: add_userspec(struct member *members, struct privilege *privs)
        !           699: {
        !           700:     struct userspec *u;
        !           701: 
        !           702:     u = emalloc(sizeof(*u));
        !           703:     list2tq(&u->users, members);
        !           704:     list2tq(&u->privileges, privs);
        !           705:     u->prev = u;
        !           706:     u->next = NULL;
        !           707:     tq_append(&userspecs, u);
        !           708: }
        !           709: 
        !           710: /*
        !           711:  * Free up space used by data structures from a previous parser run and sets
        !           712:  * the current sudoers file to path.
        !           713:  */
        !           714: void
        !           715: init_parser(const char *path, int quiet)
        !           716: {
        !           717:     struct defaults *d;
        !           718:     struct member *m, *binding;
        !           719:     struct userspec *us;
        !           720:     struct privilege *priv;
        !           721:     struct cmndspec *cs;
        !           722:     struct sudo_command *c;
        !           723: 
        !           724:     while ((us = tq_pop(&userspecs)) != NULL) {
        !           725:        while ((m = tq_pop(&us->users)) != NULL) {
        !           726:            efree(m->name);
        !           727:            efree(m);
        !           728:        }
        !           729:        while ((priv = tq_pop(&us->privileges)) != NULL) {
        !           730:            struct member *runasuser = NULL, *runasgroup = NULL;
        !           731: #ifdef HAVE_SELINUX
        !           732:            char *role = NULL, *type = NULL;
        !           733: #endif /* HAVE_SELINUX */
        !           734: 
        !           735:            while ((m = tq_pop(&priv->hostlist)) != NULL) {
        !           736:                efree(m->name);
        !           737:                efree(m);
        !           738:            }
        !           739:            while ((cs = tq_pop(&priv->cmndlist)) != NULL) {
        !           740: #ifdef HAVE_SELINUX
        !           741:                /* Only free the first instance of a role/type. */
        !           742:                if (cs->role != role) {
        !           743:                    role = cs->role;
        !           744:                    efree(cs->role);
        !           745:                }
        !           746:                if (cs->type != type) {
        !           747:                    type = cs->type;
        !           748:                    efree(cs->type);
        !           749:                }
        !           750: #endif /* HAVE_SELINUX */
        !           751:                if (tq_last(&cs->runasuserlist) != runasuser) {
        !           752:                    runasuser = tq_last(&cs->runasuserlist);
        !           753:                    while ((m = tq_pop(&cs->runasuserlist)) != NULL) {
        !           754:                        efree(m->name);
        !           755:                        efree(m);
        !           756:                    }
        !           757:                }
        !           758:                if (tq_last(&cs->runasgrouplist) != runasgroup) {
        !           759:                    runasgroup = tq_last(&cs->runasgrouplist);
        !           760:                    while ((m = tq_pop(&cs->runasgrouplist)) != NULL) {
        !           761:                        efree(m->name);
        !           762:                        efree(m);
        !           763:                    }
        !           764:                }
        !           765:                if (cs->cmnd->type == COMMAND) {
        !           766:                        c = (struct sudo_command *) cs->cmnd->name;
        !           767:                        efree(c->cmnd);
        !           768:                        efree(c->args);
        !           769:                }
        !           770:                efree(cs->cmnd->name);
        !           771:                efree(cs->cmnd);
        !           772:                efree(cs);
        !           773:            }
        !           774:            efree(priv);
        !           775:        }
        !           776:        efree(us);
        !           777:     }
        !           778:     tq_init(&userspecs);
        !           779: 
        !           780:     binding = NULL;
        !           781:     while ((d = tq_pop(&defaults)) != NULL) {
        !           782:        if (tq_last(&d->binding) != binding) {
        !           783:            binding = tq_last(&d->binding);
        !           784:            while ((m = tq_pop(&d->binding)) != NULL) {
        !           785:                if (m->type == COMMAND) {
        !           786:                        c = (struct sudo_command *) m->name;
        !           787:                        efree(c->cmnd);
        !           788:                        efree(c->args);
        !           789:                }
        !           790:                efree(m->name);
        !           791:                efree(m);
        !           792:            }
        !           793:        }
        !           794:        efree(d->var);
        !           795:        efree(d->val);
        !           796:        efree(d);
        !           797:     }
        !           798:     tq_init(&defaults);
        !           799: 
        !           800:     init_aliases();
        !           801: 
        !           802:     init_lexer();
        !           803: 
        !           804:     efree(sudoers);
        !           805:     sudoers = path ? estrdup(path) : NULL;
        !           806: 
        !           807:     parse_error = FALSE;
        !           808:     errorlineno = -1;
        !           809:     errorfile = NULL;
        !           810:     verbose = !quiet;
        !           811: }
        !           812: #line 760 "y.tab.c"
        !           813: /* allocate initial stack or double stack size, up to YYMAXDEPTH */
        !           814: #if defined(__cplusplus) || defined(__STDC__)
        !           815: static int yygrowstack(void)
        !           816: #else
        !           817: static int yygrowstack()
        !           818: #endif
        !           819: {
        !           820:     int newsize, i;
        !           821:     short *newss;
        !           822:     YYSTYPE *newvs;
        !           823: 
        !           824:     if ((newsize = yystacksize) == 0)
        !           825:         newsize = YYINITSTACKSIZE;
        !           826:     else if (newsize >= YYMAXDEPTH)
        !           827:         return -1;
        !           828:     else if ((newsize *= 2) > YYMAXDEPTH)
        !           829:         newsize = YYMAXDEPTH;
        !           830:     i = yyssp - yyss;
        !           831: #ifdef SIZE_MAX
        !           832: #define YY_SIZE_MAX SIZE_MAX
        !           833: #else
        !           834: #define YY_SIZE_MAX 0x7fffffff
        !           835: #endif
        !           836:     if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)
        !           837:         goto bail;
        !           838:     newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
        !           839:       (short *)malloc(newsize * sizeof *newss); /* overflow check above */
        !           840:     if (newss == NULL)
        !           841:         goto bail;
        !           842:     yyss = newss;
        !           843:     yyssp = newss + i;
        !           844:     if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)
        !           845:         goto bail;
        !           846:     newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
        !           847:       (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
        !           848:     if (newvs == NULL)
        !           849:         goto bail;
        !           850:     yyvs = newvs;
        !           851:     yyvsp = newvs + i;
        !           852:     yystacksize = newsize;
        !           853:     yysslim = yyss + newsize - 1;
        !           854:     return 0;
        !           855: bail:
        !           856:     if (yyss)
        !           857:             free(yyss);
        !           858:     if (yyvs)
        !           859:             free(yyvs);
        !           860:     yyss = yyssp = NULL;
        !           861:     yyvs = yyvsp = NULL;
        !           862:     yystacksize = 0;
        !           863:     return -1;
        !           864: }
        !           865: 
        !           866: #define YYABORT goto yyabort
        !           867: #define YYREJECT goto yyabort
        !           868: #define YYACCEPT goto yyaccept
        !           869: #define YYERROR goto yyerrlab
        !           870: int
        !           871: #if defined(__cplusplus) || defined(__STDC__)
        !           872: yyparse(void)
        !           873: #else
        !           874: yyparse()
        !           875: #endif
        !           876: {
        !           877:     int yym, yyn, yystate;
        !           878: #if YYDEBUG
        !           879: #if defined(__cplusplus) || defined(__STDC__)
        !           880:     const char *yys;
        !           881: #else /* !(defined(__cplusplus) || defined(__STDC__)) */
        !           882:     char *yys;
        !           883: #endif /* !(defined(__cplusplus) || defined(__STDC__)) */
        !           884: 
        !           885:     if ((yys = getenv("YYDEBUG")))
        !           886:     {
        !           887:         yyn = *yys;
        !           888:         if (yyn >= '0' && yyn <= '9')
        !           889:             yydebug = yyn - '0';
        !           890:     }
        !           891: #endif /* YYDEBUG */
        !           892: 
        !           893:     yynerrs = 0;
        !           894:     yyerrflag = 0;
        !           895:     yychar = (-1);
        !           896: 
        !           897:     if (yyss == NULL && yygrowstack()) goto yyoverflow;
        !           898:     yyssp = yyss;
        !           899:     yyvsp = yyvs;
        !           900:     *yyssp = yystate = 0;
        !           901: 
        !           902: yyloop:
        !           903:     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
        !           904:     if (yychar < 0)
        !           905:     {
        !           906:         if ((yychar = yylex()) < 0) yychar = 0;
        !           907: #if YYDEBUG
        !           908:         if (yydebug)
        !           909:         {
        !           910:             yys = 0;
        !           911:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
        !           912:             if (!yys) yys = "illegal-symbol";
        !           913:             printf("%sdebug: state %d, reading %d (%s)\n",
        !           914:                     YYPREFIX, yystate, yychar, yys);
        !           915:         }
        !           916: #endif
        !           917:     }
        !           918:     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
        !           919:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
        !           920:     {
        !           921: #if YYDEBUG
        !           922:         if (yydebug)
        !           923:             printf("%sdebug: state %d, shifting to state %d\n",
        !           924:                     YYPREFIX, yystate, yytable[yyn]);
        !           925: #endif
        !           926:         if (yyssp >= yysslim && yygrowstack())
        !           927:         {
        !           928:             goto yyoverflow;
        !           929:         }
        !           930:         *++yyssp = yystate = yytable[yyn];
        !           931:         *++yyvsp = yylval;
        !           932:         yychar = (-1);
        !           933:         if (yyerrflag > 0)  --yyerrflag;
        !           934:         goto yyloop;
        !           935:     }
        !           936:     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
        !           937:             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
        !           938:     {
        !           939:         yyn = yytable[yyn];
        !           940:         goto yyreduce;
        !           941:     }
        !           942:     if (yyerrflag) goto yyinrecovery;
        !           943: #if defined(lint) || defined(__GNUC__)
        !           944:     goto yynewerror;
        !           945: #endif
        !           946: yynewerror:
        !           947:     yyerror("syntax error");
        !           948: #if defined(lint) || defined(__GNUC__)
        !           949:     goto yyerrlab;
        !           950: #endif
        !           951: yyerrlab:
        !           952:     ++yynerrs;
        !           953: yyinrecovery:
        !           954:     if (yyerrflag < 3)
        !           955:     {
        !           956:         yyerrflag = 3;
        !           957:         for (;;)
        !           958:         {
        !           959:             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
        !           960:                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
        !           961:             {
        !           962: #if YYDEBUG
        !           963:                 if (yydebug)
        !           964:                     printf("%sdebug: state %d, error recovery shifting\
        !           965:  to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
        !           966: #endif
        !           967:                 if (yyssp >= yysslim && yygrowstack())
        !           968:                 {
        !           969:                     goto yyoverflow;
        !           970:                 }
        !           971:                 *++yyssp = yystate = yytable[yyn];
        !           972:                 *++yyvsp = yylval;
        !           973:                 goto yyloop;
        !           974:             }
        !           975:             else
        !           976:             {
        !           977: #if YYDEBUG
        !           978:                 if (yydebug)
        !           979:                     printf("%sdebug: error recovery discarding state %d\n",
        !           980:                             YYPREFIX, *yyssp);
        !           981: #endif
        !           982:                 if (yyssp <= yyss) goto yyabort;
        !           983:                 --yyssp;
        !           984:                 --yyvsp;
        !           985:             }
        !           986:         }
        !           987:     }
        !           988:     else
        !           989:     {
        !           990:         if (yychar == 0) goto yyabort;
        !           991: #if YYDEBUG
        !           992:         if (yydebug)
        !           993:         {
        !           994:             yys = 0;
        !           995:             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
        !           996:             if (!yys) yys = "illegal-symbol";
        !           997:             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
        !           998:                     YYPREFIX, yystate, yychar, yys);
        !           999:         }
        !          1000: #endif
        !          1001:         yychar = (-1);
        !          1002:         goto yyloop;
        !          1003:     }
        !          1004: yyreduce:
        !          1005: #if YYDEBUG
        !          1006:     if (yydebug)
        !          1007:         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
        !          1008:                 YYPREFIX, yystate, yyn, yyrule[yyn]);
        !          1009: #endif
        !          1010:     yym = yylen[yyn];
        !          1011:     if (yym)
        !          1012:         yyval = yyvsp[1-yym];
        !          1013:     else
        !          1014:         memset(&yyval, 0, sizeof yyval);
        !          1015:     switch (yyn)
        !          1016:     {
        !          1017: case 1:
        !          1018: #line 185 "gram.y"
        !          1019: { ; }
        !          1020: break;
        !          1021: case 5:
        !          1022: #line 193 "gram.y"
        !          1023: {
        !          1024:                            ;
        !          1025:                        }
        !          1026: break;
        !          1027: case 6:
        !          1028: #line 196 "gram.y"
        !          1029: {
        !          1030:                            yyerrok;
        !          1031:                        }
        !          1032: break;
        !          1033: case 7:
        !          1034: #line 199 "gram.y"
        !          1035: {
        !          1036:                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
        !          1037:                        }
        !          1038: break;
        !          1039: case 8:
        !          1040: #line 202 "gram.y"
        !          1041: {
        !          1042:                            ;
        !          1043:                        }
        !          1044: break;
        !          1045: case 9:
        !          1046: #line 205 "gram.y"
        !          1047: {
        !          1048:                            ;
        !          1049:                        }
        !          1050: break;
        !          1051: case 10:
        !          1052: #line 208 "gram.y"
        !          1053: {
        !          1054:                            ;
        !          1055:                        }
        !          1056: break;
        !          1057: case 11:
        !          1058: #line 211 "gram.y"
        !          1059: {
        !          1060:                            ;
        !          1061:                        }
        !          1062: break;
        !          1063: case 12:
        !          1064: #line 214 "gram.y"
        !          1065: {
        !          1066:                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
        !          1067:                        }
        !          1068: break;
        !          1069: case 13:
        !          1070: #line 217 "gram.y"
        !          1071: {
        !          1072:                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
        !          1073:                        }
        !          1074: break;
        !          1075: case 14:
        !          1076: #line 220 "gram.y"
        !          1077: {
        !          1078:                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
        !          1079:                        }
        !          1080: break;
        !          1081: case 15:
        !          1082: #line 223 "gram.y"
        !          1083: {
        !          1084:                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
        !          1085:                        }
        !          1086: break;
        !          1087: case 16:
        !          1088: #line 226 "gram.y"
        !          1089: {
        !          1090:                            add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
        !          1091:                        }
        !          1092: break;
        !          1093: case 18:
        !          1094: #line 232 "gram.y"
        !          1095: {
        !          1096:                            list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
        !          1097:                            yyval.defaults = yyvsp[-2].defaults;
        !          1098:                        }
        !          1099: break;
        !          1100: case 19:
        !          1101: #line 238 "gram.y"
        !          1102: {
        !          1103:                            yyval.defaults = new_default(yyvsp[0].string, NULL, TRUE);
        !          1104:                        }
        !          1105: break;
        !          1106: case 20:
        !          1107: #line 241 "gram.y"
        !          1108: {
        !          1109:                            yyval.defaults = new_default(yyvsp[0].string, NULL, FALSE);
        !          1110:                        }
        !          1111: break;
        !          1112: case 21:
        !          1113: #line 244 "gram.y"
        !          1114: {
        !          1115:                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, TRUE);
        !          1116:                        }
        !          1117: break;
        !          1118: case 22:
        !          1119: #line 247 "gram.y"
        !          1120: {
        !          1121:                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
        !          1122:                        }
        !          1123: break;
        !          1124: case 23:
        !          1125: #line 250 "gram.y"
        !          1126: {
        !          1127:                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
        !          1128:                        }
        !          1129: break;
        !          1130: case 25:
        !          1131: #line 256 "gram.y"
        !          1132: {
        !          1133:                            list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
        !          1134:                            yyval.privilege = yyvsp[-2].privilege;
        !          1135:                        }
        !          1136: break;
        !          1137: case 26:
        !          1138: #line 262 "gram.y"
        !          1139: {
        !          1140:                            struct privilege *p = emalloc(sizeof(*p));
        !          1141:                            list2tq(&p->hostlist, yyvsp[-2].member);
        !          1142:                            list2tq(&p->cmndlist, yyvsp[0].cmndspec);
        !          1143:                            p->prev = p;
        !          1144:                            p->next = NULL;
        !          1145:                            yyval.privilege = p;
        !          1146:                        }
        !          1147: break;
        !          1148: case 27:
        !          1149: #line 272 "gram.y"
        !          1150: {
        !          1151:                            yyval.member = yyvsp[0].member;
        !          1152:                            yyval.member->negated = FALSE;
        !          1153:                        }
        !          1154: break;
        !          1155: case 28:
        !          1156: #line 276 "gram.y"
        !          1157: {
        !          1158:                            yyval.member = yyvsp[0].member;
        !          1159:                            yyval.member->negated = TRUE;
        !          1160:                        }
        !          1161: break;
        !          1162: case 29:
        !          1163: #line 282 "gram.y"
        !          1164: {
        !          1165:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
        !          1166:                        }
        !          1167: break;
        !          1168: case 30:
        !          1169: #line 285 "gram.y"
        !          1170: {
        !          1171:                            yyval.member = new_member(NULL, ALL);
        !          1172:                        }
        !          1173: break;
        !          1174: case 31:
        !          1175: #line 288 "gram.y"
        !          1176: {
        !          1177:                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
        !          1178:                        }
        !          1179: break;
        !          1180: case 32:
        !          1181: #line 291 "gram.y"
        !          1182: {
        !          1183:                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
        !          1184:                        }
        !          1185: break;
        !          1186: case 33:
        !          1187: #line 294 "gram.y"
        !          1188: {
        !          1189:                            yyval.member = new_member(yyvsp[0].string, WORD);
        !          1190:                        }
        !          1191: break;
        !          1192: case 35:
        !          1193: #line 300 "gram.y"
        !          1194: {
        !          1195:                            list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
        !          1196: #ifdef HAVE_SELINUX
        !          1197:                            /* propagate role and type */
        !          1198:                            if (yyvsp[0].cmndspec->role == NULL)
        !          1199:                                yyvsp[0].cmndspec->role = yyvsp[0].cmndspec->prev->role;
        !          1200:                            if (yyvsp[0].cmndspec->type == NULL)
        !          1201:                                yyvsp[0].cmndspec->type = yyvsp[0].cmndspec->prev->type;
        !          1202: #endif /* HAVE_SELINUX */
        !          1203:                            /* propagate tags and runas list */
        !          1204:                            if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC)
        !          1205:                                yyvsp[0].cmndspec->tags.nopasswd = yyvsp[0].cmndspec->prev->tags.nopasswd;
        !          1206:                            if (yyvsp[0].cmndspec->tags.noexec == UNSPEC)
        !          1207:                                yyvsp[0].cmndspec->tags.noexec = yyvsp[0].cmndspec->prev->tags.noexec;
        !          1208:                            if (yyvsp[0].cmndspec->tags.setenv == UNSPEC &&
        !          1209:                                yyvsp[0].cmndspec->prev->tags.setenv != IMPLIED)
        !          1210:                                yyvsp[0].cmndspec->tags.setenv = yyvsp[0].cmndspec->prev->tags.setenv;
        !          1211:                            if (yyvsp[0].cmndspec->tags.log_input == UNSPEC)
        !          1212:                                yyvsp[0].cmndspec->tags.log_input = yyvsp[0].cmndspec->prev->tags.log_input;
        !          1213:                            if (yyvsp[0].cmndspec->tags.log_output == UNSPEC)
        !          1214:                                yyvsp[0].cmndspec->tags.log_output = yyvsp[0].cmndspec->prev->tags.log_output;
        !          1215:                            if ((tq_empty(&yyvsp[0].cmndspec->runasuserlist) &&
        !          1216:                                 tq_empty(&yyvsp[0].cmndspec->runasgrouplist)) &&
        !          1217:                                (!tq_empty(&yyvsp[0].cmndspec->prev->runasuserlist) ||
        !          1218:                                 !tq_empty(&yyvsp[0].cmndspec->prev->runasgrouplist))) {
        !          1219:                                yyvsp[0].cmndspec->runasuserlist = yyvsp[0].cmndspec->prev->runasuserlist;
        !          1220:                                yyvsp[0].cmndspec->runasgrouplist = yyvsp[0].cmndspec->prev->runasgrouplist;
        !          1221:                            }
        !          1222:                            yyval.cmndspec = yyvsp[-2].cmndspec;
        !          1223:                        }
        !          1224: break;
        !          1225: case 36:
        !          1226: #line 332 "gram.y"
        !          1227: {
        !          1228:                            struct cmndspec *cs = emalloc(sizeof(*cs));
        !          1229:                            if (yyvsp[-3].runas != NULL) {
        !          1230:                                list2tq(&cs->runasuserlist, yyvsp[-3].runas->runasusers);
        !          1231:                                list2tq(&cs->runasgrouplist, yyvsp[-3].runas->runasgroups);
        !          1232:                                efree(yyvsp[-3].runas);
        !          1233:                            } else {
        !          1234:                                tq_init(&cs->runasuserlist);
        !          1235:                                tq_init(&cs->runasgrouplist);
        !          1236:                            }
        !          1237: #ifdef HAVE_SELINUX
        !          1238:                            cs->role = yyvsp[-2].seinfo.role;
        !          1239:                            cs->type = yyvsp[-2].seinfo.type;
        !          1240: #endif
        !          1241:                            cs->tags = yyvsp[-1].tag;
        !          1242:                            cs->cmnd = yyvsp[0].member;
        !          1243:                            cs->prev = cs;
        !          1244:                            cs->next = NULL;
        !          1245:                            /* sudo "ALL" implies the SETENV tag */
        !          1246:                            if (cs->cmnd->type == ALL && !cs->cmnd->negated &&
        !          1247:                                cs->tags.setenv == UNSPEC)
        !          1248:                                cs->tags.setenv = IMPLIED;
        !          1249:                            yyval.cmndspec = cs;
        !          1250:                        }
        !          1251: break;
        !          1252: case 37:
        !          1253: #line 358 "gram.y"
        !          1254: {
        !          1255:                            yyval.member = yyvsp[0].member;
        !          1256:                            yyval.member->negated = FALSE;
        !          1257:                        }
        !          1258: break;
        !          1259: case 38:
        !          1260: #line 362 "gram.y"
        !          1261: {
        !          1262:                            yyval.member = yyvsp[0].member;
        !          1263:                            yyval.member->negated = TRUE;
        !          1264:                        }
        !          1265: break;
        !          1266: case 39:
        !          1267: #line 368 "gram.y"
        !          1268: {
        !          1269:                            yyval.string = yyvsp[0].string;
        !          1270:                        }
        !          1271: break;
        !          1272: case 40:
        !          1273: #line 373 "gram.y"
        !          1274: {
        !          1275:                            yyval.string = yyvsp[0].string;
        !          1276:                        }
        !          1277: break;
        !          1278: case 41:
        !          1279: #line 378 "gram.y"
        !          1280: {
        !          1281:                            yyval.seinfo.role = NULL;
        !          1282:                            yyval.seinfo.type = NULL;
        !          1283:                        }
        !          1284: break;
        !          1285: case 42:
        !          1286: #line 382 "gram.y"
        !          1287: {
        !          1288:                            yyval.seinfo.role = yyvsp[0].string;
        !          1289:                            yyval.seinfo.type = NULL;
        !          1290:                        }
        !          1291: break;
        !          1292: case 43:
        !          1293: #line 386 "gram.y"
        !          1294: {
        !          1295:                            yyval.seinfo.type = yyvsp[0].string;
        !          1296:                            yyval.seinfo.role = NULL;
        !          1297:                        }
        !          1298: break;
        !          1299: case 44:
        !          1300: #line 390 "gram.y"
        !          1301: {
        !          1302:                            yyval.seinfo.role = yyvsp[-1].string;
        !          1303:                            yyval.seinfo.type = yyvsp[0].string;
        !          1304:                        }
        !          1305: break;
        !          1306: case 45:
        !          1307: #line 394 "gram.y"
        !          1308: {
        !          1309:                            yyval.seinfo.type = yyvsp[-1].string;
        !          1310:                            yyval.seinfo.role = yyvsp[0].string;
        !          1311:                        }
        !          1312: break;
        !          1313: case 46:
        !          1314: #line 400 "gram.y"
        !          1315: {
        !          1316:                            yyval.runas = NULL;
        !          1317:                        }
        !          1318: break;
        !          1319: case 47:
        !          1320: #line 403 "gram.y"
        !          1321: {
        !          1322:                            yyval.runas = yyvsp[-1].runas;
        !          1323:                        }
        !          1324: break;
        !          1325: case 48:
        !          1326: #line 408 "gram.y"
        !          1327: {
        !          1328:                            yyval.runas = emalloc(sizeof(struct runascontainer));
        !          1329:                            yyval.runas->runasusers = yyvsp[0].member;
        !          1330:                            yyval.runas->runasgroups = NULL;
        !          1331:                        }
        !          1332: break;
        !          1333: case 49:
        !          1334: #line 413 "gram.y"
        !          1335: {
        !          1336:                            yyval.runas = emalloc(sizeof(struct runascontainer));
        !          1337:                            yyval.runas->runasusers = yyvsp[-2].member;
        !          1338:                            yyval.runas->runasgroups = yyvsp[0].member;
        !          1339:                        }
        !          1340: break;
        !          1341: case 50:
        !          1342: #line 418 "gram.y"
        !          1343: {
        !          1344:                            yyval.runas = emalloc(sizeof(struct runascontainer));
        !          1345:                            yyval.runas->runasusers = NULL;
        !          1346:                            yyval.runas->runasgroups = yyvsp[0].member;
        !          1347:                        }
        !          1348: break;
        !          1349: case 51:
        !          1350: #line 425 "gram.y"
        !          1351: {
        !          1352:                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
        !          1353:                                yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
        !          1354:                        }
        !          1355: break;
        !          1356: case 52:
        !          1357: #line 429 "gram.y"
        !          1358: {
        !          1359:                            yyval.tag.nopasswd = TRUE;
        !          1360:                        }
        !          1361: break;
        !          1362: case 53:
        !          1363: #line 432 "gram.y"
        !          1364: {
        !          1365:                            yyval.tag.nopasswd = FALSE;
        !          1366:                        }
        !          1367: break;
        !          1368: case 54:
        !          1369: #line 435 "gram.y"
        !          1370: {
        !          1371:                            yyval.tag.noexec = TRUE;
        !          1372:                        }
        !          1373: break;
        !          1374: case 55:
        !          1375: #line 438 "gram.y"
        !          1376: {
        !          1377:                            yyval.tag.noexec = FALSE;
        !          1378:                        }
        !          1379: break;
        !          1380: case 56:
        !          1381: #line 441 "gram.y"
        !          1382: {
        !          1383:                            yyval.tag.setenv = TRUE;
        !          1384:                        }
        !          1385: break;
        !          1386: case 57:
        !          1387: #line 444 "gram.y"
        !          1388: {
        !          1389:                            yyval.tag.setenv = FALSE;
        !          1390:                        }
        !          1391: break;
        !          1392: case 58:
        !          1393: #line 447 "gram.y"
        !          1394: {
        !          1395:                            yyval.tag.log_input = TRUE;
        !          1396:                        }
        !          1397: break;
        !          1398: case 59:
        !          1399: #line 450 "gram.y"
        !          1400: {
        !          1401:                            yyval.tag.log_input = FALSE;
        !          1402:                        }
        !          1403: break;
        !          1404: case 60:
        !          1405: #line 453 "gram.y"
        !          1406: {
        !          1407:                            yyval.tag.log_output = TRUE;
        !          1408:                        }
        !          1409: break;
        !          1410: case 61:
        !          1411: #line 456 "gram.y"
        !          1412: {
        !          1413:                            yyval.tag.log_output = FALSE;
        !          1414:                        }
        !          1415: break;
        !          1416: case 62:
        !          1417: #line 461 "gram.y"
        !          1418: {
        !          1419:                            yyval.member = new_member(NULL, ALL);
        !          1420:                        }
        !          1421: break;
        !          1422: case 63:
        !          1423: #line 464 "gram.y"
        !          1424: {
        !          1425:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
        !          1426:                        }
        !          1427: break;
        !          1428: case 64:
        !          1429: #line 467 "gram.y"
        !          1430: {
        !          1431:                            struct sudo_command *c = emalloc(sizeof(*c));
        !          1432:                            c->cmnd = yyvsp[0].command.cmnd;
        !          1433:                            c->args = yyvsp[0].command.args;
        !          1434:                            yyval.member = new_member((char *)c, COMMAND);
        !          1435:                        }
        !          1436: break;
        !          1437: case 67:
        !          1438: #line 479 "gram.y"
        !          1439: {
        !          1440:                            char *s;
        !          1441:                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
        !          1442:                                yyerror(s);
        !          1443:                                YYERROR;
        !          1444:                            }
        !          1445:                        }
        !          1446: break;
        !          1447: case 69:
        !          1448: #line 489 "gram.y"
        !          1449: {
        !          1450:                            list_append(yyvsp[-2].member, yyvsp[0].member);
        !          1451:                            yyval.member = yyvsp[-2].member;
        !          1452:                        }
        !          1453: break;
        !          1454: case 72:
        !          1455: #line 499 "gram.y"
        !          1456: {
        !          1457:                            char *s;
        !          1458:                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
        !          1459:                                yyerror(s);
        !          1460:                                YYERROR;
        !          1461:                            }
        !          1462:                        }
        !          1463: break;
        !          1464: case 74:
        !          1465: #line 509 "gram.y"
        !          1466: {
        !          1467:                            list_append(yyvsp[-2].member, yyvsp[0].member);
        !          1468:                            yyval.member = yyvsp[-2].member;
        !          1469:                        }
        !          1470: break;
        !          1471: case 77:
        !          1472: #line 519 "gram.y"
        !          1473: {
        !          1474:                            char *s;
        !          1475:                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
        !          1476:                                yyerror(s);
        !          1477:                                YYERROR;
        !          1478:                            }
        !          1479:                        }
        !          1480: break;
        !          1481: case 80:
        !          1482: #line 532 "gram.y"
        !          1483: {
        !          1484:                            char *s;
        !          1485:                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
        !          1486:                                yyerror(s);
        !          1487:                                YYERROR;
        !          1488:                            }
        !          1489:                        }
        !          1490: break;
        !          1491: case 82:
        !          1492: #line 542 "gram.y"
        !          1493: {
        !          1494:                            list_append(yyvsp[-2].member, yyvsp[0].member);
        !          1495:                            yyval.member = yyvsp[-2].member;
        !          1496:                        }
        !          1497: break;
        !          1498: case 83:
        !          1499: #line 548 "gram.y"
        !          1500: {
        !          1501:                            yyval.member = yyvsp[0].member;
        !          1502:                            yyval.member->negated = FALSE;
        !          1503:                        }
        !          1504: break;
        !          1505: case 84:
        !          1506: #line 552 "gram.y"
        !          1507: {
        !          1508:                            yyval.member = yyvsp[0].member;
        !          1509:                            yyval.member->negated = TRUE;
        !          1510:                        }
        !          1511: break;
        !          1512: case 85:
        !          1513: #line 558 "gram.y"
        !          1514: {
        !          1515:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
        !          1516:                        }
        !          1517: break;
        !          1518: case 86:
        !          1519: #line 561 "gram.y"
        !          1520: {
        !          1521:                            yyval.member = new_member(NULL, ALL);
        !          1522:                        }
        !          1523: break;
        !          1524: case 87:
        !          1525: #line 564 "gram.y"
        !          1526: {
        !          1527:                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
        !          1528:                        }
        !          1529: break;
        !          1530: case 88:
        !          1531: #line 567 "gram.y"
        !          1532: {
        !          1533:                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
        !          1534:                        }
        !          1535: break;
        !          1536: case 89:
        !          1537: #line 570 "gram.y"
        !          1538: {
        !          1539:                            yyval.member = new_member(yyvsp[0].string, WORD);
        !          1540:                        }
        !          1541: break;
        !          1542: case 91:
        !          1543: #line 576 "gram.y"
        !          1544: {
        !          1545:                            list_append(yyvsp[-2].member, yyvsp[0].member);
        !          1546:                            yyval.member = yyvsp[-2].member;
        !          1547:                        }
        !          1548: break;
        !          1549: case 92:
        !          1550: #line 582 "gram.y"
        !          1551: {
        !          1552:                            yyval.member = yyvsp[0].member;
        !          1553:                            yyval.member->negated = FALSE;
        !          1554:                        }
        !          1555: break;
        !          1556: case 93:
        !          1557: #line 586 "gram.y"
        !          1558: {
        !          1559:                            yyval.member = yyvsp[0].member;
        !          1560:                            yyval.member->negated = TRUE;
        !          1561:                        }
        !          1562: break;
        !          1563: case 94:
        !          1564: #line 592 "gram.y"
        !          1565: {
        !          1566:                            yyval.member = new_member(yyvsp[0].string, ALIAS);
        !          1567:                        }
        !          1568: break;
        !          1569: case 95:
        !          1570: #line 595 "gram.y"
        !          1571: {
        !          1572:                            yyval.member = new_member(NULL, ALL);
        !          1573:                        }
        !          1574: break;
        !          1575: case 96:
        !          1576: #line 598 "gram.y"
        !          1577: {
        !          1578:                            yyval.member = new_member(yyvsp[0].string, WORD);
        !          1579:                        }
        !          1580: break;
        !          1581: #line 1529 "y.tab.c"
        !          1582:     }
        !          1583:     yyssp -= yym;
        !          1584:     yystate = *yyssp;
        !          1585:     yyvsp -= yym;
        !          1586:     yym = yylhs[yyn];
        !          1587:     if (yystate == 0 && yym == 0)
        !          1588:     {
        !          1589: #if YYDEBUG
        !          1590:         if (yydebug)
        !          1591:             printf("%sdebug: after reduction, shifting from state 0 to\
        !          1592:  state %d\n", YYPREFIX, YYFINAL);
        !          1593: #endif
        !          1594:         yystate = YYFINAL;
        !          1595:         *++yyssp = YYFINAL;
        !          1596:         *++yyvsp = yyval;
        !          1597:         if (yychar < 0)
        !          1598:         {
        !          1599:             if ((yychar = yylex()) < 0) yychar = 0;
        !          1600: #if YYDEBUG
        !          1601:             if (yydebug)
        !          1602:             {
        !          1603:                 yys = 0;
        !          1604:                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
        !          1605:                 if (!yys) yys = "illegal-symbol";
        !          1606:                 printf("%sdebug: state %d, reading %d (%s)\n",
        !          1607:                         YYPREFIX, YYFINAL, yychar, yys);
        !          1608:             }
        !          1609: #endif
        !          1610:         }
        !          1611:         if (yychar == 0) goto yyaccept;
        !          1612:         goto yyloop;
        !          1613:     }
        !          1614:     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
        !          1615:             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
        !          1616:         yystate = yytable[yyn];
        !          1617:     else
        !          1618:         yystate = yydgoto[yym];
        !          1619: #if YYDEBUG
        !          1620:     if (yydebug)
        !          1621:         printf("%sdebug: after reduction, shifting from state %d \
        !          1622: to state %d\n", YYPREFIX, *yyssp, yystate);
        !          1623: #endif
        !          1624:     if (yyssp >= yysslim && yygrowstack())
        !          1625:     {
        !          1626:         goto yyoverflow;
        !          1627:     }
        !          1628:     *++yyssp = yystate;
        !          1629:     *++yyvsp = yyval;
        !          1630:     goto yyloop;
        !          1631: yyoverflow:
        !          1632:     yyerror("yacc stack overflow");
        !          1633: yyabort:
        !          1634:     if (yyss)
        !          1635:             free(yyss);
        !          1636:     if (yyvs)
        !          1637:             free(yyvs);
        !          1638:     yyss = yyssp = NULL;
        !          1639:     yyvs = yyvsp = NULL;
        !          1640:     yystacksize = 0;
        !          1641:     return (1);
        !          1642: yyaccept:
        !          1643:     if (yyss)
        !          1644:             free(yyss);
        !          1645:     if (yyvs)
        !          1646:             free(yyvs);
        !          1647:     yyss = yyssp = NULL;
        !          1648:     yyvs = yyvsp = NULL;
        !          1649:     yystacksize = 0;
        !          1650:     return (0);
        !          1651: }

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