chiark / gitweb /
New "shutdown" builtin service for terminating uservd. setenv emulation using putenv...
authorian <ian>
Wed, 19 May 1999 23:13:44 +0000 (23:13 +0000)
committerian <ian>
Wed, 19 May 1999 23:13:44 +0000 (23:13 +0000)
12 files changed:
INSTALL
Makefile.in
daemon.h
debian/changelog
language.i4
lexer.c
lexer.l
overlord.c
process.c
servexec.c
spec.sgml
tokens.h

diff --git a/INSTALL b/INSTALL
index c7940ed8f62304002e7dec74702f40f13735db6f..1399ae8af0e4c4a204432cfd468c13023a0807fe 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -153,6 +153,9 @@ completeness and as programming documentation.
      example, if the client receives a fatal signal of some kind from
      its execution environment (eg its controlling terminal).
 
+ 10 - The per-request child wishes the server to check whether it is
+      still the uservd.
+
  12 - The service failed onm the service side in an expected and
       controlled manner, for example because it was rejected in the
       configuration files.
@@ -170,7 +173,7 @@ completeness and as programming documentation.
    internal error occurred.  This can also occur if an attempt to
    block signals using sigprocmask fails.
 
- 0-3,5-7,9-11,13-15,17-19 are not currently used.
+ 0-3,5-7,9,11,13-15,17-19 are not currently used by normal children.
 
 REENTRANCY IN THE LIBC:
 
index 58a4a5afbdcab284ee0272473bd321cff5cee445..eb162513118cb847dc678c4fa72ce6f2bcc668c7 100644 (file)
@@ -126,8 +126,6 @@ version.h:  Makefile
 
 tokens.h:      language.i4
 
-               rm -f *.o *~ core ./#*#
-
 autoconf configure:
                autoheader
                autoconf
@@ -136,7 +134,7 @@ clean:
                find -name '*.orig' -o -name '*~' -o -name '.*~' \
                        -o -name '*#' -o -name '.#*' -o -name '*.bak' \
                        | xargs -r rm
-               rm -rf $(TARGETS) *.o version.h
+               rm -rf $(TARGETS) *.o core version.h
                rm -f overview.eps
                rm -f spec.lout* spec.text* spec.ps?* spec.sgml.new
                rm -f lout.li *.ld *.lix *.ldx
index 96ab37b9054657d6bf4e7582835ced28363ac0d1..a8f53445787e82173dbe90d33986bd8581df3e7e 100644 (file)
--- a/daemon.h
+++ b/daemon.h
@@ -131,7 +131,7 @@ typedef void builtinserviceexec_fnt(const char *const *args);
 builtinserviceexec_fnt NONRETURNING bisexec_environment, bisexec_parameter;
 builtinserviceexec_fnt NONRETURNING bisexec_version, bisexec_help;
 builtinserviceexec_fnt NONRETURNING bisexec_toplevel, bisexec_override, bisexec_reset;
-builtinserviceexec_fnt NONRETURNING bisexec_execute;
+builtinserviceexec_fnt NONRETURNING bisexec_execute, bisexec_shutdown;
 extern const char *const builtinservicehelpstrings[];
 
 void execservice(const int synchsocket[], int clientfd) NONRETURNING;
index e2f0b35b7f49d91e436a8fc31709c466118e5ef0..e18945877c7c02cf810d38c1564062b45b03f2f1 100644 (file)
@@ -1,7 +1,10 @@
 userv (0.63) unstable; urgency=low
 
+  * New "shutdown" builtin service for terminating uservd.
+
   * setenv emulation using putenv works properly (previously you would get
     wrong environment variable settings).  (Thanks to Ben Harris.)
+  * Makefile bug fixed (tokens.h would sometimes not be rebuilt).
 
  --
 
