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).
 
      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.
  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.
 
    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:
 
 
 REENTRANCY IN THE LIBC:
 
index 58a4a5afbdcab284ee0272473bd321cff5cee445..eb162513118cb847dc678c4fa72ce6f2bcc668c7 100644 (file)
@@ -126,8 +126,6 @@ version.h:  Makefile
 
 tokens.h:      language.i4
 
 
 tokens.h:      language.i4
 
-               rm -f *.o *~ core ./#*#
-
 autoconf configure:
                autoheader
                autoconf
 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
                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
                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_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;
 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
 
 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.)
   * 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(`version',`none')
 isbuiltinservice(`toplevel',`none')
 isbuiltinservice(`override',`none')
+isbuiltinservice(`shutdown',`none')
 
 dnl builtin services that are also directive names
 define(`isdirectivebuiltinservice',
 
 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;
 
        *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,    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] =
     } ;
 
 static yyconst int yy_ec[256] =
@@ -396,253 +396,254 @@ static yyconst int yy_meta[52] =
         1
     } ;
 
         1
     } ;
 
-static yyconst short int yy_base[582] =
+static yyconst short int yy_base[589] =
     {   0,
     {   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,
     {   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,
     {   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,
        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,
     {   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,
         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,
        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;
     } ;
 
 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];
                        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;
                        }
                                        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];
 
 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"
 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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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"
        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
        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);
 {
                          char *ep;
                          lr_min=lr_max= (int)strtoul(yytext,&ep,10);
@@ -1606,9 +1613,9 @@ YY_RULE_SETUP
                          return tokv_ordinal;
                        }
        YY_BREAK
                          return tokv_ordinal;
                        }
        YY_BREAK
-case 94:
+case 95:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 245 "lexer.l"
+#line 246 "lexer.l"
 {
                          char *ep;
                          lr_min= (int)strtoul(yytext,&ep,10);
 {
                          char *ep;
                          lr_min= (int)strtoul(yytext,&ep,10);
@@ -1623,9 +1630,9 @@ YY_RULE_SETUP
                          return tokv_fdrange;
                        }
        YY_BREAK
                          return tokv_fdrange;
                        }
        YY_BREAK
-case 95:
+case 96:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 258 "lexer.l"
+#line 259 "lexer.l"
 {
                          char *ep;
                          lr_min= (int)strtoul(yytext,&ep,10);
 {
                          char *ep;
                          lr_min= (int)strtoul(yytext,&ep,10);
@@ -1635,15 +1642,10 @@ YY_RULE_SETUP
                          return tokv_fdstoend;
                        }
        YY_BREAK
                          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"
 case 97:
 YY_RULE_SETUP
 #line 267 "lexer.l"
-cstate->lineno++; return tokv_newline;
+return tokv_lwsp;
        YY_BREAK
 case 98:
 YY_RULE_SETUP
        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"
 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
 {
                          parseerrprint("missing newline at eof after comment");
                          return tokv_error;
                        }
        YY_BREAK
-case 100:
+case 101:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 273 "lexer.l"
+#line 274 "lexer.l"
 {
                          return dequote(yytext);
                        }
        YY_BREAK
 {
                          return dequote(yytext);
                        }
        YY_BREAK
-case 101:
+case 102:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 276 "lexer.l"
+#line 277 "lexer.l"
 {
                          parseerrprint("misquoted or unterminated string");
                          return tokv_error;
                        }
        YY_BREAK
 {
                          parseerrprint("misquoted or unterminated string");
                          return tokv_error;
                        }
        YY_BREAK
-case 102:
+case 103:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 280 "lexer.l"
+#line 281 "lexer.l"
 return tokv_barestring;
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
 return tokv_barestring;
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 281 "lexer.l"
+#line 282 "lexer.l"
 return tokv_eof;
        YY_BREAK
 return tokv_eof;
        YY_BREAK
-case 103:
+case 104:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 284 "lexer.l"
+#line 285 "lexer.l"
 ECHO;
        YY_BREAK
 
 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];
                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_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];
        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_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;
        }
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -2570,7 +2577,7 @@ int main()
        return 0;
        }
 #endif
        return 0;
        }
 #endif
-#line 284 "lexer.l"
+#line 285 "lexer.l"
 
 
 const char *const builtinservicehelpstrings[]= {
 
 
 const char *const builtinservicehelpstrings[]= {
@@ -2579,6 +2586,7 @@ const char *const builtinservicehelpstrings[]= {
   "version",
   "toplevel",
   "override",
   "version",
   "toplevel",
   "override",
+  "shutdown",
   "reset",
   "execute",
   "help",
   "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; }
 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; }
 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",
   "version",
   "toplevel",
   "override",
+  "shutdown",
   "reset",
   "execute",
   "help",
   "reset",
   "execute",
   "help",
index dfb58a2f21ec497bc133f403450c07373b6a87dd..ae6fbfb972530cc8a599d1532014d73562f5da17 100644 (file)
@@ -43,7 +43,7 @@
 pid_t overlordpid;
 
 static pid_t checkpid= -1, detachpid= -1;
 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
 
 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 (!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();
       } 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);
 }
 
   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.
 #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) {
 
   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);
   }
 
     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) {
 
   for (;;) {
     if (needcheck) {
-      assert(checkpid==-1);
-      for (;;) {
+      while (checkpid==-1) {
        checkpid= fork();
        if (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");
          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);
 }
 
   _exit(exitstatus);
 }
 
-static void NONRETURNING sighandler_chld(int ignored) {
+static void reporttermination(int status) {
   struct progress_msg progress_mbuf;
   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;
 
   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;
 
   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);
 }
   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);
 
   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);
   fork_service_synch();
   
   getevent(&event_mbuf);
index 168e07657ad427dd16021e5a58662d0af10cd9ef..fa8b8ac033d4d6e65a179e1e893184469e2af571 100644 (file)
@@ -137,6 +137,15 @@ void bisexec_execute(const char *const *argv) {
   serv_checkstdoutexit();
 }
 
   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;
   
 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.
 
 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>
 
 <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.
 <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//
 
 <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_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,
 
   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_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,
   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,