From: Todd C. Miller Date: Sat, 18 Apr 2009 23:25:08 +0000 (+0000) Subject: Implement #includedir directive. Files in an includedir are not edited X-Git-Tag: SUDO_1_7_2~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3be603aa47531aa90b5125a56f4e8445d2cc2612;p=sudo Implement #includedir directive. Files in an includedir are not edited by visudo unless they contain a syntax error. --- diff --git a/gram.c b/gram.c index 5bc13f5b9..1f0117e2b 100644 --- a/gram.c +++ b/gram.c @@ -798,15 +798,18 @@ init_parser(path, quiet) init_aliases(); + init_lexer(); + efree(sudoers); sudoers = path ? estrdup(path) : NULL; parse_error = FALSE; errorlineno = -1; + errorfile = NULL; sudolineno = 1; verbose = !quiet; } -#line 758 "y.tab.c" +#line 761 "y.tab.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ #if defined(__cplusplus) || defined(__STDC__) static int yygrowstack(void) @@ -1546,7 +1549,7 @@ case 92: yyval.member = new_member(yyvsp[0].string, WORD); } break; -#line 1498 "y.tab.c" +#line 1501 "y.tab.c" } yyssp -= yym; yystate = *yyssp; diff --git a/gram.y b/gram.y index e04570792..5315d3259 100644 --- a/gram.y +++ b/gram.y @@ -766,11 +766,14 @@ init_parser(path, quiet) init_aliases(); + init_lexer(); + efree(sudoers); sudoers = path ? estrdup(path) : NULL; parse_error = FALSE; errorlineno = -1; + errorfile = NULL; sudolineno = 1; verbose = !quiet; } diff --git a/parse.c b/parse.c index d0b4cf124..a5d289312 100644 --- a/parse.c +++ b/parse.c @@ -89,7 +89,7 @@ sudo_file_open(nss) { if (def_ignore_local_sudoers) return(-1); - nss->handle = open_sudoers(_PATH_SUDOERS, NULL); + nss->handle = open_sudoers(_PATH_SUDOERS, FALSE, NULL); return(nss->handle ? 0 : -1); } diff --git a/parse.h b/parse.h index 98ee2bb34..d002f142d 100644 --- a/parse.h +++ b/parse.h @@ -185,6 +185,7 @@ struct alias *alias_remove __P((char *, int)); void alias_free __P((void *)); void alias_apply __P((int (*)(void *, void *), void *)); void init_aliases __P((void)); +void init_lexer __P((void)); void init_parser __P((char *, int)); int alias_compare __P((const void *, const void *)); diff --git a/sudo.c b/sudo.c index 66e5417b0..5a79e8b7b 100644 --- a/sudo.c +++ b/sudo.c @@ -1072,8 +1072,9 @@ parse_args(argc, argv) * Returns a handle to the sudoers file or NULL on error. */ FILE * -open_sudoers(sudoers, keepopen) +open_sudoers(sudoers, doedit, keepopen) const char *sudoers; + int doedit; int *keepopen; { struct stat statbuf; diff --git a/sudo.h b/sudo.h index 4d3f03cb2..77ed89eef 100644 --- a/sudo.h +++ b/sudo.h @@ -298,7 +298,7 @@ char *sudo_getepw __P((const struct passwd *)); int pam_prep_user __P((struct passwd *)); void zero_bytes __P((volatile void *, size_t)); int gettime __P((struct timespec *)); -FILE *open_sudoers __P((const char *, int *)); +FILE *open_sudoers __P((const char *, int, int *)); void display_privs __P((struct sudo_nss_list *, struct passwd *)); int display_cmnd __P((struct sudo_nss_list *, struct passwd *)); int get_ttycols __P((void)); diff --git a/sudoers.cat b/sudoers.cat index 542ea37b1..d46e3bdf3 100644 --- a/sudoers.cat +++ b/sudoers.cat @@ -61,7 +61,7 @@ DDEESSCCRRIIPPTTIIOONN -1.7.1 March 11, 2009 1 +1.7.1 April 18, 2009 1 @@ -127,7 +127,7 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) -1.7.1 March 11, 2009 2 +1.7.1 April 18, 2009 2 @@ -193,7 +193,7 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) -1.7.1 March 11, 2009 3 +1.7.1 April 18, 2009 3 @@ -259,7 +259,7 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) -1.7.1 March 11, 2009 4 +1.7.1 April 18, 2009 4 @@ -325,7 +325,7 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) -1.7.1 March 11, 2009 5 +1.7.1 April 18, 2009 5 @@ -391,7 +391,7 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) -1.7.1 March 11, 2009 6 +1.7.1 April 18, 2009 6 @@ -453,11 +453,11 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) IInncclluuddiinngg ootthheerr ffiilleess ffrroomm wwiitthhiinn ssuuddooeerrss It is possible to include other _s_u_d_o_e_r_s files from within the _s_u_d_o_e_r_s - file currently being parsed using the #include directive, similar to + file currently being parsed using the #include and #includedir -1.7.1 March 11, 2009 7 +1.7.1 April 18, 2009 7 @@ -466,12 +466,13 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - the one used by the C preprocessor. This is useful, for example, for - keeping a site-wide _s_u_d_o_e_r_s file in addition to a per-machine local - one. For the sake of this example the site-wide _s_u_d_o_e_r_s will be - _/_e_t_c_/_s_u_d_o_e_r_s and the per-machine one will be _/_e_t_c_/_s_u_d_o_e_r_s_._l_o_c_a_l. To - include _/_e_t_c_/_s_u_d_o_e_r_s_._l_o_c_a_l from within _/_e_t_c_/_s_u_d_o_e_r_s we would use the - following line in _/_e_t_c_/_s_u_d_o_e_r_s: + directives. + + This can be used, for example, to keep a site-wide _s_u_d_o_e_r_s file in + addition to a local, per-machine file. For the sake of this example + the site-wide _s_u_d_o_e_r_s will be _/_e_t_c_/_s_u_d_o_e_r_s and the per-machine one will + be _/_e_t_c_/_s_u_d_o_e_r_s_._l_o_c_a_l. To include _/_e_t_c_/_s_u_d_o_e_r_s_._l_o_c_a_l from within + _/_e_t_c_/_s_u_d_o_e_r_s we would use the following line in _/_e_t_c_/_s_u_d_o_e_r_s: #include /etc/sudoers.local @@ -489,6 +490,25 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) will cause ssuuddoo to include the file _/_e_t_c_/_s_u_d_o_e_r_s_._x_e_r_x_e_s. + The #includedir directive can be used to create a _s_u_d_o_._d directory that + the system package manager can drop _s_u_d_o_e_r_s rules into as part of + package installation. For example, given: + + #includedir /etc/sudoers.d + + ssuuddoo will read each file in _/_e_t_c_/_s_u_d_o_e_r_s_._d, skipping files that end in + ".tmp" to avoid causing problems with vviissuuddoo. Files are parsed in + sorted lexical order. That is, _/_e_t_c_/_s_u_d_o_e_r_s_._d_/_0_1___f_i_r_s_t will be parsed + before _/_e_t_c_/_s_u_d_o_e_r_s_._d_/_1_0___s_e_c_o_n_d. Be aware that because the sorting is + lexical, not numeric, _/_e_t_c_/_s_u_d_o_e_r_s_._d_/_1___w_h_o_o_p_s would be loaded aafftteerr + _/_e_t_c_/_s_u_d_o_e_r_s_._d_/_1_0___s_e_c_o_n_d. Using a consistent number of leading zeroes + in the file names can be used to avoid such problems. + + Note that unlike files included via #include, vviissuuddoo will not edit the + files in a #includedir directory unless one of them contains a syntax + error. It is still possible to run vviissuuddoo with the -f flag to edit the + files directly. + OOtthheerr ssppeecciiaall cchhaarraacctteerrss aanndd rreesseerrvveedd wwoorrddss The pound sign ('#') is used to indicate a comment (unless it is part @@ -500,6 +520,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) The reserved word AALLLL is a built-in _a_l_i_a_s that always causes a match to succeed. It can be used wherever one might otherwise use a Cmnd_Alias, User_Alias, Runas_Alias, or Host_Alias. You should not try to define + + + +1.7.1 April 18, 2009 8 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + your own _a_l_i_a_s called AALLLL as the built-in alias will be used in preference to your own. Please note that using AALLLL can be dangerous since in a command context, it allows the user to run aannyy command on @@ -521,17 +553,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) used as part of a word (e.g. a username or hostname): '@', '!', '=', ':', ',', '(', ')', '\'. - - -1.7.1 March 11, 2009 8 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - SSUUDDOOEERRSS OOPPTTIIOONNSS ssuuddoo's behavior can be modified by Default_Entry lines, as explained earlier. A list of all supported Defaults parameters, grouped by type, @@ -565,6 +586,18 @@ SSUUDDOOEERRSS OOPPTTIIOONNSS alternative is to place a colon-separated list of editors in the editor variable. vviissuuddoo will then only use the EDITOR or VISUAL if they match a value + + + +1.7.1 April 18, 2009 9 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + specified in editor. This flag is _o_f_f by default. env_reset If set, ssuuddoo will reset the environment to only contain @@ -586,18 +619,6 @@ SSUUDDOOEERRSS OOPPTTIIOONNSS working (for example if the machine is not plugged into the network). Also note that you must use the host's official name as DNS knows it. That is, you may not - - - -1.7.1 March 11, 2009 9 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - use a host alias (CNAME entry) due to performance issues and the fact that there is no way to get all aliases from DNS. If your machine's hostname (as @@ -631,6 +652,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) log_year If set, the four-digit year will be logged in the (non- syslog) ssuuddoo log file. This flag is _o_f_f by default. + + + +1.7.1 April 18, 2009 10 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + long_otp_prompt When validating with a One Time Password (OPT) scheme such as SS//KKeeyy or OOPPIIEE, a two-line prompt is used to make it easier to cut and paste the challenge to a @@ -652,18 +685,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) mail_no_perms If set, mail will be sent to the _m_a_i_l_t_o user if the invoking user is allowed to use ssuuddoo but the command - - - -1.7.1 March 11, 2009 10 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - they are trying is not listed in their _s_u_d_o_e_r_s file entry or is explicitly denied. This flag is _o_f_f by default. @@ -697,6 +718,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) preserve_groups By default, ssuuddoo will initialize the group vector to the list of groups the target user is in. When + + + +1.7.1 April 18, 2009 11 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + _p_r_e_s_e_r_v_e___g_r_o_u_p_s is set, the user's existing group vector is left unaltered. The real and effective group IDs, however, are still set to match the target user. @@ -718,18 +751,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) as _c_r_o_n(1m) or cgi-bin scripts. This flag is _o_f_f by default. - - - -1.7.1 March 11, 2009 11 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - root_sudo If set, root is allowed to run ssuuddoo too. Disabling this prevents users from "chaining" ssuuddoo commands to get a root shell by doing something like "sudo sudo @@ -763,6 +784,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) This can be done by negating the set_logname option. Note that if the _e_n_v___r_e_s_e_t option has not been disabled, entries in the _e_n_v___k_e_e_p list will override + + + +1.7.1 April 18, 2009 12 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + the value of _s_e_t___l_o_g_n_a_m_e. This flag is _o_f_f by default. setenv Allow the user to disable the _e_n_v___r_e_s_e_t option from the @@ -784,18 +817,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) style globbing when matching pathnames. However, since it accesses the file system, _g_l_o_b(3) can take a long time to complete for some patterns, especially when the - - - -1.7.1 March 11, 2009 12 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - pattern references a network file system that is mounted on demand (automounted). The _f_a_s_t___g_l_o_b option causes ssuuddoo to use the _f_n_m_a_t_c_h(3) function, which does @@ -829,6 +850,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) user is logged in on in that directory. This flag is _o_f_f by default. + + + +1.7.1 April 18, 2009 13 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + umask_override If set, ssuuddoo will set the umask as specified by _s_u_d_o_e_r_s without modification. This makes it possible to specify a more permissive umask in _s_u_d_o_e_r_s than the @@ -850,18 +883,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) things like "rsh somehost sudo ls" since _r_s_h(1) does not allocate a tty. This flag is _o_f_f by default. - - - -1.7.1 March 11, 2009 13 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - IInntteeggeerrss: closefrom Before it executes a command, ssuuddoo will close all open @@ -896,6 +917,17 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) their own timestamps via sudo -v and sudo -k respectively. + + +1.7.1 April 18, 2009 14 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + umask Umask to use when running the command. Negate this option or set it to 0777 to preserve the user's umask. The actual umask that is used will be the union of the @@ -916,18 +948,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) matches the user's EDITOR environment variable if possible, or the first editor in the list that exists and is executable. The default is the path to vi on - - - -1.7.1 March 11, 2009 14 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - your system. mailsub Subject of the mail sent to the _m_a_i_l_t_o user. The escape @@ -962,6 +982,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) %u expanded to the invoking user's login name + + + +1.7.1 April 18, 2009 15 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + %% two consecutive % characters are collapsed into a single % character @@ -982,18 +1014,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) changing the locale may affect how sudoers is interpreted. Defaults to "C". - - - -1.7.1 March 11, 2009 15 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - timestampdir The directory in which ssuuddoo stores its timestamp files. The default is _/_v_a_r_/_r_u_n_/_s_u_d_o. @@ -1029,6 +1049,17 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) always Always lecture the user. + + +1.7.1 April 18, 2009 16 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + never Never lecture the user. once Only lecture the user the first time they run ssuuddoo. @@ -1048,18 +1079,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) all All the user's _s_u_d_o_e_r_s entries for the current host must have the NOPASSWD flag set to avoid entering a - - - -1.7.1 March 11, 2009 16 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - password. always The user must always enter a password to use the --ll @@ -1095,6 +1114,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) ssuuddoo interpreting the @ sign. Defaults to root. secure_path Path used for every command run from ssuuddoo. If you don't + + + +1.7.1 April 18, 2009 17 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + trust the people running ssuuddoo to have a sane PATH environment variable you may want to use this. Another use is if you want to have the "root path" be separate from the @@ -1114,18 +1145,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) password. always The user must always enter a password to use the --vv - - - -1.7.1 March 11, 2009 17 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - option. any At least one of the user's _s_u_d_o_e_r_s entries for the @@ -1161,6 +1180,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) space-separated list or a single value without double- quotes. The list can be replaced, added to, deleted from, or disabled by using the =, +=, -=, and ! + + + +1.7.1 April 18, 2009 18 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + operators respectively. The default list of environment variables to remove is displayed when ssuuddoo is run by root with the _-_V option. Note that many @@ -1180,18 +1211,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) with the _-_V option. When logging via _s_y_s_l_o_g(3), ssuuddoo accepts the following values for the - - - -1.7.1 March 11, 2009 18 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - syslog facility (the value of the ssyysslloogg Parameter): aauutthhpprriivv (if your OS supports it), aauutthh, ddaaeemmoonn, uusseerr, llooccaall00, llooccaall11, llooccaall22, llooccaall33, llooccaall44, llooccaall55, llooccaall66, and llooccaall77. The following syslog priorities @@ -1228,6 +1247,18 @@ EEXXAAMMPPLLEESS Host_Alias SERVERS = master, mail, www, ns Host_Alias CDROM = orion, perseus, hercules + + +1.7.1 April 18, 2009 19 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + + # Cmnd alias specification Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\ /usr/sbin/restore, /usr/sbin/rrestore @@ -1246,18 +1277,6 @@ EEXXAAMMPPLLEESS to log via _s_y_s_l_o_g(3) using the _a_u_t_h facility in all cases. We don't want to subject the full time staff to the ssuuddoo lecture, user mmiilllleerrtt need not give a password, and we don't want to reset the LOGNAME, USER - - - -1.7.1 March 11, 2009 19 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - or USERNAME environment variables when running commands as root. Additionally, on the machines in the _S_E_R_V_E_R_S Host_Alias, we keep an additional local log file and make sure we log the year in each log @@ -1293,6 +1312,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) any host but they must authenticate themselves first (since the entry lacks the NOPASSWD tag). + + + +1.7.1 April 18, 2009 20 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + jack CSNETS = ALL The user jjaacckk may run any command on the machines in the _C_S_N_E_T_S alias @@ -1312,18 +1343,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) The ooppeerraattoorr user may run commands limited to simple maintenance. Here, those are commands related to backups, killing processes, the printing system, shutting down the system, and any commands in the - - - -1.7.1 March 11, 2009 20 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - directory _/_u_s_r_/_o_p_e_r_/_b_i_n_/. joe ALL = /usr/bin/su operator @@ -1359,6 +1378,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* + + + +1.7.1 April 18, 2009 21 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + On the _A_L_P_H_A machines, user jjoohhnn may su to anyone except root but he is not allowed to specify any options to the _s_u(1) command. @@ -1378,18 +1409,6 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) The user sstteevvee may run any command in the directory /usr/local/op_commands/ but only as user operator. - - - -1.7.1 March 11, 2009 21 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - matt valkyrie = KILL On his personal workstation, valkyrie, mmaatttt needs to be able to kill @@ -1425,6 +1444,18 @@ SSEECCUURRIITTYY NNOOTTEESS PPRREEVVEENNTTIINNGG SSHHEELLLL EESSCCAAPPEESS Once ssuuddoo executes a program, that program is free to do whatever it + + + +1.7.1 April 18, 2009 22 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + pleases, including run other programs. This can be a security issue since it is not uncommon for a program to allow shell escapes, which lets a user bypass ssuuddoo's access control and logging. Common programs @@ -1444,18 +1475,6 @@ PPRREEVVEENNTTIINNGG SSHHEELLLL EESSCCAAPPEESS to override default library functions by pointing an environment variable (usually LD_PRELOAD) to an alternate shared library. On such systems, ssuuddoo's _n_o_e_x_e_c functionality - - - -1.7.1 March 11, 2009 22 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - can be used to prevent a program run by ssuuddoo from executing any other programs. Note, however, that this applies only to native dynamically-linked executables. Statically-linked @@ -1491,6 +1510,18 @@ SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) This allows user aaaarroonn to run _/_u_s_r_/_b_i_n_/_m_o_r_e and _/_u_s_r_/_b_i_n_/_v_i with _n_o_e_x_e_c enabled. This will prevent those two commands + + + +1.7.1 April 18, 2009 23 + + + + + +SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) + + from executing other commands (such as a shell). If you are unsure whether or not your system is capable of supporting _n_o_e_x_e_c you can always just try it out and see if it works. @@ -1510,18 +1541,6 @@ CCAAVVEEAATTSS _s_u_d_o_e_r_s be free of syntax errors since ssuuddoo will not run with a syntactically incorrect _s_u_d_o_e_r_s file. - - - -1.7.1 March 11, 2009 23 - - - - - -SUDOERS(4) MAINTENANCE COMMANDS SUDOERS(4) - - When using netgroups of machines (as opposed to users), if you store fully qualified hostnames in the netgroup (as is usually the case), you either need to have the machine's hostname be fully qualified as @@ -1560,25 +1579,6 @@ DDIISSCCLLAAIIMMEERR - - - - - - - - - - - - - - - - - - - -1.7.1 March 11, 2009 24 +1.7.1 April 18, 2009 24 diff --git a/sudoers.man.in b/sudoers.man.in index 0b4d55736..ed39937a8 100644 --- a/sudoers.man.in +++ b/sudoers.man.in @@ -153,7 +153,7 @@ .\" ======================================================================== .\" .IX Title "SUDOERS @mansectform@" -.TH SUDOERS @mansectform@ "March 11, 2009" "1.7.1" "MAINTENANCE COMMANDS" +.TH SUDOERS @mansectform@ "April 18, 2009" "1.7.1" "MAINTENANCE COMMANDS" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -598,13 +598,15 @@ with \fBany\fR arguments. .Sh "Including other files from within sudoers" .IX Subsection "Including other files from within sudoers" It is possible to include other \fIsudoers\fR files from within the -\&\fIsudoers\fR file currently being parsed using the \f(CW\*(C`#include\*(C'\fR -directive, similar to the one used by the C preprocessor. This is -useful, for example, for keeping a site-wide \fIsudoers\fR file in -addition to a per-machine local one. For the sake of this example -the site-wide \fIsudoers\fR will be \fI/etc/sudoers\fR and the per-machine -one will be \fI/etc/sudoers.local\fR. To include \fI/etc/sudoers.local\fR -from within \fI/etc/sudoers\fR we would use the following line in \fI/etc/sudoers\fR: +\&\fIsudoers\fR file currently being parsed using the \f(CW\*(C`#include\*(C'\fR and +\&\f(CW\*(C`#includedir\*(C'\fR directives. +.PP +This can be used, for example, to keep a site-wide \fIsudoers\fR file +in addition to a local, per-machine file. For the sake of this +example the site-wide \fIsudoers\fR will be \fI/etc/sudoers\fR and the +per-machine one will be \fI/etc/sudoers.local\fR. To include +\&\fI/etc/sudoers.local\fR from within \fI/etc/sudoers\fR we would use the +following line in \fI/etc/sudoers\fR: .Sp .RS 4 \&\f(CW\*(C`#include /etc/sudoers.local\*(C'\fR @@ -625,6 +627,28 @@ of the hostname. I.e., if the machine's hostname is \*(L"xerxes\*(R", then .Ve .PP will cause \fBsudo\fR to include the file \fI/etc/sudoers.xerxes\fR. +.PP +The \f(CW\*(C`#includedir\*(C'\fR directive can be used to create a \fIsudo.d\fR +directory that the system package manager can drop \fIsudoers\fR rules +into as part of package installation. For example, given: +.PP +.Vb 1 +\& #includedir /etc/sudoers.d +.Ve +.PP +\&\fBsudo\fR will read each file in \fI/etc/sudoers.d\fR, skipping files +that end in \*(L".tmp\*(R" to avoid causing problems with \fBvisudo\fR. Files +are parsed in sorted lexical order. That is, \fI/etc/sudoers.d/01_first\fR +will be parsed before \fI/etc/sudoers.d/10_second\fR. Be aware that +because the sorting is lexical, not numeric, \fI/etc/sudoers.d/1_whoops\fR +would be loaded \fBafter\fR \fI/etc/sudoers.d/10_second\fR. Using a +consistent number of leading zeroes in the file names can be used +to avoid such problems. +.PP +Note that unlike files included via \f(CW\*(C`#include\*(C'\fR, \fBvisudo\fR will not +edit the files in a \f(CW\*(C`#includedir\*(C'\fR directory unless one of them +contains a syntax error. It is still possible to run \fBvisudo\fR +with the \f(CW\*(C`\-f\*(C'\fR flag to edit the files directly. .Sh "Other special characters and reserved words" .IX Subsection "Other special characters and reserved words" The pound sign ('#') is used to indicate a comment (unless it is diff --git a/sudoers.pod b/sudoers.pod index f54660cd7..40db5d5b2 100644 --- a/sudoers.pod +++ b/sudoers.pod @@ -441,13 +441,15 @@ with B arguments. =head2 Including other files from within sudoers It is possible to include other I files from within the -I file currently being parsed using the C<#include> -directive, similar to the one used by the C preprocessor. This is -useful, for example, for keeping a site-wide I file in -addition to a per-machine local one. For the sake of this example -the site-wide I will be F and the per-machine -one will be F. To include F -from within F we would use the following line in F: +I file currently being parsed using the C<#include> and +C<#includedir> directives. + +This can be used, for example, to keep a site-wide I file +in addition to a local, per-machine file. For the sake of this +example the site-wide I will be F and the +per-machine one will be F. To include +F from within F we would use the +following line in F: =over 4 @@ -469,6 +471,26 @@ of the hostname. I.e., if the machine's hostname is "xerxes", then will cause B to include the file F. +The C<#includedir> directive can be used to create a F +directory that the system package manager can drop I rules +into as part of package installation. For example, given: + + #includedir /etc/sudoers.d + +B will read each file in F, skipping files +that end in ".tmp" to avoid causing problems with B. Files +are parsed in sorted lexical order. That is, F +will be parsed before F. Be aware that +because the sorting is lexical, not numeric, F +would be loaded B F. Using a +consistent number of leading zeroes in the file names can be used +to avoid such problems. + +Note that unlike files included via C<#include>, B will not +edit the files in a C<#includedir> directory unless one of them +contains a syntax error. It is still possible to run B +with the C<-f> flag to edit the files directly. + =head2 Other special characters and reserved words The pound sign ('#') is used to indicate a comment (unless it is diff --git a/testsudoers.c b/testsudoers.c index c5bcb184b..ebe930f41 100644 --- a/testsudoers.c +++ b/testsudoers.c @@ -373,8 +373,9 @@ set_fqdn() } FILE * -open_sudoers(path, keepopen) +open_sudoers(path, isdir, keepopen) const char *path; + int isdir; int *keepopen; { return(fopen(path, "r")); diff --git a/toke.c b/toke.c index 6442bfa23..407b3fa9c 100644 --- a/toke.c +++ b/toke.c @@ -288,69 +288,70 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 48 -#define YY_END_OF_BUFFER 49 -static yyconst short int yy_accept[538] = +#define YY_NUM_RULES 49 +#define YY_END_OF_BUFFER 50 +static yyconst short int yy_accept[545] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 36, 44, 43, 42, 47, 36, 37, - 38, 36, 39, 36, 36, 36, 36, 41, 40, 47, - 32, 32, 32, 32, 32, 32, 47, 36, 36, 44, - 47, 32, 32, 32, 32, 32, 1, 47, 36, 36, - 16, 15, 16, 15, 15, 47, 47, 47, 2, 8, - 7, 8, 3, 8, 4, 47, 12, 12, 12, 10, - 11, 36, 0, 44, 42, 0, 46, 0, 36, 27, - 0, 26, 0, 35, 35, 0, 36, 36, 0, 36, - 36, 36, 36, 0, 30, 32, 32, 32, 32, 32, - - 32, 36, 45, 36, 44, 0, 0, 0, 0, 0, - 0, 36, 36, 36, 36, 36, 1, 0, 33, 33, - 0, 36, 16, 16, 14, 13, 14, 0, 0, 2, + 0, 0, 50, 37, 45, 44, 43, 48, 37, 38, + 39, 37, 40, 37, 37, 37, 37, 42, 41, 48, + 33, 33, 33, 33, 33, 33, 48, 37, 37, 45, + 48, 33, 33, 33, 33, 33, 1, 48, 37, 37, + 16, 15, 16, 15, 15, 48, 48, 48, 2, 8, + 7, 8, 3, 8, 4, 48, 12, 12, 12, 10, + 11, 37, 0, 45, 43, 0, 47, 0, 37, 28, + 0, 27, 0, 36, 36, 0, 37, 37, 0, 37, + 37, 37, 37, 0, 31, 33, 33, 33, 33, 33, + + 33, 37, 46, 37, 45, 0, 0, 0, 0, 0, + 0, 37, 37, 37, 37, 37, 1, 0, 34, 34, + 0, 37, 16, 16, 14, 13, 14, 0, 0, 2, 8, 0, 5, 6, 8, 8, 12, 0, 12, 12, - 0, 9, 0, 0, 0, 36, 36, 36, 36, 36, - 0, 0, 30, 30, 32, 32, 32, 32, 32, 32, - 32, 36, 0, 0, 0, 0, 0, 0, 36, 36, - 36, 36, 36, 0, 36, 9, 0, 36, 36, 36, - 36, 36, 36, 0, 31, 31, 31, 0, 0, 30, - 30, 30, 30, 30, 30, 30, 32, 32, 32, 32, - - 32, 32, 32, 36, 0, 0, 0, 0, 0, 0, - 36, 36, 36, 36, 36, 36, 36, 0, 0, 31, - 31, 31, 0, 30, 30, 0, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, 23, 32, - 32, 32, 32, 32, 36, 0, 0, 0, 0, 36, - 36, 36, 36, 36, 36, 36, 36, 0, 31, 0, - 30, 30, 30, 0, 0, 0, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 32, - 32, 32, 32, 32, 36, 0, 0, 0, 36, 36, - 36, 28, 28, 28, 0, 0, 30, 30, 30, 30, - - 30, 30, 30, 0, 0, 0, 0, 0, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 0, 22, 32, 32, 0, 21, 0, 24, - 36, 0, 0, 0, 36, 36, 36, 36, 28, 28, - 28, 28, 0, 30, 0, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 0, 0, 0, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 32, 32, 34, 0, 0, 0, 36, 18, - 33, 36, 29, 29, 29, 30, 0, 0, 0, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 0, 9, 0, 0, 0, 37, 37, 37, 37, 37, + 0, 0, 31, 31, 33, 33, 33, 33, 33, 33, + 33, 37, 0, 0, 0, 0, 0, 0, 37, 37, + 37, 37, 37, 0, 37, 9, 0, 37, 37, 37, + 37, 37, 37, 0, 32, 32, 32, 0, 0, 31, + 31, 31, 31, 31, 31, 31, 33, 33, 33, 33, + + 33, 33, 33, 37, 0, 0, 0, 0, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 0, 0, 32, + 32, 32, 0, 31, 31, 0, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 0, 24, 33, + 33, 33, 33, 33, 37, 0, 0, 0, 0, 37, + 37, 37, 37, 37, 37, 37, 37, 0, 32, 0, + 31, 31, 31, 0, 0, 0, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 33, + 33, 33, 33, 33, 37, 0, 0, 0, 37, 37, + 37, 29, 29, 29, 0, 0, 31, 31, 31, 31, + + 31, 31, 31, 0, 0, 0, 0, 0, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 0, 23, 33, 33, 0, 22, 0, 25, + 37, 0, 0, 0, 37, 37, 37, 37, 29, 29, + 29, 29, 0, 31, 0, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 0, 0, 0, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 33, 33, 35, 0, 0, 0, 37, 19, + 34, 37, 30, 30, 30, 31, 0, 0, 0, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 30, 30, 0, 0, 0, 0, 0, 30, 30, 30, - 30, 30, 30, 30, 30, 0, 20, 0, 25, 0, - 18, 0, 36, 0, 36, 36, 36, 29, 29, 29, - 29, 29, 0, 0, 0, 0, 0, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 0, 0, 19, - 18, 0, 18, 0, 36, 36, 36, 29, 29, 0, - 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 19, 0, 17, 36, 36, 36, 36, 36, 0, 0, + 31, 31, 0, 0, 0, 0, 0, 31, 31, 31, + 31, 31, 31, 31, 31, 0, 21, 0, 26, 0, + 19, 0, 0, 37, 0, 37, 37, 37, 30, 30, + 30, 30, 30, 0, 0, 0, 0, 0, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, + 0, 20, 19, 0, 19, 0, 37, 37, 37, 30, + 30, 0, 0, 0, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 20, 0, 17, 0, 37, 37, 37, 37, - 0, 0, 0, 30, 30, 30, 30, 30, 30, 30, - 30, 36, 36, 36, 30, 30, 30, 30, 30, 30, - 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, - 28, 28, 28, 28, 28, 28, 0 + 37, 0, 0, 0, 0, 0, 31, 31, 31, 31, + 31, 31, 31, 31, 0, 37, 37, 37, 31, 31, + 31, 31, 31, 31, 0, 37, 37, 37, 37, 37, + 31, 31, 31, 31, 31, 0, 18, 29, 29, 29, + 29, 29, 29, 0 } ; static yyconst int yy_ec[256] = @@ -396,147 +397,149 @@ static yyconst int yy_meta[63] = 12, 12 } ; -static yyconst short int yy_base[600] = +static yyconst short int yy_base[608] = { 0, 0, 61, 62, 63, 69, 84, 128, 189, 250, 294, - 80, 101, 2317, 2271, 2304, 3379, 2291, 337, 2247, 3379, - 3379, 2246, 3379, 107, 347, 119, 137, 2266, 3379, 3379, - 399, 2219, 446, 2224, 2231, 2226, 497, 145, 35, 167, - 521, 2193, 2180, 2170, 2165, 2166, 2223, 193, 256, 55, - 0, 3379, 2220, 0, 3379, 264, 573, 110, 0, 2164, - 3379, 73, 3379, 76, 3379, 117, 2154, 105, 106, 3379, - 142, 2151, 306, 2185, 2173, 2164, 3379, 201, 209, 2085, - 506, 2084, 543, 276, 2048, 554, 306, 581, 2068, 2067, - 325, 364, 317, 2046, 55, 618, 0, 2035, 240, 2027, - - 2025, 125, 3379, 98, 523, 2005, 2008, 1998, 1986, 1978, - 146, 115, 219, 29, 212, 149, 2024, 463, 579, 1958, - 649, 154, 0, 1998, 256, 3379, 3379, 598, 284, 0, - 1956, 674, 3379, 3379, 1926, 488, 1925, 1964, 271, 307, - 288, 1966, 1964, 1939, 676, 688, 720, 752, 784, 1925, - 1869, 821, 268, 859, 896, 1860, 1818, 1833, 1827, 1804, - 1810, 236, 1784, 1773, 1764, 1766, 1771, 300, 157, 1759, - 259, 79, 329, 691, 344, 1803, 1791, 701, 348, 935, - 967, 711, 366, 1759, 1747, 731, 455, 1706, 1689, 487, - 741, 999, 760, 768, 1037, 803, 1688, 401, 1679, 1671, - - 1654, 1650, 1640, 356, 1624, 1625, 1595, 1608, 1595, 369, - 442, 503, 233, 462, 1076, 1108, 1140, 1601, 1600, 838, - 1599, 1582, 1581, 1580, 502, 876, 505, 913, 557, 1172, - 0, 945, 1183, 954, 774, 1221, 977, 526, 3379, 1539, - 1529, 1522, 1522, 1510, 532, 1476, 1458, 1444, 581, 363, - 21, 577, 987, 490, 1260, 1292, 1019, 1479, 1432, 1431, - 1430, 1322, 630, 1056, 1086, 1096, 647, 670, 794, 1116, + 80, 101, 2372, 2325, 2367, 3392, 2360, 337, 2310, 3392, + 3392, 2307, 3392, 107, 347, 119, 137, 2313, 3392, 3392, + 399, 2292, 446, 2282, 2289, 2284, 497, 145, 35, 167, + 521, 2250, 2244, 2234, 2229, 2230, 2261, 193, 256, 55, + 0, 3392, 2256, 0, 3392, 264, 573, 110, 0, 2214, + 3392, 73, 3392, 76, 3392, 117, 2213, 105, 106, 3392, + 142, 2204, 306, 2229, 2224, 2224, 3392, 201, 209, 2181, + 506, 2180, 543, 276, 2179, 554, 306, 581, 2185, 2185, + 325, 364, 317, 2172, 55, 618, 0, 2155, 240, 2138, + + 2127, 125, 3392, 98, 523, 2074, 2078, 2035, 2030, 2021, + 146, 115, 219, 29, 212, 149, 2068, 463, 579, 2022, + 649, 154, 0, 2062, 256, 3392, 3392, 598, 284, 0, + 2020, 674, 3392, 3392, 2016, 488, 2014, 2051, 271, 307, + 288, 2046, 2035, 2023, 676, 688, 720, 752, 784, 1989, + 1978, 821, 268, 859, 896, 1971, 1927, 1942, 1937, 1929, + 1935, 236, 1885, 1887, 1833, 1833, 1811, 300, 157, 1814, + 259, 79, 329, 691, 344, 1857, 1840, 701, 348, 935, + 967, 711, 366, 1818, 1817, 731, 455, 1801, 1800, 487, + 741, 999, 760, 768, 1037, 803, 1799, 401, 1790, 1767, + + 1765, 1751, 1748, 356, 1721, 1683, 1652, 1665, 1652, 369, + 442, 503, 233, 462, 1076, 1108, 1140, 1686, 1670, 838, + 1670, 1651, 1650, 1648, 502, 876, 505, 913, 557, 1172, + 0, 945, 1183, 954, 774, 1221, 977, 526, 3392, 1626, + 1616, 1622, 1594, 1582, 532, 1576, 1544, 1545, 581, 363, + 21, 577, 987, 490, 1260, 1292, 1019, 1580, 1545, 1544, + 1530, 1322, 630, 1056, 1086, 1096, 647, 670, 794, 1116, 926, 1361, 0, 1126, 1372, 1148, 884, 1410, 1158, 583, - 1409, 1402, 640, 657, 618, 1407, 1344, 486, 632, 599, - 638, 1448, 1479, 1510, 1374, 1373, 1325, 1200, 1542, 1238, + 1510, 1517, 640, 657, 618, 1494, 1465, 486, 632, 599, + 638, 1448, 1479, 1510, 1480, 1430, 1428, 1200, 1542, 1238, - 1208, 1579, 1270, 1278, 1334, 1302, 1312, 1341, 674, 711, + 1208, 1579, 1270, 1278, 1437, 1302, 1312, 1341, 674, 711, 987, 1010, 1389, 1067, 1618, 0, 1429, 1629, 1456, 1246, - 1667, 1466, 688, 3379, 1273, 1261, 689, 3379, 743, 3379, - 766, 1247, 1187, 605, 1017, 514, 785, 1489, 501, 1705, - 1736, 1498, 1223, 1222, 1519, 954, 1528, 968, 1768, 0, + 1667, 1466, 688, 3392, 1406, 1394, 689, 3392, 743, 3392, + 766, 1380, 1337, 605, 1017, 514, 785, 1489, 501, 1705, + 1736, 1498, 1373, 1325, 1519, 954, 1528, 968, 1768, 0, 603, 1779, 1559, 1347, 1816, 1598, 1648, 1686, 1715, 1096, 1158, 1677, 1725, 1725, 1746, 1855, 0, 1748, 1866, 1757, - 1397, 1798, 861, 862, 1165, 1155, 1148, 693, 820, 1895, - 1139, 1927, 1959, 1991, 2023, 1131, 1835, 1886, 1909, 1127, - 1261, 1293, 1935, 1467, 2055, 0, 806, 2066, 1943, 1567, - - 2103, 1969, 1977, 1069, 2001, 2011, 2033, 1312, 1332, 1877, - 833, 906, 2142, 0, 900, 1039, 3379, 1099, 3379, 1033, - 2031, 1909, 1391, 981, 934, 2083, 1138, 2152, 2184, 2216, - 2248, 2046, 2120, 953, 2162, 2172, 2194, 918, 915, 1543, - 1599, 2200, 1649, 2280, 0, 915, 2291, 2224, 1917, 2328, - 2234, 2257, 2266, 2309, 1789, 869, 1028, 806, 807, 754, - 751, 2359, 699, 2384, 2397, 2429, 2461, 2381, 2317, 2411, - 2439, 2449, 690, 628, 1836, 1896, 2469, 1960, 2493, 0, - 1022, 2504, 2477, 2091, 2523, 608, 2542, 2551, 2420, 591, - 3379, 570, 3379, 2559, 1476, 2591, 2623, 2570, 2576, 556, - - 2602, 2612, 2633, 468, 381, 1992, 359, 303, 2641, 0, - 1126, 2655, 2687, 2719, 2663, 2671, 2695, 289, 0, 182, - 2703, 1478, 2751, 2783, 2733, 3379, 2739, 2763, 2128, 3379, - 2771, 2791, 2801, 126, 2821, 2813, 3379, 2866, 2879, 2892, - 2905, 2918, 2931, 2944, 2957, 2970, 2975, 2988, 3001, 3003, - 3016, 3029, 3042, 3055, 3068, 3081, 3086, 3092, 3105, 3118, - 3123, 3129, 3134, 3139, 3144, 3150, 3155, 3160, 3165, 3171, - 3178, 3183, 3188, 3193, 3199, 3206, 3211, 3216, 3222, 3229, - 3234, 3241, 3247, 3254, 3259, 3266, 3272, 3279, 3292, 3305, - 3310, 3317, 3323, 3336, 3341, 3348, 3353, 3360, 3365 - + 1397, 1798, 861, 862, 1259, 1249, 1242, 1453, 820, 1895, + 1203, 1927, 1959, 1991, 2023, 1223, 1835, 1886, 1909, 1222, + 1261, 1293, 1935, 1467, 2055, 0, 673, 2066, 1943, 1567, + + 2103, 1969, 1977, 1196, 2001, 2011, 2033, 1312, 1332, 1877, + 814, 833, 2142, 0, 898, 1039, 3392, 1099, 3392, 1137, + 2031, 1909, 1345, 877, 1110, 1106, 2083, 1138, 2152, 2184, + 2216, 2248, 2046, 2120, 1069, 2162, 2172, 2194, 1056, 1002, + 1543, 1599, 2200, 1649, 2280, 0, 916, 2291, 2224, 1917, + 2328, 2234, 2257, 2266, 2309, 1789, 964, 1028, 907, 939, + 314, 878, 839, 2359, 821, 2384, 2397, 2429, 2461, 2381, + 2317, 2411, 2439, 2449, 786, 775, 1836, 1896, 2469, 1960, + 2493, 0, 1022, 2504, 2477, 2091, 2523, 781, 2542, 2551, + 2420, 729, 3392, 711, 3392, 1146, 2559, 1476, 2591, 2623, + + 2570, 2576, 638, 2602, 2612, 2633, 599, 582, 1992, 559, + 556, 2641, 0, 1186, 2351, 2655, 2687, 2719, 2663, 2671, + 2695, 468, 0, 391, 310, 2703, 1478, 2751, 2783, 2733, + 3392, 2739, 2763, 2128, 3392, 193, 3392, 2771, 2791, 2801, + 126, 2821, 2813, 3392, 2866, 2879, 2892, 2905, 2918, 2931, + 2944, 2957, 2970, 2975, 2988, 3001, 3003, 3016, 3029, 3042, + 3055, 3068, 3081, 3086, 3092, 3105, 3118, 3123, 3129, 3134, + 3139, 3144, 3150, 3155, 3160, 3165, 3171, 3178, 3183, 3188, + 3193, 3199, 3206, 3211, 3216, 3222, 3229, 3234, 3241, 3247, + 3254, 3259, 3266, 3272, 3279, 3292, 3305, 3310, 3317, 3323, + + 3336, 3341, 3348, 3353, 3360, 3365, 3378 } ; -static yyconst short int yy_def[600] = +static yyconst short int yy_def[608] = { 0, - 537, 1, 1, 1, 538, 538, 539, 539, 540, 540, - 541, 541, 537, 542, 537, 537, 537, 543, 544, 537, - 537, 545, 537, 546, 542, 25, 25, 547, 537, 537, - 537, 31, 31, 33, 33, 33, 542, 25, 542, 537, - 543, 31, 31, 33, 33, 33, 537, 537, 548, 542, - 549, 537, 549, 549, 537, 537, 543, 537, 550, 551, - 537, 551, 537, 551, 537, 552, 553, 553, 553, 537, - 537, 542, 542, 537, 537, 554, 537, 555, 537, 544, - 544, 545, 545, 546, 556, 542, 542, 25, 547, 88, - 88, 88, 88, 557, 558, 31, 33, 33, 33, 33, - - 33, 542, 537, 542, 537, 537, 537, 537, 537, 537, - 554, 542, 88, 542, 542, 542, 537, 537, 548, 559, - 542, 542, 549, 549, 537, 537, 537, 555, 537, 550, - 551, 551, 537, 537, 551, 551, 553, 537, 553, 553, - 537, 537, 554, 560, 537, 542, 542, 542, 88, 149, - 561, 537, 562, 537, 31, 33, 33, 33, 33, 33, - 33, 542, 537, 537, 537, 537, 537, 554, 542, 149, - 542, 542, 542, 537, 542, 537, 560, 542, 542, 542, - 542, 542, 542, 563, 564, 564, 186, 565, 564, 566, - 154, 537, 192, 192, 537, 192, 33, 33, 33, 33, - - 33, 33, 33, 542, 537, 537, 537, 537, 537, 554, - 542, 542, 542, 542, 542, 542, 542, 537, 567, 567, - 220, 567, 568, 569, 570, 537, 571, 195, 571, 571, - 230, 571, 537, 233, 233, 537, 233, 537, 537, 33, - 33, 33, 33, 33, 542, 537, 537, 537, 554, 542, - 542, 542, 542, 542, 542, 542, 542, 572, 572, 573, - 574, 537, 537, 537, 537, 537, 575, 575, 576, 236, - 576, 576, 272, 576, 537, 275, 275, 537, 275, 33, - 33, 33, 33, 33, 542, 537, 537, 554, 542, 542, - 542, 542, 542, 542, 537, 577, 578, 262, 537, 299, - - 299, 537, 299, 537, 537, 537, 537, 537, 537, 579, - 579, 580, 278, 580, 580, 315, 580, 537, 318, 318, - 537, 318, 537, 537, 33, 33, 537, 537, 537, 537, - 542, 537, 537, 554, 542, 542, 542, 542, 542, 542, - 542, 542, 537, 581, 537, 582, 302, 582, 582, 349, - 349, 537, 352, 352, 537, 352, 537, 537, 537, 537, - 583, 583, 584, 321, 584, 584, 366, 584, 537, 369, - 369, 369, 33, 33, 542, 537, 537, 554, 542, 542, - 542, 542, 542, 542, 542, 537, 537, 537, 537, 585, - 585, 586, 355, 586, 586, 395, 395, 537, 398, 398, - - 537, 398, 537, 537, 537, 537, 537, 537, 587, 587, - 588, 588, 588, 413, 413, 537, 537, 537, 537, 537, - 537, 554, 542, 589, 590, 542, 542, 542, 542, 542, - 542, 542, 537, 537, 537, 537, 537, 537, 591, 591, - 592, 401, 592, 592, 444, 444, 537, 447, 447, 537, - 447, 537, 537, 537, 537, 593, 593, 537, 594, 542, - 589, 589, 590, 590, 542, 542, 542, 542, 542, 537, - 537, 537, 537, 595, 595, 596, 450, 596, 596, 479, - 479, 537, 482, 482, 482, 537, 537, 537, 537, 537, - 537, 594, 537, 542, 542, 542, 542, 542, 537, 537, - - 537, 537, 537, 537, 597, 597, 598, 598, 598, 509, - 509, 542, 542, 542, 537, 537, 537, 537, 599, 599, - 542, 542, 542, 542, 542, 537, 537, 537, 537, 537, - 542, 542, 542, 542, 542, 542, 0, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537 - + 544, 1, 1, 1, 545, 545, 546, 546, 547, 547, + 548, 548, 544, 549, 544, 544, 544, 550, 551, 544, + 544, 552, 544, 553, 549, 25, 25, 554, 544, 544, + 544, 31, 31, 33, 33, 33, 549, 25, 549, 544, + 550, 31, 31, 33, 33, 33, 544, 544, 555, 549, + 556, 544, 556, 556, 544, 544, 550, 544, 557, 558, + 544, 558, 544, 558, 544, 559, 560, 560, 560, 544, + 544, 549, 549, 544, 544, 561, 544, 562, 544, 551, + 551, 552, 552, 553, 563, 549, 549, 25, 554, 88, + 88, 88, 88, 564, 565, 31, 33, 33, 33, 33, + + 33, 549, 544, 549, 544, 544, 544, 544, 544, 544, + 561, 549, 88, 549, 549, 549, 544, 544, 555, 566, + 549, 549, 556, 556, 544, 544, 544, 562, 544, 557, + 558, 558, 544, 544, 558, 558, 560, 544, 560, 560, + 544, 544, 561, 567, 544, 549, 549, 549, 88, 149, + 568, 544, 569, 544, 31, 33, 33, 33, 33, 33, + 33, 549, 544, 544, 544, 544, 544, 561, 549, 149, + 549, 549, 549, 544, 549, 544, 567, 549, 549, 549, + 549, 549, 549, 570, 571, 571, 186, 572, 571, 573, + 154, 544, 192, 192, 544, 192, 33, 33, 33, 33, + + 33, 33, 33, 549, 544, 544, 544, 544, 544, 561, + 549, 549, 549, 549, 549, 549, 549, 544, 574, 574, + 220, 574, 575, 576, 577, 544, 578, 195, 578, 578, + 230, 578, 544, 233, 233, 544, 233, 544, 544, 33, + 33, 33, 33, 33, 549, 544, 544, 544, 561, 549, + 549, 549, 549, 549, 549, 549, 549, 579, 579, 580, + 581, 544, 544, 544, 544, 544, 582, 582, 583, 236, + 583, 583, 272, 583, 544, 275, 275, 544, 275, 33, + 33, 33, 33, 33, 549, 544, 544, 561, 549, 549, + 549, 549, 549, 549, 544, 584, 585, 262, 544, 299, + + 299, 544, 299, 544, 544, 544, 544, 544, 544, 586, + 586, 587, 278, 587, 587, 315, 587, 544, 318, 318, + 544, 318, 544, 544, 33, 33, 544, 544, 544, 544, + 549, 544, 544, 561, 549, 549, 549, 549, 549, 549, + 549, 549, 544, 588, 544, 589, 302, 589, 589, 349, + 349, 544, 352, 352, 544, 352, 544, 544, 544, 544, + 590, 590, 591, 321, 591, 591, 366, 591, 544, 369, + 369, 369, 33, 33, 549, 544, 544, 561, 549, 549, + 549, 549, 549, 549, 549, 544, 544, 544, 544, 592, + 592, 593, 355, 593, 593, 395, 395, 544, 398, 398, + + 544, 398, 544, 544, 544, 544, 544, 544, 594, 594, + 595, 595, 595, 413, 413, 544, 544, 544, 544, 544, + 544, 561, 561, 549, 596, 597, 549, 549, 549, 549, + 549, 549, 549, 544, 544, 544, 544, 544, 544, 598, + 598, 599, 401, 599, 599, 445, 445, 544, 448, 448, + 544, 448, 544, 544, 544, 544, 600, 600, 544, 601, + 561, 549, 596, 596, 597, 597, 549, 549, 549, 549, + 549, 544, 544, 544, 544, 602, 602, 603, 451, 603, + 603, 481, 481, 544, 484, 484, 484, 544, 544, 544, + 544, 544, 544, 601, 544, 561, 549, 549, 549, 549, + + 549, 544, 544, 544, 544, 544, 544, 604, 604, 605, + 605, 605, 512, 512, 561, 549, 549, 549, 544, 544, + 544, 544, 606, 606, 607, 549, 549, 549, 549, 549, + 544, 544, 544, 544, 544, 607, 544, 549, 549, 549, + 549, 549, 549, 0, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + + 544, 544, 544, 544, 544, 544, 544 } ; -static yyconst short int yy_nxt[3442] = +static yyconst short int yy_nxt[3455] = { 0, 14, 15, 16, 17, 14, 18, 19, 20, 21, 14, 22, 23, 14, 14, 24, 25, 26, 27, 25, 25, @@ -558,7 +561,7 @@ static yyconst short int yy_nxt[3442] = 90, 90, 90, 90, 90, 90, 90, 90, 105, 73, 73, 169, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 15, 16, 17, 73, 57, 345, 106, 107, 73, 173, + 15, 16, 17, 73, 57, 537, 106, 107, 73, 173, 108, 73, 168, 175, 109, 118, 211, 110, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, @@ -572,26 +575,26 @@ static yyconst short int yy_nxt[3442] = 142, 191, 211, 204, 66, 15, 16, 17, 61, 57, 121, 85, 77, 73, 62, 63, 64, 72, 127, 72, - 140, 72, 477, 72, 72, 138, 537, 72, 65, 211, + 140, 72, 537, 72, 72, 138, 77, 72, 65, 211, 86, 146, 147, 148, 146, 146, 146, 146, 146, 72, 72, 72, 150, 150, 150, 150, 150, 150, 66, 77, 150, 150, 150, 150, 150, 150, 150, 150, 210, 78, 73, 138, 79, 79, 79, 79, 79, 79, 79, 79, 87, 178, 88, 88, 88, 88, 88, 88, 88, 88, - 89, 77, 345, 73, 90, 90, 90, 90, 90, 150, + 89, 77, 496, 73, 90, 90, 90, 90, 90, 150, 150, 150, 150, 150, 150, 150, 150, 211, 73, 89, 289, 73, 73, 90, 90, 90, 90, 90, 90, 72, - 73, 214, 238, 72, 477, 72, 245, 73, 72, 72, + 73, 214, 238, 72, 345, 72, 245, 73, 72, 72, 73, 72, 72, 72, 96, 96, 96, 96, 96, 96, 96, 96, 89, 249, 239, 72, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 73, 97, 90, 90, 90, 90, 90, 90, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 97, 97, 97, 97, 97, 97, 97, 97, 537, + 72, 97, 97, 97, 97, 97, 97, 97, 97, 544, 222, 222, 222, 97, 97, 97, 97, 97, 79, 79, 79, 79, 79, 79, 79, 79, 73, 250, 77, 129, - 103, 442, 72, 72, 72, 72, 72, 72, 102, 103, + 103, 479, 72, 72, 72, 72, 72, 72, 102, 103, 72, 152, 72, 253, 72, 72, 73, 80, 72, 80, 191, 80, 252, 80, 80, 338, 152, 80, 226, 152, @@ -599,327 +602,328 @@ static yyconst short int yy_nxt[3442] = 80, 80, 132, 78, 73, 334, 79, 79, 79, 79, 79, 79, 79, 79, 82, 73, 82, 73, 82, 239, 82, 82, 106, 107, 82, 84, 108, 72, 73, 84, - 109, 72, 72, 110, 251, 84, 82, 82, 82, 499, - 537, 152, 493, 380, 111, 77, 73, 84, 84, 72, - 228, 285, 120, 77, 323, 128, 120, 120, 537, 537, - 537, 537, 537, 537, 537, 537, 149, 149, 149, 149, - - 149, 149, 149, 149, 120, 152, 324, 77, 149, 149, - 149, 149, 149, 537, 537, 537, 537, 537, 537, 537, - 537, 73, 152, 121, 390, 390, 291, 149, 149, 149, + 109, 72, 72, 110, 251, 84, 82, 82, 82, 544, + 544, 152, 345, 380, 111, 77, 73, 84, 84, 72, + 228, 285, 120, 77, 323, 128, 120, 120, 544, 544, + 544, 544, 544, 544, 544, 544, 149, 149, 149, 149, + + 149, 149, 149, 149, 120, 479, 324, 77, 149, 149, + 149, 149, 149, 544, 544, 544, 544, 544, 544, 544, + 544, 73, 443, 121, 390, 390, 291, 149, 149, 149, 149, 149, 149, 155, 155, 155, 155, 155, 155, 155, 155, 327, 288, 73, 152, 155, 155, 155, 155, 155, - 119, 442, 72, 191, 119, 378, 72, 72, 329, 336, + 119, 502, 72, 191, 119, 378, 72, 72, 329, 336, 119, 152, 73, 328, 149, 149, 149, 149, 149, 149, 228, 331, 119, 119, 72, 131, 73, 85, 131, 131, 330, 85, 73, 226, 152, 131, 335, 85, 152, 323, - 327, 337, 120, 228, 422, 77, 120, 228, 131, 85, + 327, 337, 120, 228, 440, 440, 120, 228, 131, 85, 85, 178, 120, 179, 179, 179, 179, 179, 179, 179, - 179, 324, 328, 393, 120, 120, 215, 216, 217, 215, + 179, 324, 328, 495, 120, 120, 215, 216, 217, 215, 215, 215, 215, 215, 178, 152, 179, 179, 179, 179, 179, 179, 73, 178, 270, 180, 180, 180, 180, 180, - 180, 180, 180, 464, 329, 73, 220, 220, 221, 222, + 180, 180, 180, 152, 329, 73, 220, 220, 221, 222, 222, 222, 222, 222, 188, 73, 196, 196, 196, 196, 196, 196, 196, 196, 73, 178, 330, 181, 181, 181, 181, 181, 182, 179, 179, 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 232, 273, - 273, 273, 273, 273, 274, 462, 73, 72, 73, 183, + 273, 273, 273, 273, 274, 152, 73, 72, 443, 183, - 183, 183, 183, 183, 183, 183, 183, 226, 152, 493, - 73, 183, 183, 183, 183, 183, 537, 270, 229, 229, - 229, 229, 229, 229, 229, 229, 375, 439, 439, 73, + 183, 183, 183, 183, 183, 183, 183, 226, 152, 393, + 73, 183, 183, 183, 183, 183, 544, 270, 229, 229, + 229, 229, 229, 229, 229, 229, 375, 226, 152, 73, 183, 183, 183, 183, 183, 183, 185, 186, 187, 187, - 187, 187, 187, 187, 188, 381, 226, 152, 189, 189, + 187, 187, 187, 187, 188, 381, 544, 152, 189, 189, 189, 189, 189, 259, 259, 259, 259, 259, 259, 259, - 259, 188, 416, 418, 73, 491, 423, 189, 189, 189, + 259, 188, 416, 418, 73, 466, 424, 189, 189, 189, 189, 189, 189, 152, 192, 193, 194, 192, 192, 192, - 192, 192, 195, 152, 417, 419, 196, 196, 196, 196, + 192, 192, 195, 464, 417, 419, 196, 196, 196, 196, 196, 264, 265, 266, 264, 264, 264, 264, 264, 316, 316, 316, 316, 316, 317, 196, 196, 196, 196, 196, - 196, 197, 197, 197, 197, 197, 197, 197, 197, 537, - 152, 456, 456, 197, 197, 197, 197, 197, 237, 237, - 237, 237, 237, 237, 237, 237, 474, 474, 393, 537, - 152, 347, 183, 183, 183, 183, 183, 183, 178, 270, + 196, 197, 197, 197, 197, 197, 197, 197, 197, 457, + 457, 73, 73, 197, 197, 197, 197, 197, 237, 237, + 237, 237, 237, 237, 237, 237, 462, 476, 476, 544, + 152, 495, 183, 183, 183, 183, 183, 183, 178, 270, 179, 179, 179, 179, 179, 179, 179, 179, 226, 152, - 268, 268, 268, 268, 268, 268, 433, 345, 228, 272, - 272, 272, 272, 272, 272, 272, 272, 347, 464, 73, - 178, 537, 179, 179, 179, 179, 179, 179, 179, 179, - 537, 347, 271, 271, 271, 271, 271, 271, 271, 271, + 268, 268, 268, 268, 268, 268, 493, 345, 228, 272, + 272, 272, 272, 272, 272, 272, 272, 347, 152, 73, + 178, 544, 179, 179, 179, 179, 179, 179, 179, 179, + 544, 347, 271, 271, 271, 271, 271, 271, 271, 271, 226, 152, 292, 293, 294, 292, 292, 292, 292, 292, 270, 73, 226, 152, 227, 227, 227, 227, 227, 227, - 227, 227, 228, 226, 152, 462, 229, 229, 229, 229, + 227, 227, 228, 226, 152, 393, 229, 229, 229, 229, 229, 73, 253, 313, 254, 254, 254, 254, 254, 254, - 416, 226, 152, 505, 505, 229, 229, 229, 229, 229, + 416, 226, 152, 508, 508, 229, 229, 229, 229, 229, 229, 152, 233, 234, 235, 233, 233, 233, 233, 233, 236, 73, 417, 73, 237, 237, 237, 237, 237, 304, - 379, 305, 305, 305, 305, 305, 305, 305, 305, 458, - 537, 152, 403, 237, 237, 237, 237, 237, 237, 253, + 379, 305, 305, 305, 305, 305, 305, 305, 305, 347, + 544, 152, 434, 237, 237, 237, 237, 237, 237, 253, 313, 254, 254, 254, 254, 254, 254, 254, 254, 304, 418, 306, 306, 306, 306, 306, 306, 306, 306, 304, 152, 307, 307, 307, 307, 307, 308, 305, 305, 270, 73, 253, 419, 255, 255, 255, 255, 255, 255, 255, 255, 279, 279, 279, 279, 279, 279, 279, 279, 226, - 152, 311, 311, 311, 311, 311, 311, 519, 519, 270, - 347, 426, 73, 253, 298, 256, 256, 256, 256, 256, + 152, 311, 311, 311, 311, 311, 311, 515, 77, 270, + 466, 427, 73, 253, 464, 256, 256, 256, 256, 256, 257, 254, 254, 315, 315, 315, 315, 315, 315, 315, - 315, 537, 152, 314, 314, 314, 314, 314, 314, 314, - 314, 313, 73, 73, 73, 226, 152, 268, 268, 268, + 315, 544, 152, 314, 314, 314, 314, 314, 314, 314, + 314, 313, 73, 459, 73, 226, 152, 268, 268, 268, 268, 268, 268, 268, 268, 228, 226, 152, 269, 269, - 269, 269, 269, 269, 269, 269, 270, 421, 420, 73, + 269, 269, 269, 269, 269, 269, 270, 523, 523, 403, 271, 271, 271, 271, 271, 303, 303, 303, 303, 303, 303, 303, 303, 350, 350, 350, 350, 350, 351, 271, 271, 271, 271, 271, 271, 152, 275, 276, 277, 275, - 275, 275, 275, 275, 278, 298, 224, 377, 279, 279, + 275, 275, 275, 275, 278, 347, 298, 73, 279, 279, 279, 279, 279, 349, 349, 349, 349, 349, 349, 349, 349, 367, 367, 367, 367, 367, 368, 279, 279, 279, 279, 279, 279, 253, 345, 254, 254, 254, 254, 254, - 254, 254, 254, 537, 347, 348, 348, 348, 348, 348, + 254, 254, 254, 544, 347, 348, 348, 348, 348, 348, 348, 348, 348, 357, 358, 359, 357, 357, 357, 357, - 357, 376, 374, 373, 73, 253, 345, 254, 254, 254, + 357, 421, 420, 73, 73, 253, 345, 254, 254, 254, 254, 254, 254, 254, 254, 304, 393, 305, 305, 305, 305, 305, 305, 305, 305, 304, 152, 305, 305, 305, 305, 305, 305, 305, 305, 313, 73, 299, 300, 301, - 299, 299, 299, 299, 299, 302, 152, 304, 298, 303, + 299, 299, 299, 299, 299, 302, 152, 77, 298, 303, 303, 303, 303, 303, 304, 364, 305, 305, 305, 305, 305, 305, 396, 396, 396, 396, 396, 397, 303, 303, 303, 303, 303, 303, 226, 152, 311, 311, 311, 311, 311, 311, 311, 311, 270, 226, 152, 312, 312, 312, - 312, 312, 312, 312, 312, 313, 224, 188, 333, 314, + 312, 312, 312, 312, 312, 313, 224, 377, 461, 314, 314, 314, 314, 314, 322, 322, 322, 322, 322, 322, 322, 322, 414, 414, 414, 414, 414, 415, 314, 314, 314, 314, 314, 314, 152, 318, 319, 320, 318, 318, - 318, 318, 318, 321, 332, 73, 326, 322, 322, 322, + 318, 318, 318, 321, 376, 374, 373, 322, 322, 322, 322, 322, 226, 152, 362, 362, 362, 362, 362, 362, - 460, 325, 313, 298, 224, 188, 322, 322, 322, 322, + 304, 298, 313, 224, 422, 77, 322, 322, 322, 322, 322, 322, 338, 339, 339, 339, 339, 339, 339, 339, - 339, 366, 366, 366, 366, 366, 366, 366, 366, 537, - 537, 365, 365, 365, 365, 365, 365, 365, 365, 494, - 393, 521, 73, 338, 340, 340, 340, 340, 340, 340, + 339, 366, 366, 366, 366, 366, 366, 366, 366, 544, + 544, 365, 365, 365, 365, 365, 365, 365, 365, 497, + 393, 526, 73, 338, 340, 340, 340, 340, 340, 340, - 340, 340, 188, 246, 382, 383, 384, 385, 382, 382, - 382, 382, 338, 339, 339, 339, 339, 339, 339, 287, - 73, 286, 73, 73, 338, 341, 341, 341, 341, 341, + 340, 340, 423, 188, 382, 383, 384, 385, 382, 382, + 382, 382, 338, 339, 339, 339, 339, 339, 339, 333, + 73, 332, 73, 73, 338, 341, 341, 341, 341, 341, 342, 339, 339, 73, 387, 388, 389, 387, 387, 387, 387, 387, 73, 356, 356, 356, 356, 356, 356, 356, - 356, 284, 283, 282, 73, 345, 345, 346, 346, 346, - 346, 346, 346, 346, 346, 347, 393, 281, 280, 348, + 356, 326, 325, 298, 73, 345, 345, 346, 346, 346, + 346, 346, 346, 346, 346, 347, 393, 224, 188, 348, 348, 348, 348, 348, 395, 395, 395, 395, 395, 395, - 395, 395, 445, 445, 445, 445, 445, 446, 348, 348, + 395, 395, 446, 446, 446, 446, 446, 447, 348, 348, 348, 348, 348, 348, 352, 353, 354, 352, 352, 352, - 352, 352, 355, 262, 224, 188, 356, 356, 356, 356, - 356, 537, 345, 394, 394, 394, 394, 394, 394, 394, - 394, 258, 442, 188, 95, 356, 356, 356, 356, 356, + 352, 352, 355, 188, 246, 287, 356, 356, 356, 356, + 356, 544, 345, 394, 394, 394, 394, 394, 394, 394, + 394, 286, 443, 284, 283, 356, 356, 356, 356, 356, 356, 226, 152, 362, 362, 362, 362, 362, 362, 362, 362, 313, 226, 152, 363, 363, 363, 363, 363, 363, - 363, 363, 364, 246, 248, 246, 365, 365, 365, 365, - 365, 403, 537, 404, 404, 404, 404, 404, 404, 404, - 404, 247, 442, 246, 244, 365, 365, 365, 365, 365, + 363, 363, 364, 282, 281, 280, 365, 365, 365, 365, + 365, 403, 544, 404, 404, 404, 404, 404, 404, 404, + 404, 262, 443, 224, 188, 365, 365, 365, 365, 365, 365, 152, 369, 370, 371, 369, 369, 369, 369, 369, - 226, 152, 243, 242, 372, 372, 372, 372, 372, 403, + 226, 152, 258, 188, 372, 372, 372, 372, 372, 403, - 313, 405, 405, 405, 405, 405, 405, 405, 405, 241, - 240, 89, 188, 372, 372, 372, 372, 372, 372, 338, - 339, 339, 339, 339, 339, 339, 339, 339, 403, 224, + 313, 405, 405, 405, 405, 405, 405, 405, 405, 95, + 246, 248, 246, 372, 372, 372, 372, 372, 372, 338, + 339, 339, 339, 339, 339, 339, 339, 339, 403, 247, 406, 406, 406, 406, 406, 407, 404, 404, 226, 152, 372, 372, 372, 372, 372, 372, 372, 372, 364, 73, - 338, 339, 339, 339, 339, 339, 339, 339, 339, 537, + 338, 339, 339, 339, 339, 339, 339, 339, 339, 544, 152, 226, 152, 410, 410, 410, 410, 410, 410, 364, - 188, 364, 413, 413, 413, 413, 413, 413, 413, 413, - 73, 345, 95, 391, 391, 391, 391, 391, 391, 391, - 391, 347, 345, 77, 392, 392, 392, 392, 392, 392, + 246, 364, 413, 413, 413, 413, 413, 413, 413, 413, + 73, 345, 244, 391, 391, 391, 391, 391, 391, 391, + 391, 347, 345, 243, 392, 392, 392, 392, 392, 392, - 392, 392, 393, 152, 176, 212, 394, 394, 394, 394, - 394, 537, 364, 412, 412, 412, 412, 412, 412, 412, - 412, 209, 208, 207, 206, 394, 394, 394, 394, 394, + 392, 392, 393, 152, 242, 241, 394, 394, 394, 394, + 394, 544, 364, 412, 412, 412, 412, 412, 412, 412, + 412, 240, 89, 188, 224, 394, 394, 394, 394, 394, 394, 398, 399, 400, 398, 398, 398, 398, 398, 401, - 205, 203, 202, 402, 402, 402, 402, 402, 433, 345, - 434, 434, 434, 434, 434, 434, 434, 434, 201, 442, - 200, 199, 402, 402, 402, 402, 402, 402, 226, 152, + 188, 95, 77, 402, 402, 402, 402, 402, 434, 345, + 435, 435, 435, 435, 435, 435, 435, 435, 176, 443, + 212, 209, 402, 402, 402, 402, 402, 402, 226, 152, 410, 410, 410, 410, 410, 410, 410, 410, 364, 226, - 152, 411, 411, 411, 411, 411, 411, 411, 411, 198, - 226, 152, 95, 412, 412, 412, 412, 412, 424, 433, - - 364, 435, 435, 435, 435, 435, 435, 435, 435, 345, - 422, 77, 412, 412, 412, 412, 412, 412, 424, 477, - 424, 425, 433, 459, 436, 436, 436, 436, 436, 437, - 434, 434, 480, 480, 480, 480, 480, 481, 87, 73, - 426, 77, 427, 427, 427, 427, 427, 427, 427, 427, - 402, 402, 402, 402, 402, 402, 402, 402, 444, 444, - 444, 444, 444, 444, 444, 444, 77, 176, 137, 138, - 132, 73, 426, 537, 428, 428, 428, 428, 428, 428, - 428, 428, 537, 477, 443, 443, 443, 443, 443, 443, - 443, 443, 452, 453, 454, 452, 452, 452, 452, 452, - - 132, 124, 174, 73, 426, 345, 429, 429, 429, 429, - 429, 430, 431, 431, 403, 477, 404, 404, 404, 404, - 404, 404, 404, 404, 403, 117, 404, 404, 404, 404, - 404, 404, 404, 404, 424, 73, 426, 167, 432, 432, - 432, 427, 427, 427, 427, 427, 403, 166, 404, 404, - 404, 404, 404, 404, 424, 165, 424, 424, 164, 426, - 163, 469, 469, 469, 161, 160, 156, 73, 345, 95, - 440, 440, 440, 440, 440, 440, 440, 440, 393, 345, - 72, 441, 441, 441, 441, 441, 441, 441, 441, 442, - 73, 95, 145, 443, 443, 443, 443, 443, 465, 466, - - 467, 465, 465, 465, 465, 465, 510, 510, 510, 510, - 510, 511, 443, 443, 443, 443, 443, 443, 447, 448, - 449, 447, 447, 447, 447, 447, 450, 73, 83, 81, - 451, 451, 451, 451, 451, 470, 471, 472, 470, 470, - 470, 470, 470, 526, 526, 526, 526, 526, 526, 451, - 451, 451, 451, 451, 451, 226, 152, 457, 457, 457, - 457, 457, 457, 457, 457, 426, 77, 431, 431, 431, - 431, 431, 431, 431, 431, 433, 75, 434, 434, 434, - 434, 434, 434, 434, 434, 433, 74, 434, 434, 434, - 434, 434, 434, 434, 434, 73, 73, 426, 138, 431, - - 431, 431, 431, 431, 431, 431, 431, 433, 132, 434, - 434, 434, 434, 434, 434, 451, 451, 451, 451, 451, - 451, 451, 451, 124, 117, 116, 115, 114, 73, 426, - 113, 431, 431, 431, 431, 431, 431, 468, 468, 479, - 479, 479, 479, 479, 479, 479, 479, 537, 112, 478, - 478, 478, 478, 478, 478, 478, 478, 101, 100, 99, - 73, 426, 98, 468, 468, 468, 468, 468, 468, 468, - 468, 152, 486, 486, 486, 486, 486, 486, 486, 486, - 152, 487, 487, 487, 487, 487, 487, 487, 487, 95, - 83, 81, 73, 345, 75, 475, 475, 475, 475, 475, - - 475, 475, 475, 442, 345, 74, 476, 476, 476, 476, - 476, 476, 476, 476, 477, 73, 537, 537, 478, 478, - 478, 478, 478, 152, 488, 488, 488, 488, 488, 489, - 486, 486, 469, 469, 469, 537, 537, 478, 478, 478, - 478, 478, 478, 482, 483, 484, 482, 482, 482, 482, - 482, 537, 537, 537, 537, 485, 485, 485, 485, 485, - 461, 73, 461, 537, 461, 537, 461, 461, 537, 537, - 461, 537, 537, 537, 485, 485, 485, 485, 485, 485, - 537, 537, 461, 461, 461, 463, 537, 463, 537, 463, - 537, 463, 463, 537, 537, 463, 468, 468, 468, 468, - - 468, 468, 468, 468, 537, 537, 537, 463, 463, 463, - 494, 537, 495, 495, 495, 495, 495, 495, 495, 495, - 537, 537, 537, 537, 499, 73, 500, 500, 500, 500, - 500, 500, 500, 500, 152, 486, 486, 486, 486, 486, - 486, 73, 494, 537, 496, 496, 496, 496, 496, 496, - 496, 496, 499, 537, 501, 501, 501, 501, 501, 501, - 501, 501, 499, 537, 502, 502, 502, 502, 502, 503, - 500, 500, 537, 73, 494, 537, 497, 497, 497, 497, - 497, 498, 495, 495, 485, 485, 485, 485, 485, 485, - 485, 485, 509, 509, 509, 509, 509, 509, 509, 509, - - 537, 537, 537, 537, 537, 73, 345, 537, 506, 506, - 506, 506, 506, 506, 506, 506, 477, 345, 537, 507, - 507, 507, 507, 507, 507, 507, 507, 537, 537, 537, - 537, 508, 508, 508, 508, 508, 537, 537, 508, 508, - 508, 508, 508, 508, 508, 508, 537, 537, 537, 537, - 508, 508, 508, 508, 508, 508, 152, 486, 486, 486, - 486, 486, 486, 486, 486, 152, 486, 486, 486, 486, - 486, 486, 486, 486, 512, 513, 514, 512, 512, 512, - 512, 512, 537, 494, 537, 495, 495, 495, 495, 495, - 495, 515, 516, 517, 515, 515, 515, 515, 515, 537, - - 537, 537, 537, 73, 494, 537, 495, 495, 495, 495, - 495, 495, 495, 495, 73, 499, 537, 500, 500, 500, - 500, 500, 500, 500, 500, 499, 537, 500, 500, 500, - 500, 500, 500, 500, 500, 73, 494, 537, 495, 495, - 495, 495, 495, 495, 495, 495, 499, 537, 500, 500, - 500, 500, 500, 500, 345, 537, 520, 520, 520, 520, - 520, 520, 520, 520, 537, 537, 537, 73, 521, 537, - 522, 522, 522, 522, 522, 522, 522, 522, 526, 526, - 526, 526, 526, 526, 526, 526, 527, 527, 527, 527, - 527, 527, 527, 527, 537, 537, 537, 537, 537, 73, - - 521, 537, 523, 523, 523, 523, 523, 523, 523, 523, - 528, 528, 528, 528, 528, 529, 526, 526, 531, 532, - 533, 531, 531, 531, 531, 531, 537, 537, 537, 537, - 537, 73, 521, 537, 524, 524, 524, 524, 524, 525, - 522, 522, 537, 537, 537, 537, 521, 73, 522, 522, - 522, 522, 522, 522, 526, 526, 526, 526, 526, 526, - 526, 526, 537, 73, 521, 537, 522, 522, 522, 522, - 522, 522, 522, 522, 537, 537, 537, 73, 526, 526, - 526, 526, 526, 526, 526, 526, 534, 534, 534, 534, - 534, 534, 534, 534, 537, 73, 521, 537, 522, 522, - - 522, 522, 522, 522, 522, 522, 531, 531, 531, 531, - 531, 531, 531, 531, 537, 73, 535, 535, 535, 535, - 535, 536, 534, 534, 537, 537, 537, 73, 534, 534, - 534, 534, 534, 534, 537, 73, 534, 534, 534, 534, - 534, 534, 534, 534, 537, 73, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 73, 537, 537, - 537, 537, 537, 537, 537, 73, 51, 51, 51, 51, + 152, 411, 411, 411, 411, 411, 411, 411, 411, 208, + 226, 152, 207, 412, 412, 412, 412, 412, 425, 434, + + 364, 436, 436, 436, 436, 436, 436, 436, 436, 345, + 422, 77, 412, 412, 412, 412, 412, 412, 425, 479, + 425, 426, 434, 460, 437, 437, 437, 437, 437, 438, + 435, 435, 482, 482, 482, 482, 482, 483, 206, 73, + 427, 205, 428, 428, 428, 428, 428, 428, 428, 428, + 402, 402, 402, 402, 402, 402, 402, 402, 445, 445, + 445, 445, 445, 445, 445, 445, 203, 202, 201, 200, + 199, 73, 427, 544, 429, 429, 429, 429, 429, 429, + 429, 429, 544, 479, 444, 444, 444, 444, 444, 444, + 444, 444, 453, 454, 455, 453, 453, 453, 453, 453, + + 198, 95, 87, 73, 427, 345, 430, 430, 430, 430, + 430, 431, 432, 432, 403, 479, 404, 404, 404, 404, + 404, 404, 404, 404, 403, 77, 404, 404, 404, 404, + 404, 404, 404, 404, 425, 73, 427, 77, 433, 433, + 433, 428, 428, 428, 428, 428, 403, 176, 404, 404, + 404, 404, 404, 404, 425, 137, 425, 425, 138, 427, + 132, 471, 471, 471, 132, 124, 174, 73, 345, 117, + 441, 441, 441, 441, 441, 441, 441, 441, 393, 345, + 167, 442, 442, 442, 442, 442, 442, 442, 442, 443, + 73, 166, 165, 444, 444, 444, 444, 444, 467, 468, + + 469, 467, 467, 467, 467, 467, 513, 513, 513, 513, + 513, 514, 444, 444, 444, 444, 444, 444, 448, 449, + 450, 448, 448, 448, 448, 448, 451, 73, 164, 163, + 452, 452, 452, 452, 452, 472, 473, 474, 472, 472, + 472, 472, 472, 531, 531, 531, 531, 531, 531, 452, + 452, 452, 452, 452, 452, 226, 152, 458, 458, 458, + 458, 458, 458, 458, 458, 427, 161, 432, 432, 432, + 432, 432, 432, 432, 432, 434, 160, 435, 435, 435, + 435, 435, 435, 435, 435, 434, 156, 435, 435, 435, + 435, 435, 435, 435, 435, 95, 73, 427, 72, 432, + + 432, 432, 432, 432, 432, 432, 432, 434, 95, 435, + 435, 435, 435, 435, 435, 452, 452, 452, 452, 452, + 452, 452, 452, 145, 83, 81, 77, 75, 73, 427, + 74, 432, 432, 432, 432, 432, 432, 470, 470, 481, + 481, 481, 481, 481, 481, 481, 481, 544, 73, 480, + 480, 480, 480, 480, 480, 480, 480, 138, 132, 124, + 73, 427, 117, 470, 470, 470, 470, 470, 470, 470, + 470, 152, 488, 488, 488, 488, 488, 488, 488, 488, + 152, 489, 489, 489, 489, 489, 489, 489, 489, 116, + 115, 114, 73, 345, 113, 477, 477, 477, 477, 477, + + 477, 477, 477, 443, 345, 112, 478, 478, 478, 478, + 478, 478, 478, 478, 479, 101, 100, 99, 480, 480, + 480, 480, 480, 152, 490, 490, 490, 490, 490, 491, + 488, 488, 471, 471, 471, 98, 95, 480, 480, 480, + 480, 480, 480, 484, 485, 486, 484, 484, 484, 484, + 484, 83, 515, 77, 81, 487, 487, 487, 487, 487, + 463, 73, 463, 75, 463, 525, 463, 463, 74, 73, + 463, 544, 544, 544, 487, 487, 487, 487, 487, 487, + 544, 544, 463, 463, 463, 465, 544, 465, 544, 465, + 544, 465, 465, 544, 544, 465, 470, 470, 470, 470, + + 470, 470, 470, 470, 544, 544, 544, 465, 465, 465, + 497, 544, 498, 498, 498, 498, 498, 498, 498, 498, + 544, 544, 544, 544, 502, 73, 503, 503, 503, 503, + 503, 503, 503, 503, 152, 488, 488, 488, 488, 488, + 488, 73, 497, 544, 499, 499, 499, 499, 499, 499, + 499, 499, 502, 544, 504, 504, 504, 504, 504, 504, + 504, 504, 502, 544, 505, 505, 505, 505, 505, 506, + 503, 503, 544, 73, 497, 544, 500, 500, 500, 500, + 500, 501, 498, 498, 487, 487, 487, 487, 487, 487, + 487, 487, 512, 512, 512, 512, 512, 512, 512, 512, + + 544, 544, 544, 544, 544, 73, 345, 544, 509, 509, + 509, 509, 509, 509, 509, 509, 479, 345, 544, 510, + 510, 510, 510, 510, 510, 510, 510, 544, 544, 544, + 544, 511, 511, 511, 511, 511, 544, 544, 511, 511, + 511, 511, 511, 511, 511, 511, 544, 544, 544, 544, + 511, 511, 511, 511, 511, 511, 152, 488, 488, 488, + 488, 488, 488, 488, 488, 152, 488, 488, 488, 488, + 488, 488, 488, 488, 516, 517, 518, 516, 516, 516, + 516, 516, 544, 497, 544, 498, 498, 498, 498, 498, + 498, 519, 520, 521, 519, 519, 519, 519, 519, 544, + + 544, 544, 544, 73, 497, 544, 498, 498, 498, 498, + 498, 498, 498, 498, 73, 502, 544, 503, 503, 503, + 503, 503, 503, 503, 503, 502, 544, 503, 503, 503, + 503, 503, 503, 503, 503, 73, 497, 544, 498, 498, + 498, 498, 498, 498, 498, 498, 502, 544, 503, 503, + 503, 503, 503, 503, 345, 544, 524, 524, 524, 524, + 524, 524, 524, 524, 544, 544, 544, 73, 526, 544, + 527, 527, 527, 527, 527, 527, 527, 527, 531, 531, + 531, 531, 531, 531, 531, 531, 532, 532, 532, 532, + 532, 532, 532, 532, 544, 544, 544, 544, 544, 73, + + 526, 544, 528, 528, 528, 528, 528, 528, 528, 528, + 533, 533, 533, 533, 533, 534, 531, 531, 538, 539, + 540, 538, 538, 538, 538, 538, 544, 544, 544, 544, + 544, 73, 526, 544, 529, 529, 529, 529, 529, 530, + 527, 527, 544, 544, 544, 544, 526, 73, 527, 527, + 527, 527, 527, 527, 531, 531, 531, 531, 531, 531, + 531, 531, 544, 73, 526, 544, 527, 527, 527, 527, + 527, 527, 527, 527, 544, 544, 544, 73, 531, 531, + 531, 531, 531, 531, 531, 531, 541, 541, 541, 541, + 541, 541, 541, 541, 544, 73, 526, 544, 527, 527, + + 527, 527, 527, 527, 527, 527, 538, 538, 538, 538, + 538, 538, 538, 538, 544, 73, 542, 542, 542, 542, + 542, 543, 541, 541, 544, 544, 544, 73, 541, 541, + 541, 541, 541, 541, 544, 73, 541, 541, 541, 541, + 541, 541, 541, 541, 544, 73, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 73, 544, 544, + 544, 544, 544, 544, 544, 73, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 72, 537, - 537, 537, 72, 537, 72, 72, 72, 537, 72, 72, + 67, 67, 67, 67, 67, 67, 67, 67, 72, 544, + 544, 544, 72, 544, 72, 72, 72, 544, 72, 72, 72, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 80, 537, 537, 537, 80, 537, - 80, 80, 80, 537, 80, 80, 80, 82, 537, 537, - 537, 82, 537, 82, 82, 82, 537, 82, 82, 82, - 84, 537, 537, 84, 84, 537, 84, 84, 84, 537, - 84, 84, 84, 94, 94, 537, 537, 94, 119, 537, - 537, 119, 119, 537, 119, 119, 119, 537, 119, 119, - - 119, 123, 537, 537, 123, 123, 123, 123, 123, 123, - 537, 537, 123, 123, 130, 130, 131, 537, 537, 131, - 537, 537, 131, 131, 131, 131, 131, 131, 131, 135, + 76, 76, 76, 76, 80, 544, 544, 544, 80, 544, + 80, 80, 80, 544, 80, 80, 80, 82, 544, 544, + 544, 82, 544, 82, 82, 82, 544, 82, 82, 82, + 84, 544, 544, 84, 84, 544, 84, 84, 84, 544, + 84, 84, 84, 94, 94, 544, 544, 94, 119, 544, + 544, 119, 119, 544, 119, 119, 119, 544, 119, 119, + + 119, 123, 544, 544, 123, 123, 123, 123, 123, 123, + 544, 544, 123, 123, 130, 130, 131, 544, 544, 131, + 544, 544, 131, 131, 131, 131, 131, 131, 131, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 137, 137, 537, 137, 537, 137, 137, 137, + 135, 135, 137, 137, 544, 137, 544, 137, 137, 137, 137, 137, 137, 137, 137, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 144, - 537, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 85, 537, 537, 85, 85, 537, 85, 85, 85, - 537, 85, 85, 85, 151, 151, 537, 537, 151, 153, + 544, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 85, 544, 544, 85, 85, 544, 85, 85, 85, + 544, 85, 85, 85, 151, 151, 544, 544, 151, 153, - 153, 153, 537, 537, 153, 120, 537, 537, 120, 120, - 537, 120, 120, 120, 537, 120, 120, 120, 177, 177, + 153, 153, 544, 544, 153, 120, 544, 544, 120, 120, + 544, 120, 120, 120, 544, 120, 120, 120, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 184, 184, 537, 537, 184, 190, 190, 190, 537, - 537, 190, 218, 218, 537, 537, 218, 219, 219, 537, - 537, 219, 223, 223, 537, 537, 223, 225, 225, 225, - 537, 537, 225, 258, 258, 537, 537, 258, 260, 260, - 537, 537, 260, 261, 261, 537, 537, 261, 263, 263, - 263, 537, 537, 263, 267, 267, 267, 267, 537, 537, - 267, 295, 295, 537, 537, 295, 296, 296, 537, 537, - - 296, 297, 297, 537, 537, 297, 309, 309, 309, 537, - 537, 309, 310, 310, 310, 310, 537, 537, 310, 343, - 343, 537, 537, 343, 344, 344, 537, 537, 344, 360, - 360, 360, 537, 537, 360, 361, 361, 361, 361, 537, - 537, 361, 386, 386, 537, 537, 386, 390, 537, 390, - 390, 537, 537, 390, 408, 408, 408, 537, 537, 408, - 409, 409, 409, 409, 537, 537, 409, 438, 438, 537, - 537, 438, 439, 537, 439, 439, 537, 537, 439, 455, - 455, 455, 537, 537, 455, 456, 456, 456, 537, 537, - 537, 456, 461, 537, 537, 537, 461, 537, 461, 461, - - 461, 537, 461, 461, 461, 463, 537, 537, 537, 463, - 537, 463, 463, 463, 537, 463, 463, 463, 473, 473, - 537, 537, 473, 474, 537, 474, 474, 537, 537, 474, - 490, 490, 537, 537, 537, 490, 492, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 492, 492, 492, 504, - 504, 537, 537, 504, 505, 537, 505, 505, 537, 537, - 505, 518, 518, 537, 537, 518, 519, 537, 519, 537, - 537, 537, 519, 530, 537, 537, 537, 530, 13, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537 + 177, 184, 184, 544, 544, 184, 190, 190, 190, 544, + 544, 190, 218, 218, 544, 544, 218, 219, 219, 544, + 544, 219, 223, 223, 544, 544, 223, 225, 225, 225, + 544, 544, 225, 258, 258, 544, 544, 258, 260, 260, + 544, 544, 260, 261, 261, 544, 544, 261, 263, 263, + 263, 544, 544, 263, 267, 267, 267, 267, 544, 544, + 267, 295, 295, 544, 544, 295, 296, 296, 544, 544, + + 296, 297, 297, 544, 544, 297, 309, 309, 309, 544, + 544, 309, 310, 310, 310, 310, 544, 544, 310, 343, + 343, 544, 544, 343, 344, 344, 544, 544, 344, 360, + 360, 360, 544, 544, 360, 361, 361, 361, 361, 544, + 544, 361, 386, 386, 544, 544, 386, 390, 544, 390, + 390, 544, 544, 390, 408, 408, 408, 544, 544, 408, + 409, 409, 409, 409, 544, 544, 409, 439, 439, 544, + 544, 439, 440, 544, 440, 440, 544, 544, 440, 456, + 456, 456, 544, 544, 456, 457, 457, 457, 544, 544, + 544, 457, 463, 544, 544, 544, 463, 544, 463, 463, + + 463, 544, 463, 463, 463, 465, 544, 544, 544, 465, + 544, 465, 465, 465, 544, 465, 465, 465, 475, 475, + 544, 544, 475, 476, 544, 476, 476, 544, 544, 476, + 492, 492, 544, 544, 544, 492, 494, 494, 494, 494, + 494, 494, 494, 494, 494, 494, 494, 494, 494, 507, + 507, 544, 544, 507, 508, 544, 508, 508, 544, 544, + 508, 522, 522, 544, 544, 522, 523, 544, 523, 544, + 544, 544, 523, 535, 544, 544, 544, 535, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, + 536, 13, 544, 544, 544, 544, 544, 544, 544, 544, + + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544 } ; -static yyconst short int yy_chk[3442] = +static yyconst short int yy_chk[3455] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -939,9 +943,9 @@ static yyconst short int yy_chk[3442] = 26, 26, 104, 71, 71, 12, 71, 104, 111, 68, 69, 24, 27, 27, 27, 27, 27, 27, 38, 112, 38, 38, 38, 38, 38, 38, 38, 38, 40, 102, - 534, 112, 7, 7, 7, 7, 7, 7, 7, 7, + 541, 112, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 116, 8, 520, 40, 40, 122, 116, + 8, 8, 8, 116, 8, 536, 40, 40, 122, 116, 40, 169, 111, 122, 40, 48, 169, 40, 48, 48, 48, 48, 48, 48, 48, 48, 78, 78, 78, 78, @@ -955,17 +959,17 @@ static yyconst short int yy_chk[3442] = 141, 153, 213, 162, 9, 10, 10, 10, 10, 10, 49, 84, 168, 171, 10, 10, 10, 73, 56, 73, - 140, 73, 518, 73, 73, 139, 508, 73, 10, 171, + 140, 73, 525, 73, 73, 139, 461, 73, 10, 171, 84, 87, 87, 87, 87, 87, 87, 87, 87, 73, 73, 73, 93, 93, 93, 93, 93, 93, 10, 18, 91, 91, 91, 91, 91, 91, 91, 91, 168, 18, 87, 140, 18, 18, 18, 18, 18, 18, 18, 18, 25, 179, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 210, 507, 173, 25, 25, 25, 25, 25, 92, + 25, 210, 461, 173, 25, 25, 25, 25, 25, 92, 92, 92, 92, 92, 92, 92, 92, 173, 175, 183, 250, 25, 179, 25, 25, 25, 25, 25, 25, 31, - 204, 175, 198, 31, 505, 31, 204, 250, 31, 31, + 204, 175, 198, 31, 524, 31, 204, 250, 31, 31, 183, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 210, 198, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, @@ -974,7 +978,7 @@ static yyconst short int yy_chk[3442] = 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 187, 187, 187, 33, 33, 33, 33, 33, 118, 118, 118, 118, 118, 118, 118, 118, 211, 211, 288, 136, - 136, 504, 33, 33, 33, 33, 33, 33, 37, 37, + 136, 522, 33, 33, 33, 33, 33, 33, 37, 37, 37, 190, 37, 254, 37, 37, 214, 81, 37, 81, 190, 81, 214, 81, 81, 339, 225, 81, 227, 227, @@ -982,324 +986,325 @@ static yyconst short int yy_chk[3442] = 81, 81, 136, 41, 254, 288, 41, 41, 41, 41, 41, 41, 41, 41, 83, 339, 83, 212, 83, 238, 83, 83, 105, 105, 83, 86, 105, 86, 336, 86, - 105, 86, 86, 105, 212, 86, 83, 83, 83, 500, - 229, 229, 492, 336, 41, 57, 245, 86, 86, 86, + 105, 86, 86, 105, 212, 86, 83, 83, 83, 511, + 229, 229, 510, 336, 41, 57, 245, 86, 86, 86, 229, 245, 119, 249, 280, 57, 119, 119, 57, 57, 57, 57, 57, 57, 57, 57, 88, 88, 88, 88, - 88, 88, 88, 88, 119, 490, 280, 334, 88, 88, + 88, 88, 88, 88, 119, 508, 280, 334, 88, 88, 88, 88, 88, 128, 128, 128, 128, 128, 128, 128, - 128, 252, 486, 119, 351, 351, 252, 88, 88, 88, + 128, 252, 507, 119, 351, 351, 252, 88, 88, 88, 88, 88, 88, 96, 96, 96, 96, 96, 96, 96, 96, 283, 249, 290, 263, 96, 96, 96, 96, 96, - 121, 474, 121, 263, 121, 334, 121, 121, 284, 290, + 121, 503, 121, 263, 121, 334, 121, 121, 284, 290, 121, 267, 285, 283, 96, 96, 96, 96, 96, 96, 267, 285, 121, 121, 121, 132, 289, 145, 132, 132, 284, 145, 291, 268, 268, 132, 289, 145, 309, 323, - 327, 291, 174, 268, 378, 378, 174, 309, 132, 145, + 327, 291, 174, 268, 397, 397, 174, 309, 132, 145, 145, 146, 174, 146, 146, 146, 146, 146, 146, 146, - 146, 323, 327, 473, 174, 174, 178, 178, 178, 178, + 146, 323, 327, 494, 174, 174, 178, 178, 178, 178, 178, 178, 178, 178, 182, 310, 182, 182, 182, 182, 182, 182, 146, 147, 310, 147, 147, 147, 147, 147, - 147, 147, 147, 463, 329, 178, 186, 186, 186, 186, + 147, 147, 147, 492, 329, 178, 186, 186, 186, 186, 186, 186, 186, 186, 186, 182, 191, 191, 191, 191, 191, 191, 191, 191, 147, 148, 329, 148, 148, 148, 148, 148, 148, 148, 148, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 194, 235, - 235, 235, 235, 235, 235, 461, 148, 149, 460, 149, + 235, 235, 235, 235, 235, 488, 148, 149, 476, 149, - 149, 149, 149, 149, 149, 149, 149, 269, 269, 459, + 149, 149, 149, 149, 149, 149, 149, 269, 269, 475, 331, 149, 149, 149, 149, 149, 196, 269, 196, 196, - 196, 196, 196, 196, 196, 196, 331, 397, 397, 337, + 196, 196, 196, 196, 196, 196, 331, 411, 411, 337, 149, 149, 149, 149, 149, 149, 152, 152, 152, 152, - 152, 152, 152, 152, 152, 337, 411, 411, 152, 152, + 152, 152, 152, 152, 152, 337, 412, 412, 152, 152, 152, 152, 152, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 373, 374, 379, 458, 379, 152, 152, 152, + 220, 220, 373, 374, 379, 465, 379, 152, 152, 152, 152, 152, 152, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 456, 373, 374, 154, 154, 154, 154, + 154, 154, 154, 463, 373, 374, 154, 154, 154, 154, 154, 226, 226, 226, 226, 226, 226, 226, 226, 277, 277, 277, 277, 277, 277, 154, 154, 154, 154, 154, - 154, 155, 155, 155, 155, 155, 155, 155, 155, 412, - 412, 415, 415, 155, 155, 155, 155, 155, 228, 228, - 228, 228, 228, 228, 228, 228, 446, 446, 439, 271, - 271, 438, 155, 155, 155, 155, 155, 155, 180, 271, + 154, 155, 155, 155, 155, 155, 155, 155, 155, 415, + 415, 424, 462, 155, 155, 155, 155, 155, 228, 228, + 228, 228, 228, 228, 228, 228, 424, 447, 447, 271, + 271, 460, 155, 155, 155, 155, 155, 155, 180, 271, 180, 180, 180, 180, 180, 180, 180, 180, 232, 232, - 232, 232, 232, 232, 232, 232, 434, 346, 232, 234, - 234, 234, 234, 234, 234, 234, 234, 346, 425, 180, + 232, 232, 232, 232, 232, 232, 459, 346, 232, 234, + 234, 234, 234, 234, 234, 234, 234, 346, 457, 180, 181, 348, 181, 181, 181, 181, 181, 181, 181, 181, 237, 348, 237, 237, 237, 237, 237, 237, 237, 237, 311, 311, 253, 253, 253, 253, 253, 253, 253, 253, 311, 181, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 312, 312, 424, 192, 192, 192, 192, + 192, 192, 192, 312, 312, 440, 192, 192, 192, 192, 192, 253, 257, 312, 257, 257, 257, 257, 257, 257, - 416, 457, 457, 481, 481, 192, 192, 192, 192, 192, + 416, 458, 458, 483, 483, 192, 192, 192, 192, 192, 192, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 335, 416, 257, 195, 195, 195, 195, 195, 264, - 335, 264, 264, 264, 264, 264, 264, 264, 264, 420, - 314, 314, 404, 195, 195, 195, 195, 195, 195, 215, + 335, 264, 264, 264, 264, 264, 264, 264, 264, 439, + 314, 314, 435, 195, 195, 195, 195, 195, 195, 215, 314, 215, 215, 215, 215, 215, 215, 215, 215, 265, 418, 265, 265, 265, 265, 265, 265, 265, 265, 266, 360, 266, 266, 266, 266, 266, 266, 266, 266, 360, 215, 216, 418, 216, 216, 216, 216, 216, 216, 216, 216, 270, 270, 270, 270, 270, 270, 270, 270, 274, - 274, 274, 274, 274, 274, 274, 274, 511, 511, 274, - 390, 427, 216, 217, 386, 217, 217, 217, 217, 217, + 274, 274, 274, 274, 274, 274, 274, 496, 496, 274, + 426, 428, 216, 217, 425, 217, 217, 217, 217, 217, 217, 217, 217, 276, 276, 276, 276, 276, 276, 276, 276, 279, 361, 279, 279, 279, 279, 279, 279, 279, - 279, 361, 427, 381, 217, 230, 230, 230, 230, 230, + 279, 361, 428, 420, 217, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 377, 376, 375, + 233, 233, 233, 233, 233, 233, 233, 514, 514, 404, 233, 233, 233, 233, 233, 298, 298, 298, 298, 298, 298, 298, 298, 301, 301, 301, 301, 301, 301, 233, 233, 233, 233, 233, 233, 236, 236, 236, 236, 236, - 236, 236, 236, 236, 236, 344, 343, 333, 236, 236, + 236, 236, 236, 236, 236, 390, 386, 381, 236, 236, 236, 236, 236, 300, 300, 300, 300, 300, 300, 300, 300, 320, 320, 320, 320, 320, 320, 236, 236, 236, 236, 236, 236, 255, 391, 255, 255, 255, 255, 255, 255, 255, 255, 303, 391, 303, 303, 303, 303, 303, 303, 303, 303, 304, 304, 304, 304, 304, 304, 304, - 304, 332, 326, 325, 255, 256, 392, 256, 256, 256, + 304, 377, 376, 375, 255, 256, 392, 256, 256, 256, 256, 256, 256, 256, 256, 306, 392, 306, 306, 306, 306, 306, 306, 306, 306, 307, 408, 307, 307, 307, 307, 307, 307, 307, 307, 408, 256, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 409, 305, 297, 262, + 262, 262, 262, 262, 262, 262, 409, 423, 344, 262, 262, 262, 262, 262, 308, 409, 308, 308, 308, 308, 308, 308, 354, 354, 354, 354, 354, 354, 262, 262, 262, 262, 262, 262, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 296, 295, 287, 275, + 275, 275, 275, 275, 275, 275, 343, 333, 423, 275, 275, 275, 275, 275, 313, 313, 313, 313, 313, 313, 313, 313, 371, 371, 371, 371, 371, 371, 275, 275, 275, 275, 275, 275, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 286, 423, 282, 278, 278, 278, + 278, 278, 278, 278, 332, 326, 325, 278, 278, 278, 278, 278, 317, 317, 317, 317, 317, 317, 317, 317, - 423, 281, 317, 261, 260, 259, 278, 278, 278, 278, + 305, 297, 317, 296, 378, 378, 278, 278, 278, 278, 278, 278, 292, 292, 292, 292, 292, 292, 292, 292, 292, 319, 319, 319, 319, 319, 319, 319, 319, 322, - 394, 322, 322, 322, 322, 322, 322, 322, 322, 495, - 394, 522, 292, 293, 293, 293, 293, 293, 293, 293, + 394, 322, 322, 322, 322, 322, 322, 322, 322, 498, + 394, 527, 292, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 258, 248, 338, 338, 338, 338, 338, 338, - 338, 338, 342, 342, 342, 342, 342, 342, 342, 247, - 495, 246, 522, 293, 294, 294, 294, 294, 294, 294, + 293, 293, 378, 295, 338, 338, 338, 338, 338, 338, + 338, 338, 342, 342, 342, 342, 342, 342, 342, 287, + 498, 286, 527, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 338, 345, 345, 345, 345, 345, 345, 345, 345, 342, 347, 347, 347, 347, 347, 347, 347, - 347, 244, 243, 242, 294, 299, 440, 299, 299, 299, - 299, 299, 299, 299, 299, 299, 440, 241, 240, 299, + 347, 282, 281, 261, 294, 299, 441, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 441, 260, 259, 299, 299, 299, 299, 299, 353, 353, 353, 353, 353, 353, 353, 353, 400, 400, 400, 400, 400, 400, 299, 299, 299, 299, 299, 299, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 224, 223, 222, 302, 302, 302, 302, - 302, 356, 441, 356, 356, 356, 356, 356, 356, 356, - 356, 221, 441, 219, 218, 302, 302, 302, 302, 302, + 302, 302, 302, 258, 248, 247, 302, 302, 302, 302, + 302, 356, 442, 356, 356, 356, 356, 356, 356, 356, + 356, 246, 442, 244, 243, 302, 302, 302, 302, 302, 302, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 209, 208, 207, 318, 318, 318, 318, - 318, 357, 443, 357, 357, 357, 357, 357, 357, 357, - 357, 206, 443, 205, 203, 318, 318, 318, 318, 318, + 318, 318, 318, 242, 241, 240, 318, 318, 318, 318, + 318, 357, 444, 357, 357, 357, 357, 357, 357, 357, + 357, 224, 444, 223, 222, 318, 318, 318, 318, 318, 318, 321, 321, 321, 321, 321, 321, 321, 321, 321, - 362, 362, 202, 201, 321, 321, 321, 321, 321, 358, + 362, 362, 221, 219, 321, 321, 321, 321, 321, 358, - 362, 358, 358, 358, 358, 358, 358, 358, 358, 200, - 199, 197, 189, 321, 321, 321, 321, 321, 321, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 359, 188, + 362, 358, 358, 358, 358, 358, 358, 358, 358, 218, + 209, 208, 207, 321, 321, 321, 321, 321, 321, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 359, 206, 359, 359, 359, 359, 359, 359, 359, 359, 363, 363, 364, 364, 364, 364, 364, 364, 364, 364, 363, 340, 341, 341, 341, 341, 341, 341, 341, 341, 341, 365, 365, 368, 368, 368, 368, 368, 368, 368, 368, 365, - 185, 368, 370, 370, 370, 370, 370, 370, 370, 370, - 341, 349, 184, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 352, 177, 352, 352, 352, 352, 352, 352, + 205, 368, 370, 370, 370, 370, 370, 370, 370, 370, + 341, 349, 203, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 352, 202, 352, 352, 352, 352, 352, 352, - 352, 352, 352, 455, 176, 170, 352, 352, 352, 352, - 352, 372, 455, 372, 372, 372, 372, 372, 372, 372, - 372, 167, 166, 165, 164, 352, 352, 352, 352, 352, + 352, 352, 352, 456, 201, 200, 352, 352, 352, 352, + 352, 372, 456, 372, 372, 372, 372, 372, 372, 372, + 372, 199, 197, 189, 188, 352, 352, 352, 352, 352, 352, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 163, 161, 160, 355, 355, 355, 355, 355, 387, 475, - 387, 387, 387, 387, 387, 387, 387, 387, 159, 475, - 158, 157, 355, 355, 355, 355, 355, 355, 366, 366, + 185, 184, 177, 355, 355, 355, 355, 355, 387, 477, + 387, 387, 387, 387, 387, 387, 387, 387, 176, 477, + 170, 167, 355, 355, 355, 355, 355, 355, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 369, - 369, 369, 369, 369, 369, 369, 369, 369, 369, 156, - 410, 410, 151, 369, 369, 369, 369, 369, 380, 388, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 166, + 410, 410, 165, 369, 369, 369, 369, 369, 380, 388, - 410, 388, 388, 388, 388, 388, 388, 388, 388, 476, - 422, 422, 369, 369, 369, 369, 369, 369, 380, 476, + 410, 388, 388, 388, 388, 388, 388, 388, 388, 478, + 422, 422, 369, 369, 369, 369, 369, 369, 380, 478, 380, 380, 389, 422, 389, 389, 389, 389, 389, 389, - 389, 389, 449, 449, 449, 449, 449, 449, 150, 380, - 382, 144, 382, 382, 382, 382, 382, 382, 382, 382, + 389, 389, 450, 450, 450, 450, 450, 450, 164, 380, + 382, 163, 382, 382, 382, 382, 382, 382, 382, 382, 393, 393, 393, 393, 393, 393, 393, 393, 399, 399, - 399, 399, 399, 399, 399, 399, 143, 142, 138, 137, - 135, 382, 383, 478, 383, 383, 383, 383, 383, 383, - 383, 383, 402, 478, 402, 402, 402, 402, 402, 402, + 399, 399, 399, 399, 399, 399, 161, 160, 159, 158, + 157, 382, 383, 480, 383, 383, 383, 383, 383, 383, + 383, 383, 402, 480, 402, 402, 402, 402, 402, 402, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, - 131, 124, 120, 383, 384, 506, 384, 384, 384, 384, - 384, 384, 384, 384, 405, 506, 405, 405, 405, 405, - 405, 405, 405, 405, 406, 117, 406, 406, 406, 406, - 406, 406, 406, 406, 421, 384, 385, 110, 385, 385, - 385, 385, 385, 385, 385, 385, 407, 109, 407, 407, - 407, 407, 407, 407, 421, 108, 421, 421, 107, 432, - 106, 432, 432, 432, 101, 100, 98, 385, 395, 94, + 156, 151, 150, 383, 384, 509, 384, 384, 384, 384, + 384, 384, 384, 384, 405, 509, 405, 405, 405, 405, + 405, 405, 405, 405, 406, 144, 406, 406, 406, 406, + 406, 406, 406, 406, 421, 384, 385, 143, 385, 385, + 385, 385, 385, 385, 385, 385, 407, 142, 407, 407, + 407, 407, 407, 407, 421, 138, 421, 421, 137, 433, + 135, 433, 433, 433, 131, 124, 120, 385, 395, 117, 395, 395, 395, 395, 395, 395, 395, 395, 395, 398, - 90, 398, 398, 398, 398, 398, 398, 398, 398, 398, - 432, 89, 85, 398, 398, 398, 398, 398, 426, 426, - - 426, 426, 426, 426, 426, 426, 484, 484, 484, 484, - 484, 484, 398, 398, 398, 398, 398, 398, 401, 401, - 401, 401, 401, 401, 401, 401, 401, 426, 82, 80, - 401, 401, 401, 401, 401, 433, 433, 433, 433, 433, - 433, 433, 433, 529, 529, 529, 529, 529, 529, 401, + 110, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 433, 109, 108, 398, 398, 398, 398, 398, 427, 427, + + 427, 427, 427, 427, 427, 427, 486, 486, 486, 486, + 486, 486, 398, 398, 398, 398, 398, 398, 401, 401, + 401, 401, 401, 401, 401, 401, 401, 427, 107, 106, + 401, 401, 401, 401, 401, 434, 434, 434, 434, 434, + 434, 434, 434, 534, 534, 534, 534, 534, 534, 401, 401, 401, 401, 401, 401, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 428, 76, 428, 428, 428, - 428, 428, 428, 428, 428, 435, 75, 435, 435, 435, - 435, 435, 435, 435, 435, 436, 74, 436, 436, 436, - 436, 436, 436, 436, 436, 72, 428, 429, 67, 429, - - 429, 429, 429, 429, 429, 429, 429, 437, 60, 437, - 437, 437, 437, 437, 437, 442, 442, 442, 442, 442, - 442, 442, 442, 53, 47, 46, 45, 44, 429, 430, - 43, 430, 430, 430, 430, 430, 430, 430, 430, 448, - 448, 448, 448, 448, 448, 448, 448, 451, 42, 451, - 451, 451, 451, 451, 451, 451, 451, 36, 35, 34, - 430, 431, 32, 431, 431, 431, 431, 431, 431, 431, - 431, 452, 452, 452, 452, 452, 452, 452, 452, 452, - 453, 453, 453, 453, 453, 453, 453, 453, 453, 28, - 22, 19, 431, 444, 17, 444, 444, 444, 444, 444, - - 444, 444, 444, 444, 447, 15, 447, 447, 447, 447, - 447, 447, 447, 447, 447, 14, 13, 0, 447, 447, - 447, 447, 447, 454, 454, 454, 454, 454, 454, 454, - 454, 454, 469, 469, 469, 0, 0, 447, 447, 447, - 447, 447, 447, 450, 450, 450, 450, 450, 450, 450, - 450, 0, 0, 0, 0, 450, 450, 450, 450, 450, - 462, 469, 462, 0, 462, 0, 462, 462, 0, 0, - 462, 0, 0, 0, 450, 450, 450, 450, 450, 450, - 0, 0, 462, 462, 462, 464, 0, 464, 0, 464, - 0, 464, 464, 0, 0, 464, 468, 468, 468, 468, - - 468, 468, 468, 468, 0, 0, 0, 464, 464, 464, - 465, 0, 465, 465, 465, 465, 465, 465, 465, 465, - 0, 0, 0, 0, 470, 468, 470, 470, 470, 470, - 470, 470, 470, 470, 489, 489, 489, 489, 489, 489, - 489, 465, 466, 0, 466, 466, 466, 466, 466, 466, - 466, 466, 471, 0, 471, 471, 471, 471, 471, 471, - 471, 471, 472, 0, 472, 472, 472, 472, 472, 472, - 472, 472, 0, 466, 467, 0, 467, 467, 467, 467, - 467, 467, 467, 467, 477, 477, 477, 477, 477, 477, - 477, 477, 483, 483, 483, 483, 483, 483, 483, 483, - - 0, 0, 0, 0, 0, 467, 479, 0, 479, 479, - 479, 479, 479, 479, 479, 479, 479, 482, 0, 482, - 482, 482, 482, 482, 482, 482, 482, 0, 0, 0, - 0, 482, 482, 482, 482, 482, 485, 0, 485, 485, - 485, 485, 485, 485, 485, 485, 0, 0, 0, 0, - 482, 482, 482, 482, 482, 482, 487, 487, 487, 487, - 487, 487, 487, 487, 487, 488, 488, 488, 488, 488, - 488, 488, 488, 488, 494, 494, 494, 494, 494, 494, - 494, 494, 0, 498, 0, 498, 498, 498, 498, 498, - 498, 499, 499, 499, 499, 499, 499, 499, 499, 0, - - 0, 0, 0, 494, 496, 0, 496, 496, 496, 496, - 496, 496, 496, 496, 498, 501, 0, 501, 501, 501, - 501, 501, 501, 501, 501, 502, 0, 502, 502, 502, - 502, 502, 502, 502, 502, 496, 497, 0, 497, 497, - 497, 497, 497, 497, 497, 497, 503, 0, 503, 503, - 503, 503, 503, 503, 509, 0, 509, 509, 509, 509, - 509, 509, 509, 509, 0, 0, 0, 497, 512, 0, - 512, 512, 512, 512, 512, 512, 512, 512, 515, 515, - 515, 515, 515, 515, 515, 515, 516, 516, 516, 516, - 516, 516, 516, 516, 0, 0, 0, 0, 0, 512, - - 513, 0, 513, 513, 513, 513, 513, 513, 513, 513, - 517, 517, 517, 517, 517, 517, 517, 517, 521, 521, - 521, 521, 521, 521, 521, 521, 0, 0, 0, 0, - 0, 513, 514, 0, 514, 514, 514, 514, 514, 514, - 514, 514, 0, 0, 0, 0, 525, 521, 525, 525, - 525, 525, 525, 525, 527, 527, 527, 527, 527, 527, - 527, 527, 0, 514, 523, 0, 523, 523, 523, 523, - 523, 523, 523, 523, 0, 0, 0, 525, 528, 528, - 528, 528, 528, 528, 528, 528, 531, 531, 531, 531, - 531, 531, 531, 531, 0, 523, 524, 0, 524, 524, - - 524, 524, 524, 524, 524, 524, 532, 532, 532, 532, - 532, 532, 532, 532, 0, 531, 533, 533, 533, 533, - 533, 533, 533, 533, 0, 0, 0, 524, 536, 536, - 536, 536, 536, 536, 0, 532, 535, 535, 535, 535, - 535, 535, 535, 535, 0, 533, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 536, 0, 0, - 0, 0, 0, 0, 0, 535, 538, 538, 538, 538, - 538, 538, 538, 538, 538, 538, 538, 538, 538, 539, - 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, - 539, 539, 540, 540, 540, 540, 540, 540, 540, 540, - - 540, 540, 540, 540, 540, 541, 541, 541, 541, 541, - 541, 541, 541, 541, 541, 541, 541, 541, 542, 0, - 0, 0, 542, 0, 542, 542, 542, 0, 542, 542, - 542, 543, 543, 543, 543, 543, 543, 543, 543, 543, - 543, 543, 543, 543, 544, 0, 0, 0, 544, 0, - 544, 544, 544, 0, 544, 544, 544, 545, 0, 0, - 0, 545, 0, 545, 545, 545, 0, 545, 545, 545, - 546, 0, 0, 546, 546, 0, 546, 546, 546, 0, - 546, 546, 546, 547, 547, 0, 0, 547, 548, 0, - 0, 548, 548, 0, 548, 548, 548, 0, 548, 548, - - 548, 549, 0, 0, 549, 549, 549, 549, 549, 549, - 0, 0, 549, 549, 550, 550, 551, 0, 0, 551, - 0, 0, 551, 551, 551, 551, 551, 551, 551, 552, - 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, - 552, 552, 553, 553, 0, 553, 0, 553, 553, 553, - 553, 553, 553, 553, 553, 554, 554, 554, 554, 554, - 554, 554, 554, 554, 554, 554, 554, 554, 555, 555, - 0, 555, 555, 555, 555, 555, 555, 555, 555, 555, - 555, 556, 0, 0, 556, 556, 0, 556, 556, 556, - 0, 556, 556, 556, 557, 557, 0, 0, 557, 558, - - 558, 558, 0, 0, 558, 559, 0, 0, 559, 559, - 0, 559, 559, 559, 0, 559, 559, 559, 560, 560, - 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, - 560, 561, 561, 0, 0, 561, 562, 562, 562, 0, - 0, 562, 563, 563, 0, 0, 563, 564, 564, 0, - 0, 564, 565, 565, 0, 0, 565, 566, 566, 566, - 0, 0, 566, 567, 567, 0, 0, 567, 568, 568, - 0, 0, 568, 569, 569, 0, 0, 569, 570, 570, - 570, 0, 0, 570, 571, 571, 571, 571, 0, 0, - 571, 572, 572, 0, 0, 572, 573, 573, 0, 0, - - 573, 574, 574, 0, 0, 574, 575, 575, 575, 0, - 0, 575, 576, 576, 576, 576, 0, 0, 576, 577, - 577, 0, 0, 577, 578, 578, 0, 0, 578, 579, - 579, 579, 0, 0, 579, 580, 580, 580, 580, 0, - 0, 580, 581, 581, 0, 0, 581, 582, 0, 582, - 582, 0, 0, 582, 583, 583, 583, 0, 0, 583, - 584, 584, 584, 584, 0, 0, 584, 585, 585, 0, - 0, 585, 586, 0, 586, 586, 0, 0, 586, 587, - 587, 587, 0, 0, 587, 588, 588, 588, 0, 0, - 0, 588, 589, 0, 0, 0, 589, 0, 589, 589, - - 589, 0, 589, 589, 589, 590, 0, 0, 0, 590, - 0, 590, 590, 590, 0, 590, 590, 590, 591, 591, - 0, 0, 591, 592, 0, 592, 592, 0, 0, 592, - 593, 593, 0, 0, 0, 593, 594, 594, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, - 595, 0, 0, 595, 596, 0, 596, 596, 0, 0, - 596, 597, 597, 0, 0, 597, 598, 0, 598, 0, - 0, 0, 598, 599, 0, 0, 0, 599, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537 + 413, 413, 413, 413, 413, 429, 101, 429, 429, 429, + 429, 429, 429, 429, 429, 436, 100, 436, 436, 436, + 436, 436, 436, 436, 436, 437, 98, 437, 437, 437, + 437, 437, 437, 437, 437, 94, 429, 430, 90, 430, + + 430, 430, 430, 430, 430, 430, 430, 438, 89, 438, + 438, 438, 438, 438, 438, 443, 443, 443, 443, 443, + 443, 443, 443, 85, 82, 80, 76, 75, 430, 431, + 74, 431, 431, 431, 431, 431, 431, 431, 431, 449, + 449, 449, 449, 449, 449, 449, 449, 452, 72, 452, + 452, 452, 452, 452, 452, 452, 452, 67, 60, 53, + 431, 432, 47, 432, 432, 432, 432, 432, 432, 432, + 432, 453, 453, 453, 453, 453, 453, 453, 453, 453, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 46, + 45, 44, 432, 445, 43, 445, 445, 445, 445, 445, + + 445, 445, 445, 445, 448, 42, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 36, 35, 34, 448, 448, + 448, 448, 448, 455, 455, 455, 455, 455, 455, 455, + 455, 455, 471, 471, 471, 32, 28, 448, 448, 448, + 448, 448, 448, 451, 451, 451, 451, 451, 451, 451, + 451, 22, 515, 515, 19, 451, 451, 451, 451, 451, + 464, 471, 464, 17, 464, 515, 464, 464, 15, 14, + 464, 13, 0, 0, 451, 451, 451, 451, 451, 451, + 0, 0, 464, 464, 464, 466, 0, 466, 0, 466, + 0, 466, 466, 0, 0, 466, 470, 470, 470, 470, + + 470, 470, 470, 470, 0, 0, 0, 466, 466, 466, + 467, 0, 467, 467, 467, 467, 467, 467, 467, 467, + 0, 0, 0, 0, 472, 470, 472, 472, 472, 472, + 472, 472, 472, 472, 491, 491, 491, 491, 491, 491, + 491, 467, 468, 0, 468, 468, 468, 468, 468, 468, + 468, 468, 473, 0, 473, 473, 473, 473, 473, 473, + 473, 473, 474, 0, 474, 474, 474, 474, 474, 474, + 474, 474, 0, 468, 469, 0, 469, 469, 469, 469, + 469, 469, 469, 469, 479, 479, 479, 479, 479, 479, + 479, 479, 485, 485, 485, 485, 485, 485, 485, 485, + + 0, 0, 0, 0, 0, 469, 481, 0, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 484, 0, 484, + 484, 484, 484, 484, 484, 484, 484, 0, 0, 0, + 0, 484, 484, 484, 484, 484, 487, 0, 487, 487, + 487, 487, 487, 487, 487, 487, 0, 0, 0, 0, + 484, 484, 484, 484, 484, 484, 489, 489, 489, 489, + 489, 489, 489, 489, 489, 490, 490, 490, 490, 490, + 490, 490, 490, 490, 497, 497, 497, 497, 497, 497, + 497, 497, 0, 501, 0, 501, 501, 501, 501, 501, + 501, 502, 502, 502, 502, 502, 502, 502, 502, 0, + + 0, 0, 0, 497, 499, 0, 499, 499, 499, 499, + 499, 499, 499, 499, 501, 504, 0, 504, 504, 504, + 504, 504, 504, 504, 504, 505, 0, 505, 505, 505, + 505, 505, 505, 505, 505, 499, 500, 0, 500, 500, + 500, 500, 500, 500, 500, 500, 506, 0, 506, 506, + 506, 506, 506, 506, 512, 0, 512, 512, 512, 512, + 512, 512, 512, 512, 0, 0, 0, 500, 516, 0, + 516, 516, 516, 516, 516, 516, 516, 516, 519, 519, + 519, 519, 519, 519, 519, 519, 520, 520, 520, 520, + 520, 520, 520, 520, 0, 0, 0, 0, 0, 516, + + 517, 0, 517, 517, 517, 517, 517, 517, 517, 517, + 521, 521, 521, 521, 521, 521, 521, 521, 526, 526, + 526, 526, 526, 526, 526, 526, 0, 0, 0, 0, + 0, 517, 518, 0, 518, 518, 518, 518, 518, 518, + 518, 518, 0, 0, 0, 0, 530, 526, 530, 530, + 530, 530, 530, 530, 532, 532, 532, 532, 532, 532, + 532, 532, 0, 518, 528, 0, 528, 528, 528, 528, + 528, 528, 528, 528, 0, 0, 0, 530, 533, 533, + 533, 533, 533, 533, 533, 533, 538, 538, 538, 538, + 538, 538, 538, 538, 0, 528, 529, 0, 529, 529, + + 529, 529, 529, 529, 529, 529, 539, 539, 539, 539, + 539, 539, 539, 539, 0, 538, 540, 540, 540, 540, + 540, 540, 540, 540, 0, 0, 0, 529, 543, 543, + 543, 543, 543, 543, 0, 539, 542, 542, 542, 542, + 542, 542, 542, 542, 0, 540, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, + 0, 0, 0, 0, 0, 542, 545, 545, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 546, + 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, + 546, 546, 547, 547, 547, 547, 547, 547, 547, 547, + + 547, 547, 547, 547, 547, 548, 548, 548, 548, 548, + 548, 548, 548, 548, 548, 548, 548, 548, 549, 0, + 0, 0, 549, 0, 549, 549, 549, 0, 549, 549, + 549, 550, 550, 550, 550, 550, 550, 550, 550, 550, + 550, 550, 550, 550, 551, 0, 0, 0, 551, 0, + 551, 551, 551, 0, 551, 551, 551, 552, 0, 0, + 0, 552, 0, 552, 552, 552, 0, 552, 552, 552, + 553, 0, 0, 553, 553, 0, 553, 553, 553, 0, + 553, 553, 553, 554, 554, 0, 0, 554, 555, 0, + 0, 555, 555, 0, 555, 555, 555, 0, 555, 555, + + 555, 556, 0, 0, 556, 556, 556, 556, 556, 556, + 0, 0, 556, 556, 557, 557, 558, 0, 0, 558, + 0, 0, 558, 558, 558, 558, 558, 558, 558, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 560, 560, 0, 560, 0, 560, 560, 560, + 560, 560, 560, 560, 560, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 561, 561, 561, 561, 562, 562, + 0, 562, 562, 562, 562, 562, 562, 562, 562, 562, + 562, 563, 0, 0, 563, 563, 0, 563, 563, 563, + 0, 563, 563, 563, 564, 564, 0, 0, 564, 565, + + 565, 565, 0, 0, 565, 566, 0, 0, 566, 566, + 0, 566, 566, 566, 0, 566, 566, 566, 567, 567, + 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, + 567, 568, 568, 0, 0, 568, 569, 569, 569, 0, + 0, 569, 570, 570, 0, 0, 570, 571, 571, 0, + 0, 571, 572, 572, 0, 0, 572, 573, 573, 573, + 0, 0, 573, 574, 574, 0, 0, 574, 575, 575, + 0, 0, 575, 576, 576, 0, 0, 576, 577, 577, + 577, 0, 0, 577, 578, 578, 578, 578, 0, 0, + 578, 579, 579, 0, 0, 579, 580, 580, 0, 0, + + 580, 581, 581, 0, 0, 581, 582, 582, 582, 0, + 0, 582, 583, 583, 583, 583, 0, 0, 583, 584, + 584, 0, 0, 584, 585, 585, 0, 0, 585, 586, + 586, 586, 0, 0, 586, 587, 587, 587, 587, 0, + 0, 587, 588, 588, 0, 0, 588, 589, 0, 589, + 589, 0, 0, 589, 590, 590, 590, 0, 0, 590, + 591, 591, 591, 591, 0, 0, 591, 592, 592, 0, + 0, 592, 593, 0, 593, 593, 0, 0, 593, 594, + 594, 594, 0, 0, 594, 595, 595, 595, 0, 0, + 0, 595, 596, 0, 0, 0, 596, 0, 596, 596, + + 596, 0, 596, 596, 596, 597, 0, 0, 0, 597, + 0, 597, 597, 597, 0, 597, 597, 597, 598, 598, + 0, 0, 598, 599, 0, 599, 599, 0, 0, 599, + 600, 600, 0, 0, 0, 600, 601, 601, 601, 601, + 601, 601, 601, 601, 601, 601, 601, 601, 601, 602, + 602, 0, 0, 602, 603, 0, 603, 603, 0, 0, + 603, 604, 604, 0, 0, 604, 605, 0, 605, 0, + 0, 0, 605, 606, 0, 0, 0, 606, 607, 607, + 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, + 607, 544, 544, 544, 544, 544, 544, 544, 544, 544, + + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544 } ; static yy_state_type yy_last_accepting_state; @@ -1344,6 +1349,7 @@ char *yytext; #include #include +#include #include #ifdef STDC_HEADERS # include @@ -1367,6 +1373,7 @@ char *yytext; # include #endif /* HAVE_MALLOC_H && !STDC_HEADERS */ #include +#include #include "sudo.h" #include "parse.h" #include @@ -1386,15 +1393,16 @@ static int append __P((char *, int)); static int _fill __P((char *, int, int)); static int fill_cmnd __P((char *, int)); static int fill_args __P((char *, int, int)); -static int switch_buffer __P((char *)); +static int _push_include __P((char *, int)); +static int pop_include __P((void)); static int ipv6_valid __P((const char *s)); static char *parse_include __P((char *)); extern void yyerror __P((const char *)); #define fill(a, b) _fill(a, b, 0) -#define push_include(_p) (switch_buffer((_p))) -#define pop_include() (switch_buffer(NULL)) +#define push_include(_p) (_push_include((_p), FALSE)) +#define push_includedir(_p) (_push_include((_p), TRUE)) /* realloc() to size + COMMANDARGINC to make room for command args */ #define COMMANDARGINC 64 @@ -1415,7 +1423,7 @@ extern void yyerror __P((const char *)); #define INSTR 5 -#line 1419 "lex.yy.c" +#line 1427 "lex.yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1569,9 +1577,9 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 113 "toke.l" +#line 116 "toke.l" -#line 1575 "lex.yy.c" +#line 1583 "lex.yy.c" if ( yy_init ) { @@ -1623,13 +1631,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 538 ) + if ( yy_current_state >= 545 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 3379 ); + while ( yy_base[yy_current_state] != 3392 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1657,12 +1665,12 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 114 "toke.l" +#line 117 "toke.l" BEGIN STARTDEFS; YY_BREAK case 2: YY_RULE_SETUP -#line 116 "toke.l" +#line 119 "toke.l" { BEGIN INDEFS; LEXTRACE("DEFVAR "); @@ -1674,7 +1682,7 @@ YY_RULE_SETUP case 3: YY_RULE_SETUP -#line 125 "toke.l" +#line 128 "toke.l" { BEGIN STARTDEFS; LEXTRACE(", "); @@ -1683,7 +1691,7 @@ YY_RULE_SETUP YY_BREAK case 4: YY_RULE_SETUP -#line 131 "toke.l" +#line 134 "toke.l" { LEXTRACE("= "); return('='); @@ -1691,7 +1699,7 @@ YY_RULE_SETUP YY_BREAK case 5: YY_RULE_SETUP -#line 136 "toke.l" +#line 139 "toke.l" { LEXTRACE("+= "); return('+'); @@ -1699,7 +1707,7 @@ YY_RULE_SETUP YY_BREAK case 6: YY_RULE_SETUP -#line 141 "toke.l" +#line 144 "toke.l" { LEXTRACE("-= "); return('-'); @@ -1707,7 +1715,7 @@ YY_RULE_SETUP YY_BREAK case 7: YY_RULE_SETUP -#line 146 "toke.l" +#line 149 "toke.l" { LEXTRACE("BEGINSTR "); yylval.string = NULL; @@ -1716,7 +1724,7 @@ YY_RULE_SETUP YY_BREAK case 8: YY_RULE_SETUP -#line 152 "toke.l" +#line 155 "toke.l" { LEXTRACE("WORD(2) "); if (!fill(yytext, yyleng)) @@ -1728,7 +1736,7 @@ YY_RULE_SETUP case 9: YY_RULE_SETUP -#line 161 "toke.l" +#line 164 "toke.l" { /* Line continuation char followed by newline. */ ++sudolineno; @@ -1737,7 +1745,7 @@ YY_RULE_SETUP YY_BREAK case 10: YY_RULE_SETUP -#line 167 "toke.l" +#line 170 "toke.l" { LEXTRACE("ENDSTR "); BEGIN INDEFS; @@ -1746,7 +1754,7 @@ YY_RULE_SETUP YY_BREAK case 11: YY_RULE_SETUP -#line 173 "toke.l" +#line 176 "toke.l" { LEXTRACE("BACKSLASH "); if (!append(yytext, yyleng)) @@ -1755,7 +1763,7 @@ YY_RULE_SETUP YY_BREAK case 12: YY_RULE_SETUP -#line 179 "toke.l" +#line 182 "toke.l" { LEXTRACE("STRBODY "); if (!append(yytext, yyleng)) @@ -1766,7 +1774,7 @@ YY_RULE_SETUP case 13: YY_RULE_SETUP -#line 187 "toke.l" +#line 190 "toke.l" { /* quoted fnmatch glob char, pass verbatim */ LEXTRACE("QUOTEDCHAR "); @@ -1777,7 +1785,7 @@ YY_RULE_SETUP YY_BREAK case 14: YY_RULE_SETUP -#line 195 "toke.l" +#line 198 "toke.l" { /* quoted sudoers special char, strip backslash */ LEXTRACE("QUOTEDCHAR "); @@ -1788,7 +1796,7 @@ YY_RULE_SETUP YY_BREAK case 15: YY_RULE_SETUP -#line 203 "toke.l" +#line 206 "toke.l" { BEGIN INITIAL; yyless(0); @@ -1797,7 +1805,7 @@ YY_RULE_SETUP YY_BREAK case 16: YY_RULE_SETUP -#line 209 "toke.l" +#line 212 "toke.l" { LEXTRACE("ARG "); if (!fill_args(yytext, yyleng, sawspace)) @@ -1808,7 +1816,7 @@ YY_RULE_SETUP case 17: YY_RULE_SETUP -#line 217 "toke.l" +#line 220 "toke.l" { char *path; @@ -1824,7 +1832,23 @@ YY_RULE_SETUP YY_BREAK case 18: YY_RULE_SETUP -#line 230 "toke.l" +#line 233 "toke.l" +{ + char *path; + + if ((path = parse_include(yytext)) == NULL) + yyterminate(); + + LEXTRACE("INCLUDEDIR\n"); + + /* Push current buffer and switch to include file */ + if (!push_includedir(path)) + yyterminate(); + } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 246 "toke.l" { int n; for (n = 0; isblank((unsigned char)yytext[n]); n++) @@ -1854,9 +1878,9 @@ YY_RULE_SETUP } } YY_BREAK -case 19: +case 20: YY_RULE_SETUP -#line 259 "toke.l" +#line 275 "toke.l" { int n; for (n = 0; isblank((unsigned char)yytext[n]); n++) @@ -1877,59 +1901,59 @@ YY_RULE_SETUP } } YY_BREAK -case 20: +case 21: YY_RULE_SETUP -#line 279 "toke.l" +#line 295 "toke.l" { /* cmnd does not require passwd for this user */ LEXTRACE("NOPASSWD "); return(NOPASSWD); } YY_BREAK -case 21: +case 22: YY_RULE_SETUP -#line 285 "toke.l" +#line 301 "toke.l" { /* cmnd requires passwd for this user */ LEXTRACE("PASSWD "); return(PASSWD); } YY_BREAK -case 22: +case 23: YY_RULE_SETUP -#line 291 "toke.l" +#line 307 "toke.l" { LEXTRACE("NOEXEC "); return(NOEXEC); } YY_BREAK -case 23: +case 24: YY_RULE_SETUP -#line 296 "toke.l" +#line 312 "toke.l" { LEXTRACE("EXEC "); return(EXEC); } YY_BREAK -case 24: +case 25: YY_RULE_SETUP -#line 301 "toke.l" +#line 317 "toke.l" { LEXTRACE("SETENV "); return(SETENV); } YY_BREAK -case 25: +case 26: YY_RULE_SETUP -#line 306 "toke.l" +#line 322 "toke.l" { LEXTRACE("NOSETENV "); return(NOSETENV); } YY_BREAK -case 26: +case 27: YY_RULE_SETUP -#line 311 "toke.l" +#line 327 "toke.l" { /* netgroup */ if (!fill(yytext, yyleng)) @@ -1938,9 +1962,9 @@ YY_RULE_SETUP return(NETGROUP); } YY_BREAK -case 27: +case 28: YY_RULE_SETUP -#line 319 "toke.l" +#line 335 "toke.l" { /* UN*X group */ if (!fill(yytext, yyleng)) @@ -1949,9 +1973,9 @@ YY_RULE_SETUP return(USERGROUP); } YY_BREAK -case 28: +case 29: YY_RULE_SETUP -#line 327 "toke.l" +#line 343 "toke.l" { if (!fill(yytext, yyleng)) yyterminate(); @@ -1959,9 +1983,9 @@ YY_RULE_SETUP return(NTWKADDR); } YY_BREAK -case 29: +case 30: YY_RULE_SETUP -#line 334 "toke.l" +#line 350 "toke.l" { if (!fill(yytext, yyleng)) yyterminate(); @@ -1969,9 +1993,9 @@ YY_RULE_SETUP return(NTWKADDR); } YY_BREAK -case 30: +case 31: YY_RULE_SETUP -#line 341 "toke.l" +#line 357 "toke.l" { if (!ipv6_valid(yytext)) { LEXTRACE("ERROR "); @@ -1983,9 +2007,9 @@ YY_RULE_SETUP return(NTWKADDR); } YY_BREAK -case 31: +case 32: YY_RULE_SETUP -#line 352 "toke.l" +#line 368 "toke.l" { if (!ipv6_valid(yytext)) { LEXTRACE("ERROR "); @@ -1997,9 +2021,9 @@ YY_RULE_SETUP return(NTWKADDR); } YY_BREAK -case 32: +case 33: YY_RULE_SETUP -#line 363 "toke.l" +#line 379 "toke.l" { if (strcmp(yytext, "ALL") == 0) { LEXTRACE("ALL "); @@ -2022,9 +2046,9 @@ YY_RULE_SETUP return(ALIAS); } YY_BREAK -case 33: +case 34: YY_RULE_SETUP -#line 385 "toke.l" +#line 401 "toke.l" { /* no command args allowed for Defaults!/path */ if (!fill_cmnd(yytext, yyleng)) @@ -2033,9 +2057,9 @@ YY_RULE_SETUP return(COMMAND); } YY_BREAK -case 34: +case 35: YY_RULE_SETUP -#line 393 "toke.l" +#line 409 "toke.l" { BEGIN GOTCMND; LEXTRACE("COMMAND "); @@ -2043,9 +2067,9 @@ YY_RULE_SETUP yyterminate(); } /* sudo -e */ YY_BREAK -case 35: +case 36: YY_RULE_SETUP -#line 400 "toke.l" +#line 416 "toke.l" { /* directories can't have args... */ if (yytext[yyleng - 1] == '/') { @@ -2061,9 +2085,9 @@ YY_RULE_SETUP } } /* a pathname */ YY_BREAK -case 36: +case 37: YY_RULE_SETUP -#line 415 "toke.l" +#line 431 "toke.l" { /* a word */ if (!fill(yytext, yyleng)) @@ -2072,57 +2096,57 @@ YY_RULE_SETUP return(WORD); } YY_BREAK -case 37: +case 38: YY_RULE_SETUP -#line 423 "toke.l" +#line 439 "toke.l" { LEXTRACE("( "); return ('('); } YY_BREAK -case 38: +case 39: YY_RULE_SETUP -#line 428 "toke.l" +#line 444 "toke.l" { LEXTRACE(") "); return(')'); } YY_BREAK -case 39: +case 40: YY_RULE_SETUP -#line 433 "toke.l" +#line 449 "toke.l" { LEXTRACE(", "); return(','); } /* return ',' */ YY_BREAK -case 40: +case 41: YY_RULE_SETUP -#line 438 "toke.l" +#line 454 "toke.l" { LEXTRACE("= "); return('='); } /* return '=' */ YY_BREAK -case 41: +case 42: YY_RULE_SETUP -#line 443 "toke.l" +#line 459 "toke.l" { LEXTRACE(": "); return(':'); } /* return ':' */ YY_BREAK -case 42: +case 43: YY_RULE_SETUP -#line 448 "toke.l" +#line 464 "toke.l" { if (yyleng % 2 == 1) return('!'); /* return '!' */ } YY_BREAK -case 43: +case 44: YY_RULE_SETUP -#line 453 "toke.l" +#line 469 "toke.l" { BEGIN INITIAL; ++sudolineno; @@ -2130,25 +2154,25 @@ YY_RULE_SETUP return(COMMENT); } /* return newline */ YY_BREAK -case 44: +case 45: YY_RULE_SETUP -#line 460 "toke.l" +#line 476 "toke.l" { /* throw away space/tabs */ sawspace = TRUE; /* but remember for fill_args */ } YY_BREAK -case 45: +case 46: YY_RULE_SETUP -#line 464 "toke.l" +#line 480 "toke.l" { sawspace = TRUE; /* remember for fill_args */ ++sudolineno; LEXTRACE("\n\t"); } /* throw away EOL after \ */ YY_BREAK -case 46: +case 47: YY_RULE_SETUP -#line 470 "toke.l" +#line 486 "toke.l" { BEGIN INITIAL; ++sudolineno; @@ -2156,9 +2180,9 @@ YY_RULE_SETUP return(COMMENT); } /* comment, not uid/gid */ YY_BREAK -case 47: +case 48: YY_RULE_SETUP -#line 477 "toke.l" +#line 493 "toke.l" { LEXTRACE("ERROR "); return(ERROR); @@ -2170,7 +2194,7 @@ case YY_STATE_EOF(GOTCMND): case YY_STATE_EOF(STARTDEFS): case YY_STATE_EOF(INDEFS): case YY_STATE_EOF(INSTR): -#line 482 "toke.l" +#line 498 "toke.l" { if (YY_START != INITIAL) { BEGIN INITIAL; @@ -2181,12 +2205,12 @@ case YY_STATE_EOF(INSTR): yyterminate(); } YY_BREAK -case 48: +case 49: YY_RULE_SETUP -#line 492 "toke.l" +#line 508 "toke.l" ECHO; YY_BREAK -#line 2190 "lex.yy.c" +#line 2214 "lex.yy.c" case YY_END_OF_BUFFER: { @@ -2477,7 +2501,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 538 ) + if ( yy_current_state >= 545 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2512,11 +2536,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 538 ) + if ( yy_current_state >= 545 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 537); + yy_is_jam = (yy_current_state == 544); return yy_is_jam ? 0 : yy_current_state; } @@ -3075,7 +3099,7 @@ int main() return 0; } #endif -#line 492 "toke.l" +#line 508 "toke.l" static int _fill(src, len, olen) @@ -3192,63 +3216,228 @@ fill_args(s, len, addspace) return(TRUE); } -struct sudoers_state { +struct path_list { + char *path; + struct path_list *next; +}; + +struct include_stack { YY_BUFFER_STATE bs; char *path; + struct path_list *more; /* more files in case of includedir */ int lineno; + int keepopen; }; +static int +pl_compare(v1, v2) + const void *v1; + const void *v2; +{ + const struct path_list * const *p1 = v1; + const struct path_list * const *p2 = v2; + + return(strcmp((*p1)->path, (*p2)->path)); +} + +static char * +switch_dir(stack, dirpath) + struct include_stack *stack; + char *dirpath; +{ + DIR *dir; + int i, count = 0; + char *path = NULL; + struct dirent *dent; + struct stat sb; + struct path_list *pl, *first = NULL; + struct path_list **sorted = NULL; + + if (!(dir = opendir(dirpath))) { + yyerror(dirpath); + return(FALSE); + } + while ((dent = readdir(dir))) { + /* Ignore visudo .tmp files. */ + if (dent->d_namlen > 4 && + strcmp(dent->d_name + dent->d_namlen - 4, ".tmp") == 0) { + continue; + } + if (asprintf(&path, "%s/%s", dirpath, dent->d_name) == -1) { + closedir(dir); + goto bad; + } + if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { + efree(path); + continue; + } + pl = malloc(sizeof(*pl)); + if (pl == NULL) + goto bad; + pl->path = path; + pl->next = first; + first = pl; + count++; + } + closedir(dir); + + if (count == 0) + goto done; + + /* Sort the list as an array. */ + sorted = malloc(sizeof(*sorted) * count); + if (sorted == NULL) + goto bad; + pl = first; + for (i = 0; i < count; i++) { + sorted[i] = pl; + pl = pl->next; + } + qsort(sorted, count, sizeof(*sorted), pl_compare); + + /* Apply sorting to the list. */ + first = sorted[0]; + sorted[count - 1]->next = NULL; + for (i = 1; i < count; i++) + sorted[i - 1]->next = sorted[i]; + efree(sorted); + + /* Pull out the first element for parsing, leave the rest for later. */ + if (count) { + path = first->path; + pl = first->next; + efree(first); + stack->more = pl; + } else { + path = NULL; + } +done: + efree(dirpath); + return(path); +bad: + while (first != NULL) { + pl = first; + first = pl->next; + free(pl->path); + free(pl); + } + efree(sorted); + efree(dirpath); + efree(path); + return(NULL); +} + #define MAX_SUDOERS_DEPTH 128 #define SUDOERS_STACK_INCREMENT 16 +static size_t istacksize, idepth; +static struct include_stack *istack; +static int keepopen; + +void +init_lexer() +{ + struct path_list *pl; + + while (idepth) { + idepth--; + while ((pl = istack[idepth].more) != NULL) { + istack[idepth].more = pl->next; + efree(pl->path); + efree(pl); + } + efree(istack[idepth].path); + if (!istack[idepth].keepopen) + fclose(istack[idepth].bs->yy_input_file); + yy_delete_buffer(istack[idepth].bs); + } + efree(istack); + istack = NULL; + istacksize = idepth = 0; + keepopen = FALSE; +} + static int -switch_buffer(path) +_push_include(path, isdir) char *path; + int isdir; { - static size_t stacksize, depth; - static struct sudoers_state *state; - static int keepopen; FILE *fp; - if (path != NULL) { - /* push current state */ - if (depth >= stacksize) { - if (depth > MAX_SUDOERS_DEPTH) { - yyerror("too many levels of includes"); - return(FALSE); - } - stacksize += SUDOERS_STACK_INCREMENT; - state = (struct sudoers_state *) realloc(state, - sizeof(state) * stacksize); - if (state == NULL) { - yyerror("unable to allocate memory"); - return(FALSE); - } + /* push current state onto stack */ + if (idepth >= istacksize) { + if (idepth > MAX_SUDOERS_DEPTH) { + yyerror("too many levels of includes"); + return(FALSE); } - if ((fp = open_sudoers(path, &keepopen)) == NULL) { + istacksize += SUDOERS_STACK_INCREMENT; + istack = (struct include_stack *) realloc(istack, + sizeof(istack) * istacksize); + if (istack == NULL) { + yyerror("unable to allocate memory"); + return(FALSE); + } + } + if (isdir) { + if (!(path = switch_dir(&istack[idepth], path))) { yyerror(path); return(FALSE); } - state[depth].bs = YY_CURRENT_BUFFER; - state[depth].path = sudoers; - state[depth].lineno = sudolineno; - depth++; + if ((fp = open_sudoers(path, FALSE, &keepopen)) == NULL) { + yyerror(path); + return(FALSE); /* XXX - just to go next one? */ + } + } else { + if ((fp = open_sudoers(path, TRUE, &keepopen)) == NULL) { + yyerror(path); + return(FALSE); + } + istack[idepth].more = NULL; + } + /* Push the old (current) file and open the new one. */ + istack[idepth].path = sudoers; /* push old path */ + istack[idepth].bs = YY_CURRENT_BUFFER; + istack[idepth].lineno = sudolineno; + istack[idepth].keepopen = keepopen; + idepth++; + sudolineno = 1; + sudoers = path; + yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); + + return(TRUE); +} + +static int +pop_include() +{ + struct path_list *pl; + FILE *fp; + + if (idepth == 0) + return(FALSE); + + if (!keepopen) + fclose(YY_CURRENT_BUFFER->yy_input_file); + yy_delete_buffer(YY_CURRENT_BUFFER); + keepopen = FALSE; + if ((pl = istack[idepth - 1].more) != NULL) { + /* Move to next file in the dir. */ + istack[idepth - 1].more = pl->next; + if ((fp = open_sudoers(pl->path, FALSE, &keepopen)) == NULL) { + yyerror(pl->path); + return(FALSE); /* XXX - just to go next one? */ + } + efree(sudoers); + sudoers = pl->path; sudolineno = 1; - sudoers = path; yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); + efree(pl); } else { - /* pop */ - if (depth == 0) - return(FALSE); - depth--; - if (!keepopen) - fclose(YY_CURRENT_BUFFER->yy_input_file); - yy_delete_buffer(YY_CURRENT_BUFFER); - yy_switch_to_buffer(state[depth].bs); + idepth--; + yy_switch_to_buffer(istack[idepth].bs); efree(sudoers); - sudoers = state[depth].path; - sudolineno = state[depth].lineno; - keepopen = FALSE; + sudoers = istack[idepth].path; + sudolineno = istack[idepth].lineno; } return(TRUE); } @@ -3263,6 +3452,8 @@ parse_include(base) /* Pull out path from #include line. */ cp = base + sizeof("#include"); + if (*cp == 'i') + cp += 3; /* includedir */ while (isblank((unsigned char) *cp)) cp++; ep = cp; diff --git a/toke.l b/toke.l index 90a5100b4..6d8199138 100644 --- a/toke.l +++ b/toke.l @@ -27,6 +27,7 @@ #include #include +#include #include #ifdef STDC_HEADERS # include @@ -50,6 +51,7 @@ # include #endif /* HAVE_MALLOC_H && !STDC_HEADERS */ #include +#include #include "sudo.h" #include "parse.h" #include @@ -69,15 +71,16 @@ static int append __P((char *, int)); static int _fill __P((char *, int, int)); static int fill_cmnd __P((char *, int)); static int fill_args __P((char *, int, int)); -static int switch_buffer __P((char *)); +static int _push_include __P((char *, int)); +static int pop_include __P((void)); static int ipv6_valid __P((const char *s)); static char *parse_include __P((char *)); extern void yyerror __P((const char *)); #define fill(a, b) _fill(a, b, 0) -#define push_include(_p) (switch_buffer((_p))) -#define pop_include() (switch_buffer(NULL)) +#define push_include(_p) (_push_include((_p), FALSE)) +#define push_includedir(_p) (_push_include((_p), TRUE)) /* realloc() to size + COMMANDARGINC to make room for command args */ #define COMMANDARGINC 64 @@ -227,6 +230,19 @@ DEFVAR [a-z_]+ yyterminate(); } +^#includedir[[:blank:]]+\/.*\n { + char *path; + + if ((path = parse_include(yytext)) == NULL) + yyterminate(); + + LEXTRACE("INCLUDEDIR\n"); + + /* Push current buffer and switch to include file */ + if (!push_includedir(path)) + yyterminate(); + } + ^[[:blank:]]*Defaults([:@>\!]{WORD})? { int n; for (n = 0; isblank((unsigned char)yytext[n]); n++) @@ -605,63 +621,228 @@ fill_args(s, len, addspace) return(TRUE); } -struct sudoers_state { +struct path_list { + char *path; + struct path_list *next; +}; + +struct include_stack { YY_BUFFER_STATE bs; char *path; + struct path_list *more; /* more files in case of includedir */ int lineno; + int keepopen; }; +static int +pl_compare(v1, v2) + const void *v1; + const void *v2; +{ + const struct path_list * const *p1 = v1; + const struct path_list * const *p2 = v2; + + return(strcmp((*p1)->path, (*p2)->path)); +} + +static char * +switch_dir(stack, dirpath) + struct include_stack *stack; + char *dirpath; +{ + DIR *dir; + int i, count = 0; + char *path = NULL; + struct dirent *dent; + struct stat sb; + struct path_list *pl, *first = NULL; + struct path_list **sorted = NULL; + + if (!(dir = opendir(dirpath))) { + yyerror(dirpath); + return(FALSE); + } + while ((dent = readdir(dir))) { + /* Ignore visudo .tmp files. */ + if (dent->d_namlen > 4 && + strcmp(dent->d_name + dent->d_namlen - 4, ".tmp") == 0) { + continue; + } + if (asprintf(&path, "%s/%s", dirpath, dent->d_name) == -1) { + closedir(dir); + goto bad; + } + if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { + efree(path); + continue; + } + pl = malloc(sizeof(*pl)); + if (pl == NULL) + goto bad; + pl->path = path; + pl->next = first; + first = pl; + count++; + } + closedir(dir); + + if (count == 0) + goto done; + + /* Sort the list as an array. */ + sorted = malloc(sizeof(*sorted) * count); + if (sorted == NULL) + goto bad; + pl = first; + for (i = 0; i < count; i++) { + sorted[i] = pl; + pl = pl->next; + } + qsort(sorted, count, sizeof(*sorted), pl_compare); + + /* Apply sorting to the list. */ + first = sorted[0]; + sorted[count - 1]->next = NULL; + for (i = 1; i < count; i++) + sorted[i - 1]->next = sorted[i]; + efree(sorted); + + /* Pull out the first element for parsing, leave the rest for later. */ + if (count) { + path = first->path; + pl = first->next; + efree(first); + stack->more = pl; + } else { + path = NULL; + } +done: + efree(dirpath); + return(path); +bad: + while (first != NULL) { + pl = first; + first = pl->next; + free(pl->path); + free(pl); + } + efree(sorted); + efree(dirpath); + efree(path); + return(NULL); +} + #define MAX_SUDOERS_DEPTH 128 #define SUDOERS_STACK_INCREMENT 16 +static size_t istacksize, idepth; +static struct include_stack *istack; +static int keepopen; + +void +init_lexer() +{ + struct path_list *pl; + + while (idepth) { + idepth--; + while ((pl = istack[idepth].more) != NULL) { + istack[idepth].more = pl->next; + efree(pl->path); + efree(pl); + } + efree(istack[idepth].path); + if (!istack[idepth].keepopen) + fclose(istack[idepth].bs->yy_input_file); + yy_delete_buffer(istack[idepth].bs); + } + efree(istack); + istack = NULL; + istacksize = idepth = 0; + keepopen = FALSE; +} + static int -switch_buffer(path) +_push_include(path, isdir) char *path; + int isdir; { - static size_t stacksize, depth; - static struct sudoers_state *state; - static int keepopen; FILE *fp; - if (path != NULL) { - /* push current state */ - if (depth >= stacksize) { - if (depth > MAX_SUDOERS_DEPTH) { - yyerror("too many levels of includes"); - return(FALSE); - } - stacksize += SUDOERS_STACK_INCREMENT; - state = (struct sudoers_state *) realloc(state, - sizeof(state) * stacksize); - if (state == NULL) { - yyerror("unable to allocate memory"); - return(FALSE); - } + /* push current state onto stack */ + if (idepth >= istacksize) { + if (idepth > MAX_SUDOERS_DEPTH) { + yyerror("too many levels of includes"); + return(FALSE); } - if ((fp = open_sudoers(path, &keepopen)) == NULL) { + istacksize += SUDOERS_STACK_INCREMENT; + istack = (struct include_stack *) realloc(istack, + sizeof(istack) * istacksize); + if (istack == NULL) { + yyerror("unable to allocate memory"); + return(FALSE); + } + } + if (isdir) { + if (!(path = switch_dir(&istack[idepth], path))) { yyerror(path); return(FALSE); } - state[depth].bs = YY_CURRENT_BUFFER; - state[depth].path = sudoers; - state[depth].lineno = sudolineno; - depth++; + if ((fp = open_sudoers(path, FALSE, &keepopen)) == NULL) { + yyerror(path); + return(FALSE); /* XXX - just to go next one? */ + } + } else { + if ((fp = open_sudoers(path, TRUE, &keepopen)) == NULL) { + yyerror(path); + return(FALSE); + } + istack[idepth].more = NULL; + } + /* Push the old (current) file and open the new one. */ + istack[idepth].path = sudoers; /* push old path */ + istack[idepth].bs = YY_CURRENT_BUFFER; + istack[idepth].lineno = sudolineno; + istack[idepth].keepopen = keepopen; + idepth++; + sudolineno = 1; + sudoers = path; + yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); + + return(TRUE); +} + +static int +pop_include() +{ + struct path_list *pl; + FILE *fp; + + if (idepth == 0) + return(FALSE); + + if (!keepopen) + fclose(YY_CURRENT_BUFFER->yy_input_file); + yy_delete_buffer(YY_CURRENT_BUFFER); + keepopen = FALSE; + if ((pl = istack[idepth - 1].more) != NULL) { + /* Move to next file in the dir. */ + istack[idepth - 1].more = pl->next; + if ((fp = open_sudoers(pl->path, FALSE, &keepopen)) == NULL) { + yyerror(pl->path); + return(FALSE); /* XXX - just to go next one? */ + } + efree(sudoers); + sudoers = pl->path; sudolineno = 1; - sudoers = path; yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); + efree(pl); } else { - /* pop */ - if (depth == 0) - return(FALSE); - depth--; - if (!keepopen) - fclose(YY_CURRENT_BUFFER->yy_input_file); - yy_delete_buffer(YY_CURRENT_BUFFER); - yy_switch_to_buffer(state[depth].bs); + idepth--; + yy_switch_to_buffer(istack[idepth].bs); efree(sudoers); - sudoers = state[depth].path; - sudolineno = state[depth].lineno; - keepopen = FALSE; + sudoers = istack[idepth].path; + sudolineno = istack[idepth].lineno; } return(TRUE); } @@ -676,6 +857,8 @@ parse_include(base) /* Pull out path from #include line. */ cp = base + sizeof("#include"); + if (*cp == 'i') + cp += 3; /* includedir */ while (isblank((unsigned char) *cp)) cp++; ep = cp; diff --git a/visudo.c b/visudo.c index e9098f767..ce4fb85d7 100644 --- a/visudo.c +++ b/visudo.c @@ -93,10 +93,11 @@ __unused static const char rcsid[] = "$Sudo$"; struct sudoersfile { char *path; - int fd; char *tpath; + int fd; int tfd; int modified; + int doedit; struct sudoersfile *next; }; @@ -215,8 +216,9 @@ main(argc, argv) * Parse the existing sudoers file(s) in quiet mode to highlight any * existing errors and to pull in editor and env_editor conf values. */ - if ((yyin = open_sudoers(sudoers_path, NULL)) == NULL) + if ((yyin = open_sudoers(sudoers_path, TRUE, NULL)) == NULL) { error(1, "%s", sudoers_path); + } init_parser(sudoers_path, 0); yyparse(); (void) update_defaults(SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER); @@ -228,6 +230,8 @@ main(argc, argv) /* Edit the sudoers file(s) */ tq_foreach_fwd(&sudoerslist, sp) { + if (!sp->doedit) + continue; if (sp != tq_first(&sudoerslist)) { printf("press return to edit %s: ", sp->path); while ((ch = getchar()) != EOF && ch != '\n') @@ -747,8 +751,9 @@ check_syntax(sudoers_path, quiet, strict) * any subsequent files #included via a callback from the parser. */ FILE * -open_sudoers(path, keepopen) +open_sudoers(path, doedit, keepopen) const char *path; + int doedit; int *keepopen; { struct sudoersfile *entry; @@ -766,6 +771,8 @@ open_sudoers(path, keepopen) entry->next = NULL; entry->fd = open(entry->path, O_RDWR | O_CREAT, SUDOERS_MODE); entry->tpath = NULL; + entry->tfd = -1; + entry->doedit = doedit; if (entry->fd == -1) { warning("%s", entry->path); efree(entry);