index 295a5da184fa76d1377e62943fc6e6586ba44d8e..d660b272834003edd2ad31dbc295dec9ef4e2c16 100644 (file)
@@ -162,6 +162,7 @@ isbuiltinservice(`parameter',`parameter',`',` <parameter>')
 isbuiltinservice(`version',`none')
 isbuiltinservice(`toplevel',`none')
 isbuiltinservice(`override',`none')
+isbuiltinservice(`shutdown',`none')
 
 dnl builtin services that are also directive names
 define(`isdirectivebuiltinservice',
diff --git a/lexer.c b/lexer.c
index 1a94c7bae9f165716747c0c022d87c24d92e17c6..6d2c63d24e7bf6732c0235823c43682665cb53ea 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -285,73 +285,73 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 103
-#define YY_END_OF_BUFFER 104
-static yyconst short int yy_accept[572] =
+#define YY_NUM_RULES 104
+#define YY_END_OF_BUFFER 105
+static yyconst short int yy_accept[579] =
     {   0,
-        0,    0,  104,  102,   96,   97,   89,  101,   99,   86,
-       90,   87,   88,   93,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   91,  102,   96,   97,
-       99,  101,  101,  100,  101,   99,   99,   98,   95,   93,
-      102,  102,  102,  102,   19,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,   37,  102,  102,  102,  102,
-       32,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  100,  101,  101,  101,
-
-      101,    0,  101,  101,   94,   93,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,   31,   62,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,   70,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  101,  101,  100,    0,  101,  101,   94,   93,  102,
-      102,  102,   66,  102,  102,   63,   67,  102,  102,  102,
-       35,   36,  102,  102,  102,  102,   40,   42,  102,   50,
-      102,  102,   59,   69,  102,   71,  102,   72,  102,  102,
-
-      102,  102,  102,  102,  102,   30,  102,   84,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,   74,   75,
-      102,   61,  102,  101,  101,    0,    0,    0,  101,   94,
-       93,  102,   64,  102,  102,  102,  102,  102,   58,  102,
-       65,  102,   92,  102,   38,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   41,  102,  102,
-       48,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,   85,  101,    0,    0,   94,   93,  102,  102,  102,
-      102,  102,   68,  102,  102,  102,  102,  102,  102,   69,
-       76,   77,   78,   79,   80,   81,   82,   83,  102,  102,
-
-      102,  102,   60,  102,  102,  102,    1,  102,  102,  102,
-      102,   39,  102,   73,  102,  102,  102,  102,    0,   94,
-       93,  102,  102,  102,  102,  102,  102,  102,  102,   49,
-      102,   21,   26,  102,  102,  102,   10,  102,  102,  102,
-      102,  102,   51,  102,  102,  102,  102,   45,   61,   94,
-       93,  102,    9,   66,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   47,  102,  102,  102,
-      102,  102,  102,   46,  102,   94,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   12,  102,  102,  102,
-      102,  102,  102,   44,   11,  102,  102,  102,  102,  102,
-
-      102,   94,  102,  102,  102,  102,  102,   33,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-        8,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,   43,   34,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,   20,  102,
-      102,  102,  102,   52,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   55,  102,  102,
-      102,  102,  102,   53,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   56,  102,  102,
-       15,  102,  102,  102,  102,   17,    7,  102,  102,  102,
-
-      102,  102,  102,  102,   23,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,    4,  102,  102,  102,
-       22,  102,  102,  102,  102,  102,   13,  102,  102,  102,
-      102,    5,    6,  102,  102,  102,  102,  102,  102,   16,
-      102,  102,  102,  102,  102,  102,    3,   25,  102,   18,
-      102,  102,  102,   27,  102,   54,  102,   24,   14,   57,
-      102,  102,  102,  102,   28,  102,  102,  102,   29,    2,
-        0
+        0,    0,  105,  103,   97,   98,   90,  102,  100,   87,
+       91,   88,   89,   94,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,   92,  103,   97,   98,
+      100,  102,  102,  101,  102,  100,  100,   99,   96,   94,
+      103,  103,  103,  103,   19,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,   37,  103,  103,  103,  103,
+       32,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  101,  102,  102,
+
+      102,  102,    0,  102,  102,   95,   94,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,   31,   63,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,   71,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  102,  102,  101,    0,  102,  102,   95,
+       94,  103,  103,  103,   67,  103,  103,   64,   68,  103,
+      103,  103,   35,   36,  103,  103,  103,  103,   40,   42,
+      103,   51,  103,  103,   60,   70,  103,   72,  103,   73,
+
+      103,  103,  103,  103,  103,  103,  103,   30,  103,   85,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,   75,   76,  103,   62,  103,  102,  102,    0,    0,
+        0,  102,   95,   94,  103,   65,  103,  103,  103,  103,
+      103,   59,  103,   66,  103,   93,  103,   38,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+       41,  103,  103,   49,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,   86,  102,    0,    0,   95,
+       94,  103,  103,  103,  103,  103,   69,  103,  103,  103,
+      103,  103,  103,   70,   77,   78,   79,   80,   81,   82,
+
+       83,   84,  103,  103,  103,  103,   61,  103,  103,  103,
+        1,  103,  103,  103,  103,  103,   39,  103,   74,  103,
+      103,  103,  103,    0,   95,   94,  103,  103,  103,  103,
+      103,  103,  103,  103,   50,  103,   21,   26,  103,  103,
+      103,   10,  103,  103,  103,  103,  103,   52,  103,  103,
+      103,  103,  103,   45,   62,   95,   94,  103,    9,   67,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,   47,  103,  103,  103,  103,  103,   48,  103,
+       46,  103,   95,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,   12,  103,  103,  103,  103,  103,  103,
+
+       44,   11,  103,  103,  103,  103,  103,  103,   95,  103,
+      103,  103,  103,  103,   33,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,    8,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,   43,
+       34,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,   20,  103,  103,  103,  103,
+       53,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,   56,  103,  103,  103,  103,  103,
+       54,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,   57,  103,  103,   15,  103,  103,
+
+      103,  103,   17,    7,  103,  103,  103,  103,  103,  103,
+      103,   23,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,    4,  103,  103,  103,   22,  103,  103,
+      103,  103,  103,   13,  103,  103,  103,  103,    5,    6,
+      103,  103,  103,  103,  103,  103,   16,  103,  103,  103,
+      103,  103,  103,    3,   25,  103,   18,  103,  103,  103,
+       27,  103,   55,  103,   24,   14,   58,  103,  103,  103,
+      103,   28,  103,  103,  103,   29,    2,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -396,253 +396,254 @@ static yyconst int yy_meta[52] =
         1
     } ;
 
-static yyconst short int yy_base[582] =
+static yyconst short int yy_base[589] =
     {   0,
-        0,    0,  917,    0,   50,  918,    0,   52,   56,    0,
-        0,    0,    0,   64,  883,   19,   44,   37,   51,  882,
-       25,   36,   64,  885,   34,   67,   62,  867,  887,  866,
-       75,   68,  871,   60,  880,   73,    0,    0,  106,  918,
-      905,  109,  101,  905,  132,  116,  903,  918,  168,  177,
-      867,   87,  860,   24,    0,   87,  874,  876,  858,   88,
-      871,  853,  868,  855,  867,    0,  856,  865,  849,  856,
-        0,  853,   95,  848,  862,  846,  854,  843,  838,  115,
-      848,  854,   98,  849,  843,  130,  114,  841,  839,  835,
-      837,  847,  848,  832,  831,  839,    0,  198,  869,    0,
-
-      126,  134,  245,  265,  283,  292,  843,  827,  829,  835,
-      830,  838,  820,  825,  825,  816,  833,  829,  829,  815,
-      823,    0,  816,  827,  827,  812,  826,  810,  810,  812,
-      808,  808,  820,    0,  808,  800,  799,  132,  808,  804,
-      797,  805,  812,  792,  804,  806,  804,  787,  802,  785,
-      783,  816,  785,  786,  789,  788,  781,  782,  778,  782,
-      775,  301,  318,  918,  348,  384,  393,  411,  420,  782,
-      773,  769,  775,  781,  781,    0,    0,  773,  780,  771,
-        0,    0,  778,  766,  765,  761,    0,    0,  778,    0,
-      762,  758,    0,  773,  765,    0,  775,    0,  766,  132,
-
-      771,  785,  754,  768,  757,    0,  764,    0,  765,  758,
-      746,  747,  755,  758,  744,  743,  745,  754,  770,    0,
-      748,  747,  750,  429,  438,  135,    0,  464,  200,  482,
-      491,  733,    0,  765,  734,  737,  762,  735,    0,  734,
-        0,  732,  727,  725,    0,  739,  739,  730,  500,  734,
-      721,  719,  722,  732,  730,  726,  729,    0,  713,  714,
-        0,  722,  727,  715,  723,  722,  719,  703,  706,  708,
-      708,    0,  139,    0,  508,  526,  535,  717,  714,  710,
-      711,  700,    0,  702,  701,  726,  708,  724,  706,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  705,  706,
-
-      720,  691,    0,  702,  701,  684,  715,  697,  681,  695,
-      677,    0,  679,    0,  692,  693,  681,  687,  198,  544,
-      553,  688,  688,  669,  702,  668,  683,  674,  123,  698,
-      679,  696,    0,  668,  677,  663,    0,  675,  674,  672,
-      689,  651,  687,  665,  654,  660,  665,    0,    0,  562,
-      682,  681,    0,    0,  134,  659,  664,  661,  644,  649,
-      140,  659,  194,  648,  647,  655,    0,  641,  654,  651,
-      179,  638,  667,    0,  645,  571,  198,  635,  633,  631,
-      630,  635,  629,  659,  625,  627,    0,  635,  637,  627,
-      627,  618,  620,    0,    0,  634,  619,  617,  620,  633,
-
-      621,    0,  620,  606,  611,  614,  623,    0,  639,  606,
-      617,  100,  615,  608,  604,  616,  605,  614,  609,  598,
-        0,  601,  610,  600,  595,  607,  602,  591,  604,  587,
-      589,  598,    0,    0,  596,  125,  592,  590,  597,  577,
-      588,  592,  573,  599,  554,  553,  557,  501,    0,  502,
-      461,  434,  435,  462,  428,  436,  443,  427,  418,  449,
-      390,  383,  350,  350,  354,  367,  351,  378,  360,  345,
-      349,  347,  373,    0,  341,  343,  353,  352,  344,  346,
-      198,  334,  334,  336,  363,  336,  331,    0,  329,  333,
-        0,  316,  321,  316,  325,    0,    0,  314,  316,  316,
-
-      320,  327,  303,  286,  317,  296,  290,  295,  293,  280,
-      277,  247,  249,  246,  232,  242,    0,  230,  227,  227,
-        0,  243,  212,  227,  212,  225,    0,  226,  219,  221,
-      214,    0,    0,  220,  216,  196,  208,  202,  202,    0,
-      203,  198,  205,  202,  198,  206,    0,    0,  196,    0,
-      187,  193,  190,    0,  173,    0,  164,    0,    0,    0,
-      177,  177,  165,  145,    0,  134,  141,  119,    0,    0,
-      918,  592,  596,  600,  604,  608,  612,  616,  620,  138,
-       67
+        0,    0,  924,    0,   50,  925,    0,   52,   56,    0,
+        0,    0,    0,   64,  890,   19,   44,   37,   51,  889,
+       25,   36,   64,  892,   34,   67,   62,  874,  894,  873,
+       75,   74,  878,   65,  887,   72,    0,    0,  109,  925,
+      912,  115,  104,  912,  138,  119,  910,  925,  174,  183,
+      874,   69,  867,   24,    0,   85,  881,  883,  865,   92,
+      878,  860,  875,  862,  874,    0,  863,  872,  856,  863,
+        0,  860,   99,  855,  869,  853,  861,  850,  845,  101,
+      855,  861,   90,  856,  850,  136,  104,  842,  847,  845,
+      841,  843,  853,  854,  838,  837,  845,    0,  204,  875,
+
+        0,  131,  139,  251,  271,  289,  298,  849,  833,  835,
+      841,  836,  844,  826,  831,  831,  822,  839,  835,  835,
+      821,  829,    0,  822,  833,  833,  818,  832,  816,  816,
+      818,  814,  814,  826,    0,  814,  806,  805,  121,  814,
+      810,  803,  811,  818,  798,  810,  812,  810,  793,  808,
+      791,  789,  822,  789,  790,  791,  794,  793,  786,  787,
+      783,  787,  780,  307,  324,  925,  354,  390,  399,  417,
+      426,  787,  778,  774,  780,  786,  786,    0,    0,  778,
+      785,  776,    0,    0,  783,  771,  770,  766,    0,    0,
+      783,    0,  767,  763,    0,  778,  770,    0,  780,    0,
+
+      771,  118,  776,  790,  759,  773,  762,    0,  769,    0,
+      770,  763,  751,  752,  760,  763,  763,  748,  747,  749,
+      758,  774,    0,  752,  751,  754,  435,  444,  134,    0,
+      470,  206,  488,  497,  737,    0,  769,  738,  741,  766,
+      739,    0,  738,    0,  736,  731,  729,    0,  743,  743,
+      734,  506,  738,  725,  723,  726,  736,  734,  730,  733,
+        0,  717,  718,    0,  726,  731,  719,  717,  726,  725,
+      722,  706,  709,  711,  711,    0,  145,    0,  514,  532,
+      541,  720,  717,  713,  714,  703,    0,  705,  704,  729,
+      711,  727,  709,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,  708,  709,  723,  694,    0,  705,  704,  687,
+      718,  700,  684,  698,  680,  678,    0,  681,    0,  694,
+      695,  683,  689,  160,  550,  559,  690,  690,  671,  704,
+      670,  685,  676,  127,  700,  681,  698,    0,  670,  679,
+      665,    0,  677,  676,  674,  691,  653,  689,  667,  661,
+      655,  661,  666,    0,    0,  568,  683,  682,    0,    0,
+      135,  660,  665,  662,  645,  650,  143,  660,  148,  649,
+      648,  656,    0,  642,  655,  652,  182,  639,    0,  668,
+        0,  646,  577,  185,  636,  634,  632,  631,  636,  630,
+      660,  626,  628,    0,  636,  638,  628,  628,  619,  621,
+
+        0,    0,  635,  620,  618,  621,  634,  622,    0,  621,
+      607,  612,  615,  624,    0,  640,  607,  618,  100,  616,
+      609,  605,  617,  606,  615,  610,  599,    0,  602,  611,
+      601,  596,  608,  603,  592,  605,  588,  590,  599,    0,
+        0,  596,  165,  589,  584,  588,  557,  566,  573,  496,
+      525,  449,  440,  444,  449,    0,  450,  451,  435,  436,
+      456,  422,  387,  394,  358,  356,  387,  371,  364,  351,
+      351,  355,  368,  352,  379,  361,  346,  350,  348,  374,
+        0,  342,  344,  354,  353,  345,  347,  203,  335,  335,
+      337,  354,  327,  322,    0,  320,  324,    0,  317,  322,
+
+      317,  326,    0,    0,  306,  297,  297,  301,  308,  293,
+      287,  318,  263,  246,  251,  249,  236,  267,  248,  250,
+      246,  232,  232,    0,  220,  217,  218,    0,  234,  213,
+      228,  213,  226,    0,  227,  218,  220,  213,    0,    0,
+      219,  215,  197,  209,  204,  204,    0,  205,  201,  208,
+      205,  201,  209,    0,    0,  199,    0,  190,  197,  194,
+        0,  180,    0,  171,    0,    0,    0,  180,  156,  143,
+      145,    0,  133,  143,  123,    0,    0,  925,  598,  602,
+      606,  610,  614,  618,  622,  626,  138,   67
     } ;
 
-static yyconst short int yy_def[582] =
+static yyconst short int yy_def[589] =
     {   0,
-      571,    1,  571,  572,  571,  571,  572,  573,  574,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  571,  571,
-      575,  573,  576,  577,  573,  574,  575,  571,  572,   14,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  578,  576,  577,  578,
-
-      578,  579,  577,  573,  572,   14,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  578,  576,  571,  579,  103,  104,  572,   14,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  578,  163,  571,  580,  579,  573,  572,
-       14,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  576,  581,  228,  572,   14,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  579,  572,
-       14,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-        0,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571
+      578,    1,  578,  579,  578,  578,  579,  580,  581,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  578,  578,
+      582,  580,  583,  584,  580,  581,  582,  578,  579,   14,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  585,  583,  584,
+
+      585,  585,  586,  584,  580,  579,   14,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  585,  583,  578,  586,  104,  105,  579,
+       14,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  585,  165,  578,  587,
+      586,  580,  579,   14,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  583,  588,  231,  579,
+       14,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  586,  579,   14,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  579,  579,  579,  579,  579,    0,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578
     } ;
 
-static yyconst short int yy_nxt[970] =
+static yyconst short int yy_nxt[977] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,    4,   11,   12,
        13,    4,   14,   14,   14,   14,   14,   14,   14,   14,
        14,    4,    4,   15,   16,    4,   17,   18,   19,   20,
        21,   22,   23,    4,   24,   25,   26,   27,   28,   29,
        30,   31,   32,   33,   34,   35,   36,    4,    4,    4,
-       37,   39,   40,   43,   52,   41,   44,   47,   48,  111,
-       67,   57,   69,   53,   70,   58,   68,  112,   54,   59,
-      102,   55,   75,   76,   45,   49,   50,   50,   50,   50,
+       37,   39,   40,   43,   52,   41,   44,   47,   48,  112,
+       67,   57,   69,   53,   70,   58,   68,  113,   54,   59,
+      103,   55,   75,   76,   45,   49,   50,   50,   50,   50,
        50,   50,   50,   50,   50,   56,   60,   61,   62,   63,
-       79,   77,   64,   71,   72,   78,   87,   95,   65,   85,
-
-       80,   73,   92,   86,   93,   97,   81,   39,   40,   88,
-       43,   41,   89,   44,   96,  108,   90,   47,   48,  113,
-      118,  130,  109,   98,  131,  114,  138,  101,  102,  435,
-      119,   45,   99,  101,  102,  142,  226,  102,  164,  143,
-      150,  274,  436,   97,  103,  103,  103,  103,  103,  103,
-      103,  103,  103,   99,  146,  151,  165,  152,  139,  199,
-      252,   98,  359,  147,  378,  385,  360,  570,  457,  386,
-      148,  569,  149,  458,  200,  568,  253,  567,  379,  104,
-      105,  105,  105,  105,  105,  105,  105,  105,  105,  106,
-      106,  106,  106,  106,  106,  106,  106,  106,  100,  101,
-
-      102,   43,  164,  566,   44,  565,  564,  563,  562,  397,
-      162,  162,  162,  162,  162,  162,  162,  162,  162,  100,
-      165,  388,   45,  398,  403,  501,  389,  561,  560,  390,
-      559,  558,  557,  556,  555,  554,  553,  502,  552,  551,
-      404,  550,  405,  549,  548,  163,  100,  547,  546,  545,
-      544,  543,  542,  541,  540,  539,  538,  166,  166,  166,
-      166,  166,  166,  166,  166,  166,   43,  537,  536,   44,
-      535,  534,  533,  532,  531,  530,  529,  167,  167,  167,
-      167,  167,  167,  167,  167,  167,  167,   45,  528,  167,
-      167,  167,  167,  167,  167,  168,  168,  168,  168,  168,
-
-      168,  168,  168,  168,  169,  169,  169,  169,  169,  169,
-      169,  169,  169,  224,  224,  224,  224,  224,  224,  224,
-      224,  224,   97,  527,  526,  525,  524,  523,  522,  521,
-      225,  225,  225,  225,  225,  225,  225,  225,  225,  225,
-       98,  520,  225,  225,  225,  225,  225,  225,  571,  226,
-      102,  519,  518,  517,  516,  515,  514,  513,  512,  511,
-      227,  227,  227,  227,  227,  227,  227,  227,  227,  571,
-      510,  509,  508,  507,  506,  505,  504,  503,  500,  499,
-      498,  497,  496,  495,  494,  493,  492,  491,  490,  489,
-      488,  487,  486,  485,  484,  228,   42,   42,   42,   42,
-
-       42,   42,   42,   42,   42,  229,  229,  229,  229,  229,
-      229,  229,  229,  229,  229,  483,  482,  229,  229,  229,
-      229,  229,  229,  230,  230,  230,  230,  230,  230,  230,
-      230,  230,  231,  231,  231,  231,  231,  231,  231,  231,
-      231,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
-      481,  480,  273,  273,  273,  273,  273,  273,  164,  479,
-      478,  477,  476,  475,  474,  473,  275,  275,  275,  275,
-      275,  275,  275,  275,  275,  275,  165,  472,  275,  275,
-      275,  275,  275,  275,  276,  276,  276,  276,  276,  276,
-
-      276,  276,  276,  277,  277,  277,  277,  277,  277,  277,
-      277,  277,  291,  292,  293,  294,  295,  296,  297,  298,
-      319,  319,  319,  319,  319,  319,  319,  319,  319,  319,
-      471,  470,  319,  319,  319,  319,  319,  319,  320,  320,
-      320,  320,  320,  320,  320,  320,  320,  321,  321,  321,
-      321,  321,  321,  321,  321,  321,  350,  350,  350,  350,
-      350,  350,  350,  350,  350,  351,  351,  351,  351,  351,
-      351,  351,  351,  351,  376,  376,  376,  376,  376,  376,
-      376,  376,  376,  402,  402,  402,  402,  402,  402,  402,
-      402,  402,   38,  469,  468,   38,   42,   42,  467,   42,
-
-       46,   46,   46,   46,   47,   47,   47,   47,   43,   43,
-      466,   43,   99,   99,  465,   99,  100,  100,  464,  100,
-      102,  102,  463,  102,  462,  461,  460,  459,  456,  455,
-      454,  453,  452,  451,  450,  449,  448,  447,  446,  445,
-      444,  443,  442,  441,  440,  439,  438,  437,  434,  433,
-      432,  431,  430,  429,  428,  427,  426,  425,  424,  423,
-      422,  421,  420,  419,  418,  417,  416,  415,  414,  413,
-      412,  411,  410,  409,  408,  407,  406,  401,  400,  399,
-      396,  395,  394,  393,  392,  391,  387,  384,  383,  382,
-      381,  380,  377,   49,  375,  374,  373,  372,  371,  354,
-
-      370,  369,  368,  367,  366,  365,  364,  363,  362,  361,
-      358,  357,  356,  355,  354,  353,  352,  349,  348,  347,
-      346,  345,  344,  343,  342,  341,  340,  339,  338,  337,
-      336,  335,  334,  333,  332,  331,  330,  329,  328,  327,
-      326,  325,  324,  323,  322,  318,  317,  316,  315,  314,
-      313,  312,  311,  310,  309,  308,  307,  306,  305,  304,
-      303,  302,  301,  300,  299,  290,  289,  288,  287,  286,
-      285,  284,  283,  282,  281,  280,  279,  278,  272,  271,
-      270,  269,  268,  267,  266,  265,  264,  263,  262,  261,
-      260,  259,  258,  257,  241,  256,  255,  254,  251,  250,
-
-      249,  248,  247,  246,  245,  244,  243,  242,  241,  240,
-      239,  238,  237,  236,  235,  234,  233,  232,  223,  222,
-      221,  220,  219,  218,  217,  216,  215,  214,  213,  212,
-      211,  210,  209,  208,  207,  206,  205,  204,  203,  202,
-      201,  198,  197,  196,  195,  194,  193,  192,  191,  190,
-      189,  188,  187,  186,  185,  184,  183,  182,  181,  180,
-      179,  178,  177,  176,  175,  174,  173,  172,  171,  170,
-      100,  161,  160,  159,  158,  157,  156,  155,  154,  153,
-      145,  144,  141,  140,  137,  136,  135,  134,  133,  132,
-      129,  128,  127,  126,  125,  124,  123,  122,  121,  120,
-
-      117,  116,  115,  110,  107,   48,  100,   48,   94,   91,
-       84,   83,   82,   74,   66,   51,  571,    3,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571
+       79,   77,   64,   71,   72,   78,   96,  109,   65,   85,
+
+       80,   73,   87,   86,  110,   88,   81,   93,   98,   94,
+       39,   40,  139,   97,   41,   89,   43,  114,   90,   44,
+       47,   48,   91,  115,  119,  131,   99,  143,  132,  442,
+      151,  144,  102,  103,  120,  229,  103,   45,  100,  102,
+      103,  278,  443,  166,  140,  152,  255,  153,  201,   98,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  100,
+      147,  167,  256,  202,  166,  385,  365,   99,  392,  148,
+      366,  577,  393,  576,  575,  395,  149,  574,  150,  386,
+      396,  573,  167,  397,  572,  105,  106,  106,  106,  106,
+      106,  106,  106,  106,  106,  107,  107,  107,  107,  107,
+
+      107,  107,  107,  107,  101,  102,  103,   43,  464,  571,
+       44,  410,  404,  465,  570,  569,  164,  164,  164,  164,
+      164,  164,  164,  164,  164,  101,  405,  411,   45,  412,
+      508,  568,  567,  566,  565,  564,  563,  562,  561,  560,
+      559,  558,  509,  557,  556,  555,  554,  553,  552,  551,
+      550,  165,  101,  549,  548,  547,  546,  545,  544,  543,
+      542,  541,  540,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,   43,  539,  538,   44,  537,  536,  535,  534,
+      533,  532,  531,  169,  169,  169,  169,  169,  169,  169,
+      169,  169,  169,   45,  530,  169,  169,  169,  169,  169,
+
+      169,  170,  170,  170,  170,  170,  170,  170,  170,  170,
+      171,  171,  171,  171,  171,  171,  171,  171,  171,  227,
+      227,  227,  227,  227,  227,  227,  227,  227,   98,  529,
+      528,  527,  526,  525,  524,  523,  228,  228,  228,  228,
+      228,  228,  228,  228,  228,  228,   99,  522,  228,  228,
+      228,  228,  228,  228,  578,  229,  103,  521,  520,  519,
+      518,  517,  516,  515,  514,  513,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  578,  512,  511,  510,  507,
+      506,  505,  504,  503,  502,  501,  500,  499,  498,  497,
+      496,  495,  494,  493,  492,  491,  490,  489,  488,  487,
+
+      486,  231,   42,   42,   42,   42,   42,   42,   42,   42,
+       42,  232,  232,  232,  232,  232,  232,  232,  232,  232,
+      232,  485,  484,  232,  232,  232,  232,  232,  232,  233,
+      233,  233,  233,  233,  233,  233,  233,  233,  234,  234,
+      234,  234,  234,  234,  234,  234,  234,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,  277,  277,  277,  277,
+      277,  277,  277,  277,  277,  277,  483,  482,  277,  277,
+      277,  277,  277,  277,  166,  481,  480,  479,  478,  477,
+      476,  475,  279,  279,  279,  279,  279,  279,  279,  279,
+      279,  279,  167,  474,  279,  279,  279,  279,  279,  279,
+
+      280,  280,  280,  280,  280,  280,  280,  280,  280,  281,
+      281,  281,  281,  281,  281,  281,  281,  281,  295,  296,
+      297,  298,  299,  300,  301,  302,  324,  324,  324,  324,
+      324,  324,  324,  324,  324,  324,  473,  472,  324,  324,
+      324,  324,  324,  324,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  326,  326,  326,  326,  326,  326,  326,
+      326,  326,  356,  356,  356,  356,  356,  356,  356,  356,
+      356,  357,  357,  357,  357,  357,  357,  357,  357,  357,
+      383,  383,  383,  383,  383,  383,  383,  383,  383,  409,
+      409,  409,  409,  409,  409,  409,  409,  409,   38,  471,
+
+      470,   38,   42,   42,  469,   42,   46,   46,   46,   46,
+       47,   47,   47,   47,   43,   43,  468,   43,  100,  100,
+      467,  100,  101,  101,  466,  101,  103,  103,  463,  103,
+      462,  461,  460,  459,  458,  457,  456,  455,  454,  453,
+      452,  451,  450,  449,  448,  447,  446,  445,  444,  441,
+      440,  439,  438,  437,  436,  435,  434,  433,  432,  431,
+      430,  429,  428,  427,  426,  425,  424,  423,  422,  421,
+      420,  419,  418,  417,  416,  415,  414,  413,  408,  407,
+      406,  403,  402,  401,  400,  399,  398,  394,  391,  390,
+      389,  388,  387,  384,   49,  382,  381,  380,  379,  378,
+
+      377,  360,  376,  375,  374,  373,  372,  371,  370,  369,
+      368,  367,  364,  363,  362,  361,  360,  359,  358,  355,
+      354,  353,  352,  351,  350,  349,  348,  347,  346,  345,
+      344,  343,  342,  341,  340,  339,  338,  337,  336,  335,
+      334,  333,  332,  331,  330,  329,  328,  327,  323,  322,
+      321,  320,  319,  318,  317,  316,  315,  314,  313,  312,
+      311,  310,  309,  308,  307,  306,  305,  304,  303,  294,
+      293,  292,  291,  290,  289,  288,  287,  286,  285,  284,
+      283,  282,  276,  275,  274,  273,  272,  271,  270,  269,
+      268,  267,  266,  265,  264,  263,  262,  261,  260,  244,
+
+      259,  258,  257,  254,  253,  252,  251,  250,  249,  248,
+      247,  246,  245,  244,  243,  242,  241,  240,  239,  238,
+      237,  236,  235,  226,  225,  224,  223,  222,  221,  220,
+      219,  218,  217,  216,  215,  214,  213,  212,  211,  210,
+      209,  208,  207,  206,  205,  204,  203,  200,  199,  198,
+      197,  196,  195,  194,  193,  192,  191,  190,  189,  188,
+      187,  186,  185,  184,  183,  182,  181,  180,  179,  178,
+      177,  176,  175,  174,  173,  172,  101,  163,  162,  161,
+      160,  159,  158,  157,  156,  155,  154,  146,  145,  142,
+      141,  138,  137,  136,  135,  134,  133,  130,  129,  128,
+
+      127,  126,  125,  124,  123,  122,  121,  118,  117,  116,
+      111,  108,   48,  101,   48,   95,   92,   84,   83,   82,
+       74,   66,   51,  578,    3,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578
     } ;
 
-static yyconst short int yy_chk[970] =
+static yyconst short int yy_chk[977] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -651,105 +652,106 @@ static yyconst short int yy_chk[970] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    5,    5,    8,   16,    5,    8,    9,    9,   54,
        21,   18,   22,   16,   22,   18,   21,   54,   17,   18,
-      581,   17,   25,   25,    8,   14,   14,   14,   14,   14,
+      588,   17,   25,   25,    8,   14,   14,   14,   14,   14,
        14,   14,   14,   14,   14,   17,   19,   19,   19,   19,
-       27,   26,   19,   23,   23,   26,   32,   36,   19,   31,
-
-       27,   23,   34,   31,   34,   43,   27,   39,   39,   32,
-       42,   39,   32,   42,   36,   52,   32,   46,   46,   56,
-       60,   73,   52,   43,   73,   56,   80,  101,  101,  412,
-       60,   42,   45,   45,   45,   83,  226,  226,  102,   83,
-       87,  580,  412,  273,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   86,   87,  102,   87,   80,  138,
-      200,  273,  329,   86,  355,  361,  329,  568,  436,  361,
-       86,  567,   86,  436,  138,  566,  200,  564,  355,   45,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,   98,   98,
-
-       98,  229,  319,  563,  229,  562,  561,  557,  555,  371,
-       98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
-      319,  363,  229,  371,  377,  481,  363,  553,  552,  363,
-      551,  549,  546,  545,  544,  543,  542,  481,  541,  539,
-      377,  538,  377,  537,  536,   98,  103,  535,  534,  531,
-      530,  529,  528,  526,  525,  524,  523,  103,  103,  103,
-      103,  103,  103,  103,  103,  103,  104,  522,  520,  104,
-      519,  518,  516,  515,  514,  513,  512,  104,  104,  104,
-      104,  104,  104,  104,  104,  104,  104,  104,  511,  104,
-      104,  104,  104,  104,  104,  105,  105,  105,  105,  105,
-
-      105,  105,  105,  105,  106,  106,  106,  106,  106,  106,
-      106,  106,  106,  162,  162,  162,  162,  162,  162,  162,
-      162,  162,  163,  510,  509,  508,  507,  506,  505,  504,
-      163,  163,  163,  163,  163,  163,  163,  163,  163,  163,
-      163,  503,  163,  163,  163,  163,  163,  163,  165,  165,
-      165,  502,  501,  500,  499,  498,  495,  494,  493,  492,
-      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-      490,  489,  487,  486,  485,  484,  483,  482,  480,  479,
-      478,  477,  476,  475,  473,  472,  471,  470,  469,  468,
-      467,  466,  465,  464,  463,  165,  166,  166,  166,  166,
-
-      166,  166,  166,  166,  166,  167,  167,  167,  167,  167,
-      167,  167,  167,  167,  167,  462,  461,  167,  167,  167,
-      167,  167,  167,  168,  168,  168,  168,  168,  168,  168,
-      168,  168,  169,  169,  169,  169,  169,  169,  169,  169,
-      169,  224,  224,  224,  224,  224,  224,  224,  224,  224,
-      225,  225,  225,  225,  225,  225,  225,  225,  225,  225,
-      460,  459,  225,  225,  225,  225,  225,  225,  228,  458,
-      457,  456,  455,  454,  453,  452,  228,  228,  228,  228,
-      228,  228,  228,  228,  228,  228,  228,  451,  228,  228,
-      228,  228,  228,  228,  230,  230,  230,  230,  230,  230,
-
-      230,  230,  230,  231,  231,  231,  231,  231,  231,  231,
-      231,  231,  249,  249,  249,  249,  249,  249,  249,  249,
-      275,  275,  275,  275,  275,  275,  275,  275,  275,  275,
-      450,  448,  275,  275,  275,  275,  275,  275,  276,  276,
-      276,  276,  276,  276,  276,  276,  276,  277,  277,  277,
-      277,  277,  277,  277,  277,  277,  320,  320,  320,  320,
-      320,  320,  320,  320,  320,  321,  321,  321,  321,  321,
-      321,  321,  321,  321,  350,  350,  350,  350,  350,  350,
-      350,  350,  350,  376,  376,  376,  376,  376,  376,  376,
-      376,  376,  572,  447,  446,  572,  573,  573,  445,  573,
-
-      574,  574,  574,  574,  575,  575,  575,  575,  576,  576,
-      444,  576,  577,  577,  443,  577,  578,  578,  442,  578,
-      579,  579,  441,  579,  440,  439,  438,  437,  435,  432,
-      431,  430,  429,  428,  427,  426,  425,  424,  423,  422,
-      420,  419,  418,  417,  416,  415,  414,  413,  411,  410,
-      409,  407,  406,  405,  404,  403,  401,  400,  399,  398,
-      397,  396,  393,  392,  391,  390,  389,  388,  386,  385,
-      384,  383,  382,  381,  380,  379,  378,  375,  373,  372,
-      370,  369,  368,  366,  365,  364,  362,  360,  359,  358,
-      357,  356,  352,  351,  347,  346,  345,  344,  343,  342,
-
-      341,  340,  339,  338,  336,  335,  334,  332,  331,  330,
-      328,  327,  326,  325,  324,  323,  322,  318,  317,  316,
-      315,  313,  311,  310,  309,  308,  307,  306,  305,  304,
-      302,  301,  300,  299,  289,  288,  287,  286,  285,  284,
-      282,  281,  280,  279,  278,  271,  270,  269,  268,  267,
-      266,  265,  264,  263,  262,  260,  259,  257,  256,  255,
-      254,  253,  252,  251,  250,  248,  247,  246,  244,  243,
-      242,  240,  238,  237,  236,  235,  234,  232,  223,  222,
-      221,  219,  218,  217,  216,  215,  214,  213,  212,  211,
-      210,  209,  207,  205,  204,  203,  202,  201,  199,  197,
-
-      195,  194,  192,  191,  189,  186,  185,  184,  183,  180,
-      179,  178,  175,  174,  173,  172,  171,  170,  161,  160,
-      159,  158,  157,  156,  155,  154,  153,  152,  151,  150,
-      149,  148,  147,  146,  145,  144,  143,  142,  141,  140,
-      139,  137,  136,  135,  133,  132,  131,  130,  129,  128,
-      127,  126,  125,  124,  123,  121,  120,  119,  118,  117,
-      116,  115,  114,  113,  112,  111,  110,  109,  108,  107,
-       99,   96,   95,   94,   93,   92,   91,   90,   89,   88,
-       85,   84,   82,   81,   79,   78,   77,   76,   75,   74,
-       72,   70,   69,   68,   67,   65,   64,   63,   62,   61,
-
-       59,   58,   57,   53,   51,   47,   44,   41,   35,   33,
-       30,   29,   28,   24,   20,   15,    3,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
-      571,  571,  571,  571,  571,  571,  571,  571,  571
+       27,   26,   19,   23,   23,   26,   36,   52,   19,   31,
+
+       27,   23,   32,   31,   52,   32,   27,   34,   43,   34,
+       39,   39,   80,   36,   39,   32,   42,   56,   32,   42,
+       46,   46,   32,   56,   60,   73,   43,   83,   73,  419,
+       87,   83,  102,  102,   60,  229,  229,   42,   45,   45,
+       45,  587,  419,  103,   80,   87,  202,   87,  139,  277,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       86,  103,  202,  139,  324,  361,  334,  277,  367,   86,
+      334,  575,  367,  574,  573,  369,   86,  571,   86,  361,
+      369,  570,  324,  369,  569,   45,   49,   49,   49,   49,
+       49,   49,   49,   49,   49,   50,   50,   50,   50,   50,
+
+       50,   50,   50,   50,   99,   99,   99,  232,  443,  568,
+      232,  384,  377,  443,  564,  562,   99,   99,   99,   99,
+       99,   99,   99,   99,   99,   99,  377,  384,  232,  384,
+      488,  560,  559,  558,  556,  553,  552,  551,  550,  549,
+      548,  546,  488,  545,  544,  543,  542,  541,  538,  537,
+      536,   99,  104,  535,  533,  532,  531,  530,  529,  527,
+      526,  525,  523,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  105,  522,  521,  105,  520,  519,  518,  517,
+      516,  515,  514,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  513,  105,  105,  105,  105,  105,
+
+      105,  106,  106,  106,  106,  106,  106,  106,  106,  106,
+      107,  107,  107,  107,  107,  107,  107,  107,  107,  164,
+      164,  164,  164,  164,  164,  164,  164,  164,  165,  512,
+      511,  510,  509,  508,  507,  506,  165,  165,  165,  165,
+      165,  165,  165,  165,  165,  165,  165,  505,  165,  165,
+      165,  165,  165,  165,  167,  167,  167,  502,  501,  500,
+      499,  497,  496,  494,  493,  492,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  491,  490,  489,  487,
+      486,  485,  484,  483,  482,  480,  479,  478,  477,  476,
+      475,  474,  473,  472,  471,  470,  469,  468,  467,  466,
+
+      465,  167,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  169,  169,  169,  169,  169,  169,  169,  169,  169,
+      169,  464,  463,  169,  169,  169,  169,  169,  169,  170,
+      170,  170,  170,  170,  170,  170,  170,  170,  171,  171,
+      171,  171,  171,  171,  171,  171,  171,  227,  227,  227,
+      227,  227,  227,  227,  227,  227,  228,  228,  228,  228,
+      228,  228,  228,  228,  228,  228,  462,  461,  228,  228,
+      228,  228,  228,  228,  231,  460,  459,  458,  457,  455,
+      454,  453,  231,  231,  231,  231,  231,  231,  231,  231,
+      231,  231,  231,  452,  231,  231,  231,  231,  231,  231,
+
+      233,  233,  233,  233,  233,  233,  233,  233,  233,  234,
+      234,  234,  234,  234,  234,  234,  234,  234,  252,  252,
+      252,  252,  252,  252,  252,  252,  279,  279,  279,  279,
+      279,  279,  279,  279,  279,  279,  451,  450,  279,  279,
+      279,  279,  279,  279,  280,  280,  280,  280,  280,  280,
+      280,  280,  280,  281,  281,  281,  281,  281,  281,  281,
+      281,  281,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  326,  326,  326,  326,  326,  326,  326,  326,  326,
+      356,  356,  356,  356,  356,  356,  356,  356,  356,  383,
+      383,  383,  383,  383,  383,  383,  383,  383,  579,  449,
+
+      448,  579,  580,  580,  447,  580,  581,  581,  581,  581,
+      582,  582,  582,  582,  583,  583,  446,  583,  584,  584,
+      445,  584,  585,  585,  444,  585,  586,  586,  442,  586,
+      439,  438,  437,  436,  435,  434,  433,  432,  431,  430,
+      429,  427,  426,  425,  424,  423,  422,  421,  420,  418,
+      417,  416,  414,  413,  412,  411,  410,  408,  407,  406,
+      405,  404,  403,  400,  399,  398,  397,  396,  395,  393,
+      392,  391,  390,  389,  388,  387,  386,  385,  382,  380,
+      378,  376,  375,  374,  372,  371,  370,  368,  366,  365,
+      364,  363,  362,  358,  357,  353,  352,  351,  350,  349,
+
+      348,  347,  346,  345,  344,  343,  341,  340,  339,  337,
+      336,  335,  333,  332,  331,  330,  329,  328,  327,  323,
+      322,  321,  320,  318,  316,  315,  314,  313,  312,  311,
+      310,  309,  308,  306,  305,  304,  303,  293,  292,  291,
+      290,  289,  288,  286,  285,  284,  283,  282,  275,  274,
+      273,  272,  271,  270,  269,  268,  267,  266,  265,  263,
+      262,  260,  259,  258,  257,  256,  255,  254,  253,  251,
+      250,  249,  247,  246,  245,  243,  241,  240,  239,  238,
+      237,  235,  226,  225,  224,  222,  221,  220,  219,  218,
+      217,  216,  215,  214,  213,  212,  211,  209,  207,  206,
+
+      205,  204,  203,  201,  199,  197,  196,  194,  193,  191,
+      188,  187,  186,  185,  182,  181,  180,  177,  176,  175,
+      174,  173,  172,  163,  162,  161,  160,  159,  158,  157,
+      156,  155,  154,  153,  152,  151,  150,  149,  148,  147,
+      146,  145,  144,  143,  142,  141,  140,  138,  137,  136,
+      134,  133,  132,  131,  130,  129,  128,  127,  126,  125,
+      124,  122,  121,  120,  119,  118,  117,  116,  115,  114,
+      113,  112,  111,  110,  109,  108,  100,   97,   96,   95,
+       94,   93,   92,   91,   90,   89,   88,   85,   84,   82,
+       81,   79,   78,   77,   76,   75,   74,   72,   70,   69,
+
+       68,   67,   65,   64,   63,   62,   61,   59,   58,   57,
+       53,   51,   47,   44,   41,   35,   33,   30,   29,   28,
+       24,   20,   15,    3,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  578,  578,  578,  578
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1104,13 +1106,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 >= 572 )
+                               if ( yy_current_state >= 579 )
                                        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] != 918 );
+               while ( yy_base[yy_current_state] != 925 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1374,231 +1376,236 @@ YY_RULE_SETUP
 case 48:
 YY_RULE_SETUP
 #line 191 "lexer.l"
-{ lr_bispa= bispa_none; lr_bisexec= bisexec_reset; lr_dir= df_reset; return tokv_word_reset; }
+{ lr_bispa= bispa_none; lr_bisexec= bisexec_shutdown; return tokv_word_shutdown; }
        YY_BREAK
 case 49:
 YY_RULE_SETUP
 #line 192 "lexer.l"
-{ lr_bispa= bispa_none; lr_bisexec= bisexec_execute; lr_dir= df_execute; return tokv_word_execute; }
+{ lr_bispa= bispa_none; lr_bisexec= bisexec_reset; lr_dir= df_reset; return tokv_word_reset; }
        YY_BREAK
 case 50:
 YY_RULE_SETUP
 #line 193 "lexer.l"
-{ lr_bispa= bispa_none; lr_bisexec= bisexec_help; return tokv_word_help; }
+{ lr_bispa= bispa_none; lr_bisexec= bisexec_execute; lr_dir= df_execute; return tokv_word_execute; }
        YY_BREAK
 case 51:
 YY_RULE_SETUP
 #line 194 "lexer.l"
-{ lr_parameter= pf_service; return tokv_word_service; }
+{ lr_bispa= bispa_none; lr_bisexec= bisexec_help; return tokv_word_help; }
        YY_BREAK
 case 52:
 YY_RULE_SETUP
 #line 195 "lexer.l"
-{ lr_parameter= pf_callinguser; return tokv_word_callinguser; }
+{ lr_parameter= pf_service; return tokv_word_service; }
        YY_BREAK
 case 53:
 YY_RULE_SETUP
 #line 196 "lexer.l"
-{ lr_parameter= pf_callinggroup; return tokv_word_callinggroup; }
+{ lr_parameter= pf_callinguser; return tokv_word_callinguser; }
        YY_BREAK
 case 54:
 YY_RULE_SETUP
 #line 197 "lexer.l"
-{ lr_parameter= pf_callingusershell; return tokv_word_callingusershell; }
+{ lr_parameter= pf_callinggroup; return tokv_word_callinggroup; }
        YY_BREAK
 case 55:
 YY_RULE_SETUP
 #line 198 "lexer.l"
-{ lr_parameter= pf_serviceuser; return tokv_word_serviceuser; }
+{ lr_parameter= pf_callingusershell; return tokv_word_callingusershell; }
        YY_BREAK
 case 56:
 YY_RULE_SETUP
 #line 199 "lexer.l"
-{ lr_parameter= pf_servicegroup; return tokv_word_servicegroup; }
+{ lr_parameter= pf_serviceuser; return tokv_word_serviceuser; }
        YY_BREAK
 case 57:
 YY_RULE_SETUP
 #line 200 "lexer.l"
-{ lr_parameter= pf_serviceusershell; return tokv_word_serviceusershell; }
+{ lr_parameter= pf_servicegroup; return tokv_word_servicegroup; }
        YY_BREAK
 case 58:
 YY_RULE_SETUP
 #line 201 "lexer.l"
-{ lr_loglevel= LOG_DEBUG; return tokv_syslog_debug; }
+{ lr_parameter= pf_serviceusershell; return tokv_word_serviceusershell; }
        YY_BREAK
 case 59:
 YY_RULE_SETUP
 #line 202 "lexer.l"
-{ lr_loglevel= LOG_INFO; return tokv_syslog_info; }
+{ lr_loglevel= LOG_DEBUG; return tokv_syslog_debug; }
        YY_BREAK
 case 60:
 YY_RULE_SETUP
 #line 203 "lexer.l"
-{ lr_loglevel= LOG_NOTICE; return tokv_syslog_notice; }
+{ lr_loglevel= LOG_INFO; return tokv_syslog_info; }
        YY_BREAK
 case 61:
 YY_RULE_SETUP
 #line 204 "lexer.l"
-{ lr_loglevel= LOG_WARNING; return tokv_syslog_warning; }
+{ lr_loglevel= LOG_NOTICE; return tokv_syslog_notice; }
        YY_BREAK
 case 62:
 YY_RULE_SETUP
 #line 205 "lexer.l"
-{ lr_loglevel= LOG_ERR; return tokv_syslog_err; }
+{ lr_loglevel= LOG_WARNING; return tokv_syslog_warning; }
        YY_BREAK
 case 63:
 YY_RULE_SETUP
 #line 206 "lexer.l"
-{ lr_loglevel= LOG_CRIT; return tokv_syslog_crit; }
+{ lr_loglevel= LOG_ERR; return tokv_syslog_err; }
        YY_BREAK
 case 64:
 YY_RULE_SETUP
 #line 207 "lexer.l"
-{ lr_loglevel= LOG_ALERT; return tokv_syslog_alert; }
+{ lr_loglevel= LOG_CRIT; return tokv_syslog_crit; }
        YY_BREAK
 case 65:
 YY_RULE_SETUP
 #line 208 "lexer.l"
-{ lr_loglevel= LOG_EMERG; return tokv_syslog_emerg; }
+{ lr_loglevel= LOG_ALERT; return tokv_syslog_alert; }
        YY_BREAK
 case 66:
 YY_RULE_SETUP
 #line 209 "lexer.l"
-{ lr_logfacility= LOG_AUTHPRIV; return tokv_syslog_authpriv; }
+{ lr_loglevel= LOG_EMERG; return tokv_syslog_emerg; }
        YY_BREAK
 case 67:
 YY_RULE_SETUP
 #line 210 "lexer.l"
-{ lr_logfacility= LOG_CRON; return tokv_syslog_cron; }
+{ lr_logfacility= LOG_AUTHPRIV; return tokv_syslog_authpriv; }
        YY_BREAK
 case 68:
 YY_RULE_SETUP
 #line 211 "lexer.l"
-{ lr_logfacility= LOG_DAEMON; return tokv_syslog_daemon; }
+{ lr_logfacility= LOG_CRON; return tokv_syslog_cron; }
        YY_BREAK
 case 69:
 YY_RULE_SETUP
 #line 212 "lexer.l"
-{ lr_logfacility= LOG_KERN; return tokv_syslog_kern; }
+{ lr_logfacility= LOG_DAEMON; return tokv_syslog_daemon; }
        YY_BREAK
 case 70:
 YY_RULE_SETUP
 #line 213 "lexer.l"
-{ lr_logfacility= LOG_LPR; return tokv_syslog_lpr; }
+{ lr_logfacility= LOG_KERN; return tokv_syslog_kern; }
        YY_BREAK
 case 71:
 YY_RULE_SETUP
 #line 214 "lexer.l"
-{ lr_logfacility= LOG_MAIL; return tokv_syslog_mail; }
+{ lr_logfacility= LOG_LPR; return tokv_syslog_lpr; }
        YY_BREAK
 case 72:
 YY_RULE_SETUP
 #line 215 "lexer.l"
-{ lr_logfacility= LOG_NEWS; return tokv_syslog_news; }
+{ lr_logfacility= LOG_MAIL; return tokv_syslog_mail; }
        YY_BREAK
 case 73:
 YY_RULE_SETUP
 #line 216 "lexer.l"
-{ lr_logfacility= LOG_SYSLOG; return tokv_syslog_syslog; }
+{ lr_logfacility= LOG_NEWS; return tokv_syslog_news; }
        YY_BREAK
 case 74:
 YY_RULE_SETUP
 #line 217 "lexer.l"
-{ lr_logfacility= LOG_USER; return tokv_syslog_user; }
+{ lr_logfacility= LOG_SYSLOG; return tokv_syslog_syslog; }
        YY_BREAK
 case 75:
 YY_RULE_SETUP
 #line 218 "lexer.l"
-{ lr_logfacility= LOG_UUCP; return tokv_syslog_uucp; }
+{ lr_logfacility= LOG_USER; return tokv_syslog_user; }
        YY_BREAK
 case 76:
 YY_RULE_SETUP
 #line 219 "lexer.l"
-{ lr_logfacility= LOG_LOCAL0; return tokv_syslog_local0; }
+{ lr_logfacility= LOG_UUCP; return tokv_syslog_uucp; }
        YY_BREAK
 case 77:
 YY_RULE_SETUP
 #line 220 "lexer.l"
-{ lr_logfacility= LOG_LOCAL1; return tokv_syslog_local1; }
+{ lr_logfacility= LOG_LOCAL0; return tokv_syslog_local0; }
        YY_BREAK
 case 78:
 YY_RULE_SETUP
 #line 221 "lexer.l"
-{ lr_logfacility= LOG_LOCAL2; return tokv_syslog_local2; }
+{ lr_logfacility= LOG_LOCAL1; return tokv_syslog_local1; }
        YY_BREAK
 case 79:
 YY_RULE_SETUP
 #line 222 "lexer.l"
-{ lr_logfacility= LOG_LOCAL3; return tokv_syslog_local3; }
+{ lr_logfacility= LOG_LOCAL2; return tokv_syslog_local2; }
        YY_BREAK
 case 80:
 YY_RULE_SETUP
 #line 223 "lexer.l"
-{ lr_logfacility= LOG_LOCAL4; return tokv_syslog_local4; }
+{ lr_logfacility= LOG_LOCAL3; return tokv_syslog_local3; }
        YY_BREAK
 case 81:
 YY_RULE_SETUP
 #line 224 "lexer.l"
-{ lr_logfacility= LOG_LOCAL5; return tokv_syslog_local5; }
+{ lr_logfacility= LOG_LOCAL4; return tokv_syslog_local4; }
        YY_BREAK
 case 82:
 YY_RULE_SETUP
 #line 225 "lexer.l"
-{ lr_logfacility= LOG_LOCAL6; return tokv_syslog_local6; }
+{ lr_logfacility= LOG_LOCAL5; return tokv_syslog_local5; }
        YY_BREAK
 case 83:
 YY_RULE_SETUP
 #line 226 "lexer.l"
-{ lr_logfacility= LOG_LOCAL7; return tokv_syslog_local7; }
+{ lr_logfacility= LOG_LOCAL6; return tokv_syslog_local6; }
        YY_BREAK
 case 84:
 YY_RULE_SETUP
 #line 227 "lexer.l"
-{ return tokv_word_read; }
+{ lr_logfacility= LOG_LOCAL7; return tokv_syslog_local7; }
        YY_BREAK
 case 85:
 YY_RULE_SETUP
 #line 228 "lexer.l"
-{ return tokv_word_write; }
+{ return tokv_word_read; }
        YY_BREAK
 case 86:
 YY_RULE_SETUP
 #line 229 "lexer.l"
-{ return tokv_dollar; }
+{ return tokv_word_write; }
        YY_BREAK
 case 87:
 YY_RULE_SETUP
 #line 230 "lexer.l"
-{ return tokv_openparen; }
+{ return tokv_dollar; }
        YY_BREAK
 case 88:
 YY_RULE_SETUP
 #line 231 "lexer.l"
-{ return tokv_closeparen; }
+{ return tokv_openparen; }
        YY_BREAK
 case 89:
 YY_RULE_SETUP
 #line 232 "lexer.l"
-{ return tokv_not; }
+{ return tokv_closeparen; }
        YY_BREAK
 case 90:
 YY_RULE_SETUP
 #line 233 "lexer.l"
-{ return tokv_and; }
+{ return tokv_not; }
        YY_BREAK
 case 91:
 YY_RULE_SETUP
 #line 234 "lexer.l"
-{ return tokv_or; }
+{ return tokv_and; }
        YY_BREAK
 case 92:
 YY_RULE_SETUP
 #line 235 "lexer.l"
-{ lr_dir= df_error; lr_loglevel= LOG_ERR; return tokv_word_error; }
+{ return tokv_or; }
        YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 239 "lexer.l"
+#line 236 "lexer.l"
+{ lr_dir= df_error; lr_loglevel= LOG_ERR; return tokv_word_error; }
+       YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 240 "lexer.l"
 {
                          char *ep;
                          lr_min=lr_max= (int)strtoul(yytext,&ep,10);
@@ -1606,9 +1613,9 @@ YY_RULE_SETUP
                          return tokv_ordinal;
                        }
        YY_BREAK
-case 94:
+case 95:
 YY_RULE_SETUP
-#line 245 "lexer.l"
+#line 246 "lexer.l"
 {
                          char *ep;
                          lr_min= (int)strtoul(yytext,&ep,10);
@@ -1623,9 +1630,9 @@ YY_RULE_SETUP
                          return tokv_fdrange;
                        }
        YY_BREAK
-case 95:
+case 96:
 YY_RULE_SETUP
-#line 258 "lexer.l"
+#line 259 "lexer.l"
 {
                          char *ep;
                          lr_min= (int)strtoul(yytext,&ep,10);
@@ -1635,15 +1642,10 @@ YY_RULE_SETUP
                          return tokv_fdstoend;
                        }
        YY_BREAK
-case 96:
-YY_RULE_SETUP
-#line 266 "lexer.l"
-return tokv_lwsp;
-       YY_BREAK
 case 97:
 YY_RULE_SETUP
 #line 267 "lexer.l"
-cstate->lineno++; return tokv_newline;
+return tokv_lwsp;
        YY_BREAK
 case 98:
 YY_RULE_SETUP
@@ -1653,38 +1655,43 @@ cstate->lineno++; return tokv_newline;
 case 99:
 YY_RULE_SETUP
 #line 269 "lexer.l"
+cstate->lineno++; return tokv_newline;
+       YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 270 "lexer.l"
 {
                          parseerrprint("missing newline at eof after comment");
                          return tokv_error;
                        }
        YY_BREAK
-case 100:
+case 101:
 YY_RULE_SETUP
-#line 273 "lexer.l"
+#line 274 "lexer.l"
 {
                          return dequote(yytext);
                        }
        YY_BREAK
-case 101:
+case 102:
 YY_RULE_SETUP
-#line 276 "lexer.l"
+#line 277 "lexer.l"
 {
                          parseerrprint("misquoted or unterminated string");
                          return tokv_error;
                        }
        YY_BREAK
-case 102:
+case 103:
 YY_RULE_SETUP
-#line 280 "lexer.l"
+#line 281 "lexer.l"
 return tokv_barestring;
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 281 "lexer.l"
+#line 282 "lexer.l"
 return tokv_eof;
        YY_BREAK
-case 103:
+case 104:
 YY_RULE_SETUP
-#line 284 "lexer.l"
+#line 285 "lexer.l"
 ECHO;
        YY_BREAK
 
@@ -1976,7 +1983,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 >= 572 )
+                       if ( yy_current_state >= 579 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2011,11 +2018,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 >= 572 )
+               if ( yy_current_state >= 579 )
                        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 == 571);
+       yy_is_jam = (yy_current_state == 578);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -2570,7 +2577,7 @@ int main()
        return 0;
        }
 #endif
-#line 284 "lexer.l"
+#line 285 "lexer.l"
 
 
 const char *const builtinservicehelpstrings[]= {
@@ -2579,6 +2586,7 @@ const char *const builtinservicehelpstrings[]= {
   "version",
   "toplevel",
   "override",
+  "shutdown",
   "reset",
   "execute",
   "help",
diff --git a/lexer.l b/lexer.l
index 6af03455119af5b06c40af9146834c38247aaf29..388089a764770904b091aa31e2517734632c678d 100644 (file)
--- a/lexer.l
+++ b/lexer.l
@@ -188,6 +188,7 @@ parameter { lr_bispa= bispa_parameter; lr_bisexec= bisexec_parameter; return tok
 version { lr_bispa= bispa_none; lr_bisexec= bisexec_version; return tokv_word_version; }
 toplevel { lr_bispa= bispa_none; lr_bisexec= bisexec_toplevel; return tokv_word_toplevel; }
 override { lr_bispa= bispa_none; lr_bisexec= bisexec_override; return tokv_word_override; }
+shutdown { lr_bispa= bispa_none; lr_bisexec= bisexec_shutdown; return tokv_word_shutdown; }
 reset { lr_bispa= bispa_none; lr_bisexec= bisexec_reset; lr_dir= df_reset; return tokv_word_reset; }
 execute { lr_bispa= bispa_none; lr_bisexec= bisexec_execute; lr_dir= df_execute; return tokv_word_execute; }
 help { lr_bispa= bispa_none; lr_bisexec= bisexec_help; return tokv_word_help; }
@@ -289,6 +290,7 @@ const char *const builtinservicehelpstrings[]= {
   "version",
   "toplevel",
   "override",
+  "shutdown",
   "reset",
   "execute",
   "help",
index dfb58a2f21ec497bc133f403450c07373b6a87dd..ae6fbfb972530cc8a599d1532014d73562f5da17 100644 (file)
@@ -43,7 +43,7 @@
 pid_t overlordpid;
 
 static pid_t checkpid= -1, detachpid= -1;
-static sig_atomic_t needcheck= 1;
+static sig_atomic_t needcheck= 1; /* 2 means we half-expect the server to be down */
 
 static void checkstalepipes(void) {
   /* There is an unimportant race here.  If there is a stale pipe but
@@ -128,11 +128,14 @@ static void sighandler_chld(int x) {
       } else if (!WIFEXITED(status)) {
        syslog(LOG_ERR,"call pid %ld died due to unknown reason, code %d",
               (long)r,status);
+      } else if (WEXITSTATUS(status)==10) {
+       needcheck= 2;
       } else if (WEXITSTATUS(status)>12) {
        if (WEXITSTATUS(status)>24)
          syslog(LOG_ERR,"call pid %ld exited with status %d >24",
                 (long)r,WEXITSTATUS(status));
        checkstalepipes();
+       needcheck= 1;
       }
     }
   }
@@ -165,7 +168,7 @@ static void blocksignals(int how) {
   r= sigprocmask(how,&set,0); assert(!r);
 }
 
-static void NONRETURNING docheck(void) {
+static void NONRETURNING docheck(int needwanted) {
 #ifndef DEBUG
   /* This subprocess exits with status 0 if the parent should die,
    * 1 if it should not, and something else if it fails horribly.
@@ -197,8 +200,11 @@ static void NONRETURNING docheck(void) {
 
   r= connect(sfd,(struct sockaddr*)&ssockname,sizeof(ssockname));
   if (r) {
-    if (errno == ECONNREFUSED || errno == ENOENT)
-      { syslog(LOG_WARNING,"real uservd daemon is not running: %m"); exit(0); }
+    if (errno == ECONNREFUSED || errno == ENOENT) {
+      if (needwanted != 2)
+       syslog(LOG_WARNING,"real uservd daemon is not running: %m");
+      exit(0);
+    }
     syslog(LOG_ERR,"unable to connect to uservd daemon: %m"); exit(1);
   }
 
@@ -340,11 +346,10 @@ int main(int argc, char *const *argv) {
 
   for (;;) {
     if (needcheck) {
-      assert(checkpid==-1);
-      for (;;) {
+      while (checkpid==-1) {
        checkpid= fork();
        if (checkpid!=-1) {
-         if (!checkpid) docheck();
+         if (!checkpid) docheck(needcheck);
          break;
        } else if (errno==EAGAIN) {
          syslog(LOG_ERR,"fork for check - will wait and retry: %m");
index 64afd5c419aba03a85e2e29c6b0b2123fc78c1e0..636255a286f18209d2eed766e18d42bf260ec169 100644 (file)
--- a/process.c
+++ b/process.c
@@ -271,8 +271,18 @@ void NONRETURNING disconnect(int exitstatus) {
   _exit(exitstatus);
 }
 
-static void NONRETURNING sighandler_chld(int ignored) {
+static void reporttermination(int status) {
   struct progress_msg progress_mbuf;
+  
+  memset(&progress_mbuf,0,sizeof(progress_mbuf));
+  progress_mbuf.magic= PROGRESS_MAGIC;
+  progress_mbuf.type= pt_terminated;
+  progress_mbuf.data.terminated.status= status;
+  xfwrite(&progress_mbuf,sizeof(progress_mbuf),swfile);
+  xfflush(swfile);
+}
+
+static void NONRETURNING sighandler_chld(int ignored) {
   int status;
   pid_t returned;
 
@@ -282,13 +292,7 @@ static void NONRETURNING sighandler_chld(int ignored) {
   if (returned!=child) syscallerror("spurious child process");
   child= childtokill= -1;
 
-  memset(&progress_mbuf,0,sizeof(progress_mbuf));
-  progress_mbuf.magic= PROGRESS_MAGIC;
-  progress_mbuf.type= pt_terminated;
-  progress_mbuf.data.terminated.status= status;
-  xfwrite(&progress_mbuf,sizeof(progress_mbuf),swfile);
-  xfflush(swfile);
-
+  reporttermination(status);
   syslog(LOG_INFO,"service completed (status %d %d)",(status>>8)&0x0ff,status&0x0ff);
   _exit(0);
 }
@@ -746,6 +750,18 @@ void servicerequest(int sfd) {
   getevent(&event_mbuf);
   assert(event_mbuf.type == et_confirm);
 
+  if (execbuiltin == bisexec_shutdown && !serviceuser_uid) {
+    /* The check for the uid is just so we can give a nice
+     * error message (in the actual code for bisexec_shutdown).
+     * If this is spoofed somehow then the unlink() will simply fail.
+     */
+    r= unlink(RENDEZVOUSPATH);
+    if (r) syscallfailure("remove rendezvous socket %s",RENDEZVOUSPATH);
+    syslog(LOG_NOTICE,"arranging for termination, due to client request");
+    reporttermination(0);
+    _exit(10);
+  }
+
   fork_service_synch();
   
   getevent(&event_mbuf);
index 168e07657ad427dd16021e5a58662d0af10cd9ef..fa8b8ac033d4d6e65a179e1e893184469e2af571 100644 (file)
@@ -137,6 +137,15 @@ void bisexec_execute(const char *const *argv) {
   serv_checkstdoutexit();
 }
 
+void bisexec_shutdown(const char *const *argv) {
+  /* This is only reached if the serviceuser_uid test in
+   * process.c:servicerequest() fails (we have to handle the
+   * shutdown request there, unfortunately).
+   */
+  fputs("uservd: builtin service shutdown: permission denied\n",stderr);
+  _exit(-1);
+}
+
 static void serv_resetsignal(int signo) {
   struct sigaction sig;
   
index 82a74dd2851ae7204318ffd86c019d2f2244a5b7..86d612e98095314682b22c459f785e30810db5d0 100644 (file)
--- a/spec.sgml
+++ b/spec.sgml
@@ -30,7 +30,7 @@ You should have received a copy of the GNU General Public License
 along with <prgn/userv/; if not, write to the Free Software
 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-<toc sect>
+<toc sect1>
 
 <chapt id="intro">Introduction
 <p>
@@ -954,10 +954,13 @@ to be parsed).
 <tag/<tt/help//
 <item>
 Displays a list of the understood builtin service names and arguments.
-</taglist>
 
-In the future other builtin services may be defined which do more than
-just print information.
+<tag/<tt/shutdown//
+<item>
+Arranges for the <prgn/uservd/ to shut down.  Available only when the
+service user is root.  This only affects new requests; it doesn't
+terminate any currently-running requests
+</taglist>
 
 <tag/<tt/set-environment//
 <tag/<tt/no-set-environment//
index de555fe0bf996d71122c72fde04af0e701f87811..4ea2ac9bc090b8b3d536e15ae766c34b061a048e 100644 (file)
--- a/tokens.h
+++ b/tokens.h
@@ -98,61 +98,62 @@ enum tokens {
   toki_word_version=                                0x0000002d,
   toki_word_toplevel=                               0x0000002e,
   toki_word_override=                               0x0000002f,
-  toki_word_reset=                                  0x00000030,
-  toki_word_execute=                                0x00000031,
-  toki_word_help=                                   0x00000032,
-  toki_word_service=                                0x00000033,
-  toki_word_callinguser=                            0x00000034,
-  toki_word_callinggroup=                           0x00000035,
-  toki_word_callingusershell=                       0x00000036,
-  toki_word_serviceuser=                            0x00000037,
-  toki_word_servicegroup=                           0x00000038,
-  toki_word_serviceusershell=                       0x00000039,
-  toki_syslog_debug=                                0x0000003a,
-  toki_syslog_info=                                 0x0000003b,
-  toki_syslog_notice=                               0x0000003c,
-  toki_syslog_warning=                              0x0000003d,
-  toki_syslog_err=                                  0x0000003e,
-  toki_syslog_crit=                                 0x0000003f,
-  toki_syslog_alert=                                0x00000040,
-  toki_syslog_emerg=                                0x00000041,
-  toki_syslog_authpriv=                             0x00000042,
-  toki_syslog_cron=                                 0x00000043,
-  toki_syslog_daemon=                               0x00000044,
-  toki_syslog_kern=                                 0x00000045,
-  toki_syslog_lpr=                                  0x00000046,
-  toki_syslog_mail=                                 0x00000047,
-  toki_syslog_news=                                 0x00000048,
-  toki_syslog_syslog=                               0x00000049,
-  toki_syslog_user=                                 0x0000004a,
-  toki_syslog_uucp=                                 0x0000004b,
-  toki_syslog_local0=                               0x0000004c,
-  toki_syslog_local1=                               0x0000004d,
-  toki_syslog_local2=                               0x0000004e,
-  toki_syslog_local3=                               0x0000004f,
-  toki_syslog_local4=                               0x00000050,
-  toki_syslog_local5=                               0x00000051,
-  toki_syslog_local6=                               0x00000052,
-  toki_syslog_local7=                               0x00000053,
-  toki_word_read=                                   0x00000054,
-  toki_word_write=                                  0x00000055,
-  toki_ordinal=                                     0x00000056,
-  toki_fdrange=                                     0x00000057,
-  toki_fdstoend=                                    0x00000058,
-  toki_dollar=                                      0x00000059,
-  toki_lwsp=                                        0x0000005a,
-  toki_newline=                                     0x0000005b,
-  toki_barestring=                                  0x0000005c,
-  toki_quotedstring=                                0x0000005d,
-  toki_eof=                                         0x0000005e,
-  toki_quit=                                        0x0000005f,
-  toki_error=                                       0x00000060,
-  toki_openparen=                                   0x00000061,
-  toki_closeparen=                                  0x00000062,
-  toki_not=                                         0x00000063,
-  toki_and=                                         0x00000064,
-  toki_or=                                          0x00000065,
-  toki_word_error=                                  0x00000066,
+  toki_word_shutdown=                               0x00000030,
+  toki_word_reset=                                  0x00000031,
+  toki_word_execute=                                0x00000032,
+  toki_word_help=                                   0x00000033,
+  toki_word_service=                                0x00000034,
+  toki_word_callinguser=                            0x00000035,
+  toki_word_callinggroup=                           0x00000036,
+  toki_word_callingusershell=                       0x00000037,
+  toki_word_serviceuser=                            0x00000038,
+  toki_word_servicegroup=                           0x00000039,
+  toki_word_serviceusershell=                       0x0000003a,
+  toki_syslog_debug=                                0x0000003b,
+  toki_syslog_info=                                 0x0000003c,
+  toki_syslog_notice=                               0x0000003d,
+  toki_syslog_warning=                              0x0000003e,
+  toki_syslog_err=                                  0x0000003f,
+  toki_syslog_crit=                                 0x00000040,
+  toki_syslog_alert=                                0x00000041,
+  toki_syslog_emerg=                                0x00000042,
+  toki_syslog_authpriv=                             0x00000043,
+  toki_syslog_cron=                                 0x00000044,
+  toki_syslog_daemon=                               0x00000045,
+  toki_syslog_kern=                                 0x00000046,
+  toki_syslog_lpr=                                  0x00000047,
+  toki_syslog_mail=                                 0x00000048,
+  toki_syslog_news=                                 0x00000049,
+  toki_syslog_syslog=                               0x0000004a,
+  toki_syslog_user=                                 0x0000004b,
+  toki_syslog_uucp=                                 0x0000004c,
+  toki_syslog_local0=                               0x0000004d,
+  toki_syslog_local1=                               0x0000004e,
+  toki_syslog_local2=                               0x0000004f,
+  toki_syslog_local3=                               0x00000050,
+  toki_syslog_local4=                               0x00000051,
+  toki_syslog_local5=                               0x00000052,
+  toki_syslog_local6=                               0x00000053,
+  toki_syslog_local7=                               0x00000054,
+  toki_word_read=                                   0x00000055,
+  toki_word_write=                                  0x00000056,
+  toki_ordinal=                                     0x00000057,
+  toki_fdrange=                                     0x00000058,
+  toki_fdstoend=                                    0x00000059,
+  toki_dollar=                                      0x0000005a,
+  toki_lwsp=                                        0x0000005b,
+  toki_newline=                                     0x0000005c,
+  toki_barestring=                                  0x0000005d,
+  toki_quotedstring=                                0x0000005e,
+  toki_eof=                                         0x0000005f,
+  toki_quit=                                        0x00000060,
+  toki_error=                                       0x00000061,
+  toki_openparen=                                   0x00000062,
+  toki_closeparen=                                  0x00000063,
+  toki_not=                                         0x00000064,
+  toki_and=                                         0x00000065,
+  toki_or=                                          0x00000066,
+  toki_word_error=                                  0x00000067,
 
   tokv_word_reject=             tokt_directive|tokt_execmode|tokr_word|toki_word_reject,
   tokv_word_executefromdirectory=tokt_directive|tokt_execmode|tokr_word|toki_word_executefromdirectory,
@@ -201,6 +202,7 @@ enum tokens {
   tokv_word_version=            tokt_builtinservice|tokr_word|toki_word_version,
   tokv_word_toplevel=           tokt_builtinservice|tokr_word|toki_word_toplevel,
   tokv_word_override=           tokt_builtinservice|tokr_word|toki_word_override,
+  tokv_word_shutdown=           tokt_builtinservice|tokr_word|toki_word_shutdown,
   tokv_word_reset=              tokt_builtinservice|tokt_directive|tokr_word|toki_word_reset,
   tokv_word_execute=            tokt_builtinservice|tokt_directive|tokt_execmode|tokr_word|toki_word_execute,
   tokv_word_help=               tokt_builtinservice|tokr_word|toki_word_help,