On 5/20/07, Roland Mainz <roland.mainz at nrubsig.org> wrote:
>
> Hi!
>
> ----
>
> ast-ksh.2007-05-15 is out (yes, yes, I know... I am little bit late with
> this annoucement... ;-( )
>
> -------- Original Message --------
patch diff from 20070418 to 20070515 attached
-- 
      _        Felix Schulte
    _|_|_     mailto:felix.schulte at gmail.com
    (0 0)
ooO--(_)--Ooo
-------------- next part --------------
diff -r -N -u ksh93_2007_04_18/lib/package/ast-ksh.html 
ksh93_2007_05_15/lib/package/ast-ksh.html
--- ksh93_2007_04_18/lib/package/ast-ksh.html   2007-04-18 20:07:29.000000000 
+0200
+++ ksh93_2007_05_15/lib/package/ast-ksh.html   2007-05-16 05:16:01.000000000 
+0200
@@ -193,7 +193,19 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="ksh93 
changes">ksh93 changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
-07-04-18  --- Release ksh93s+  ---
+07-05-15  --- Release ksh93s+  ---
+07-05-15  A bug in which the %B format of printf was affected  by the
+         locale has been fixed.
+07-05-14  A bug in which &nbsp;was not removed in the replacement pattern with
+         ${var/pattern/rep} when it was not followed by &nbsp;or a digit has
+         been fixed.
+07-05-10  A bug in which ksh -R file core dumped if no script was sepcifed
+         has been fixed.  it not displays an error message.
+07-05-07  Added additional Solaris signals to signal table.
+07-04-30  A bug in which a pipeline with command substitution inside a
+         function could cause a pipline that invokes this function to
+         hang when the pipefail option is on has been fixed.
+07-04-30  Added -q to whence.
 07-04-18  A small memory leak with each redirection of a non-builtin has
          been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
@@ -1654,6 +1666,19 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libast 
changes">libast changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+07-05-15 sfio/sfvprintf.c: %h? and SFFMT_SHORT =&gt; raw bytes
+07-05-09 features/signal.c,features/siglist: use kill -l &amp; strsignal()
+07-04-25 misc/optctx.c: add for opt_info switching
+07-04-24 misc/cmdarg.c,include/cmdarg.h: add CMD_CHECKED, CMD_SILENT
+07-04-24 misc/procopen.c,include/proc.h: add PROC_CHECK
+07-04-24 misc/procrun.c: add flags arg (current use PROC_ARGMOD)
+07-04-24 misc/cmdarg.c,include/cmdarg.h: move from src/cmd/tw
+07-04-20 port/(lclang.h|lc.c|mc.c|lclib.h|lcgen.c): separate lctab.c
+07-04-20 comp/conf.sh: defer to systems without 'grep -q' -- sigh
+07-04-20 comp/conf.sh: probe for LL integer constant initializer suffix
+07-04-20 include/syslog.h: &lt;namval.h&gt; =&gt; &lt;ast_namval.h&gt; for 
win32
+07-04-20 ast_namval.h: add as copy of include/namval.h for win32
+07-04-19 comp/conf.tab: fix SVID SI entries to probe SI_* (not _SI_*)
 07-04-13 tm/tmxdate.c,tm/tmzone.c: handle &#0091;-+&#0093;0000 UTC zone offset
 07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
 07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER =&gt; nan/inf vs. NAN/INF
@@ -1661,6 +1686,7 @@
 07-03-28 misc/optget.c: fix l10n --?-
 07-03-25 features/common: fix { ast_std.h ast_map.h stdint.h } logic
 07-03-21 error.h: move from error_info to (*_error_data_)
+07-03-21 misc/error.c: add errorctx() for error_info switching
 07-03-21 option.h: move from opt_info to (*_opt_data_)
 07-03-19 regex/regdecomp.c: fix REX_ONECHAR escapes and add REX_KMP
 07-03-11 tm/tmxscan.c,regex/regnexec.c: fix strict-alias transgressions
@@ -3080,7 +3106,13 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libcmd 
changes">libcmd changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
-07-03-28 date.c: add --unelepsed=scale, -U: fmtelapsed() =&gt; strelapsed()
+07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify &gt;= 20070511 context
+07-05-09 fds.c: handle ipv6 sockets
+07-05-09 cmd.h: &lt;shbltin.h&gt; : cmdquit() =&gt; sh_checksig(context)
+07-04-25 mkdir.c: force (S_ISVTX|S_ISUID|S_ISGID) after mkdir(2)
+07-04-24 procrun.c: add -last intercept =&gt; sh_run() and whence -q
+07-04-19 uname.c: name operands first checked for CS_NAME, then NAME
+07-03-28 date.c: add --unelapsed=scale, -U: fmtelapsed() =&gt; strelapsed()
 07-03-25 wclib.h: iswspace() requires &lt;wctype.h&gt;!
 07-03-11 tty.c: add sysV --line-number, -l
 07-02-26 Makefile: sumlib.o: direct extract from +lsum (vcodex someday)
@@ -3364,7 +3396,7 @@
 <TR>
 <TD align=left></TD>
 <TD align=center></TD>
-<TD align=right>April 18, 2007</TD>
+<TD align=right>May 15, 2007</TD>
 </TR>
 </TABLE>
 <P>
diff -r -N -u ksh93_2007_04_18/lib/package/ast-ksh.README 
ksh93_2007_05_15/lib/package/ast-ksh.README
--- ksh93_2007_04_18/lib/package/ast-ksh.README 2007-04-18 20:07:28.000000000 
+0200
+++ ksh93_2007_05_15/lib/package/ast-ksh.README 2007-05-16 05:16:00.000000000 
+0200
@@ -92,7 +92,19 @@
 
 :::::::: ksh93 ::::::::
 
-07-04-18  --- Release ksh93s+  ---
+07-05-15  --- Release ksh93s+  ---
+07-05-15  A bug in which the %B format of printf was affected  by the
+         locale has been fixed.
+07-05-14  A bug in which \ was not removed in the replacement pattern with
+         ${var/pattern/rep} when it was not followed by \ or a digit has
+         been fixed.
+07-05-10  A bug in which ksh -R file core dumped if no script was sepcifed
+         has been fixed.  it not displays an error message.
+07-05-07  Added additional Solaris signals to signal table.
+07-04-30  A bug in which a pipeline with command substitution inside a
+         function could cause a pipline that invokes this function to
+         hang when the pipefail option is on has been fixed.
+07-04-30  Added -q to whence.
 07-04-18  A small memory leak with each redirection of a non-builtin has
          been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
@@ -1550,6 +1562,19 @@
 
 :::::::: libast ::::::::
 
+07-05-15 sfio/sfvprintf.c: %h? and SFFMT_SHORT => raw bytes
+07-05-09 features/signal.c,features/siglist: use kill -l & strsignal()
+07-04-25 misc/optctx.c: add for opt_info switching
+07-04-24 misc/cmdarg.c,include/cmdarg.h: add CMD_CHECKED, CMD_SILENT
+07-04-24 misc/procopen.c,include/proc.h: add PROC_CHECK
+07-04-24 misc/procrun.c: add flags arg (current use PROC_ARGMOD)
+07-04-24 misc/cmdarg.c,include/cmdarg.h: move from src/cmd/tw
+07-04-20 port/(lclang.h|lc.c|mc.c|lclib.h|lcgen.c): separate lctab.c
+07-04-20 comp/conf.sh: defer to systems without 'grep -q' -- sigh
+07-04-20 comp/conf.sh: probe for LL integer constant initializer suffix
+07-04-20 include/syslog.h: <namval.h> => <ast_namval.h> for win32
+07-04-20 ast_namval.h: add as copy of include/namval.h for win32
+07-04-19 comp/conf.tab: fix SVID SI entries to probe SI_* (not _SI_*)
 07-04-13 tm/tmxdate.c,tm/tmzone.c: handle [-+]0000 UTC zone offset
 07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
 07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER => nan/inf vs. NAN/INF
@@ -1557,6 +1582,7 @@
 07-03-28 misc/optget.c: fix l10n --?-
 07-03-25 features/common: fix { ast_std.h ast_map.h stdint.h } logic
 07-03-21 error.h: move from error_info to (*_error_data_)
+07-03-21 misc/error.c: add errorctx() for error_info switching
 07-03-21 option.h: move from opt_info to (*_opt_data_)
 07-03-19 regex/regdecomp.c: fix REX_ONECHAR escapes and add REX_KMP
 07-03-11 tm/tmxscan.c,regex/regnexec.c: fix strict-alias transgressions
@@ -2973,7 +2999,13 @@
 
 :::::::: libcmd ::::::::
 
-07-03-28 date.c: add --unelepsed=scale, -U: fmtelapsed() => strelapsed()
+07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify >= 20070511 context
+07-05-09 fds.c: handle ipv6 sockets
+07-05-09 cmd.h: <shbltin.h> : cmdquit() => sh_checksig(context)
+07-04-25 mkdir.c: force (S_ISVTX|S_ISUID|S_ISGID) after mkdir(2)
+07-04-24 procrun.c: add -last intercept => sh_run() and whence -q
+07-04-19 uname.c: name operands first checked for CS_NAME, then NAME
+07-03-28 date.c: add --unelapsed=scale, -U: fmtelapsed() => strelapsed()
 07-03-25 wclib.h: iswspace() requires <wctype.h>!
 07-03-11 tty.c: add sysV --line-number, -l
 07-02-26 Makefile: sumlib.o: direct extract from +lsum (vcodex someday)
diff -r -N -u ksh93_2007_04_18/lib/package/ast-ksh.ver 
ksh93_2007_05_15/lib/package/ast-ksh.ver
--- ksh93_2007_04_18/lib/package/ast-ksh.ver    2007-04-18 20:07:27.000000000 
+0200
+++ ksh93_2007_05_15/lib/package/ast-ksh.ver    2007-05-15 07:49:57.000000000 
+0200
@@ -1 +1 @@
-ast-ksh 2007-04-18 2007-04-18 1
+ast-ksh 2007-05-15 2007-05-15 1
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/print.c 
ksh93_2007_05_15/src/cmd/ksh93/bltins/print.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/print.c       2007-04-12 
20:21:06.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/print.c       2007-05-16 
04:36:53.000000000 +0200
@@ -751,6 +751,7 @@
                break;
        case 'B':
                value->s = (char*)fmtbase64(value->s, &fe->size);
+               fe->flags |= SFFMT_SHORT;
                break;
        case 'H':
                value->s = fmthtml(value->s);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/shopen.c 
ksh93_2007_05_15/src/cmd/ksh93/bltins/shopen.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/shopen.c      2007-03-20 
20:08:28.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/shopen.c      2007-05-09 
15:53:14.000000000 +0200
@@ -447,11 +447,11 @@
 ;
 
 
-extern int b_open(int argc, char *argv[], void *extra)
+extern int b_open(int argc, char *argv[], void *context)
 {
        register Namval_t *np;
        register int n,oflag=0;
-       Shell_t *shp = (Shell_t*)extra;
+       Shell_t *shp = ((Shbltin_t*)context)->shp;
        struct filedata *fdp;
        struct stat statb;
        mode_t mode = 0666;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/typeset.c 
ksh93_2007_05_15/src/cmd/ksh93/bltins/typeset.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/typeset.c     2007-04-11 
04:36:37.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/typeset.c     2007-05-02 
23:46:02.000000000 +0200
@@ -535,14 +535,15 @@
        return(r);
 }
 
-typedef void (*Iptr_t)(int);
+typedef void (*Iptr_t)(int,void*);
 typedef int (*Fptr_t)(int, char*[], void*);
 
 #define GROWLIB        4
 
-static void**  liblist;
-static int     nlib;
-static int     maxlib;
+static void            **liblist;
+static unsigned short  *libattr;
+static int             nlib;
+static int             maxlib;
 
 /*
  * This allows external routines to load from the same library */
@@ -562,26 +563,38 @@
        register int    n;
        register int    r;
        Iptr_t          initfn;
+       Shbltin_t       *sp = &sh.bltindata;
 
+       sp->nosfio = 0;
        for (n = r = 0; n < nlib; n++)
        {
                if (r)
+               {
                        liblist[n-1] = liblist[n];
+                       libattr[n-1] = libattr[n];
+               }
                else if (liblist[n] == library)
                        r++;
        }
        if (r)
                nlib--;
        else if ((initfn = (Iptr_t)dlllook(library, "lib_init")))
-               (*initfn)(0);
+               (*initfn)(0,sp);
        if (nlib >= maxlib)
        {
                maxlib += GROWLIB;
                if (liblist)
+               {
                        liblist = (void**)realloc((void*)liblist, 
(maxlib+1)*sizeof(void**));
+                       libattr = (unsigned short*)realloc((void*)liblist, 
(maxlib+1)*sizeof(unsigned short*));
+               }
                else
+               {
                        liblist = (void**)malloc((maxlib+1)*sizeof(void**));
+                       libattr = (unsigned 
short*)malloc((maxlib+1)*sizeof(unsigned short*));
+               }
        }
+       libattr[nlib] = NV_BLTINOPT|(sp->nosfio?BLT_NOSFIO:0);
        liblist[nlib++] = library;
        liblist[nlib] = 0;
        return !r;
@@ -678,6 +691,8 @@
                                {
                                        if(dlete || nv_isattr(np,BLT_SPC))
                                                errmsg = "restricted name";
+                                       else
+                                               nv_onattr(np,libattr[n]);
                                }
                                break;
                        }
@@ -893,7 +908,11 @@
                                sfprintf(file,"[%s]\n", sh_fmtq(nv_refsub(np)));
                        }
                        else
+#if SHOPT_TYPEDEF
+                               sfputr(file,nv_isvtree(np)?cp:sh_fmtq(cp),'\n');
+#else
                                sfputr(file,sh_fmtq(cp),'\n');
+#endif /* SHOPT_TYPEDEF */
                }
                return(1);
        }
@@ -936,6 +955,10 @@
        tp->scanmask = flag&~NV_NOSCOPE;
        tp->scanroot = root;
        tp->outfile = file;
+#if SHOPT_TYPEDEF
+       if(!tp->prefix && tp->tp)
+               tp->prefix = nv_name(tp->tp);
+#endif /* SHOPT_TYPEDEF */
        if(flag&NV_INTEGER)
                tp->scanmask |= (NV_DOUBLE|NV_EXPNOTE);
        namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/whence.c 
ksh93_2007_05_15/src/cmd/ksh93/bltins/whence.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/whence.c      2005-12-07 
17:14:16.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/whence.c      2007-04-24 
22:12:48.000000000 +0200
@@ -40,6 +40,7 @@
 #define A_FLAG 4
 #define F_FLAG 010
 #define X_FLAG 020
+#define Q_FLAG 040
 
 static int whence(Shell_t *,char**, int);
 
@@ -112,6 +113,9 @@
            case 'p':
                flags |= P_FLAG;
                break;
+           case 'q':
+               flags |= Q_FLAG;
+               break;
            case ':':
                errormsg(SH_DICT,2, "%s", opt_info.arg);
                break;
@@ -140,6 +144,8 @@
        Pathcomp_t *pp;
 #endif
        int notrack = 1;
+       if(flags&Q_FLAG)
+               flags &= ~A_FLAG;
        while(name= *argv++)
        {
                tofree=0;
@@ -151,6 +157,8 @@
 #endif
                if(flags&P_FLAG)
                        goto search;
+               if(flags&Q_FLAG)
+                       goto bltins;
                /* reserved words first */
                if(sh_lookup(name,shtab_reserved))
                {
@@ -179,6 +187,7 @@
                        aflag++;
                }
                /* built-ins and functions next */
+       bltins:
                root = (flags&F_FLAG)?shp->bltin_tree:shp->fun_tree;
                if(np= nv_bfsearch(name, root, &nq, &notused))
                {
@@ -194,6 +203,8 @@
                                else
                                        cp = sh_translate(is_function);
                        }
+                       if(flags&Q_FLAG)
+                               continue;
                        sfprintf(sfstdout,"%s%s\n",name,cp);
                        if(!aflag)
                                continue;
@@ -227,7 +238,9 @@
                        cp = shp->lastpath;
                shp->lastpath = 0;
 #endif
-               if(cp)
+               if(flags&Q_FLAG)
+                       r |= !cp;
+               else if(cp)
                {
                        if(flags&V_FLAG)
                        {
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/data/builtins.c 
ksh93_2007_05_15/src/cmd/ksh93/data/builtins.c
--- ksh93_2007_04_18/src/cmd/ksh93/data/builtins.c      2007-03-27 
20:07:41.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/data/builtins.c      2007-05-15 
05:07:06.000000000 +0200
@@ -44,7 +44,7 @@
 #      define SHOPT_CMDLIB_HDR <cmdlist.h>
 #endif
 #define Q(f)           #f      /* libpp cpp workaround -- fixed 2005-04-11 */
-#define CMDLIST(f)     SH_CMDLIB_DIR "/" Q(f), NV_BLTIN|NV_NOFREE, bltin(f),
+#define CMDLIST(f)     SH_CMDLIB_DIR "/" Q(f), NV_BLTIN|NV_BLTINOPT|NV_NOFREE, 
bltin(f),
 
 #undef basename
 #undef dirname
@@ -105,7 +105,6 @@
        "jobs",         NV_BLTIN|BLT_ENV,               bltin(jobs),
 #endif /* JOBS */
        "false",        NV_BLTIN|BLT_ENV,               bltin(false),
-SH_CMDLIB_DIR "/getconf",NV_BLTIN|BLT_ENV,             bltin(getconf),
        "getopts",      NV_BLTIN|BLT_ENV,               bltin(getopts),
        "print",        NV_BLTIN|BLT_ENV,               bltin(print),
        "printf",       NV_BLTIN|NV_NOFREE,             bltin(printf),
@@ -131,6 +130,7 @@
        CMDLIST(basename)
        CMDLIST(chmod)
        CMDLIST(dirname)
+       CMDLIST(getconf)
        CMDLIST(head)
        CMDLIST(mkdir)
        CMDLIST(logname)
@@ -1368,14 +1368,19 @@
 "[D\f:dump-strings\f?Do not execute the script, but output the set of double "
        "quoted strings preceded by a \b$\b.  These strings are needed for "
        "localization of the script to different locales.]"
-"[E?Reads the file \b${ENV-$HOME/.kshrc}\b, if it exists, as a profile. "
+"[E?Reads the file "
+#if SHOPT_SYSRC
+       "\b/etc/ksh.kshrc\b, if it exists, as a profile, followed by "
+#endif
+       "\b${ENV-$HOME/.kshrc}\b, if it exists, as a profile. "
        "On by default for interactive shells; use \b+E\b to disable.]"
 #if SHOPT_PFSH
 "[P?Invoke the shell as a profile shell.  See \bpfexec\b(1).]"
 #endif
 #if SHOPT_KIA
 "[R]:[file?Do not execute the script, but create a cross reference database "
-       "in \afile\a that can be used a separate shell script browser.]"
+       "in \afile\a that can be used a separate shell script browser.  The "
+       "-R option requires a script to be specified as the first operand.]"
 #endif /* SHOPT_KIA */
 #if SHOPT_BASH
    "\fbash2\f"
@@ -1784,7 +1789,7 @@
 #endif /* SHOPT_FS_3D */
 
 const char sh_optwhence[] =
-"[-1c?\n@(#)$Id: whence (AT&T Research) 1999-07-07 $\n]"
+"[-1c?\n@(#)$Id: whence (AT&T Research) 2007-04-24 $\n]"
 USAGE_LICENSE
 "[+NAME?whence - locate a command and describe its type]"
 "[+DESCRIPTION?Without \b-v\b, \bwhence\b writes on standard output an "
@@ -1798,6 +1803,8 @@
 "[f?Do not check for functions.]"
 "[p?Do not check to see if \aname\a is a reserved word, a built-in, "
        "an alias, or a function.]"
+"[q?Quiet mode. Returns 0 if all arguments are built-ins, functions, or are "
+       "programs found on the path.]"
 "[v?For each name you specify, the shell displays a line that indicates "
        "if that name is one of the following:]{"
        "[+?Reserved word]"
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/data/options.c 
ksh93_2007_05_15/src/cmd/ksh93/data/options.c
--- ksh93_2007_04_18/src/cmd/ksh93/data/options.c       2006-09-07 
01:00:31.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/data/options.c       2007-05-11 
21:06:43.000000000 +0200
@@ -25,7 +25,7 @@
 #include       "shtable.h"
 
 #if SHOPT_BASH
-#   define bashopt(a,b)        a,      b|SH_BASHOPT,
+#   define bashopt(a,b)                a,      b|SH_BASHOPT,
 #   define bashextra(a,b)      a,      b|SH_BASHEXTRA,
 #else
 #   define bashopt(a,b)
@@ -92,8 +92,15 @@
        bashextra("physical",           SH_PHYSICAL)
        bashextra("posix",              SH_POSIX)
        "privileged",                   SH_PRIVILEGED,
-#if SHOPT_PFSH
+#if SHOPT_BASH
+       "profile",                      SH_LOGIN_SHELL|SH_COMMANDLINE,
+#   if SHOPT_PFSH
+       "pfsh",                         SH_PFSH|SH_COMMANDLINE,
+#   endif
+#else
+#   if SHOPT_PFSH
        "profile",                      SH_PFSH|SH_COMMANDLINE,
+#   endif
 #endif
        bashopt("progcomp",             SH_PROGCOMP)
        bashopt("promptvars",           SH_PROMPTVARS)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/data/signals.c 
ksh93_2007_05_15/src/cmd/ksh93/data/signals.c
--- ksh93_2007_04_18/src/cmd/ksh93/data/signals.c       2005-06-01 
06:10:35.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/data/signals.c       2007-05-07 
14:39:12.000000000 +0200
@@ -55,6 +55,9 @@
 #ifdef SIGBUS
        "BUS",          VAL(SIGBUS,SH_SIGDONE),         S("Bus error"),
 #endif /* SIGBUS */
+#ifdef SIGCANCEL
+       "CANCEL",       VAL(SIGCANCEL,SH_SIGIGNORE),    S("Thread 
cancellation"),
+#endif /*SIGCANCEL */
 #ifdef SIGCHLD
        "CHLD",         VAL(SIGCHLD,SH_SIGFAULT),       S("Death of Child"),
 #   ifdef SIGCLD
@@ -71,6 +74,9 @@
        "CONT",         VAL(SIGCONT,SH_SIGIGNORE),      S("Stopped process 
continued"),
 #endif /* SIGCONT */
        "DEBUG",        VAL(TRAP(SH_DEBUGTRAP),0),      "",
+#ifdef SIGDANGER
+       "DANGER",       VAL(SIGDANGER,0),       S("System crash soon"),
+#endif /* SIGDANGER */
 #ifdef SIGDIL
        "DIL",          VAL(SIGDIL,0),                  S("DIL signal"),
 #endif /* SIGDIL */
@@ -99,6 +105,12 @@
 #ifdef SIGIOT
        "IOT",          VAL(SIGIOT,SH_SIGDONE),         S("Abort"),
 #endif /* SIGIOT */
+#ifdef SIGJVM1
+       "JVM1",         VAL(SIGJVM1,SH_SIGIGNORE),      S("Special signal used 
by Java Virtual Machine"),
+#endif /*SIGJVM1 */
+#ifdef SIGJVM2
+       "JVM2",         VAL(SIGJVM2,SH_SIGIGNORE),      S("Special signal used 
by Java Virtual Machine"),
+#endif /*SIGJVM2 */
        "KEYBD",        VAL(TRAP(SH_KEYTRAP),0),        "",
 #ifdef SIGKILL
        "KILL",         VAL(SIGKILL,0),                 S("Killed"),
@@ -144,7 +156,7 @@
 #define SIGRTMIN       _SIGRTMIN
 #endif 
 #endif
-#ifdef SIGRTMIN
+#if defined(SIGRTMIN) && SIGRTMIN > 0
        "RTMIN",        VAL(SIGRTMIN,0),                S("Lowest priority 
realtime signal"),
 #endif /* SIGRTMIN */
 #ifdef __SIGRTMAX
@@ -156,7 +168,7 @@
 #define SIGRTMAX       _SIGRTMAX
 #endif 
 #endif
-#ifdef SIGRTMAX
+#if defined(SIGRTMAX) && SIGRTMAX > 0
        "RTMAX",        VAL(SIGRTMAX,0),                S("Highest priority 
realtime signal"),
 #endif /* SIGRTMAX */
 #endif /* SIGQUIT */
@@ -205,9 +217,6 @@
 #ifdef SIGMIGRATE
        "MIGRATE",              VAL(SIGMIGRATE,0),      S("Migrate process"),
 #endif /* SIGMIGRATE */
-#ifdef SIGDANGER
-       "DANGER",               VAL(SIGDANGER,0),       S("System crash soon"),
-#endif /* SIGDANGER */
 #ifdef SIGSOUND
        "SOUND",                VAL(SIGSOUND,0),        S("Sound completed"),
 #endif /* SIGSOUND */
@@ -223,5 +232,8 @@
 #ifdef SIGXFSZ
        "XFSZ",         VAL(SIGXFSZ,SH_SIGDONE|SH_SIGINTERACTIVE),      
S("Exceeded file size limit"),
 #endif /* SIGXFSZ */
+#ifdef SIGXRES
+       "XRES",         VAL(SIGXRES,SH_SIGDONE|SH_SIGINTERACTIVE),      
S("Exceeded resource control"),
+#endif /* SIGRES */
        "",     0,      0
 };
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/edit/edit.c 
ksh93_2007_05_15/src/cmd/ksh93/edit/edit.c
--- ksh93_2007_04_18/src/cmd/ksh93/edit/edit.c  2007-01-08 17:53:00.000000000 
+0100
+++ ksh93_2007_05_15/src/cmd/ksh93/edit/edit.c  2007-04-26 21:38:41.000000000 
+0200
@@ -583,6 +583,7 @@
 
 void   ed_setup(register Edit_t *ep, int fd, int reedit)
 {
+       Shell_t *shp = ep->sh;
        register char *pp;
        register char *last;
        char *ppmax;
@@ -592,25 +593,28 @@
        ep->e_fd = fd;
        ep->e_multiline = sh_isoption(SH_MULTILINE)!=0;
 #ifdef SIGWINCH
-       if(!(sh.sigflag[SIGWINCH]&SH_SIGFAULT))
+       if(!(shp->sigflag[SIGWINCH]&SH_SIGFAULT))
        {
                signal(SIGWINCH,sh_fault);
-               sh.sigflag[SIGWINCH] |= SH_SIGFAULT;
+               shp->sigflag[SIGWINCH] |= SH_SIGFAULT;
        }
+       pp = shp->st.trapcom[SIGWINCH];
+       shp->st.trapcom[SIGWINCH] = 0;
        sh_fault(SIGWINCH);
+       shp->st.trapcom[SIGWINCH] = pp;
 #endif
 #if KSHELL
        ep->e_stkptr = stakptr(0);
        ep->e_stkoff = staktell();
-       if(!(last = sh.prompt))
+       if(!(last = shp->prompt))
                last = "";
-       sh.prompt = 0;
+       shp->prompt = 0;
 #else
        last = ep->e_prbuff;
 #endif /* KSHELL */
-       if(sh.hist_ptr)
+       if(shp->hist_ptr)
        {
-               register History_t *hp = sh.hist_ptr;
+               register History_t *hp = shp->hist_ptr;
                ep->e_hismax = hist_max(hp);
                ep->e_hismin = hist_min(hp);
        }
@@ -736,7 +740,7 @@
 #ifdef _cmd_tput
                char *term;
                if(!ep->e_term)
-                       ep->e_term = nv_search("TERM",sh.var_tree,0);
+                       ep->e_term = nv_search("TERM",shp->var_tree,0);
                if(ep->e_term && (term=nv_getval(ep->e_term)) && 
strlen(term)<sizeof(ep->e_termname) && strcmp(term,ep->e_termname))
                {
                        sh_trap(".sh.subscript=$(tput cuu1 2>/dev/null)",0);
@@ -774,8 +778,9 @@
        register Edit_t *ep = (Edit_t*)context;
        register int rv= -1;
        register int delim = (ep->e_raw==RAWMODE?'\r':'\n');
+       Shell_t *shp = ep->sh;
        int mode = -1;
-       int (*waitevent)(int,long,int) = sh.waitevent;
+       int (*waitevent)(int,long,int) = shp->waitevent;
        if(ep->e_raw==ALTMODE)
                mode = 1;
        if(size < 0)
@@ -785,10 +790,10 @@
        }
        sh_onstate(SH_TTYWAIT);
        errno = EINTR;
-       sh.waitevent = 0;
+       shp->waitevent = 0;
        while(rv<0 && errno==EINTR)
        {
-               if(sh.trapnote&(SH_SIGSET|SH_SIGTRAP))
+               if(shp->trapnote&(SH_SIGSET|SH_SIGTRAP))
                        goto done;
                /* an interrupt that should be ignored */
                errno = 0;
@@ -824,7 +829,7 @@
                        rv = read(fd,buff,size);
                        if(rv>=0 || errno!=EINTR)
                                break;
-                       if(sh.trapnote&(SH_SIGSET|SH_SIGTRAP))
+                       if(shp->trapnote&(SH_SIGSET|SH_SIGTRAP))
                                goto done;
                        /* an interrupt that should be ignored */
                        fixtime();
@@ -833,7 +838,7 @@
        else if(rv>=0 && mode>0)
                rv = read(fd,buff,rv>0?rv:1);
 done:
-       sh.waitevent = waitevent;
+       shp->waitevent = waitevent;
        sh_offstate(SH_TTYWAIT);
        return(rv);
 }
@@ -960,7 +965,7 @@
                /* check for possible key mapping */
                if((c = ep->e_lbuf[--ep->e_lookahead]) < 0)
                {
-                       if(mode<=0 && sh.st.trap[SH_KEYTRAP])
+                       if(mode<=0 && ep->sh->st.trap[SH_KEYTRAP])
                        {
                                n=1;
                                if((readin[0]= -c) == ESC)
@@ -1446,6 +1451,7 @@
 {
        register char *cp;
        int savexit;
+       Shell_t *shp = ep->sh;
 #if SHOPT_MULTIBYTE
        char buff[MAXLINE];
        ed_external(ep->e_inbuf,cp=buff);
@@ -1465,9 +1471,9 @@
        nv_putval(ED_COLNOD,(char*)&ep->e_col,NV_NOFREE|NV_INTEGER);
        nv_putval(ED_TXTNOD,(char*)cp,NV_NOFREE);
        nv_putval(ED_MODENOD,ep->e_vi_insert,NV_NOFREE);
-       savexit = sh.savexit;
-       sh_trap(sh.st.trap[SH_KEYTRAP],0);
-       sh.savexit = savexit;
+       savexit = shp->savexit;
+       sh_trap(shp->st.trap[SH_KEYTRAP],0);
+       shp->savexit = savexit;
        if((cp = nv_getval(ED_CHRNOD)) == inbuff)
                nv_unset(ED_CHRNOD);
        else
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/features/sigfeatures 
ksh93_2007_05_15/src/cmd/ksh93/features/sigfeatures
--- ksh93_2007_04_18/src/cmd/ksh93/features/sigfeatures 2006-06-13 
17:18:31.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/features/sigfeatures 2007-05-10 
23:56:58.000000000 +0200
@@ -7,8 +7,8 @@
        #endif
        #ifdef _lib_sigprocmask
        #    define sh_sigaction(s,action) do { sigset_t ss;\
-                               sigemptyset(&ss);\
-                               sigaddset(&ss,(s));\
+                               sigemptyset(&ss); \
+                               if(s) sigaddset(&ss,(s)); \
                                sigprocmask(action,&ss,0); \
                                }while(0)
        #    define sigrelease(s)       sh_sigaction(s,SIG_UNBLOCK)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/defs.h 
ksh93_2007_05_15/src/cmd/ksh93/include/defs.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/defs.h       2007-03-27 
20:14:45.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/include/defs.h       2007-05-08 
23:55:18.000000000 +0200
@@ -34,6 +34,10 @@
 #include       <history.h>
 #include       "fault.h"
 #include       "argnod.h"
+#include       "name.h"
+#define _SH_PRIVATE
+#include       <shcmd.h>
+#undef _SH_PRIVATE
 
 #ifndef pointerof
 #define pointerof(x)           ((void*)((char*)0+(x)))
@@ -52,6 +56,8 @@
  * note that the first few fields have to be the same as for
  * Shscoped_t in <shell.h>
  */
+
+
 struct sh_scoped
 {
        struct sh_scoped *prevst;       /* pointer to previous state */
@@ -179,6 +185,7 @@
        struct checkpt  checkbase; \
        Shinit_f        userinit; \
        Shbltin_f       bltinfun; \
+       Shbltin_t       bltindata; \
        Shwait_f        waitevent; \
        char            *cur_line; \
        char            *rcfile; \
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/name.h 
ksh93_2007_05_15/src/cmd/ksh93/include/name.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/name.h       2007-03-05 
14:52:11.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/include/name.h       2007-05-01 
22:51:54.000000000 +0200
@@ -119,6 +119,7 @@
 #define BLT_SPC                (NV_LJUST)              /* special built-ins */
 #define BLT_EXIT       (NV_RJUST)              /* exit value can be > 255 */
 #define BLT_DCL                (NV_TAGGED)             /* declaration command 
*/
+#define BLT_NOSFIO     (NV_IMPORT)             /* doesn't use sfio */
 #define nv_isref(n)    (nv_isattr((n),NV_REF)==NV_REF)
 #define nv_istable(n)  (nv_isattr((n),NV_TABLE|NV_LJUST|NV_RJUST)==NV_TABLE)
 #define is_abuiltin(n) (nv_isattr(n,NV_BLTIN)==NV_BLTIN)
@@ -138,9 +139,6 @@
 #define nv_reftree(n)  ((n)->nvalue.nrp->root)
 #define nv_reftable(n) ((n)->nvalue.nrp->table)
 #define nv_refsub(n)   ((n)->nvalue.nrp->sub)
-#if SHOPT_OO
-#   define nv_class(np)                
(nv_isattr(np,NV_REF|NV_IMPORT)?0:(Namval_t*)((np)->nvenv))
-#endif /* SHOPT_OO */
 
 /* ... etc */
 
@@ -181,6 +179,7 @@
 extern Namval_t                *nv_mount(Namval_t*, const char *name, Dt_t*);
 extern Namval_t                *nv_arraychild(Namval_t*, Namval_t*, int);
 extern int             nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*);
+extern int             nv_isvtree(Namval_t*);
 
 extern const Namdisc_t RESTRICTED_disc;
 extern char            nv_local;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/shell.h 
ksh93_2007_05_15/src/cmd/ksh93/include/shell.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/shell.h      2006-10-26 
19:48:36.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/include/shell.h      2007-05-11 
21:27:13.000000000 +0200
@@ -27,7 +27,7 @@
  *
  */
 
-#include       <cmd.h>
+#include       <ast.h>
 #include       <cdt.h>
 #ifdef _SH_PRIVATE
 #   include    "name.h"
@@ -35,7 +35,7 @@
 #   include    <nval.h>
 #endif /* _SH_PRIVATE */
 
-#define SH_VERSION     20060510
+#define SH_VERSION     20070511
 
 #undef NOT_USED
 #define NOT_USED(x)    (&x,1)
@@ -48,7 +48,6 @@
 Shopt_t;
 
 typedef void   (*Shinit_f)(int);
-typedef int     (*Shbltin_f)(int, char*[], void*);
 typedef int    (*Shwait_f)(int, long, int);
 
 union Shnode_u;
@@ -149,6 +148,8 @@
 #define SH_IOCOPROCESS (-2)
 #define SH_IOHISTFILE  (-3)
 
+#include       <cmd.h>
+
 /* symbolic value for sh_fdnotify */
 #define SH_FDCLOSE     (-1)
 
@@ -170,6 +171,7 @@
 extern int             sh_funscope(int,char*[],int(*)(void*),void*,int);
 extern Sfio_t          *sh_iogetiop(int,int);
 extern int             sh_main(int, char*[], void(*)(int));
+extern int             sh_run(int, char*[]);
 extern void            sh_menu(Sfio_t*, int, char*[]);
 extern Namval_t                *sh_addbuiltin(const char*, int(*)(int, 
char*[],void*), void*);
 extern char            *sh_fmtq(const char*);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/shtable.h 
ksh93_2007_05_15/src/cmd/ksh93/include/shtable.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/shtable.h    2005-06-01 
06:06:36.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/include/shtable.h    2007-05-07 
14:31:08.000000000 +0200
@@ -33,20 +33,20 @@
 typedef struct shtable1
 {
        const char      *sh_name;
-       unsigned        sh_number;
+       const unsigned  sh_number;
 } Shtable_t;
 
 struct shtable2
 {
        const char      *sh_name;
-       unsigned        sh_number;
+       const unsigned  sh_number;
        const char      *sh_value;
 };
 
 struct shtable3
 {
        const char      *sh_name;
-       unsigned        sh_number;
+       const unsigned  sh_number;
        int             (*sh_value)(int, char*[], void*);
 };
 
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/Makefile 
ksh93_2007_05_15/src/cmd/ksh93/Makefile
--- ksh93_2007_04_18/src/cmd/ksh93/Makefile     2007-03-25 05:47:28.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/Makefile     2007-05-15 19:05:05.000000000 
+0200
@@ -185,7 +185,7 @@
        echo ";" >> $(<)
 end
 
-:: math.tab syscall.s mamexec mamstate.c deparse.c $(DOCFILES) \
+:: math.tab syscall.s mamexec mamstate.c $(DOCFILES) \
        bash.c bash_pre_rc.sh hexpand.c mkservice.c \
        shopen.mk shopen.c
 
@@ -193,8 +193,8 @@
        alias.sh append.sh arith.sh arrays.sh attributes.sh basic.sh \
        bracket.sh builtins.sh case.sh comvar.sh coprocess.sh exit.sh \
        expand.sh functions.sh glob.sh grep.sh heredoc.sh io.sh \
-       nameref.sh options.sh path.sh quoting.sh quoting2.sh return.sh \
-       select.sh substring.sh tilde.sh variables.sh 
+       nameref.sh options.sh path.sh quoting.sh quoting2.sh restricted.sh \
+       return.sh select.sh substring.sh tilde.sh variables.sh 
 
 if "$(PWD:B:N=cc-*)"
 
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/Mamfile 
ksh93_2007_05_15/src/cmd/ksh93/Mamfile
--- ksh93_2007_04_18/src/cmd/ksh93/Mamfile      2007-04-18 20:07:29.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/Mamfile      2007-05-16 05:16:02.000000000 
+0200
@@ -41,8 +41,23 @@
 make pmain.o
 make sh/pmain.c
 make include/shell.h implicit
-make include/nval.h implicit
-make ${PACKAGE_ast_INCLUDE}/cdt.h implicit
+make ${PACKAGE_ast_INCLUDE}/cmd.h implicit
+make ${PACKAGE_ast_INCLUDE}/dlldefs.h implicit
+done ${PACKAGE_ast_INCLUDE}/dlldefs.h dontcare
+make ${PACKAGE_ast_INCLUDE}/cmdext.h implicit
+make ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+make ${INSTALLROOT}/include/prototyped.h implicit
+done ${INSTALLROOT}/include/prototyped.h dontcare
+done ${PACKAGE_ast_INCLUDE}/prototyped.h dontcare
+done ${PACKAGE_ast_INCLUDE}/cmdext.h dontcare
+make ${PACKAGE_ast_INCLUDE}/shcmd.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/shcmd.h dontcare
+make ${PACKAGE_ast_INCLUDE}/stak.h implicit
+make ${PACKAGE_ast_INCLUDE}/stk.h implicit
+make ${PACKAGE_ast_INCLUDE}/sfio.h implicit
+make ${PACKAGE_ast_INCLUDE}/sfio_s.h implicit
+done ${PACKAGE_ast_INCLUDE}/sfio_s.h dontcare
 make ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_map.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_map.h dontcare
@@ -55,10 +70,7 @@
 make ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
 make ${PACKAGE_ast_INCLUDE}/regex.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
-make ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-make ${INSTALLROOT}/include/prototyped.h implicit
-done ${INSTALLROOT}/include/prototyped.h dontcare
-done ${PACKAGE_ast_INCLUDE}/prototyped.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/regex.h dontcare
 prev ${PACKAGE_ast_INCLUDE}/ast_map.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_botch.h implicit
@@ -85,24 +97,39 @@
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_std.h dontcare
-done ${PACKAGE_ast_INCLUDE}/cdt.h dontcare
+done ${PACKAGE_ast_INCLUDE}/sfio.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/stk.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/stak.h dontcare
+make ${PACKAGE_ast_INCLUDE}/error.h implicit
+make ${PACKAGE_ast_INCLUDE}/option.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast.h implicit
 make ${PACKAGE_ast_INCLUDE}/vmalloc.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
 done ${PACKAGE_ast_INCLUDE}/vmalloc.h dontcare
-make ${PACKAGE_ast_INCLUDE}/sfio.h implicit
-make ${PACKAGE_ast_INCLUDE}/sfio_s.h implicit
-done ${PACKAGE_ast_INCLUDE}/sfio_s.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
-prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
-done ${PACKAGE_ast_INCLUDE}/sfio.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_version.h implicit
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_version.h dontcare
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/option.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/error.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/cmd.h dontcare
+make include/nval.h implicit
+make ${PACKAGE_ast_INCLUDE}/cdt.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
+done ${PACKAGE_ast_INCLUDE}/cdt.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done include/nval.h dontcare
 make include/name.h implicit
 prev include/nval.h implicit
@@ -112,30 +139,7 @@
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done include/name.h dontcare
 prev ${PACKAGE_ast_INCLUDE}/cdt.h implicit
-make ${PACKAGE_ast_INCLUDE}/cmd.h implicit
-make ${PACKAGE_ast_INCLUDE}/dlldefs.h implicit
-done ${PACKAGE_ast_INCLUDE}/dlldefs.h dontcare
-make ${PACKAGE_ast_INCLUDE}/cmdext.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/cmdext.h dontcare
-make ${PACKAGE_ast_INCLUDE}/stak.h implicit
-make ${PACKAGE_ast_INCLUDE}/stk.h implicit
-prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/stk.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/stak.h dontcare
-make ${PACKAGE_ast_INCLUDE}/error.h implicit
-make ${PACKAGE_ast_INCLUDE}/option.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/option.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/error.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/cmd.h dontcare
 done include/shell.h
 done sh/pmain.c
 meta pmain.o %.c>%.o sh/pmain.c pmain
@@ -236,6 +240,8 @@
 prev include/shell.h implicit
 make include/env.h implicit
 done include/env.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/shcmd.h implicit
+prev include/name.h implicit
 make include/argnod.h implicit
 prev ${PACKAGE_ast_INCLUDE}/stak.h implicit
 done include/argnod.h
@@ -1118,10 +1124,6 @@
 done waitevent.o generated
 make xec.o
 make sh/xec.c
-make ${PACKAGE_ast_INCLUDE}/proc.h implicit
-prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/proc.h
 prev ${PACKAGE_ast_INCLUDE}/vmalloc.h implicit
 prev include/streval.h implicit
 prev FEATURE/locale implicit
@@ -1140,7 +1142,7 @@
 done sh/xec.c
 meta xec.o %.c>%.o sh/xec.c xec
 prev sh/xec.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DSHOPT_FILESCAN -DSHOPT_NAMESPACE -DSHOPT_OPTIMIZE -D_BLD_shell 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DKSHELL -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/xec.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_FILESCAN -DSHOPT_NAMESPACE -DSHOPT_OPTIMIZE -D_PACKAGE_ast -D_BLD_shell 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DKSHELL -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/xec.c
 done xec.o generated
 make env.o
 make sh/env.c
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/RELEASE 
ksh93_2007_05_15/src/cmd/ksh93/RELEASE
--- ksh93_2007_04_18/src/cmd/ksh93/RELEASE      2007-04-18 16:21:50.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/RELEASE      2007-05-16 04:40:29.000000000 
+0200
@@ -1,4 +1,16 @@
-07-04-18  --- Release ksh93s+  ---
+07-05-15  --- Release ksh93s+  ---
+07-05-15  A bug in which the %B format of printf was affected  by the
+         locale has been fixed.
+07-05-14  A bug in which \ was not removed in the replacement pattern with
+         ${var/pattern/rep} when it was not followed by \ or a digit has
+         been fixed.
+07-05-10  A bug in which ksh -R file core dumped if no script was sepcifed
+         has been fixed.  it not displays an error message.
+07-05-07  Added additional Solaris signals to signal table.
+07-04-30  A bug in which a pipeline with command substitution inside a
+         function could cause a pipline that invokes this function to
+         hang when the pipefail option is on has been fixed.
+07-04-30  Added -q to whence.
 07-04-18  A small memory leak with each redirection of a non-builtin has
          been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/args.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/args.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/args.c    2007-03-27 20:52:51.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/args.c    2007-05-12 08:13:20.000000000 
+0200
@@ -43,7 +43,7 @@
 #   define PFSHOPT
 #endif
 #if SHOPT_BASH
-#   define BASHOPT     "\375\374\373"
+#   define BASHOPT     "\374"
 #else
 #   define BASHOPT
 #endif
@@ -70,7 +70,7 @@
        SH_PFSH,
 #endif
 #if SHOPT_BASH
-       SH_NOPROFILE, SH_RC, SH_POSIX,
+       SH_POSIX,
 #endif
        SH_DICTIONARY, SH_INTERACTIVE, SH_RESTRICTED, SH_CFLAG,
        SH_ALLEXPORT, SH_NOTIFY, SH_ERREXIT, SH_NOGLOB, SH_TRACKALL,
@@ -159,7 +159,7 @@
        while((n = optget(argv,setflag?sh_optset:sh_optksh)))
        {
                o=0;
-               f=*opt_info.option=='-';
+               f=*opt_info.option=='-' && (opt_info.num || opt_info.arg);
                switch(n)
                {
                    case 'A':
@@ -204,28 +204,28 @@
                    case -1:    /* --rcfile */
                        sh.rcfile = opt_info.arg;
                        continue;
-                   case -6:    /* --version */
-                       sfputr(sfstdout, "ksh bash emulation, version ",-1);
-                       np = nv_open("BASH_VERSION",sh.var_tree,0);
-                       sfputr(sfstdout, nv_getval(np),-1);
-                       np = nv_open("MACHTYPE",sh.var_tree,0);
-                       sfprintf(sfstdout, " (%s)\n", nv_getval(np));
-                       sh_exit(0);
-
                    case -2:    /* --noediting */
-                       off_option(&newflags,SH_VI);
-                       off_option(&newflags,SH_EMACS);
-                       off_option(&newflags,SH_GMACS);
+                       if (!f)
+                       {
+                               off_option(&newflags,SH_VI);
+                               off_option(&newflags,SH_EMACS);
+                               off_option(&newflags,SH_GMACS);
+                       }
                        continue;
-
                    case -3:    /* --profile */
-                       f = !f;
-                       /*FALLTHROUGH*/
-                   case -4:    /* --rc */
-                   case -5:    /* --posix */
+                       n = 'l';
+                       goto skip;
+                   case -4:    /* --posix */
                        /* mask lower 8 bits to find char in optksh string */
                        n&=0xff;
                        goto skip;
+                   case -5:    /* --version */
+                       sfputr(sfstdout, "ksh bash emulation, version ",-1);
+                       np = nv_open("BASH_VERSION",sh.var_tree,0);
+                       sfputr(sfstdout, nv_getval(np),-1);
+                       np = nv_open("MACHTYPE",sh.var_tree,0);
+                       sfprintf(sfstdout, " (%s)\n", nv_getval(np));
+                       sh_exit(0);
 #endif
                    case 'D':
                        on_option(&newflags,SH_NOEXEC);
@@ -336,6 +336,8 @@
 #if SHOPT_KIA
        if(ap->kiafile)
        {
+               if(!argv[0])
+                       errormsg(SH_DICT,ERROR_usage(2),"-R requires 
scriptname");
                if(!(shlex.kiafile=sfopen(NIL(Sfio_t*),ap->kiafile,"w+")))
                        errormsg(SH_DICT,ERROR_system(3),e_create,ap->kiafile);
                if(!(shlex.kiatmp=sftmp(2*SF_BUFSIZE)))
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/arith.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/arith.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/arith.c   2007-04-12 20:13:29.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/arith.c   2007-05-10 05:51:11.000000000 
+0200
@@ -97,6 +97,7 @@
 {
        register Sfdouble_t r= 0;
        char *str = (char*)*ptr;
+       register char *cp;
        switch(type)
        {
            case ASSIGN:
@@ -119,7 +120,6 @@
                {
                        register Namval_t *np;
                        int dot=0;
-                       char *cp;
                        while(1)
                        {
                                while(xp=str, c=mbchar(str), isaname(c));
@@ -190,13 +190,14 @@
                                        }
                                }
                                *str = 0;
-                               if(strcasecmp(*ptr,"Inf")==0)
+                               cp = (char*)*ptr;
+                               if ((cp[0] == 'i' || cp[0] == 'I') && (cp[1] == 
'n' || cp[1] == 'N') && (cp[2] == 'f' || cp[2] == 'F') && cp[3] == 0)
                                {
                                        Inf = 1.0/Zero;
                                        Infnod.nvalue.ldp = &Inf;
                                        np = &Infnod;
                                }
-                               else if(strcasecmp(*ptr,"NaN")==0)
+                               else if ((cp[0] == 'n' || cp[0] == 'N') && 
(cp[1] == 'a' || cp[1] == 'A') && (cp[2] == 'n' || cp[2] == 'N') && cp[3] == 0)
                                {
                                        NaN = 0.0/Zero;
                                        NaNnod.nvalue.ldp = &NaN;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/bash.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/bash.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/bash.c    2006-10-13 05:59:11.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/bash.c    2007-05-12 07:39:25.000000000 
+0200
@@ -50,8 +50,6 @@
        "[P?Do not follow symbolic links, use physical directory structure "
        "instead. Only available in bash compatibility mode.]";
 const char sh_bash2[] =
-"[l:login?Make the shell act as if it had been invoked as a login shell. "
-"Only available if invoked as \bbash\b.]"
 "[O]:?[shopt_option?\ashopt_option\a is one of the shell options accepted by "
        "the \bshopt\b builtin. If \ashopt_option\a is present, \b-O\b sets "
        "the value of that option; \b+O\b unsets it. If \ashopt_option\a is "
@@ -66,12 +64,9 @@
 "[03:profile?Read either the system-wide startup file or any of the "
        "personal initialization files. On by default for interactive "
        "shells. Only available if invoked as \bbash\b.]"
-"[04:rc?Read and execute the personal initialization file "
-       "\b$HOME/.bashrc\b. On by default for interactive shells. Only "
-       "available if invoked as \bbash\b.]"
-"[05:posix?If invoked as \bbash\b, turn on POSIX compatibility. \bBash\b in "
+"[04:posix?If invoked as \bbash\b, turn on POSIX compatibility. \bBash\b in "
        "POSIX mode is not the same as \bksh\b.]"
-"[06:version?Print version number and exit.]";
+"[05:version?Print version number and exit.]";
 
 const char sh_optshopt[] =
 "+[-1c?\n@(#)$Id: shopt (AT&T Research) 2003-02-13 $\n]"
@@ -404,7 +399,7 @@
 
        /* set startup files */
        n=0;
-       if(!sh_isoption(SH_NOPROFILE))
+       if(sh_isoption(SH_LOGIN_SHELL))
        {
                if(!sh_isoption(SH_POSIX))
                {
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/fault.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/fault.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/fault.c   2007-02-14 08:59:55.000000000 
+0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/fault.c   2007-05-02 16:22:55.000000000 
+0200
@@ -59,9 +59,10 @@
 */
 void   sh_fault(register int sig)
 {
-       register int    flag=0;
-       register char   *trap;
-       register struct checkpt *pp = (struct checkpt*)sh.jmplist;
+       register Shell_t        *shp = sh_getinterp();
+       register int            flag=0;
+       register char           *trap;
+       register struct checkpt *pp = (struct checkpt*)shp->jmplist;
        int     action=0;
        /* reset handler */
        if(!(sig&SH_TRAP))
@@ -79,17 +80,17 @@
                        nv_putval(LINES, (char*)&v, NV_INT32);
        }
 #endif  /* SIGWINCH */
-       if(sh.savesig)
+       if(shp->savesig)
        {
                /* critical region, save and process later */
-               sh.savesig = sig;
+               shp->savesig = sig;
                return;
        }
 
        /* handle ignored signals */
-       if((trap=sh.st.trapcom[sig]) && *trap==0)
+       if((trap=shp->st.trapcom[sig]) && *trap==0)
                return;
-       flag = sh.sigflag[sig]&~SH_SIGOFF;
+       flag = shp->sigflag[sig]&~SH_SIGOFF;
        if(!trap)
        {
                if(flag&SH_SIGIGNORE)
@@ -97,14 +98,14 @@
                if(flag&SH_SIGDONE)
                {
                        void *ptr=0;
-                       if((flag&SH_SIGINTERACTIVE) && 
sh_isstate(SH_INTERACTIVE) && !sh_isstate(SH_FORKED) && ! sh.subshell)
+                       if((flag&SH_SIGINTERACTIVE) && 
sh_isstate(SH_INTERACTIVE) && !sh_isstate(SH_FORKED) && ! shp->subshell)
                        {
                                /* check for TERM signal between fork/exec */
                                if(sig==SIGTERM && job.in_critical)
-                                       sh.trapnote |= SH_SIGTERM;
+                                       shp->trapnote |= SH_SIGTERM;
                                return;
                        }
-                       sh.lastsig = sig;
+                       shp->lastsig = sig;
                        sigrelease(sig);
                        if(pp->mode < SH_JMPFUN)
                                pp->mode = SH_JMPFUN;
@@ -114,14 +115,14 @@
                        {
                                if(ptr)
                                        free(ptr);
-                               if(!sh.subshell)
+                               if(!shp->subshell)
                                        sh_done(sig);
                                sh_exit(SH_EXITSIG);
                        }
                        /* mark signal and continue */
-                       sh.trapnote |= SH_SIGSET;
-                       if(sig < sh.sigmax)
-                               sh.sigflag[sig] |= SH_SIGSET;
+                       shp->trapnote |= SH_SIGSET;
+                       if(sig < shp->sigmax)
+                               shp->sigflag[sig] |= SH_SIGSET;
 #if  defined(VMFL) && (VMALLOC_VERSION>=20031205L)
                        if(abortsig(sig))
                        {
@@ -137,7 +138,7 @@
        }
        errno = 0;
        if(pp->mode==SH_JMPCMD)
-               sh.lastsig = sig;
+               shp->lastsig = sig;
        if(trap)
        {
                /*
@@ -149,12 +150,12 @@
        }
        else
        {
-               sh.lastsig = sig;
+               shp->lastsig = sig;
                flag = SH_SIGSET;
 #ifdef SIGTSTP
                if(sig==SIGTSTP)
                {
-                       sh.trapnote |= SH_SIGTSTP;
+                       shp->trapnote |= SH_SIGTSTP;
                        if(pp->mode==SH_JMPCMD && sh_isstate(SH_STOPOK))
                        {
                                sigrelease(sig);
@@ -165,14 +166,20 @@
 #endif /* SIGTSTP */
        }
 #ifdef ERROR_NOTIFY
-       if((error_info.flags&ERROR_NOTIFY) && sh.bltinfun)
-               action = (*sh.bltinfun)(-sig,(char**)0,(void*)0);
-#endif
+       /* This is obsolete */
+       if((error_info.flags&ERROR_NOTIFY) && shp->bltinfun)
+               action = (*shp->bltinfun)(-sig,(char**)0,(void*)0);
        if(action>0)
                return;
-       sh.trapnote |= flag;
-       if(sig < sh.sigmax)
-               sh.sigflag[sig] |= flag;
+#endif
+       if(shp->bltinfun && shp->bltindata.notify)
+       {
+               shp->bltindata.sigset = 1;
+               return;
+       }
+       shp->trapnote |= flag;
+       if(sig < shp->sigmax)
+               shp->sigflag[sig] |= flag;
        if(pp->mode==SH_JMPCMD && sh_isstate(SH_STOPOK))
        {
                if(action<0)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/init.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/init.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/init.c    2007-04-11 18:10:20.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/init.c    2007-05-04 20:02:00.000000000 
+0200
@@ -1089,6 +1089,12 @@
        sh.login_files = login_files;
        if(sh.userinit=userinit)
                (*userinit)(0);
+       sh.bltindata.version = SH_VERSION;
+       sh.bltindata.shp = &sh;
+       sh.bltindata.shrun = sh_run;
+       sh.bltindata.shtrap = sh_trap;
+       sh.bltindata.shexit = sh_exit;
+       sh.bltindata.shbltin = sh_addbuiltin;
        return(&sh);
 }
 
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/jobs.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/jobs.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/jobs.c    2007-04-10 23:15:58.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/jobs.c    2007-04-26 14:41:21.000000000 
+0200
@@ -366,7 +366,7 @@
  */
 void job_init(int lflag)
 {
-       register int i,ntry=0;
+       register int ntry=0;
        job.fd = JOBTTY;
        signal(SIGCHLD,job_waitsafe);
 #   if defined(SIGCLD) && (SIGCLD!=SIGCHLD)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/macro.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/macro.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/macro.c   2007-02-20 17:21:07.000000000 
+0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/macro.c   2007-05-14 17:08:10.000000000 
+0200
@@ -2281,21 +2281,27 @@
 
 /*
  * Given pattern/string, replace / with 0 and return pointer to string
- * \ characters are stripped from string.
+ * \ characters are stripped from string.  The \ are stripped in the
+ * replacement string unless followed by a digit or \.
  */ 
 static char *mac_getstring(char *pattern)
 {
-       register char *cp = pattern;
-       register int c;
+       register char   *cp=pattern, *rep=0, *dp;
+       register int    c;
        while(c = *cp++)
        {
-               if(c==ESCAPE)
-                       cp++;
-               else if(c=='/')
+               if(c==ESCAPE && (!rep || (*cp && !isadigit(*cp) && 
*cp!=ESCAPE)))
+                       c = *cp++;
+               else if(!rep && c=='/')
                {
                        cp[-1] = 0;
-                       return(cp);
+                       rep = dp = cp;
+                       continue;
                }
+               if(rep)
+                       *dp++ = c;
        }
-       return(NIL(char*));
+       if(rep)
+               *dp = 0;
+       return(rep);
 }
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/main.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/main.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/main.c    2007-04-11 18:03:39.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/main.c    2007-05-12 08:15:11.000000000 
+0200
@@ -140,7 +140,7 @@
        int i, rshflag;         /* set for restricted shell */
        char *command;
 #ifdef _lib_sigvec
-       /* This is to clear mask that my be left on by rlogin */
+       /* This is to clear mask that may be left on by rlogin */
        clearsigmask(SIGALRM);
        clearsigmask(SIGHUP);
        clearsigmask(SIGCHLD);
@@ -210,7 +210,7 @@
                        sh_onoption(SH_MONITOR);
                }
                job_init(sh_isoption(SH_LOGIN_SHELL));
-               if(sh_isoption(SH_LOGIN_SHELL) && !sh_isoption(SH_NOPROFILE))
+               if(sh_isoption(SH_LOGIN_SHELL))
                {
                        /*      system profile  */
                        sh_source(shp, iop, e_sysprofile);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/nvdisc.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/nvdisc.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/nvdisc.c  2007-02-14 09:07:50.000000000 
+0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/nvdisc.c  2007-05-15 05:08:51.000000000 
+0200
@@ -993,7 +993,7 @@
        register const char *name = path_basename(path);
        char *cp;
        register Namval_t *np, *nq=0;
-       int offset = staktell();
+       int attr=0, offset = staktell();
        if(name==path && (nq=nv_bfsearch(name,sh.bltin_tree,(Namval_t**)0,&cp)))
                path = name = stakptr(offset);
        if(np = nv_search(path,sh.bltin_tree,0))
@@ -1019,7 +1019,10 @@
                        if(nv_isattr(np,BLT_SPC))
                                return(np);
                        if(!bltin)
+                       {
                                bltin = np->nvalue.bfp;
+                               attr = nv_isattr(np,NV_BLTINOPT);
+                       }
                        if(np->nvenv)
                                dtdelete(sh.bltin_tree,np);
                        if(extra == (void*)1)
@@ -1034,7 +1037,7 @@
                return(np);
        np->nvenv = 0;
        np->nvfun = 0;
-       nv_setattr(np,0);
+       nv_setattr(np,attr);
        if(bltin)
        {
                np->nvalue.bfp = bltin;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/nvtree.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/nvtree.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/nvtree.c  2007-02-19 21:48:09.000000000 
+0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/nvtree.c  2007-05-14 22:35:54.000000000 
+0200
@@ -559,7 +559,7 @@
                outval(".",prefix-n,wp);
                if(c=='.')
                        cp[m-1] = c;
-               sfnputc(outfile,'\t',wp->indent-1);
+               sfnputc(outfile,'\t',--wp->indent);
                sfputc(outfile,')');
        }
        return(--argv);
@@ -590,7 +590,9 @@
                stakputc('.');
        }
        name = stakfreeze(1);
+       sh.last_root = 0;
        dir = nv_diropen(name);
+       walk.root = sh.last_root;
        if(subscript)
                name[strlen(name)-1] = 0;
        while(cp = nv_dirnext(dir))
@@ -616,7 +618,6 @@
        else
                sfseek(outfile,0L,SEEK_SET);
        walk.out = outfile;
-       walk.root = sh.last_root;
        walk.indent = 0;
        walk.noscope = noscope;
        genvalue(argv,name,0,&walk);
@@ -627,6 +628,11 @@
        return((char*)out->_data);
 }
 
+int nv_isvtree(Namval_t *np)
+{
+       return(np && nv_hasdisc(np,&treedisc));
+}
+
 /*
  * get discipline for compound initializations
  */
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/path.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/path.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/path.c    2007-03-06 18:25:51.000000000 
+0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/path.c    2007-05-09 05:49:44.000000000 
+0200
@@ -685,6 +685,7 @@
                                        if(strcmp(cp,LIBCMD)==0 && 
(addr=(Fptr_t)dlllook((void*)0,stakptr(n))))
                                        {
                                                np = 
sh_addbuiltin(stakptr(PATH_OFFSET),addr,NiL);
+                                               nv_onattr(np,NV_BLTINOPT);
                                                np->nvfun = 
(Namfun_t*)np->nvname;
                                                return(oldpp);
                                        }
@@ -699,6 +700,7 @@
                                   (!(np = 
sh_addbuiltin(stakptr(PATH_OFFSET),NiL,NiL)) || np->nvalue.bfp!=addr) &&
                                   (np = 
sh_addbuiltin(stakptr(PATH_OFFSET),addr,NiL)))
                                {
+                                       nv_onattr(np,NV_BLTINOPT);
                                        np->nvenv = oldpp->bltin_lib;
                                        return(oldpp);
                                }
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/subshell.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/subshell.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/subshell.c        2007-02-26 
22:27:37.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/subshell.c        2007-04-30 
17:29:04.000000000 +0200
@@ -209,6 +209,7 @@
        subshell_data->svar = lp;
        save = sh.subshell;
        sh.subshell = 0;;
+       mp->nvname = np->nvname;
        nv_clone(np,mp,NV_NOFREE);
        sh.subshell = save;
        return(np);
@@ -236,7 +237,7 @@
                        mp->nvenv = np->nvenv;
                mp->nvfun = np->nvfun;
                mp->nvflag = np->nvflag;
-               if((mp==nv_scoped(PATHNOD)) || (mp==nv_scoped(IFSNOD)))
+               if(nv_cover(mp))
                        nv_putval(mp, np->nvalue.cp,0);
                else
                        mp->nvalue.cp = np->nvalue.cp;
@@ -329,6 +330,7 @@
        register struct subshell *sp = &sub_data;
        int jmpval,nsig;
        int savecurenv = shp->curenv;
+       int savejobpgid = job.curpgid;
        int16_t subshell;
        char *savsig;
        Sfio_t *iop=0;
@@ -344,6 +346,7 @@
                subenv = 0;
        }
        shp->curenv = ++subenv;
+       job.curpgid = 0;
        savst = shp->st;
        sh_pushcontext(&buff,SH_JMPSUB);
        subshell = shp->subshell+1;
@@ -489,6 +492,7 @@
 #endif
        job_subrestore(sp->jobs);
        shp->jobenv = savecurenv;
+       job.curpgid = savejobpgid;
        shp->bckpid = sp->bckpid;
        if(sp->shpwd)   /* restore environment if saved */
        {
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/xec.c 
ksh93_2007_05_15/src/cmd/ksh93/sh/xec.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/xec.c     2007-04-18 15:17:02.000000000 
+0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/xec.c     2007-05-02 23:52:12.000000000 
+0200
@@ -172,13 +172,13 @@
        if(com->comstate  && np)
        {
                /* call builtin to cleanup state */
-               Nambltin_t bdata; 
-               bdata.shp = &sh;
-               bdata.np = com->comnamq;
-               bdata.ptr =nv_context(np);
-               bdata.data = com->comstate;
-               bdata.flags = SH_END_OPTIM;
-               (*funptr(np))(0,(char**)0, &bdata);
+               Shbltin_t *bp = &sh.bltindata;
+               bp->bnode = np;
+               bp->vnode = com->comnamq;
+               bp->ptr =nv_context(np);
+               bp->data = com->comstate;
+               bp->flags = SH_END_OPTIM;
+               (*funptr(np))(0,(char**)0, bp);
        }
        com->comstate = 0;
        if(com->comarg && !np)
@@ -544,7 +544,6 @@
        }
 }
 
-
 int sh_exec(register const Shnode_t *t, int flags)
 {
        sh_sigcheck();
@@ -560,7 +559,7 @@
 #endif
                int             topfd = sh.topfd;
                char            *sav=stakptr(0);
-               char            *cp=0, **com=0;
+               char            *cp=0, **com=0, *comn;
                int             argn;
                int             skipexitset = 0;
                int             was_interactive = 0;
@@ -628,21 +627,25 @@
                        argn -= command;
                        if(!command && np && is_abuiltin(np))
                                np = dtsearch(sh.fun_tree,np);
-                       if(com0 && !np && !strchr(com0,'/'))
+                       if(com0)
                        {
-                               Dt_t *root = command?sh.bltin_tree:sh.fun_tree;
-                               np = nv_bfsearch(com0, root, &nq, &cp); 
-#if SHOPT_NAMESPACE
-                               if(sh.namespace && !nq && !cp)
+                               if(!np && !strchr(com0,'/'))
                                {
-                                       int offset = staktell();
-                                       stakputs(nv_name(sh.namespace));
-                                       stakputc('.');
-                                       stakputs(com0);
-                                       stakseek(offset);
-                                       np = nv_bfsearch(stakptr(offset), root, 
&nq, &cp); 
-                               }
+                                       Dt_t *root = 
command?sh.bltin_tree:sh.fun_tree;
+                                       np = nv_bfsearch(com0, root, &nq, &cp); 
+#if SHOPT_NAMESPACE
+                                       if(sh.namespace && !nq && !cp)
+                                       {
+                                               int offset = staktell();
+                                               stakputs(nv_name(sh.namespace));
+                                               stakputc('.');
+                                               stakputs(com0);
+                                               stakseek(offset);
+                                               np = 
nv_bfsearch(stakptr(offset), root, &nq, &cp); 
+                                       }
 #endif /* SHOPT_NAMESPACE */
+                               }
+                               comn = com[argn-1];
                        }
                        io = t->tre.treio;
                        if(sh.envlist = argp = t->com.comset)
@@ -751,7 +754,6 @@
                                /* check for builtins */
                                if(np && is_abuiltin(np))
                                {
-                                       Nambltin_t bdata; 
                                        void *context;
                                        int scope=0, jmpval, save_prompt,share;
                                        struct checkpt buff;
@@ -817,12 +819,17 @@
                                                sh.bltinfun = funptr(np);
                                                if(nv_isattr(np,NV_BLTINOPT))
                                                {
-                                                       bdata.shp = &sh;
-                                                       bdata.np = nq;
-                                                       bdata.ptr = context;
-                                                       bdata.data = 
t->com.comstate;
-                                                       bdata.flags = 
(OPTIMIZE!=0);
-                                                       context = (void*)&bdata;
+                                                       Shbltin_t *bp = 
&sh.bltindata;
+                                                       bp->bnode = np;
+                                                       bp->vnode = nq;
+                                                       bp->ptr = context;
+                                                       bp->data = 
t->com.comstate;
+                                                       bp->sigset = 0;
+                                                       bp->notify = 0;
+                                                       bp->flags = 
(OPTIMIZE!=0);
+                                                       if(sh.subshell && 
nv_isattr(np,BLT_NOSFIO))
+                                                               sh_subtmpfile();
+                                                       context = (void*)bp;
                                                }
                                                if(execflg && !sh.subshell &&
                                                        !sh.st.trapcom[0] && 
!sh.st.trap[SH_ERRTRAP] && sh.fn_depth==0 && !nv_isattr(np,BLT_ENV))
@@ -837,7 +844,7 @@
                                                
if(error_info.flags&ERROR_INTERACTIVE)
                                                        tty_check(ERRIO);
                                                if(nv_isattr(np,NV_BLTINOPT))
-                                                       
((Shnode_t*)t)->com.comstate = bdata.data;
+                                                       
((Shnode_t*)t)->com.comstate = sh.bltindata.data;
                                                if(!nv_isattr(np,BLT_EXIT) && 
sh.exitval!=SH_RUNPROG)
                                                        sh.exitval &= 
SH_EXITMASK;
                                        }
@@ -855,6 +862,8 @@
                                                                        
sfclose(item->strm);
                                                        }
                                                }
+                                               if(sh.bltinfun && 
(error_info.flags&ERROR_NOTIFY))
+                                                       
(*sh.bltinfun)(-2,com,context);
                                                /* failure on special built-ins 
fatal */
                                                if(jmpval<=SH_JMPCMD  && 
(!nv_isattr(np,BLT_SPC) || command))
                                                        jmpval=0;
@@ -1332,7 +1341,7 @@
                        struct comnod   *tp;
                        char *cp, *trap, *nullptr = 0;
                        int nameref, refresh=1;
-                       static char *av[5] = { "for", 0, "in" };
+                       char *av[5];
 #if SHOPT_OPTIMIZE
                        int  jmpval = ((struct checkpt*)sh.jmplist)->mode;
                        struct checkpt buff;
@@ -1415,7 +1424,9 @@
                                {
                                        av[0] = 
(t->tre.tretyp&COMSCAN)?"select":"for";
                                        av[1] = t->for_.fornam;
+                                       av[2] = "in";
                                        av[3] = cp;
+                                       av[4] = 0;
                                        sh_debug(trap,(char*)0,(char*)0,av,0);
                                }
                                sh_exec(t->for_.fortre,flag);
@@ -1537,12 +1548,15 @@
                    case TARITH: /* (( expression )) */
                    {
                        register char *trap;
-                       static char *arg[4]=  {"((", 0, "))"};
+                       char *arg[4];
                        error_info.line = t->ar.arline-sh.st.firstline;
+                       arg[0] = "((";
                        if(!(t->ar.arexpr->argflag&ARG_RAW))
                                arg[1] = 
sh_macpat(t->ar.arexpr,OPTIMIZE|ARG_ARITH);
                        else
                                arg[1] = t->ar.arexpr->argval;
+                       arg[2] = "))";
+                       arg[3] = 0;
                        if(trap=sh.st.trap[SH_DEBUGTRAP])
                                sh_debug(trap,(char*)0, (char*)0, arg, 
ARG_ARITH);
                        if(sh_isoption(SH_XTRACE))
@@ -1574,8 +1588,11 @@
                        t= (Shnode_t*)(tt->sw.swlst);
                        if(trap=sh.st.trap[SH_DEBUGTRAP])
                        {
-                               static char *av[4] = {"case", 0, "in" };
+                               char *av[4];
+                               av[0] = "case";
                                av[1] = r;
+                               av[2] = "in";
+                               av[3] = 0;
                                sh_debug(trap, (char*)0, (char*)0, av, 0);
                        }
                        while(t)
@@ -1924,15 +1941,15 @@
                                sh_done(0);
                        if(sh.lastarg!= lastarg && sh.lastarg)
                                free(sh.lastarg);
-                       if(strlen(com[argn-1]) < sizeof(lastarg))
+                       if(strlen(comn) < sizeof(lastarg))
                        {
                                nv_onattr(L_ARGNOD,NV_NOFREE);
-                               sh.lastarg = strcpy(lastarg,com[argn-1]);
+                               sh.lastarg = strcpy(lastarg,comn);
                        }
                        else
                        {
                                nv_offattr(L_ARGNOD,NV_NOFREE);
-                               sh.lastarg = strdup(com[argn-1]);
+                               sh.lastarg = strdup(comn);
                        }
                }
                if(!skipexitset)
@@ -1956,6 +1973,34 @@
        return(sh.exitval);
 }
 
+int sh_run(int argn, char *argv[])
+{
+       register struct dolnod  *dp;
+       register struct comnod  *t = (struct comnod*)stakalloc(sizeof(struct 
comnod));
+       int                     savtop = staktell();
+       char                    *savptr = stakfreeze(0);
+       Opt_t                   *op, *np = optctx(0, 0);
+       Shbltin_t               bltindata;
+       bltindata = sh.bltindata;
+       op = optctx(np, 0);
+       memset(t, 0, sizeof(struct comnod));
+       dp = (struct dolnod*)stakalloc((unsigned)sizeof(struct dolnod) + 
ARG_SPARE*sizeof(char*) + argn*sizeof(char*));
+       dp->dolnum = argn;
+       dp->dolbot = ARG_SPARE;
+       memcpy(dp->dolval+ARG_SPARE, argv, (argn+1)*sizeof(char*));
+       t->comarg = (struct argnod*)dp;
+       if(!strchr(argv[0],'/'))
+               t->comnamp = 
(void*)nv_bfsearch(argv[0],sh.fun_tree,(Namval_t**)&t->comnamq,(char**)0);
+       argn=sh_exec((Shnode_t*)t,sh_isstate(SH_ERREXIT));
+       optctx(op,np);
+       sh.bltindata = bltindata;
+       if(savptr!=stakptr(0))
+               stakset(savptr,savtop);
+       else
+               stakseek(savtop);
+       return(argn);
+}
+
 /*
  * test for equality with second argument trimmed
  * returns 1 if r == trim(s) otherwise 0
@@ -2533,7 +2578,7 @@
  */
 static int run_subshell(const Shnode_t *t,pid_t grp)
 {
-       static char prolog[] = "(print $(typeset +A);set; typeset -p; print 
.sh.dollar=$$;set +o)";
+       static const char prolog[] = "(print $(typeset +A);set; typeset -p; 
print .sh.dollar=$$;set +o)";
        register int i, fd, trace = sh_isoption(SH_XTRACE);
        int pin,pout;
        pid_t pid;
@@ -2933,15 +2978,3 @@
        }
 #   endif /* _lib_fork */
 #endif /* SHOPT_SPAWN */
-
-/*
- * override procrun() since it is used in libcmd
- */
-#include       <proc.h>
-int procrun(const char *path, char *argv[])
-{
-       if(sh.subshell)
-               sh_subtmpfile();
-       return(procclose(procopen(path, argv, NiL, NiL, PROC_FOREGROUND|PROC_GID
-|PROC_UID)));
-}
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/basic.sh 
ksh93_2007_05_15/src/cmd/ksh93/tests/basic.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/basic.sh       2007-03-20 
19:30:26.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/basic.sh       2007-04-30 
17:48:30.000000000 +0200
@@ -330,6 +330,12 @@
 print 'print  -- $0' >> /tmp/ksh$$x
 chmod +x /tmp/ksh$$x
 [[ $(/tmp/ksh$$x) == /tmp/ksh$$x ]] || err_exit  "\$0 is $0 instead of 
/tmp/ksh$$x"
+cat > /tmp/ksh$$x <<- \EOF
+       myfilter() { x=$(print ok | cat); print  -r -- $SECONDS;}
+       set -o pipefail
+       sleep 3 | myfilter
+EOF
+(( $($SHELL /tmp/ksh$$x) > 2.0 )) && err_exit 'command substitution causes 
pipefail option to hang'
 rm -f /tmp/ksh$$x
 exec 3<&-
 ( typeset -r foo=bar) 2> /dev/null || err_exit 'readonly variables set in a 
subshell cannot unset'
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/options.sh 
ksh93_2007_05_15/src/cmd/ksh93/tests/options.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/options.sh     2006-10-06 
19:28:13.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/options.sh     2007-05-11 
22:42:25.000000000 +0200
@@ -310,4 +310,22 @@
 false | true | true    && err_exit 'pipe with first not failing with pipefail'
 true | false | true    && err_exit 'pipe middle not failing with pipefail'
 true | true | false    && err_exit 'pipe last not failing with pipefail'
+$SHELL -c '[[ $- == *c* ]]' || err_exit  'option c not in $-'
+trap 'rm -f /tmp/.profile' EXIT
+> /tmp/.profile
+for i in  i l r s D E a b e f h k n r t u v  x B C G H
+do     HOME=/tmp ENV= $SHELL -$i  2> /dev/null <<- ++EOF++ || err_exit "option 
$i not in \$-"
+       [[ \$- == *$i* ]]  ||   exit 1
+       ++EOF++
+done
+letters=ilrabefhknuvxBCGE
+integer j=0
+for i in  interactive login restricted allexport notify errexit \
+       noglob  trackall keyword noexec nounset verbose xtrace braceexpand \
+       noclobber globstar rc
+do     HOME=/tmp ENV= $SHELL   -o $i  2> /dev/null <<- ++EOF++ || err_exit 
"option $i not equivalent to ${letters:j:1}"
+       [[ \$- == *${letters:j:1}* ]]  ||   exit 1
+       ++EOF++
+       ((j++))
+done
 exit $((Errors))
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/restricted.sh 
ksh93_2007_05_15/src/cmd/ksh93/tests/restricted.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/restricted.sh  1970-01-01 
01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/restricted.sh  2007-03-06 
18:28:39.000000000 +0100
@@ -0,0 +1,78 @@
+########################################################################
+#                                                                      #
+#               This software is part of the ast package               #
+#           Copyright (c) 1982-2007 AT&T Knowledge Ventures            #
+#                      and is licensed under the                       #
+#                  Common Public License, Version 1.0                  #
+#                      by AT&T Knowledge Ventures                      #
+#                                                                      #
+#                A copy of the License is available at                 #
+#            http://www.opensource.org/licenses/cpl1.0.txt             #
+#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
+#                                                                      #
+#              Information and Software Systems Research               #
+#                            AT&T Research                             #
+#                           Florham Park NJ                            #
+#                                                                      #
+#                  David Korn <dgk at research.att.com>                   #
+#                                                                      #
+########################################################################
+function err_exit
+{
+       print -u2 -n "\t"
+       print -u2 -r ${Command}[$1]: "${@:2}"
+       let Errors+=1
+}
+alias err_exit='err_exit $LINENO'
+
+# test restricted shell
+Command=${0##*/}
+integer Errors=0
+mkdir  /tmp/ksh$$ || err_exit "mkdir /tmp/ksh$$ failed" 
+trap "cd /; rm -rf /tmp/ksh$$" EXIT
+pwd=$PWD
+case $SHELL in
+/*)    ;;
+*/*)   SHELL=$pwd/$SHELL;;
+*)     SHELL=$(whence "$SHELL");;
+esac
+function check_restricted
+{
+       rm -f out
+       rksh -c "$@" 2> out > /dev/null
+       grep restricted out  > /dev/null 2>&1 
+}
+
+[[ $SHELL != /* ]] && SHELL=$pwd/$SHELL
+cd /tmp/ksh$$ || err_exit "cd /tmp/ksh$$ failed"
+ln -s $SHELL rksh
+PATH=$PWD:$PATH
+rksh -c  '[[ -o restricted ]]' || err_exit 'restricted option not set' 
+[[ $(rksh -c 'print hello') == hello ]] || err_exit 'unable to run print'
+check_restricted /bin/echo || err_exit '/bin/echo not resticted'
+check_restricted ./echo || err_exit './echo not resticted'
+check_restricted 'SHELL=ksh' || err_exit 'SHELL asignment not resticted'
+check_restricted 'PATH=/bin' || err_exit 'PATH asignment not resticted'
+check_restricted 'FPATH=/bin' || err_exit 'FPATH asignment not resticted'
+check_restricted 'ENV=/bin' || err_exit 'ENV asignment not resticted'
+check_restricted 'print > file' || err_exit '> file not restricted'
+> empty
+check_restricted 'print <> empty' || err_exit '<> file not restricted'
+print 'echo hello' > script
+chmod +x ./script
+! check_restricted script ||  err_exit 'script without builtins should run in 
restricted mode'
+check_restricted ./script ||  err_exit 'script with / in name should not run 
in restricted mode'
+print '/bin/echo hello' > script
+check_restricted script ||  err_exit 'script with pathnames should not run in 
restricted mode'
+print 'echo hello> file' > script
+check_restricted script ||  err_exit 'script with output redirection should 
not run in restricted mode'
+print 'PATH=/bin' > script
+check_restricted script ||  err_exit 'script with PATH assignment should not 
run in restricted mode'
+cat > script <<!
+#! $SHELL
+print hello
+!
+cp script /tmp/dgk
+check_restricted 'script;:' ||  err_exit 'script with #! pathname should not 
run in restricted mode'
+check_restricted 'script' ||  err_exit 'script with #! pathname should not run 
in restricted mode even if last command in script'
+exit $((Errors))
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/substring.sh 
ksh93_2007_05_15/src/cmd/ksh93/tests/substring.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/substring.sh   2007-03-20 
19:43:39.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/substring.sh   2007-05-14 
16:55:20.000000000 +0200
@@ -166,6 +166,10 @@
 if     [[ "${x//\[(*)\]/\{\1\}}" != {123}def ]]
 then   err_exit 'closing brace escape not working'
 fi
+xx=%28text%29
+if     [[ ${xx//%28/abc\)} != 'abc)text%29' ]]
+then    err_exit '${xx//%28/abc\)} not working'
+fi
 unset foo
 foo=one/two/three
 if     [[ ${foo//'/'/_} != one_two_three ]]
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/conf.sh 
ksh93_2007_05_15/src/lib/libast/comp/conf.sh
--- ksh93_2007_04_18/src/lib/libast/comp/conf.sh        2007-04-02 
21:43:47.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/conf.sh        2007-04-20 
19:45:43.000000000 +0200
@@ -21,7 +21,7 @@
 ########################################################################
 : generate getconf and limits info
 #
-# @(#)conf.sh (AT&T Research) 2007-04-02
+# @(#)conf.sh (AT&T Research) 2007-04-20
 #
 # this script generates these files from the table file in the first arg
 # the remaining args are the C compiler name and flags
@@ -128,8 +128,33 @@
 }
 !
 if     $cc -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe
-then   LL='ll'
-else   LL='l'
+then   LL_format='ll'
+else   LL_format='l'
+fi
+
+# determine the intmax_t constant suffix
+
+cat > $tmp.c <<!
+${head}
+int
+main()
+{
+#if _ast_intmax_long
+       return 1;
+#else
+       _ast_intmax_t           s = 0x7fffffffffffffffLL;
+       unsigned _ast_intmax_t  u = 0xffffffffffffffffLL;
+
+       return 0;
+#endif
+}
+!
+if     $cc -o $tmp.exe $tmp.c >/dev/null 2>&1
+then   if      ./$tmp.exe
+       then    LL_suffix='LL'
+       else    LL_suffix='L'
+       fi
+else   LL_suffix=''
 fi
 
 # set up the names and keys
@@ -200,7 +225,7 @@
                                                ;;
                                        *" -$f- "*)
                                                ;;
-                                       *)      if      iffe -n - hdr $f | grep 
-q _hdr_$f
+                                       *)      if      iffe -n - hdr $f | grep 
_hdr_$f >/dev/null
                                                then    hdr="$hdr $f"
                                                        
headers=$headers$nl#include$sp'<'$1'>'
                                                else    hdr="$hdr -$f-"
@@ -984,9 +1009,6 @@
        case $flags in
        *W*)    conf_flags="${conf_flags}|CONF_PREFIX_ONLY" ;;
        esac
-       case $shell in
-       ksh)    conf_flags=${conf_flags#0?} ;;
-       esac
        case $debug in
        ?*)     case $standard in
                ????)   sep=" " ;;
@@ -1058,10 +1080,10 @@
                                                ;;
                                        '')     case $conf_name in
                                                SIZE_*|U*|*_MAX)        
-                                                       f="%${LL}u"
+                                                       f="%${LL_format}u"
                                                        t="unsigned 
_ast_intmax_t"
                                                        ;;
-                                               *)      f="%${LL}d"
+                                               *)      f="%${LL_format}d"
                                                        t="_ast_intmax_t"
                                                        ;;
                                                esac
@@ -1294,9 +1316,86 @@
                        conf_minmax=0x$conf_minmax
                        ;;
                esac
+               case $conf_limit in
+               ?*[-+]*|*['()']*)
+                       ;;
+               *[lLuU])
+                       case $LL_suffix in
+                       ??)     case $conf_limit in
+                               *[!lL][lL]|*[!lL][lL][uU])
+                                       conf_limit=${conf_limit}L
+                                       ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               -*[2468])       
+                       case $shell in
+                       ksh)    p=${conf_limit%?}
+                               s=${conf_limit#$p}
+                               ((s=s-1))
+                               ;;
+                       *)      eval `echo '' $conf_limit | sed 's/ 
*\(.*\)\(.\) */p=\1 s=\2/'`
+                               s=`expr $s - 1`
+                               ;;
+                       esac
+                       conf_limit=${p}${s}${LL_suffix}-1${LL_suffix}
+                       ;;
+               0[xX]*[abcdefABCDEF])
+                       conf_limit=${conf_limit}${LL_suffix}
+                       ;;
+               -*[0123456789])
+                       conf_limit=${conf_limit}${LL_suffix}
+                       ;;
+               *[0123456789])
+                       conf_limit=${conf_limit}U${LL_suffix}
+                       ;;
+               esac
+               case $conf_minmax in
+               ?*[-+]*|*['()']*)
+                       ;;
+               *[lLuU])
+                       case $LL_suffix in
+                       ??)     case $conf_minmax in
+                               *[!lL][lL]|*[!lL][lL][uU])
+                                       conf_minmax=${conf_minmax}L
+                                       ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               -*[2468])       
+                       case $shell in
+                       ksh)    p=${conf_minmax%?}
+                               s=${conf_minmax#$p}
+                               ((s=s-1))
+                               ;;
+                       *)      eval `echo '' $conf_minmax | sed 's/ 
*\(.*\)\(.\) */p=\1 s=\2/'`
+                               s=`expr $s - 1`
+                               ;;
+                       esac
+                       conf_minmax=${p}${s}${LL_suffix}-1${LL_suffix}
+                       ;;
+               0[xX]*[abcdefABCDEF])
+                       conf_minmax=${conf_minmax}${LL_suffix}
+                       ;;
+               -*[0123456789])
+                       conf_minmax=${conf_minmax}${LL_suffix}
+                       ;;
+               *[0123456789])
+                       conf_minmax=${conf_minmax}U${LL_suffix}
+                       ;;
+               esac
                conf_limit="{ $conf_limit, 0 }" conf_minmax="{ $conf_minmax, 0 
}"
                ;;
        esac
+       case $conf_flags in
+       '0|'*)  case $shell in
+               ksh)    conf_flags=${conf_flags#0?} ;;
+               *)      conf_flags=`echo "$conf_flags" | sed 's/^0.//'` ;;
+               esac
+               ;;
+       esac
        echo "{ \"$conf_name\", $conf_limit, $conf_minmax, $conf_flags, 
$conf_standard, $conf_section, $conf_call, $conf_op },"
        case $shell in
        ksh)    len=${#conf_name}
@@ -1327,14 +1426,16 @@
 esac
 {
 cat <<!
-#pragma prototyped
-
 #ifndef _CONFTAB_H
 #define _CONFTAB_H
 $systeminfo
 
 ${generated}
 
+#if !defined(const) && !defined(__STDC__) && !defined(__cplusplus) && 
!defined(c_plusplus)
+#define const
+#endif
+
 #define conf           _ast_conf_data
 #define conf_elements  _ast_conf_ndata
 
@@ -1385,8 +1486,6 @@
 
 struct Conf_s; typedef struct Conf_s Conf_t;
 
-typedef int (*Conf_f)(Conf_t*, intmax_t*, char**);
-
 typedef struct Value_s
 {
        intmax_t        number;
@@ -1421,8 +1520,7 @@
 
 #endif
 !
-} > $tmp.1
-proto < $tmp.1 > $tmp.2
+} > $tmp.2
 case $debug in
 -d7)   echo $command: $tmp.2 ${base}.h ;;
 *)     cmp -s $tmp.2 ${base}.h 2>/dev/null || mv $tmp.2 ${base}.h ;;
@@ -1433,7 +1531,6 @@
 esac
 {
 cat <<!
-#pragma prototyped
 ${head}
 #include <sys/types.h>
 #include <limits.h>
@@ -1480,8 +1577,7 @@
 
 int    conf_elements = (int)sizeof(conf) / (int)sizeof(conf[0]);
 !
-} > $tmp.3
-proto < $tmp.3 > $tmp.4
+} > $tmp.4
 case $debug in
 -d7)   echo $command: $tmp.4 ${base}.c ;;
 *)     cmp -s $tmp.4 ${base}.c 2>/dev/null || mv $tmp.4 ${base}.c ;;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/conf.tab 
ksh93_2007_05_15/src/lib/libast/comp/conf.tab
--- ksh93_2007_04_18/src/lib/libast/comp/conf.tab       2007-04-02 
21:45:47.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/conf.tab       2007-04-19 
23:05:07.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # posix { getconf limits } macro table
 #
-# @(#)conf.tab (AT&T Research) 2007-04-01
+# @(#)conf.tab (AT&T Research) 2007-04-19
 #
 # name standard section call flags [ header ... ] [ value ... ]
 #
@@ -45,7 +45,7 @@
 AIO_MAX                                POSIX   SC 1 LMU        1
 AIO_PRIO_DELTA_MAX             POSIX   SC 1 LMU
 ALLOC_SIZE_MIN                 POSIX   PC 1 LUVW
-ARCHITECTURE                   SVID    SI 1 0
+ARCHITECTURE                   SVID    SI 1 O
 ARG_MAX                                POSIX   SC 1 CDLMUX     NCARGS 4096
 ASYNCHRONOUS_IO                        POSIX   SC 1 CDFUW
 ASYNC_IO                       POSIX   PC 1 FUW
@@ -58,7 +58,7 @@
 BC_DIM_MAX                     POSIX   SC 2 LMN        2048
 BC_SCALE_MAX                   POSIX   SC 2 LMN        99
 BC_STRING_MAX                  POSIX   SC 2 LMN        1000
-BUSTYPES                       SVID    SI 1 0
+BUSTYPES                       SVID    SI 1 O
 CHARCLASS_NAME_MAX             XOPEN   XX 1 L          14
 CHAR_BIT                       C       XX 1 L          8
 CHAR_MAX                       C       XX 1 L
@@ -116,9 +116,9 @@
 GETGR_R_SIZE_MAX               C       QQ 1 L
 GETPW_R_SIZE_MAX               C       QQ 1 L
 HOSTID                         C       QQ 1 L
-HOSTNAME                       SVID    SI 1 0
+HOSTNAME                       SVID    SI 1 O
 HOST_NAME_MAX                  POSIX   SC 1 LMU        255
-HW_PROVIDER                    SVID    SI 1 0
+HW_PROVIDER                    SVID    SI 1 O
 HW_SERIAL                      C       QQ 1 L
 ILP32_OFF32                    XBS5    SC 1 FU
 ILP32_OFF32_CFLAGS             XBS5    CS 1 FU
@@ -130,7 +130,7 @@
 ILP32_OFFBIG_LDFLAGS           XBS5    CS 1 FU
 ILP32_OFFBIG_LIBS              XBS5    CS 1 FU
 ILP32_OFFBIG_LINTFLAGS         XBS5    CS 1 FU
-INITTAB_NAME                   SVID    SI 1 0
+INITTAB_NAME                   SVID    SI 1 O
 INT_MAX                                C       XX 1 L          32767
 INT_MIN                                C       XX 1 L          -32767
 IOV_MAX                                XOPEN   SC 1 LMU        16
@@ -169,7 +169,7 @@
 KERNEL_REGION_MAX              SCO     SC 1 0
 KERNEL_S5INODE                 SCO     SC 1 0
 KERNEL_S5INODE_MAX             SCO     SC 1 0
-KERNEL_STAMP                   SVID    SI 1 0
+KERNEL_STAMP                   SVID    SI 1 O
 KERN_POINTERS                  C       QQ 1 L
 KERN_SIM                       C       QQ 1 L
 LEGACY                         XOPEN   SC 1 FU
@@ -214,7 +214,7 @@
 LPBIG_OFFBIG_LDFLAGS           XBS5    CS 1 FU
 LPBIG_OFFBIG_LIBS              XBS5    CS 1 FU
 LPBIG_OFFBIG_LINTFLAGS         XBS5    CS 1 FU
-MACHINE                                SVID    SI 1 0
+MACHINE                                SVID    SI 1 O
 MAPPED_FILES                   POSIX   SC 1 CDFUW      _lib_mmap
 MAX_CANON                      POSIX   PC 1 LMU        CANBSIZ 255
 MAX_INPUT                      POSIX   PC 1 LMU        MAX_CANON 255   
@@ -343,8 +343,8 @@
 OSREL_MAJ                      C       QQ 1 L
 OSREL_MIN                      C       QQ 1 L
 OSREL_PATCH                    C       QQ 1 L
-OS_BASE                                SVID    SI 1 0
-OS_PROVIDER                    SVID    SI 1 0
+OS_BASE                                SVID    SI 1 O
+OS_PROVIDER                    SVID    SI 1 O
 OS_VERSION                     AES     SC 1 FSU
 PAGESIZE                       POSIX   SC 1 MU         PAGESIZE PAGE_SIZE 4096 
cc{
        int main()
@@ -506,7 +506,7 @@
 SYMLOOP_MAX                    POSIX   SC 1 LMU        8
 SYNCHRONIZED_IO                        POSIX   SC 1 CDFUW
 SYNC_IO                                POSIX   PC 1 FUW
-SYSNAME                                SVID    SI 1 0
+SYSNAME                                SVID    SI 1 O
 SYSPID_MAX                     SVID    SC 1 LMU        2
 THREADS                                POSIX   SC 1 CDFUW
 THREADS_PRIO_CEILING           POSIX   SC 1 FUW
@@ -550,7 +550,7 @@
 ULONG_MAX                      C       XX 1 L          4294967295
 UNIX                           XOPEN   SC 1 FSUW
 UPE                            POSIX   SC 2 FUW
-USER_LIMIT                     SVID    SI 1 0
+USER_LIMIT                     SVID    SI 1 O
 USHRT_MAX                      C       XX 1 L          65535
 V6_ILP32_OFF32                 POSIX   SC 1 W
 V6_ILP32_OFFBIG                        POSIX   SC 1 W
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/rename.c 
ksh93_2007_05_15/src/lib/libast/comp/rename.c
--- ksh93_2007_04_18/src/lib/libast/comp/rename.c       2004-07-23 
08:13:51.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/rename.c       2007-04-23 
22:54:35.000000000 +0200
@@ -49,7 +49,7 @@
                argv[1] = from;
                argv[2] = to;
                argv[3] = 0;
-               if (!procrun(argv[0], argv))
+               if (!procrun(argv[0], argv, 0))
                {
                        errno = oerrno;
                        return 0;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/setlocale.c 
ksh93_2007_05_15/src/lib/libast/comp/setlocale.c
--- ksh93_2007_04_18/src/lib/libast/comp/setlocale.c    2006-12-19 
06:08:54.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/comp/setlocale.c    2007-04-20 
21:44:46.000000000 +0200
@@ -151,7 +151,7 @@
                return 0;
        sys = uwin_setlocale(category, usr);
        if (ast.locale.set & AST_LC_debug)
-               sfprintf(sfstderr, "locale uwin %17s %-24s %-24s\n", 
categories[lcindex(category, 0)].name, usr, sys);
+               sfprintf(sfstderr, "locale uwin %17s %-24s %-24s\n", 
lc_categories[lcindex(category, 0)].name, usr, sys);
        return sys;
 }
 
@@ -558,7 +558,7 @@
                        dp = &default_numeric;
                LCINFO(category)->data = (void*)dp;
                if (ast.locale.set & (AST_LC_debug|AST_LC_setlocale))
-                       sfprintf(sfstderr, "locale info %17s decimal '%c' 
thousands '%c'\n", categories[category].name, dp->decimal, dp->thousand >= 0 ? 
dp->thousand : 'X');
+                       sfprintf(sfstderr, "locale info %17s decimal '%c' 
thousands '%c'\n", lc_categories[category].name, dp->decimal, dp->thousand >= 0 
? dp->thousand : 'X');
        }
        return 0;
 }
@@ -567,7 +567,7 @@
  * this table is indexed by AST_LC_[A-Z]*
  */
 
-Lc_category_t          categories[] =
+Lc_category_t          lc_categories[] =
 {
 { "LC_ALL",           LC_ALL,           AST_LC_ALL,           0               
},
 { "LC_COLLATE",       LC_COLLATE,       AST_LC_COLLATE,       set_collate     
},
@@ -645,11 +645,11 @@
        const char*     sys;
        int             i;
 
-       if (!lc && !(lc = categories[category].prev))
+       if (!lc && !(lc = lc_categories[category].prev))
                lc = lcmake(NiL);
        if (locales[category] != lc)
        {
-               if (categories[category].external == 
-categories[category].internal)
+               if (lc_categories[category].external == 
-lc_categories[category].internal)
                {
                        sys = 0;
                        for (i = 1; i < AST_LC_COUNT; i++)
@@ -660,13 +660,13 @@
                                }
                }
                else if (lc->flags & (LC_debug|LC_local))
-                       sys = setlocale(categories[category].external, 
lcmake(NiL)->name);
-               else if (!(sys = setlocale(categories[category].external, 
lc->name)) &&
-                        (streq(lc->name, lc->code) || !(sys = 
setlocale(categories[category].external, lc->code))) &&
+                       sys = setlocale(lc_categories[category].external, 
lcmake(NiL)->name);
+               else if (!(sys = setlocale(lc_categories[category].external, 
lc->name)) &&
+                        (streq(lc->name, lc->code) || !(sys = 
setlocale(lc_categories[category].external, lc->code))) &&
                         !streq(lc->code, lc->language->code))
-                               sys = setlocale(categories[category].external, 
lc->language->code);
+                               sys = 
setlocale(lc_categories[category].external, lc->language->code);
                if (ast.locale.set & (AST_LC_debug|AST_LC_setlocale))
-                       sfprintf(sfstderr, "locale set  %17s %-24s %-24s\n", 
categories[category].name, lc->name, sys);
+                       sfprintf(sfstderr, "locale set  %17s %-24s %-24s\n", 
lc_categories[category].name, lc->name, sys);
                if (!sys)
                {
                        /*
@@ -684,13 +684,13 @@
                        }
                        if (!(lc->flags & LC_local))
                                return 0;
-                       if (categories[category].external != 
-categories[category].internal)
-                               setlocale(categories[category].external, 
lcmake(NiL)->name);
+                       if (lc_categories[category].external != 
-lc_categories[category].internal)
+                               setlocale(lc_categories[category].external, 
lcmake(NiL)->name);
                }
                locales[category] = lc;
-               if (categories[category].setf && 
(*categories[category].setf)(&categories[category]))
+               if (lc_categories[category].setf && 
(*lc_categories[category].setf)(&lc_categories[category]))
                {
-                       locales[category] = categories[category].prev;
+                       locales[category] = lc_categories[category].prev;
                        return 0;
                }
                if (lc->flags & LC_default)
@@ -729,7 +729,7 @@
                for (i = 1; i < AST_LC_COUNT; i++)
                {
                        s = w;
-                       t = categories[i].name;
+                       t = lc_categories[i].name;
                        while (*t && *s++ == *t++);
                        if (!*t && *s++ == '=')
                        {
@@ -776,8 +776,8 @@
                                }
                                stk[k++] = cat[i];
                        }
-                       else if (!categories[cat[i]].prev)
-                               categories[cat[i]].prev = p;
+                       else if (!lc_categories[cat[i]].prev)
+                               lc_categories[cat[i]].prev = p;
        }
        while (s[0] == '/' && s[1] && n < AST_LC_COUNT)
        {
@@ -802,8 +802,8 @@
                                return -1;
                        }
                }
-               else if (!categories[n].prev)
-                       categories[n].prev = p;
+               else if (!lc_categories[n].prev)
+                       lc_categories[n].prev = p;
        }
        return n;
 }
@@ -862,7 +862,7 @@
                                        if (cat[j] == k)
                                        {
                                                cat[j] = -1;
-                                               sfprintf(sp, "%s=", 
categories[j].name);
+                                               sfprintf(sp, "%s=", 
lc_categories[j].name);
                                        }
                                sfprintf(sp, "%s", locales[i]->name);
                        }
@@ -888,11 +888,11 @@
                        if (!(a = getenv("LC_ALL")) || !*a)
                        {
                                for (i = 1; i < AST_LC_COUNT; i++)
-                                       if ((s = getenv(categories[i].name)) && 
*s)
+                                       if ((s = getenv(lc_categories[i].name)) 
&& *s)
                                        {
                                                if (streq(s, local) && (u || (u 
= native_locale(locale, tmp, sizeof(tmp)))))
                                                        s = u;
-                                               categories[i].prev = lcmake(s);
+                                               lc_categories[i].prev = 
lcmake(s);
                                        }
                                a = getenv("LANG");
                        }
@@ -906,13 +906,13 @@
                        p = 0;
                        for (i = 1; i < AST_LC_COUNT; i++)
                        {
-                               if (!categories[i].prev)
+                               if (!lc_categories[i].prev)
                                {
                                        if (!p && !(p = lcmake(a)))
                                                break;
-                                       categories[i].prev = p;
+                                       lc_categories[i].prev = p;
                                }
-                               if (!single(i, categories[i].prev))
+                               if (!single(i, lc_categories[i].prev))
                                {
                                        while (i--)
                                                single(i, NiL);
@@ -921,7 +921,7 @@
                        }
                        if (ast.locale.set & AST_LC_debug)
                                for (i = 1; i < AST_LC_COUNT; i++)
-                                       sfprintf(sfstderr, "locale env  %17s 
%s\n", categories[i].name, locales[i]->name);
+                                       sfprintf(sfstderr, "locale env  %17s 
%s\n", lc_categories[i].name, locales[i]->name);
                        initialized = 1;
                }
                goto compose;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/syslog.h 
ksh93_2007_05_15/src/lib/libast/comp/syslog.h
--- ksh93_2007_04_18/src/lib/libast/comp/syslog.h       2003-06-15 
12:29:15.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/syslog.h       2007-04-21 
00:22:54.000000000 +0200
@@ -95,7 +95,7 @@
 
 /* encoding support */
 
-#include <namval.h>
+#include <ast_namval.h>
 
 #define log_facility   _log_facility
 #define log_severity   _log_severity
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/system.c 
ksh93_2007_05_15/src/lib/libast/comp/system.c
--- ksh93_2007_04_18/src/lib/libast/comp/system.c       2006-09-22 
17:28:36.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/system.c       2007-04-23 
22:54:44.000000000 +0200
@@ -51,5 +51,5 @@
        sh[1] = "-c";
        sh[2] = (char*)cmd;
        sh[3] = 0;
-       return procrun(NiL, sh);
+       return procrun(NiL, sh, 0);
 }
diff -r -N -u ksh93_2007_04_18/src/lib/libast/features/siglist 
ksh93_2007_05_15/src/lib/libast/features/siglist
--- ksh93_2007_04_18/src/lib/libast/features/siglist    1970-01-01 
01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/features/siglist    2007-05-09 
18:21:19.000000000 +0200
@@ -0,0 +1,14 @@
+lib    strsignal string.h signal.h
+
+tst    - run{
+       for sig in `/bin/kill -l 2>/dev/null`
+       do      case $sig in
+               *[!A-Za-z0-9_]*|*MIN|*MAX)
+                       ;;
+               *)      echo "#if defined(SIG$sig) && !defined(HAD_SIG$sig)"
+                       echo "0,\"$sig\",SIG$sig,"
+                       echo "#endif"
+                       ;;
+               esac
+       done
+}end
diff -r -N -u ksh93_2007_04_18/src/lib/libast/features/signal.c 
ksh93_2007_05_15/src/lib/libast/features/signal.c
--- ksh93_2007_04_18/src/lib/libast/features/signal.c   2006-09-28 
20:16:56.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/features/signal.c   2007-05-09 
18:14:04.000000000 +0200
@@ -22,13 +22,19 @@
 #pragma prototyped
 /*
  * Glenn Fowler
- * AT&T Bell Laboratories
+ * AT&T Research
  *
  * generate signal features
  */
 
+#include "FEATURE/standards"
+
+#define strsignal      ______strsignal
+
 #include <signal.h>
 
+#undef strsignal
+
 struct _m_
 {
        char*           text;
@@ -41,170 +47,226 @@
 static struct _m_ map[] =
 {
 #ifdef SIGABRT
+#define HAD_SIGABRT    1
 "Abort",                       "ABRT",         SIGABRT,
 #endif
 #ifdef SIGAIO
+#define HAD_SIGAIO     1
 "Asynchronous I/O",            "AIO",          SIGAIO,
 #endif
 #ifdef SIGALRM
+#define HAD_SIGALRM    1
 "Alarm call",                  "ALRM",         SIGALRM,
 #endif
 #ifdef SIGAPOLLO
+#define HAD_SIGAPOLLO  1
 "Apollo",                      "APOLLO",       SIGAPOLLO,
 #endif
 #ifdef SIGBUS
+#define HAD_SIGBUS     1
 "Bus error",                   "BUS",          SIGBUS,
 #endif
 #ifdef SIGCHLD
+#define HAD_SIGCHLD    1
 "Child status change",         "CHLD",         SIGCHLD,
 #endif
 #ifdef SIGCLD
+#define HAD_SIGCLD     1
 "Death of child",              "CLD",          SIGCLD,
 #endif
 #ifdef SIGCONT
+#define HAD_SIGCONT    1
 "Stopped process continued",   "CONT",         SIGCONT,
 #endif
 #ifdef SIGDANGER
+#define HAD_SIGDANGER  1
 "System crash soon",           "DANGER",       SIGDANGER,
 #endif
 #ifdef SIGDEBUG
+#define HAD_SIGDEBUG   1
 "Debug trap",                  "DEBUG",        SIGDEBUG,
 #endif
 #ifdef SIGDIL
+#define HAD_SIGDIL     1
 "DIL trap",                    "DIL",          SIGDIL,
 #endif
 #ifdef SIGEMT
+#define HAD_SIGEMT     1
 "EMT trap",                    "EMT",          SIGEMT,
 #endif
 #ifdef SIGERR
+#define HAD_SIGERR     1
 "ERR trap",                    "ERR",          SIGERR,
 #endif
 #ifdef SIGEXIT
+#define HAD_SIGEXIT    1
 "Exit",                                "EXIT",         SIGEXIT,
 #endif
 #ifdef SIGFPE
+#define HAD_SIGFPE     1
 "Floating exception",          "FPE",          SIGFPE,
 #endif
 #ifdef SIGFREEZE
+#define HAD_SIGFREEZE  1
 "CPR freeze",                  "FREEZE",       SIGFREEZE,
 #endif
 #ifdef SIGHUP
+#define HAD_SIGHUP     1
 "Hangup",                      "HUP",          SIGHUP,
 #endif
 #ifdef SIGILL
+#define HAD_SIGILL     1
 "Illegal instruction",         "ILL",          SIGILL,
 #endif
 #ifdef SIGINT
+#define HAD_SIGINT     1
 "Interrupt",                   "INT",          SIGINT,
 #endif
 #ifdef SIGIO
+#define HAD_SIGIO      1
 "IO possible",                 "IO",           SIGIO,
 #endif
 #ifdef SIGIOT
+#define HAD_SIGIOT     1
 "IOT trap",                    "IOT",          SIGIOT,
 #endif
 #ifdef SIGKILL
+#define HAD_SIGKILL    1
 "Killed",                      "KILL",         SIGKILL,
 #endif
 #ifdef SIGLAB
+#define HAD_SIGLAB     1
 "Security label changed",      "LAB",          SIGLAB,
 #endif
 #ifdef SIGLOST
+#define HAD_SIGLOST    1
 "Resources lost",              "LOST",         SIGLOST,
 #endif
 #ifdef SIGLWP
+#define HAD_SIGLWP     1
 "Thread event",                        "LWP",          SIGLWP,
 #endif
 #ifdef SIGMIGRATE
+#define HAD_SIGMIGRATE 1
 "Migrate process",             "MIGRATE",      SIGMIGRATE,
 #endif
 #ifdef SIGPHONE
+#define HAD_SIGPHONE   1
 "Phone status change",         "PHONE",        SIGPHONE,
 #endif
 #ifdef SIGPIPE
+#define HAD_SIGPIPE    1
 "Broken pipe",                 "PIPE",         SIGPIPE,
 #endif
 #ifdef SIGPOLL
+#define HAD_SIGPOLL    1
 "Poll event",                  "POLL",         SIGPOLL,
 #endif
 #ifdef SIGPROF
+#define HAD_SIGPROF    1
 "Profile timer alarm",         "PROF",         SIGPROF,
 #endif
 #ifdef SIGPWR
+#define HAD_SIGPWR     1
 "Power fail",                  "PWR",          SIGPWR,
 #endif
 #ifdef SIGQUIT
+#define HAD_SIGQUIT    1
 "Quit",                                "QUIT",         SIGQUIT,
 #endif
 #ifdef SIGSEGV
+#define HAD_SIGSEGV    1
 "Memory fault",                        "SEGV",         SIGSEGV,
 #endif
 #ifdef SIGSOUND
+#define HAD_SIGSOUND   1
 "Sound completed",             "SOUND",        SIGSOUND,
 #endif
 #ifdef SIGSSTOP
+#define HAD_SIGSSTOP   1
 "Sendable stop",               "SSTOP",        SIGSSTOP,
 #endif
 #ifdef gould
+#define HAD_gould      1
 "Stack overflow",              "STKOV",        28,
 #endif
 #ifdef SIGSTOP
+#define HAD_SIGSTOP    1
 "Stopped (signal)",            "STOP",         SIGSTOP,
 #endif
 #ifdef SIGSYS
+#define HAD_SIGSYS     1
 "Bad system call",             "SYS",          SIGSYS,
 #endif
 #ifdef SIGTERM
+#define HAD_SIGTERM    1
 "Terminated",                  "TERM",         SIGTERM,
 #endif
 #ifdef SIGTHAW
+#define HAD_SIGTHAW    1
 "CPR thaw",                    "THAW",         SIGTHAW,
 #endif
 #ifdef SIGTINT
+#define HAD_SIGTINT    1
 "Interrupt (terminal)",                "TINT",         SIGTINT,
 #endif
 #ifdef SIGTRAP
+#define HAD_SIGTRAP    1
 "Trace trap",                  "TRAP",         SIGTRAP,
 #endif
 #ifdef SIGTSTP
+#define HAD_SIGTSTP    1
 "Stopped",                     "TSTP",         SIGTSTP,
 #endif
 #ifdef SIGTTIN
+#define HAD_SIGTTIN    1
 "Stopped (tty input)",         "TTIN",         SIGTTIN,
 #endif
 #ifdef SIGTTOU
+#define HAD_SIGTTOU    1
 "Stopped (tty output)",                "TTOU",         SIGTTOU,
 #endif
 #ifdef SIGURG
+#define HAD_SIGURG     1
 "Urgent IO",                   "URG",          SIGURG,
 #endif
 #ifdef SIGUSR1
+#define HAD_SIGUSR1    1
 "User signal 1",               "USR1",         SIGUSR1,
 #endif
 #ifdef SIGUSR2
+#define HAD_SIGUSR2    1
 "User signal 2",               "USR2",         SIGUSR2,
 #endif
 #ifdef SIGVTALRM
+#define HAD_SIGVTALRM  1
 "Virtual timer alarm",         "VTALRM",       SIGVTALRM,
 #endif
 #ifdef SIGWAITING
+#define HAD_SIGWAITING 1
 "All threads blocked",         "WAITING",      SIGWAITING,
 #endif
 #ifdef SIGWINCH
+#define HAD_SIGWINCH   1
 "Window change",               "WINCH",        SIGWINCH,
 #endif
 #ifdef SIGWIND
+#define HAD_SIGWIND    1
 "Window change",               "WIND",         SIGWIND,
 #endif
 #ifdef SIGWINDOW
+#define HAD_SIGWINDOW  1
 "Window change",               "WINDOW",       SIGWINDOW,
 #endif
 #ifdef SIGXCPU
+#define HAD_SIGXCPU    1
 "CPU time limit",              "XCPU",         SIGXCPU,
 #endif
 #ifdef SIGXFSZ
+#define HAD_SIGXFSZ    1
 "File size limit",             "XFSZ",         SIGXFSZ,
 #endif
+#include "FEATURE/siglist"
 0
 };
 
@@ -214,7 +276,11 @@
 
 #define RANGE_SIG      (~(RANGE_MIN|RANGE_MAX|RANGE_RT))
 
-static int             index[64];
+static int             mapindex[1024];
+
+#if _lib_strsignal
+extern char*           strsignal(int);
+#endif
 
 int
 main()
@@ -223,13 +289,17 @@
        register int    j;
        register int    k;
        int             n;
+#if _lib_strsignal
+       char*           s;
+#endif
 
        k = 0;
        for (i = 0; map[i].name; i++)
-               if ((j = map[i].value) > 0 && j < elementsof(index) && 
!index[j])
+               if ((j = map[i].value) > 0 && j < elementsof(mapindex) && 
!mapindex[j])
                {
-                       if (j > k) k = j;
-                       index[j] = i;
+                       if (j > k)
+                               k = j;
+                       mapindex[j] = i;
                }
 #ifdef SIGRTMIN
        i = SIGRTMIN;
@@ -238,15 +308,17 @@
 #else
        j = i;
 #endif
-       if (j >= elementsof(index)) j = elementsof(index) - 1;
-       if (i <= j && i > 0 && i < elementsof(index) && j > 0 && j < 
elementsof(index))
+       if (j >= elementsof(mapindex))
+               j = elementsof(mapindex) - 1;
+       if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < 
elementsof(mapindex))
        {
-               if (j > k) k = j;
-               index[i] = RANGE_MIN | RANGE_RT;
+               if (j > k)
+                       k = j;
+               mapindex[i] = RANGE_MIN | RANGE_RT;
                n = 1;
                while (++i < j)
-                       index[i] = RANGE_RT | n++;
-               index[j] = RANGE_MAX | RANGE_RT | n;
+                       mapindex[i] = RANGE_RT | n++;
+               mapindex[j] = RANGE_MAX | RANGE_RT | n;
        }
 #endif
        printf("#pragma prototyped\n");
@@ -255,23 +327,37 @@
        printf("static const char* const        sig_name[] =\n");
        printf("{\n");
        for (i = 0; i <= k; i++)
-               if (!(j = index[i])) printf("   \"%d\",\n", i);
+               if (!(j = mapindex[i]))
+                       printf("        \"%d\",\n", i);
                else if (j & RANGE_RT)
                {
-                       if (j & RANGE_MIN) printf("     \"RTMIN\",\n");
-                       else if (j & RANGE_MAX) printf("        \"RTMAX\",\n");
-                       else printf("   \"RT%d\",\n", j & RANGE_SIG);
+                       if (j & RANGE_MIN)
+                               printf("        \"RTMIN\",\n");
+                       else if (j & RANGE_MAX)
+                               printf("        \"RTMAX\",\n");
+                       else
+                               printf("        \"RT%d\",\n", j & RANGE_SIG);
                }
-               else printf("   \"%s\",\n", map[j].name);
+               else
+                       printf("        \"%s\",\n", map[j].name);
        printf("        0\n");
        printf("};\n");
        printf("\n");
        printf("static const char* const        sig_text[] =\n");
        printf("{\n");
        for (i = 0; i <= k; i++)
-               if (!(j = index[i])) printf("   \"Signal %d\",\n", i);
-               else if (j & RANGE_RT) printf(" \"Realtime priority %d%s\",\n", 
j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
-               else printf("   \"%s\",\n", map[j].text);
+               if (!(j = mapindex[i]))
+                       printf("        \"Signal %d\",\n", i);
+               else if (j & RANGE_RT)
+                       printf("        \"Realtime priority %d%s\",\n", j & 
RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
+               else if (map[j].text)
+                       printf("        \"%s\",\n", map[j].text);
+#if _lib_strsignal
+               else if (s = strsignal(i))
+                       printf("        \"%s\",\n", s);
+#endif
+               else
+                       printf("        \"Signal %d\",\n", i);
        printf("        0\n");
        printf("};\n");
        return 0;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/cmdarg.h 
ksh93_2007_05_15/src/lib/libast/include/cmdarg.h
--- ksh93_2007_04_18/src/lib/libast/include/cmdarg.h    1970-01-01 
01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/include/cmdarg.h    2007-04-24 
21:53:36.000000000 +0200
@@ -0,0 +1,84 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
+*                      and is licensed under the                       *
+*                  Common Public License, Version 1.0                  *
+*                      by AT&T Knowledge Ventures                      *
+*                                                                      *
+*                A copy of the License is available at                 *
+*            http://www.opensource.org/licenses/cpl1.0.txt             *
+*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
+*                                                                      *
+*              Information and Software Systems Research               *
+*                            AT&T Research                             *
+*                           Florham Park NJ                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                   Phong Vo <kpv at research.att.com>                    *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * xargs/tw command arg list interface definitions
+ */
+
+#ifndef _CMDARG_H
+#define _CMDARG_H
+
+#define CMD_CHECKED    (1<<9)          /* cmdopen() argv[0] ok         */
+#define CMD_EMPTY      (1<<0)          /* run once, even if no args    */
+#define CMD_EXACT      (1<<1)          /* last command must have argmax*/
+#define CMD_IGNORE     (1<<2)          /* ignore EXIT_QUIT exit        */
+#define CMD_INSERT     (1<<3)          /* argpat for insertion         */
+#define CMD_MINIMUM    (1<<4)          /* argmax is a minimum          */
+#define CMD_NEWLINE    (1<<5)          /* echo separator is newline    */
+#define CMD_POST       (1<<6)          /* argpat is post arg position  */
+#define CMD_QUERY      (1<<7)          /* trace and query each command */
+#define CMD_SILENT     (1<<10)         /* no error messages            */
+#define CMD_TRACE      (1<<8)          /* trace each command           */
+
+#define CMD_USER       (1<<12)
+
+typedef struct                         /* cmd + args info              */
+{
+       struct
+       {
+       size_t          args;           /* total args                   */
+       size_t          commands;       /* total commands               */
+       }               total;
+
+       int             argcount;       /* current arg count            */
+       int             argmax;         /* max # args                   */
+       int             echo;           /* just an echo                 */
+       int             flags;          /* CMD_* flags                  */
+       int             insertlen;      /* strlen(insert)               */
+       int             offset;         /* post arg offset              */
+
+       char**          argv;           /* exec argv                    */
+       char**          firstarg;       /* first argv file arg          */
+       char**          insertarg;      /* argv before insert           */
+       char**          postarg;        /* start of post arg list       */
+       char**          nextarg;        /* next argv file arg           */
+       char*           nextstr;        /* next string ends before here */
+       char*           laststr;        /* last string ends before here */
+       char*           insert;         /* replace with current arg     */
+       char            buf[1];         /* argv and arg buffer          */
+} Cmdarg_t;
+
+#if _BLD_ast && defined(__EXPORT__)
+#define extern         __EXPORT__
+#endif
+
+extern Cmdarg_t*       cmdopen(char**, int, int, const char*, int);
+extern int             cmdflush(Cmdarg_t*);
+extern int             cmdarg(Cmdarg_t*, const char*, int);
+extern int             cmdclose(Cmdarg_t*);
+
+#undef extern
+
+#endif
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/fts.h 
ksh93_2007_05_15/src/lib/libast/include/fts.h
--- ksh93_2007_04_18/src/lib/libast/include/fts.h       1999-10-11 
09:31:30.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/include/fts.h       2007-04-24 
18:50:44.000000000 +0200
@@ -118,6 +118,10 @@
 
 #ifdef _FTSENT_PRIVATE_
        _FTSENT_PRIVATE_
+#else
+       short           _fts_pad_1;     /* <ftwalk.h> compatibility     */
+       struct stat     _fts_pad_2;     /* <ftwalk.h> compatibility     */
+       FTS*            fts;            /* fts_open() handle            */
 #endif
 
 };
@@ -125,6 +129,7 @@
 struct Fts
 {
        int             fts_errno;      /* last errno                   */
+       void*           fts_handle;     /* user defined handle          */
 
 #ifdef _FTS_PRIVATE_
        _FTS_PRIVATE_
@@ -139,6 +144,7 @@
 extern FTSENT* fts_children(FTS*, int);
 extern int     fts_close(FTS*);
 extern int     fts_flags(void);
+extern int     fts_local(FTSENT*);
 extern int     fts_notify(int(*)(FTS*, FTSENT*, void*), void*);
 extern FTS*    fts_open(char* const*, int, int(*)(FTSENT* const*, FTSENT* 
const*));
 extern FTSENT* fts_read(FTS*);
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/option.h 
ksh93_2007_05_15/src/lib/libast/include/option.h
--- ksh93_2007_04_18/src/lib/libast/include/option.h    2007-03-22 
23:14:38.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/include/option.h    2007-04-25 
19:24:44.000000000 +0200
@@ -99,6 +99,7 @@
 extern char*           optusage(const char*);
 extern int             optstr(const char*, const char*);
 extern int             optesc(Sfio_t*, const char*, int);
+extern Opt_t*          optctx(Opt_t*, Opt_t*);
 
 #undef extern
 
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/proc.h 
ksh93_2007_05_15/src/lib/libast/include/proc.h
--- ksh93_2007_04_18/src/lib/libast/include/proc.h      1998-04-13 
21:03:07.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/include/proc.h      2007-04-24 
21:34:24.000000000 +0200
@@ -32,12 +32,14 @@
 
 #define PROC_ARGMOD    (1<<0)  /* argv[-1],argv[0] can be modified     */
 #define PROC_BACKGROUND        (1<<1)  /* shell background (&) setup           
*/
+#define PROC_CHECK     (1<<17) /* check that command exists            */
 #define PROC_CLEANUP   (1<<2)  /* close parent redirect fds on error   */
 #define PROC_DAEMON    (1<<3)  /* daemon setup                         */
 #define PROC_ENVCLEAR  (1<<4)  /* clear environment                    */
 #define PROC_FOREGROUND        (1<<14) /* system(3) setup                      
*/
 #define PROC_GID       (1<<5)  /* setgid(getgid())                     */
 #define PROC_IGNORE    (1<<6)  /* ignore parent pipe errors            */
+#define PROC_IGNOREPATH        (1<<16) /* procrun() intercept to ignore path   
*/
 #define PROC_OVERLAY   (1<<7)  /* overlay current process if possible  */
 #define PROC_PARANOID  (1<<8)  /* restrict everything                  */
 #define PROC_PRIVELEGED        (1<<9)  /* setuid(0), setgid(getegid())         
*/
@@ -94,8 +96,8 @@
 
 extern int     procclose(Proc_t*);
 extern int     procfree(Proc_t*);
-extern Proc_t* procopen(const char*, char**, char**, long*, long);
-extern int     procrun(const char*, char**);
+extern Proc_t* procopen(const char*, char**, char**, long*, int);
+extern int     procrun(const char*, char**, int);
 
 #undef extern
 
diff -r -N -u ksh93_2007_04_18/src/lib/libast/Makefile 
ksh93_2007_05_15/src/lib/libast/Makefile
--- ksh93_2007_04_18/src/lib/libast/Makefile    2007-03-22 18:27:48.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libast/Makefile    2007-04-25 19:54:20.000000000 
+0200
@@ -28,11 +28,11 @@
 __OBSOLETE__ == $("6 months ago":@F=%(%Y0101)T)
 
 HEADERSRC = ast.h ast_dir.h ast_getopt.h ast_std.h \
-       ast_version.h ast_windows.h \
-       ccode.h cdt.h debug.h dt.h error.h find.h ftw.h ftwalk.h fts.h \
-       fs3d.h getopt.h glob.h hash.h hashkey.h hashpart.h lc.h ls.h \
-       magic.h mc.h mime.h mnt.h modecanon.h modex.h namval.h option.h \
-       proc.h re_comp.h recfmt.h regex.h regexp.h \
+       ast_namval.h ast_version.h ast_windows.h \
+       ccode.h cdt.h cmdarg.h debug.h dt.h error.h find.h ftw.h ftwalk.h \
+       fts.h fs3d.h getopt.h glob.h hash.h hashkey.h hashpart.h lc.h \
+       ls.h magic.h mc.h mime.h mnt.h modecanon.h modex.h namval.h \
+       option.h proc.h re_comp.h recfmt.h regex.h regexp.h \
        sfio.h sfio_s.h sfio_t.h sfdisc.h \
        stack.h stak.h stk.h swap.h tar.h times.h tm.h tok.h \
        usage.h vdb.h vecargs.h vmalloc.h wait.h wordexp.h \
@@ -79,11 +79,11 @@
        pathnative.c pathposix.c pathtemp.c pathtmp.c pathstat.c \
        pathgetlink.c pathsetlink.c pathbin.c pathshell.c pathcd.c \
        fs3d.c ftwalk.c ftwflags.c fts.c setenviron.c \
-       optget.c optjoin.c optesc.c strsort.c struniq.c \
+       optget.c optjoin.c optesc.c optctx.c strsort.c struniq.c \
        magic.c mime.c mimetype.c signal.c systrace.c \
        error.c errorf.c errormsg.c errorx.c \
        localeconv.c setlocale.c translate.c \
-       catopen.c iconv.c lc.c mc.c \
+       catopen.c iconv.c lc.c lctab.c mc.c \
        base64.c recfmt.c recstr.c reclen.c fmtrec.c \
        fmtbase.c fmtbuf.c fmtclock.c fmtdev.c fmtelapsed.c fmterror.c \
        fmtesc.c fmtfmt.c fmtfs.c fmtident.c fmtip4.c fmtls.c fmtmatch.c \
@@ -99,7 +99,7 @@
        tmxdate.c tmxfmt.c tmxgettime.c tmxleap.c tmxmake.c \
        tmxscan.c tmxsettime.c tmxsleep.c tmxtime.c tmxtouch.c \
        tvcmp.c tvgettime.c tvsettime.c tvsleep.c tvtouch.c \
-       vecargs.c vecfile.c vecfree.c vecload.c vecstring.c \
+       cmdarg.c vecargs.c vecfile.c vecfree.c vecload.c vecstring.c \
        univlib.h univdata.c touch.c mnt.c \
        memccpy.c memchr.c memcmp.c memcpy.c memdup.c memmove.c memset.c \
        mkdir.c mkfifo.c mknod.c rmdir.c remove.c rename.c link.c unlink.c \
@@ -226,7 +226,7 @@
  * NOTE: sun4 runtime link botches ro data so advertized sig_info is rw
  */
 
-:READONLY: conftab.c modedata.c /*sftable.c*/ \
+:READONLY: conftab.c lctab.c modedata.c /*sftable.c*/ \
        /*sigdata.c*/ tmdata.c univdata.c
 
 :: atmain.C \
@@ -246,10 +246,12 @@
 
 $(HEADERGEN) :COPY: FEATURE/$$(<:B:/$(ID)_//)
 
+ast_namval.h :COPY: namval.h
+
 lcgen : lcgen.c
        $(CC.NATIVE|CC) -o $(<) $(*)
 
-lc.h lctab.h :JOINT: lcgen lc.tab
+lc.h lctab.c :JOINT: lcgen lc.tab
        $(*:O=1:C,^[^/],./&,) $(tmp).1 $(tmp).2 < $(*:O=2) # :P=E: in 2006
        $(PROTO) -p $(PROTOFLAGS) $(tmp).1 $(PROTOINSTALL) > $(tmp).3
        $(RM) -f $(tmp).1
diff -r -N -u ksh93_2007_04_18/src/lib/libast/Mamfile 
ksh93_2007_05_15/src/lib/libast/Mamfile
--- ksh93_2007_04_18/src/lib/libast/Mamfile     2007-04-18 20:07:32.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libast/Mamfile     2007-05-16 05:16:04.000000000 
+0200
@@ -924,16 +924,16 @@
 exec - then    rm ${COTEMP}.3
 exec - else    mv ${COTEMP}.3 lc.h
 exec - fi
-exec - if      cmp 2>/dev/null -s ${COTEMP}.2 lctab.h
+exec - if      cmp 2>/dev/null -s ${COTEMP}.2 lctab.c
 exec - then    rm ${COTEMP}.2
-exec - else    mv ${COTEMP}.2 lctab.h
+exec - else    mv ${COTEMP}.2 lctab.c
 exec - fi
 prev include/ast.h implicit
 make ${INSTALLROOT}/include/prototyped.h implicit
 done ${INSTALLROOT}/include/prototyped.h dontcare
 done lc.h dontcare generated
-make lctab.h
-done lctab.h generated
+make lctab.c
+done lctab.c generated
 done joint.lc.h virtual
 prev include/error.h implicit
 prev include/ast.h implicit
@@ -1124,6 +1124,7 @@
 make fts.o
 make misc/fts.c
 prev include/fts.h implicit
+prev include/ls.h implicit
 prev include/fs3d.h implicit
 prev include/error.h implicit
 prev include/ast_dir.h implicit
@@ -1175,6 +1176,14 @@
 prev misc/optesc.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd 
-D_PACKAGE_ast -c misc/optesc.c
 done optesc.o generated
+make optctx.o
+make misc/optctx.c
+prev misc/optlib.h implicit
+done misc/optctx.c
+meta optctx.o %.c>%.o misc/optctx.c optctx
+prev misc/optctx.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd 
-D_PACKAGE_ast -c misc/optctx.c
+done optctx.o generated
 make strsort.o
 make string/strsort.c
 prev include/ast.h implicit
@@ -1271,7 +1280,6 @@
 done systrace.o generated
 make error.o
 make misc/error.c
-prev include/error.h implicit
 prev include/regex.h implicit
 prev include/times.h implicit
 prev include/stk.h implicit
@@ -1283,7 +1291,7 @@
 done misc/error.c
 meta error.o %.c>%.o misc/error.c error
 prev misc/error.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd 
-I${INSTALLROOT}/include -D_PACKAGE_ast -DERROR_CATALOG=\""libast"\" -c 
misc/error.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd 
-I${INSTALLROOT}/include -DERROR_CATALOG=\""libast"\" -D_PACKAGE_ast -c 
misc/error.c
 done error.o generated
 make errorf.o
 make misc/errorf.c
@@ -1393,15 +1401,24 @@
 done iconv.o generated
 make lc.o
 make port/lc.c
-make lctab.h implicit
-done lctab.h
+make port/lclang.h implicit
 prev include/ast_windows.h implicit
+done port/lclang.h
 prev port/lclib.h implicit
 done port/lc.c
 meta lc.o %.c>%.o port/lc.c lc
 prev port/lc.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd 
-I${INSTALLROOT}/include -D_PACKAGE_ast -c port/lc.c
 done lc.o generated
+make lctab.o
+make lctab.c
+prev port/lclang.h implicit
+prev port/lclib.h implicit
+done lctab.c
+meta lctab.o %.c>%.o lctab.c lctab
+prev lctab.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd 
-I${INSTALLROOT}/include -D_PACKAGE_ast  -c lctab.c
+done lctab.o generated
 make mc.o
 make port/mc.c
 prev std/nl_types.h implicit
@@ -1862,9 +1879,17 @@
 make FEATURE/signal implicit
 meta FEATURE/signal features/%.c>FEATURE/% features/signal.c signal
 make features/signal.c
+make FEATURE/siglist implicit
+meta FEATURE/siglist features/%>FEATURE/% features/siglist siglist
+make features/siglist
+done features/siglist
+prev ast.req
+exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} 
'   run features/siglist
+done FEATURE/siglist generated
+prev FEATURE/standards implicit
 done features/signal.c
 prev ast.req
-exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} 
'   run features/signal.c
+exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I.  
${LDFLAGS} '   run features/signal.c
 done FEATURE/signal generated
 prev sig.h implicit
 prev include/ast.h implicit
@@ -1932,7 +1957,7 @@
 done misc/procrun.c
 meta procrun.o %.c>%.o misc/procrun.c procrun
 prev misc/procrun.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd 
-D_PACKAGE_ast -c misc/procrun.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd 
-D__OBSOLETE__=20060101 -D_PACKAGE_ast -c misc/procrun.c
 done procrun.o generated
 make procfree.o
 make misc/procfree.c
@@ -2263,6 +2288,18 @@
 prev tm/tvtouch.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd 
-D_PACKAGE_ast -c tm/tvtouch.c
 done tvtouch.o generated
+make cmdarg.o
+make misc/cmdarg.c
+make include/cmdarg.h implicit
+done include/cmdarg.h
+prev include/proc.h implicit
+prev include/error.h implicit
+prev include/ast.h implicit
+done misc/cmdarg.c
+meta cmdarg.o %.c>%.o misc/cmdarg.c cmdarg
+prev misc/cmdarg.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd 
-D_PACKAGE_ast -c misc/cmdarg.c
+done cmdarg.o generated
 make vecargs.o
 make vec/vecargs.c
 make include/vecargs.h implicit
@@ -3263,7 +3300,10 @@
 make comp/closelog.c
 make comp/sysloglib.h implicit
 make comp/syslog.h implicit
-prev include/namval.h implicit
+make ast_namval.h implicit
+prev include/namval.h
+exec - cmp 2>/dev/null -s include/namval.h ast_namval.h || { rm -f 
ast_namval.h; silent test -d . || mkdir .; ${STDCP} include/namval.h 
ast_namval.h; }
+done ast_namval.h dontcare generated
 done comp/syslog.h dontcare
 done comp/sysloglib.h dontcare
 prev include/ast.h implicit
@@ -5755,12 +5795,12 @@
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd 
-D_PACKAGE_ast -c obsolete/spawn.c
 done spawn.o generated
 exec - ${AR} cr libast.a state.o transition.o opendir.o readdir.o rewinddir.o 
seekdir.o telldir.o getcwd.o fastfind.o hashalloc.o hashdump.o hashfree.o 
hashlast.o hashlook.o hashscan.o hashsize.o hashview.o hashwalk.o memhash.o 
memsum.o strhash.o strkey.o strsum.o stracmp.o strnacmp.o ccmap.o ccmapid.o 
ccnative.o chresc.o chrtoi.o
-exec - ${AR} cr libast.a streval.o strexpr.o strmatch.o strcopy.o modei.o 
modex.o strmode.o strlcat.o strlcpy.o strlook.o strncopy.o strsearch.o 
strpsearch.o stresc.o stropt.o strtape.o tok.o tokline.o tokscan.o pathaccess.o 
pathcat.o pathcanon.o pathcheck.o pathpath.o pathexists.o pathfind.o pathkey.o 
pathprobe.o pathrepl.o pathnative.o pathposix.o pathtemp.o pathtmp.o pathstat.o 
pathgetlink.o pathsetlink.o pathbin.o pathshell.o pathcd.o fs3d.o ftwalk.o 
ftwflags.o fts.o setenviron.o optget.o optjoin.o optesc.o strsort.o struniq.o 
magic.o mime.o mimetype.o signal.o systrace.o error.o errorf.o errormsg.o 
errorx.o localeconv.o setlocale.o translate.o catopen.o iconv.o lc.o mc.o 
base64.o recfmt.o recstr.o reclen.o fmtrec.o fmtbase.o fmtbuf.o fmtclock.o 
fmtdev.o fmtelapsed.o fmterror.o fmtesc.o fmtfmt.o fmtfs.o fmtident.o fmtip4.o 
fmtls.o fmtmatch.o fmtmode.o fmtnum.o fmtperm.o fmtre.o fmttime.o fmtuid.o 
fmtgid.o fmtsignal.o fmtscale.o fmttmx.o fmttv.o fmtversion.o strelapsed.o 
strperm.o struid.o strgid.o strtoip4.o stack.o
-exec - ${AR} cr libast.a stk.o swapget.o swapmem.o swapop.o swapput.o 
sigdata.o sigcrit.o sigunblock.o procopen.o procclose.o procrun.o procfree.o 
tmdate.o tmequiv.o tmfix.o tmfmt.o tmform.o tmgoff.o tminit.o tmleap.o tmlex.o 
tmlocale.o tmmake.o tmpoff.o tmscan.o tmsleep.o tmtime.o tmtype.o tmweek.o 
tmword.o tmzone.o tmxdate.o tmxfmt.o tmxgettime.o tmxleap.o tmxmake.o tmxscan.o 
tmxsettime.o tmxsleep.o tmxtime.o tmxtouch.o tvcmp.o tvgettime.o tvsettime.o 
tvsleep.o tvtouch.o vecargs.o vecfile.o vecfree.o vecload.o vecstring.o 
univdata.o touch.o mnt.o memccpy.o memchr.o memcmp.o memcpy.o memdup.o 
memmove.o memset.o mkdir.o mkfifo.o mknod.o rmdir.o remove.o rename.o link.o 
unlink.o strdup.o strchr.o strrchr.o strstr.o strtod.o strtold.o strtol.o 
strtoll.o strtoul.o strtoull.o strton.o strtonll.o strntod.o strntold.o 
strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o strncasecmp.o 
strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o execvpe.o 
spawnveg.o vfork.o killpg.o hsearch.o
-exec - ${AR} cr libast.a tsearch.o getlogin.o putenv.o setenv.o unsetenv.o 
lstat.o statvfs.o eaccess.o gross.o omitted.o readlink.o symlink.o getpgrp.o 
setpgid.o setsid.o waitpid.o creat64.o fcntl.o open.o atexit.o getdents.o 
getwd.o dup2.o errno.o getpreroot.o ispreroot.o realopen.o setpreroot.o 
getgroups.o mount.o system.o iblocks.o modedata.o tmdata.o memfatal.o 
sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o sfdcseekable.o sfdcslow.o 
sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o sfdcprefix.o wc.o basename.o 
closelog.o dirname.o fmtmsglib.o fnmatch.o ftw.o getdate.o getsubopt.o glob.o 
nftw.o openlog.o re_comp.o resolvepath.o realpath.o regcmp.o regexp.o 
setlogmask.o strftime.o strptime.o swab.o syslog.o tempnam.o wordexp.o mktime.o 
regalloc.o regclass.o regcoll.o regcomp.o regcache.o regdecomp.o regerror.o 
regexec.o regfatal.o reginit.o regnexec.o regsubcomp.o regsubexec.o regsub.o 
regrecord.o regrexec.o regstat.o dtclose.o dtdisc.o dtextract.o dtflatten.o 
dthash.o dtlist.o dtmethod.o dtnew.o dtopen.o dtrenew.o dtrestore.o dtsize.o 
dtstat.o
-exec - ${AR} cr libast.a dtstrhash.o dttree.o dttreeset.o dtview.o dtwalk.o 
sfclose.o sfclrlock.o sfdisc.o sfdlen.o sfexcept.o sfgetl.o sfgetu.o sfcvt.o 
sfecvt.o sffcvt.o sfextern.o sffilbuf.o sfflsbuf.o sfprints.o sfgetd.o sfgetr.o 
sfllen.o sfmode.o sfmove.o sfnew.o sfpkrd.o sfnotify.o sfnputc.o sfopen.o 
sfpeek.o sfpoll.o sfpool.o sfpopen.o sfprintf.o sfputd.o sfputl.o sfputr.o 
sfputu.o sfrd.o sfread.o sfreserve.o sfscanf.o sfseek.o sfset.o sfsetbuf.o 
sfsetfd.o sfsize.o sfsk.o sfstack.o sfstrtod.o sfsync.o sfswap.o sftable.o 
sftell.o sftmp.o sfungetc.o sfvprintf.o sfvscanf.o sfwr.o sfwrite.o sfpurge.o 
sfraise.o sfgetm.o sfmutex.o sfputm.o sfresize.o _sfclrerr.o _sfeof.o 
_sferror.o _sffileno.o _sfopen.o _sfstacked.o _sfvalue.o _sfgetc.o _sfgetl.o 
_sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o _sfllen.o _sfslen.o _sfulen.o 
_sfputc.o _sfputd.o _sfputl.o _sfputm.o _sfputu.o clearerr.o fclose.o fdopen.o 
feof.o ferror.o fflush.o fgetc.o fgetpos.o fgets.o fileno.o fopen.o fprintf.o 
fpurge.o fputc.o
-exec - ${AR} cr libast.a fputs.o fread.o freopen.o fscanf.o fseek.o fseeko.o 
fsetpos.o ftell.o ftello.o fwrite.o getc.o getchar.o getw.o pclose.o popen.o 
printf.o putc.o putchar.o puts.o putw.o rewind.o scanf.o setbuf.o setbuffer.o 
setlinebuf.o setvbuf.o snprintf.o sprintf.o sscanf.o asprintf.o vasprintf.o 
tmpfile.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o 
vsprintf.o vsscanf.o _doprnt.o _doscan.o _filbuf.o _flsbuf.o _stdfun.o 
_stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o _stdvbuf.o _stdvsnprnt.o 
_stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o putwchar.o vfwscanf.o wprintf.o 
fgetws.o fwscanf.o swprintf.o vswprintf.o wscanf.o fputwc.o getwc.o swscanf.o 
vswscanf.o fputws.o getwchar.o ungetwc.o vwprintf.o fwide.o putwc.o vfwprintf.o 
vwscanf.o stdio_c99.o stdio_gnu.o frexp.o frexpl.o astcopy.o astconf.o 
astdynamic.o astlicense.o astquery.o astwinsize.o conftab.o aststatic.o 
getopt.o getoptl.o vmbest.o vmclear.o vmclose.o vmdcheap.o vmdebug.o vmdisc.o 
vmexit.o vmlast.o vmopen.o vmpool.o vmprivate.o vmprofile.o
-exec - ${AR} cr libast.a vmregion.o vmsegment.o vmset.o vmstat.o vmstrdup.o 
vmtrace.o vmwalk.o vmmopen.o malloc.o vmgetmem.o a64l.o acosh.o asinh.o atanh.o 
cbrt.o crypt.o erf.o err.o exp.o exp__E.o expm1.o gamma.o getpass.o lgamma.o 
log.o log1p.o log__L.o rand48.o random.o rcmd.o rint.o support.o sfstrtmp.o 
spawn.o
+exec - ${AR} cr libast.a streval.o strexpr.o strmatch.o strcopy.o modei.o 
modex.o strmode.o strlcat.o strlcpy.o strlook.o strncopy.o strsearch.o 
strpsearch.o stresc.o stropt.o strtape.o tok.o tokline.o tokscan.o pathaccess.o 
pathcat.o pathcanon.o pathcheck.o pathpath.o pathexists.o pathfind.o pathkey.o 
pathprobe.o pathrepl.o pathnative.o pathposix.o pathtemp.o pathtmp.o pathstat.o 
pathgetlink.o pathsetlink.o pathbin.o pathshell.o pathcd.o fs3d.o ftwalk.o 
ftwflags.o fts.o setenviron.o optget.o optjoin.o optesc.o optctx.o strsort.o 
struniq.o magic.o mime.o mimetype.o signal.o systrace.o error.o errorf.o 
errormsg.o errorx.o localeconv.o setlocale.o translate.o catopen.o iconv.o lc.o 
lctab.o mc.o base64.o recfmt.o recstr.o reclen.o fmtrec.o fmtbase.o fmtbuf.o 
fmtclock.o fmtdev.o fmtelapsed.o fmterror.o fmtesc.o fmtfmt.o fmtfs.o 
fmtident.o fmtip4.o fmtls.o fmtmatch.o fmtmode.o fmtnum.o fmtperm.o fmtre.o 
fmttime.o fmtuid.o fmtgid.o fmtsignal.o fmtscale.o fmttmx.o fmttv.o 
fmtversion.o strelapsed.o strperm.o struid.o strgid.o
+exec - ${AR} cr libast.a strtoip4.o stack.o stk.o swapget.o swapmem.o swapop.o 
swapput.o sigdata.o sigcrit.o sigunblock.o procopen.o procclose.o procrun.o 
procfree.o tmdate.o tmequiv.o tmfix.o tmfmt.o tmform.o tmgoff.o tminit.o 
tmleap.o tmlex.o tmlocale.o tmmake.o tmpoff.o tmscan.o tmsleep.o tmtime.o 
tmtype.o tmweek.o tmword.o tmzone.o tmxdate.o tmxfmt.o tmxgettime.o tmxleap.o 
tmxmake.o tmxscan.o tmxsettime.o tmxsleep.o tmxtime.o tmxtouch.o tvcmp.o 
tvgettime.o tvsettime.o tvsleep.o tvtouch.o cmdarg.o vecargs.o vecfile.o 
vecfree.o vecload.o vecstring.o univdata.o touch.o mnt.o memccpy.o memchr.o 
memcmp.o memcpy.o memdup.o memmove.o memset.o mkdir.o mkfifo.o mknod.o rmdir.o 
remove.o rename.o link.o unlink.o strdup.o strchr.o strrchr.o strstr.o strtod.o 
strtold.o strtol.o strtoll.o strtoul.o strtoull.o strton.o strtonll.o strntod.o 
strntold.o strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o 
strncasecmp.o strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o 
execvpe.o spawnveg.o
+exec - ${AR} cr libast.a vfork.o killpg.o hsearch.o tsearch.o getlogin.o 
putenv.o setenv.o unsetenv.o lstat.o statvfs.o eaccess.o gross.o omitted.o 
readlink.o symlink.o getpgrp.o setpgid.o setsid.o waitpid.o creat64.o fcntl.o 
open.o atexit.o getdents.o getwd.o dup2.o errno.o getpreroot.o ispreroot.o 
realopen.o setpreroot.o getgroups.o mount.o system.o iblocks.o modedata.o 
tmdata.o memfatal.o sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o 
sfdcseekable.o sfdcslow.o sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o 
sfdcprefix.o wc.o basename.o closelog.o dirname.o fmtmsglib.o fnmatch.o ftw.o 
getdate.o getsubopt.o glob.o nftw.o openlog.o re_comp.o resolvepath.o 
realpath.o regcmp.o regexp.o setlogmask.o strftime.o strptime.o swab.o syslog.o 
tempnam.o wordexp.o mktime.o regalloc.o regclass.o regcoll.o regcomp.o 
regcache.o regdecomp.o regerror.o regexec.o regfatal.o reginit.o regnexec.o 
regsubcomp.o regsubexec.o regsub.o regrecord.o regrexec.o regstat.o dtclose.o 
dtdisc.o dtextract.o dtflatten.o dthash.o dtlist.o dtmethod.o dtnew.o dtopen.o 
dtrenew.o
+exec - ${AR} cr libast.a dtrestore.o dtsize.o dtstat.o dtstrhash.o dttree.o 
dttreeset.o dtview.o dtwalk.o sfclose.o sfclrlock.o sfdisc.o sfdlen.o 
sfexcept.o sfgetl.o sfgetu.o sfcvt.o sfecvt.o sffcvt.o sfextern.o sffilbuf.o 
sfflsbuf.o sfprints.o sfgetd.o sfgetr.o sfllen.o sfmode.o sfmove.o sfnew.o 
sfpkrd.o sfnotify.o sfnputc.o sfopen.o sfpeek.o sfpoll.o sfpool.o sfpopen.o 
sfprintf.o sfputd.o sfputl.o sfputr.o sfputu.o sfrd.o sfread.o sfreserve.o 
sfscanf.o sfseek.o sfset.o sfsetbuf.o sfsetfd.o sfsize.o sfsk.o sfstack.o 
sfstrtod.o sfsync.o sfswap.o sftable.o sftell.o sftmp.o sfungetc.o sfvprintf.o 
sfvscanf.o sfwr.o sfwrite.o sfpurge.o sfraise.o sfgetm.o sfmutex.o sfputm.o 
sfresize.o _sfclrerr.o _sfeof.o _sferror.o _sffileno.o _sfopen.o _sfstacked.o 
_sfvalue.o _sfgetc.o _sfgetl.o _sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o 
_sfllen.o _sfslen.o _sfulen.o _sfputc.o _sfputd.o _sfputl.o _sfputm.o _sfputu.o 
clearerr.o fclose.o fdopen.o feof.o ferror.o fflush.o fgetc.o fgetpos.o fgets.o 
fileno.o fopen.o
+exec - ${AR} cr libast.a fprintf.o fpurge.o fputc.o fputs.o fread.o freopen.o 
fscanf.o fseek.o fseeko.o fsetpos.o ftell.o ftello.o fwrite.o getc.o getchar.o 
getw.o pclose.o popen.o printf.o putc.o putchar.o puts.o putw.o rewind.o 
scanf.o setbuf.o setbuffer.o setlinebuf.o setvbuf.o snprintf.o sprintf.o 
sscanf.o asprintf.o vasprintf.o tmpfile.o ungetc.o vfprintf.o vfscanf.o 
vprintf.o vscanf.o vsnprintf.o vsprintf.o vsscanf.o _doprnt.o _doscan.o 
_filbuf.o _flsbuf.o _stdfun.o _stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o 
_stdvbuf.o _stdvsnprnt.o _stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o 
putwchar.o vfwscanf.o wprintf.o fgetws.o fwscanf.o swprintf.o vswprintf.o 
wscanf.o fputwc.o getwc.o swscanf.o vswscanf.o fputws.o getwchar.o ungetwc.o 
vwprintf.o fwide.o putwc.o vfwprintf.o vwscanf.o stdio_c99.o stdio_gnu.o 
frexp.o frexpl.o astcopy.o astconf.o astdynamic.o astlicense.o astquery.o 
astwinsize.o conftab.o aststatic.o getopt.o getoptl.o vmbest.o vmclear.o 
vmclose.o vmdcheap.o vmdebug.o vmdisc.o vmexit.o vmlast.o vmopen.o
+exec - ${AR} cr libast.a vmpool.o vmprivate.o vmprofile.o vmregion.o 
vmsegment.o vmset.o vmstat.o vmstrdup.o vmtrace.o vmwalk.o vmmopen.o malloc.o 
vmgetmem.o a64l.o acosh.o asinh.o atanh.o cbrt.o crypt.o erf.o err.o exp.o 
exp__E.o expm1.o gamma.o getpass.o lgamma.o log.o log1p.o log__L.o rand48.o 
random.o rcmd.o rint.o support.o sfstrtmp.o spawn.o
 exec - (ranlib libast.a) >/dev/null 2>&1 || true
 done libast.a generated
 done ast virtual
@@ -6118,6 +6158,14 @@
 exec - else    mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/ast_std.h
 exec - fi
 done ${INSTALLROOT}/include/ast/ast_std.h generated
+make ${INSTALLROOT}/include/ast/ast_namval.h
+prev ast_namval.h
+exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  ast_namval.h  > 1.${COTEMP}.x
+exec - if      cmp 2>/dev/null -s ${INSTALLROOT}/include/ast/ast_namval.h 
1.${COTEMP}.x
+exec - then    rm -f 1.${COTEMP}.x
+exec - else    mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/ast_namval.h
+exec - fi
+done ${INSTALLROOT}/include/ast/ast_namval.h generated
 make ${INSTALLROOT}/include/ast/ast_version.h
 prev include/ast_version.h
 exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  include/ast_version.h  > 1.${COTEMP}.x
@@ -6150,6 +6198,14 @@
 exec - else    mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/cdt.h
 exec - fi
 done ${INSTALLROOT}/include/ast/cdt.h generated
+make ${INSTALLROOT}/include/ast/cmdarg.h
+prev include/cmdarg.h
+exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  include/cmdarg.h  > 1.${COTEMP}.x
+exec - if      cmp 2>/dev/null -s ${INSTALLROOT}/include/ast/cmdarg.h 
1.${COTEMP}.x
+exec - then    rm -f 1.${COTEMP}.x
+exec - else    mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/cmdarg.h
+exec - fi
+done ${INSTALLROOT}/include/ast/cmdarg.h generated
 make ${INSTALLROOT}/include/ast/debug.h
 prev include/debug.h
 exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  include/debug.h  > 1.${COTEMP}.x
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/cmdarg.c 
ksh93_2007_05_15/src/lib/libast/misc/cmdarg.c
--- ksh93_2007_04_18/src/lib/libast/misc/cmdarg.c       1970-01-01 
01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/misc/cmdarg.c       2007-04-24 
22:04:47.000000000 +0200
@@ -0,0 +1,350 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
+*                      and is licensed under the                       *
+*                  Common Public License, Version 1.0                  *
+*                      by AT&T Knowledge Ventures                      *
+*                                                                      *
+*                A copy of the License is available at                 *
+*            http://www.opensource.org/licenses/cpl1.0.txt             *
+*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
+*                                                                      *
+*              Information and Software Systems Research               *
+*                            AT&T Research                             *
+*                           Florham Park NJ                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                   Phong Vo <kpv at research.att.com>                    *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * xargs/tw command arg list support
+ */
+
+#include <ast.h>
+#include <ctype.h>
+#include <error.h>
+#include <proc.h>
+
+#include "cmdarg.h"
+
+#ifndef EXIT_QUIT
+#define EXIT_QUIT      255
+#endif
+
+static const char*     echo[] = { "echo", 0 };
+
+/*
+ * open a cmdarg stream
+ * initialize the command for execution
+ * argv[-1] is reserved for procrun(PROC_ARGMOD)
+ */
+
+Cmdarg_t*
+cmdopen(char** argv, int argmax, int size, const char* argpat, int flags)
+{
+       register Cmdarg_t*      cmd;
+       register int            n;
+       register char**         p;
+       register char*          s;
+       char*                   sh;
+       int                     c;
+       int                     m;
+       int                     argc;
+       long                    x;
+
+       char**                  post = 0;
+
+       n = sizeof(char**);
+       if (*argv)
+       {
+               for (p = argv + 1; *p; p++)
+               {
+                       if ((flags & CMD_POST) && argpat && streq(*p, argpat))
+                       {
+                               *p = 0;
+                               post = p + 1;
+                               argpat = 0;
+                       }
+                       else
+                               n += strlen(*p) + 1;
+               }
+               argc = p - argv;
+       }
+       else
+               argc = 0;
+       for (p = environ; *p; p++)
+               n += sizeof(char**) + strlen(*p) + 1;
+       if ((x = strtol(astconf("ARG_MAX", NiL, NiL), NiL, 0)) <= 0)
+               x = ARG_MAX;
+       if (size <= 0 || size > x)
+               size = x;
+       sh = pathshell();
+       m = n + (argc + 4) * sizeof(char**) + strlen(sh) + 1;
+       m = roundof(m, sizeof(char**));
+       if (size < m)
+       {
+               error(2, "size must be at least %d", m);
+               return 0;
+       }
+       if ((m = x / 10) > 2048)
+               m = 2048;
+       if (size > (x - m))
+               size = x - m;
+       n = size - n;
+       m = ((flags & CMD_INSERT) && argpat) ? (strlen(argpat) + 1) : 0;
+       if (!(cmd = newof(0, Cmdarg_t, 1, n + m)))
+       {
+               error(ERROR_SYSTEM|2, "out of space");
+               return 0;
+       }
+       c = n / sizeof(char**);
+       if (argmax <= 0 || argmax > c)
+               argmax = c;
+       s = cmd->buf;
+       if (!argv[0])
+       {
+               argv = (char**)echo;
+               cmd->echo = 1;
+       }
+       else if (streq(argv[0], echo[0]))
+       {
+               cmd->echo = 1;
+               flags &= ~CMD_NEWLINE;
+       }
+       else if (!(flags & CMD_CHECKED))
+       {
+               if (!pathpath(s, argv[0], NiL, PATH_REGULAR|PATH_EXECUTE))
+               {
+                       if (!(flags & CMD_SILENT))
+                       {
+                               error(ERROR_SYSTEM|2, "%s: command not found", 
argv[0]);
+                               exit(EXIT_NOTFOUND);
+                       }
+                       free(cmd);
+                       return 0;
+               }
+               argv[0] = s;
+       }
+       s += strlen(s) + 1;
+       if (m)
+       {
+               cmd->insert = strcpy(s, argpat);
+               cmd->insertlen = m - 1;
+               s += m;
+       }
+       s += sizeof(char**) - (s - cmd->buf) % sizeof(char**);
+       p = (char**)s;
+       n -= strlen(*p++ = sh) + 1;
+       cmd->argv = p;
+       while (*p = *argv++)
+               p++;
+       if (m)
+       {
+               argmax = 1;
+               *p++ = 0;
+               cmd->insertarg = p;
+               argv = cmd->argv;
+               c = *cmd->insert;
+               while (s = *argv)
+               {
+                       while ((s = strchr(s, c)) && strncmp(cmd->insert, s, 
cmd->insertlen))
+                               s++;
+                       *p++ = s ? *argv : (char*)0;
+                       argv++;
+               }
+               *p++ = 0;
+       }
+       cmd->firstarg = cmd->nextarg = p;
+       cmd->laststr = cmd->nextstr = cmd->buf + n;
+       cmd->argmax = argmax;
+       cmd->flags = flags;
+       cmd->offset = ((cmd->postarg = post) ? (argc - (post - argv)) : 0) + 3;
+       return cmd;
+}
+
+/*
+ * flush outstanding command file args
+ */
+
+int
+cmdflush(register Cmdarg_t* cmd)
+{
+       register char*  s;
+       register char** p;
+       register int    n;
+
+       if (cmd->flags & CMD_EMPTY)
+               cmd->flags &= ~CMD_EMPTY;
+       else if (cmd->nextarg <= cmd->firstarg)
+               return 0;
+       if ((cmd->flags & CMD_MINIMUM) && cmd->argcount < cmd->argmax)
+       {
+               if (!(cmd->flags & CMD_SILENT))
+                       error(2, "%d arg command would be too long", 
cmd->argcount);
+               return -1;
+       }
+       cmd->total.args += cmd->argcount;
+       cmd->total.commands++;
+       cmd->argcount = 0;
+       if (p = cmd->postarg)
+               while (*cmd->nextarg++ = *p++);
+       else
+               *cmd->nextarg = 0;
+       if (s = cmd->insert)
+       {
+               char*   a;
+               char*   b;
+               char*   e;
+               char*   t;
+               char*   u;
+               int     c;
+               int     m;
+
+               a = cmd->firstarg[0];
+               b = (char*)&cmd->nextarg[1];
+               e = cmd->nextstr;
+               c = *s;
+               m = cmd->insertlen;
+               for (n = 1; cmd->argv[n]; n++)
+                       if (t = cmd->insertarg[n])
+                       {
+                               cmd->argv[n] = b;
+                               for (;;)
+                               {
+                                       if (!(u = strchr(t, c)))
+                                       {
+                                               b += sfsprintf(b, e - b, "%s", 
t);
+                                               break;
+                                       }
+                                       if (!strncmp(s, u, m))
+                                       {
+                                               b += sfsprintf(b, e - b, 
"%-.*s%s", u - t, t, a);
+                                               t = u + m;
+                                       }
+                                       else if (b >= e)
+                                               break;
+                                       else
+                                       {
+                                               *b++ = *u++;
+                                               t = u;
+                                       }
+                               }
+                               if (b < e)
+                                       *b++ = 0;
+                       }
+               if (b >= e)
+               {
+                       if (!(cmd->flags & CMD_SILENT))
+                               error(2, "%s: command too large after insert", 
a);
+                       return -1;
+               }
+       }
+       cmd->nextarg = cmd->firstarg;
+       cmd->nextstr = cmd->laststr;
+       if (cmd->flags & (CMD_QUERY|CMD_TRACE))
+       {
+               p = cmd->argv;
+               sfprintf(sfstderr, "+ %s", *p);
+               while (s = *++p)
+                       sfprintf(sfstderr, " %s", s);
+               if (!(cmd->flags & CMD_QUERY))
+                       sfprintf(sfstderr, "\n");
+               else if (astquery(1, "? "))
+                       return 0;
+       }
+       if (cmd->echo)
+       {
+               n = (cmd->flags & CMD_NEWLINE) ? '\n' : ' ';
+               for (p = cmd->argv + 1; s = *p++;)
+                       sfputr(sfstdout, s, *p ? n : '\n');
+               n = 0;
+       }
+       else if ((n = procrun(*cmd->argv, cmd->argv, 
PROC_ARGMOD|PROC_IGNOREPATH)) == -1)
+       {
+               if (!(cmd->flags & CMD_SILENT))
+               {
+                       error(ERROR_SYSTEM|2, "%s: command exec error", 
*cmd->argv);
+                       exit(EXIT_NOTFOUND - 1);
+               }
+               return -1;
+       }
+       else if (n >= EXIT_NOTFOUND - 1)
+       {
+               if (!(cmd->flags & CMD_SILENT))
+                       exit(n);
+       }
+       else if (!(cmd->flags & CMD_IGNORE))
+       {
+               if (n == EXIT_QUIT && !(cmd->flags & CMD_SILENT))
+                       exit(2);
+               if (n)
+                       error_info.errors++;
+       }
+       return n;
+}
+
+/*
+ * add file to the command arg list
+ */
+
+int
+cmdarg(register Cmdarg_t* cmd, const char* file, register int len)
+{
+       int     i;
+       int     r;
+
+       r = 0;
+       if (len)
+       {
+               while ((cmd->nextstr -= len + 1) < (char*)(cmd->nextarg + 
cmd->offset))
+               {
+                       if (cmd->nextarg == cmd->firstarg)
+                       {
+                               error(2, "%s: path too long for exec args", 
file);
+                               return -1;
+                       }
+                       if (i = cmdflush(cmd))
+                       {
+                               if (r < i)
+                                       r = i;
+                               if (!(cmd->flags & CMD_IGNORE))
+                                       return r;
+                       }
+               }
+               *cmd->nextarg++ = cmd->nextstr;
+               memcpy(cmd->nextstr, file, len);
+               cmd->nextstr[len] = 0;
+               cmd->argcount++;
+               if (cmd->argcount >= cmd->argmax && (i = cmdflush(cmd)) > r)
+                       r = i;
+       }
+       return r;
+}
+
+/*
+ * close a cmdarg stream
+ */
+
+int
+cmdclose(Cmdarg_t* cmd)
+{
+       int     n;
+
+       if ((cmd->flags & CMD_EXACT) && cmd->argcount < cmd->argmax)
+       {
+               if (!(cmd->flags & CMD_SILENT))
+                       error(2, "only %d arguments for last command", 
cmd->argcount);
+               return -1;
+       }
+       cmd->flags &= ~CMD_MINIMUM;
+       n = cmdflush(cmd);
+       free(cmd);
+       return n;
+}
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/error.c 
ksh93_2007_05_15/src/lib/libast/misc/error.c
--- ksh93_2007_04_18/src/lib/libast/misc/error.c        2007-03-23 
03:53:27.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/misc/error.c        2007-04-25 
00:01:16.000000000 +0200
@@ -619,8 +619,6 @@
  * error_info context control
  */
 
-#include <error.h>
-
 static Error_info_t*   freecontext;
 
 Error_info_t*
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/fts.c 
ksh93_2007_05_15/src/lib/libast/misc/fts.c
--- ksh93_2007_04_18/src/lib/libast/misc/fts.c  2006-08-02 21:16:05.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libast/misc/fts.c  2007-04-27 07:01:42.000000000 
+0200
@@ -32,6 +32,7 @@
 #include <ast_dir.h>
 #include <error.h>
 #include <fs3d.h>
+#include <ls.h>
 
 struct Ftsent;
 
@@ -70,7 +71,7 @@
        char*           home;                   /* home/path buffer     */ \
        char*           endbase;                /* space to build paths */ \
        char*           endbuf;                 /* space to build paths */ \
-       char*           pad;
+       char*           pad[2];                 /* $0.02 to splain this */
 
 /*
  * NOTE: <ftwalk.h> relies on status and statb being the first two elements
@@ -79,12 +80,12 @@
 #define _FTSENT_PRIVATE_ \
        short           status;                 /* internal status      */ \
        struct stat     statb;                  /* fts_statp data       */ \
+       FTS*            fts;                    /* fts_open() handle    */ \
        int             nd;                     /* popdir() count       */ \
        FTSENT*         left;                   /* left child           */ \
        FTSENT*         right;                  /* right child          */ \
        FTSENT*         pwd;                    /* pwd parent           */ \
        FTSENT*         stack;                  /* getlist() stack      */ \
-       FTS*            fts;                    /* for fts verification */ \
        long            nlink;                  /* FTS_D link count     */ \
        unsigned char   must;                   /* must stat            */ \
        unsigned char   type;                   /* DT_* type            */ \
@@ -1457,6 +1458,22 @@
 }
 
 /*
+ * return 1 if ent is mounted on a local filesystem
+ */
+
+int
+fts_local(FTSENT* ent)
+{
+#ifdef ST_LOCAL
+       struct statvfs  fs;
+
+       return statvfs(ent->fts_path, &fs) || (fs.f_flag & ST_LOCAL);
+#else
+       return !strgrpmatch(fmtfs(ent->fts_statp), "([an]fs|samb)", NiL, 0, 
STR_LEFT|STR_ICASE);
+#endif
+}
+
+/*
  * close an open fts stream
  */
 
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/optctx.c 
ksh93_2007_05_15/src/lib/libast/misc/optctx.c
--- ksh93_2007_04_18/src/lib/libast/misc/optctx.c       1970-01-01 
01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/misc/optctx.c       2007-04-25 
20:03:21.000000000 +0200
@@ -0,0 +1,70 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
+*                      and is licensed under the                       *
+*                  Common Public License, Version 1.0                  *
+*                      by AT&T Knowledge Ventures                      *
+*                                                                      *
+*                A copy of the License is available at                 *
+*            http://www.opensource.org/licenses/cpl1.0.txt             *
+*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
+*                                                                      *
+*              Information and Software Systems Research               *
+*                            AT&T Research                             *
+*                           Florham Park NJ                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                   Phong Vo <kpv at research.att.com>                    *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * _opt_infop_ context control
+ *
+ * allocate new context:
+ *     new_context = optctx(0, 0);
+ * free new context:
+ *     optctx(0, new_context);
+ * switch to new_context:
+ *     old_context = optctx(new_context, 0);
+ * switch to old_context and free new_context:
+ *     optctx(old_context, new_context);
+ */
+
+#include <optlib.h>
+
+static Opt_t*  freecontext;
+
+Opt_t*
+optctx(Opt_t* p, Opt_t* o)
+{
+       if (o)
+       {
+               if (freecontext)
+                       free(o);
+               else
+                       freecontext = o;
+               if (!p)
+                       return 0;
+       }
+       if (p)
+       {
+               o = _opt_infop_;
+               _opt_infop_ = p;
+       }
+       else
+       {
+               if (o = freecontext)
+                       freecontext = 0;
+               else if (!(o = newof(0, Opt_t, 1, 0)))
+                       return 0;
+               memset(o, 0, sizeof(Opt_t));
+               o->state = _opt_infop_->state;
+       }
+       return o;
+}
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/optget.c 
ksh93_2007_05_15/src/lib/libast/misc/optget.c
--- ksh93_2007_04_18/src/lib/libast/misc/optget.c       2007-03-28 
08:13:50.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/misc/optget.c       2007-04-24 
12:24:13.000000000 +0200
@@ -680,14 +680,16 @@
 save(const char* s)
 {
        Save_t*         p;
+       Dtdisc_t*       d;
 
-       static Dtdisc_t disc;
        static Dt_t*    dict;
 
        if (!dict)
        {
-               disc.key = offsetof(Save_t, text);
-               if (!(dict = dtopen(&disc, Dthash)))
+               if (!(d = newof(0, Dtdisc_t, 1, 0)))
+                       return (char*)s;
+               d->key = offsetof(Save_t, text);
+               if (!(dict = dtopen(d, Dthash)))
                        return (char*)s;
        }
        if (!(p = (Save_t*)dtmatch(dict, s)))
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/procopen.c 
ksh93_2007_05_15/src/lib/libast/misc/procopen.c
--- ksh93_2007_04_18/src/lib/libast/misc/procopen.c     2006-10-25 
17:20:39.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/misc/procopen.c     2007-04-23 
23:03:12.000000000 +0200
@@ -360,7 +360,7 @@
  */
 
 Proc_t*
-procopen(const char* cmd, char** argv, char** envv, long* modv, long flags)
+procopen(const char* cmd, char** argv, char** envv, long* modv, int flags)
 {
        register Proc_t*        proc = 0;
        register int            procfd;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/procrun.c 
ksh93_2007_05_15/src/lib/libast/misc/procrun.c
--- ksh93_2007_04_18/src/lib/libast/misc/procrun.c      1996-12-12 
20:11:25.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/misc/procrun.c      2007-04-24 
22:13:36.000000000 +0200
@@ -34,7 +34,16 @@
 #include "proclib.h"
 
 int
-procrun(const char* path, char** argv)
+procrun(const char* path, char** argv, int flags)
 {
-       return procclose(procopen(path, argv, NiL, NiL, 
PROC_FOREGROUND|PROC_GID|PROC_UID));
+#if __OBSOLETE__ < 20090101
+       flags &= argv ? PROC_ARGMOD : PROC_CHECK;
+#endif
+       if (flags & PROC_CHECK)
+       {
+               char    buf[PATH_MAX];
+
+               return pathpath(buf, path, NiL, PATH_REGULAR|PATH_EXECUTE) ? 0 
: -1;
+       }
+       return procclose(procopen(path, argv, NiL, NiL, 
flags|PROC_FOREGROUND|PROC_GID|PROC_UID));
 }
diff -r -N -u ksh93_2007_04_18/src/lib/libast/path/pathprobe.c 
ksh93_2007_05_15/src/lib/libast/path/pathprobe.c
--- ksh93_2007_04_18/src/lib/libast/path/pathprobe.c    2006-09-06 
05:29:07.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/path/pathprobe.c    2007-04-23 
22:54:59.000000000 +0200
@@ -291,7 +291,7 @@
                *ap++ = (char*)tool;
                *ap++ = proc;
                *ap = 0;
-               if (procrun(exe, arg))
+               if (procrun(exe, arg, 0))
                        return 0;
                if (eaccess(path, R_OK))
                        return 0;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/port/lc.c 
ksh93_2007_05_15/src/lib/libast/port/lc.c
--- ksh93_2007_04_18/src/lib/libast/port/lc.c   2002-10-05 12:19:59.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libast/port/lc.c   2007-04-20 21:32:20.000000000 
+0200
@@ -26,58 +26,19 @@
  */
 
 #include "lclib.h"
+#include "lclang.h"
 
 #include <ctype.h>
 
-#if _WINIX
-
-#include <ast_windows.h>
-
-#define LANG_CHINESE_SIMPLIFIED                        LANG_CHINESE
-#define LANG_CHINESE_TRADITIONAL               LANG_CHINESE
-#define LANG_NORWEGIAN_BOKMAL                  LANG_NORWEGIAN
-#define LANG_NORWEGIAN_NYNORSK                 LANG_NORWEGIAN
-#define LANG_SERBO_CROATIAN                    LANG_CROATIAN
-
-#define CTRY_CZECH_REPUBLIC                    CTRY_CZECH
-
-#define SUBLANG_CHINESE_SIMPLIFIED_CHINA       SUBLANG_CHINESE_SIMPLIFIED
-#define SUBLANG_CHINESE_SIMPLIFIED_HONG_KONG   SUBLANG_CHINESE_HONGKONG
-#define SUBLANG_CHINESE_SIMPLIFIED_SINGAPORE   SUBLANG_CHINESE_SINGAPORE
-#define SUBLANG_CHINESE_TRADITIONAL_TAIWAN     SUBLANG_CHINESE_TRADITIONAL
-#define SUBLANG_DUTCH_NETHERLANDS_ANTILLES     SUBLANG_DUTCH
-#define SUBLANG_DUTCH_BELGIUM                  SUBLANG_DUTCH_BELGIAN
-#define SUBLANG_ENGLISH_AUSTRALIA              SUBLANG_ENGLISH_AUS
-#define SUBLANG_ENGLISH_CANADA                 SUBLANG_ENGLISH_CAN
-#define SUBLANG_ENGLISH_IRELAND                        SUBLANG_ENGLISH_EIRE
-#define SUBLANG_ENGLISH_NEW_ZEALAND            SUBLANG_ENGLISH_NZ
-#define SUBLANG_ENGLISH_TRINIDAD_TOBAGO                
SUBLANG_ENGLISH_CARIBBEAN
-#define SUBLANG_ENGLISH_UNITED_KINGDOM         SUBLANG_ENGLISH_UK
-#define SUBLANG_ENGLISH_UNITED_STATES          SUBLANG_ENGLISH_US
-#define SUBLANG_FRENCH_BELGIUM                 SUBLANG_FRENCH_BELGIAN
-#define SUBLANG_FRENCH_CANADA                  SUBLANG_FRENCH_CANADIAN
-#define SUBLANG_FRENCH_SWITZERLAND             SUBLANG_FRENCH_SWISS
-#define SUBLANG_GERMAN_AUSTRIA                 SUBLANG_GERMAN_AUSTRIAN
-#define SUBLANG_GERMAN_SWITZERLAND             SUBLANG_GERMAN_SWISS
-#define SUBLANG_ITALIAN_SWITZERLAND            SUBLANG_ITALIAN_SWISS
-#define SUBLANG_NORWEGIAN_BOKMAL_NORWAY                SUBLANG_NORWEGIAN_BOKMAL
-#define SUBLANG_NORWEGIAN_NORWAY               SUBLANG_NORWEGIAN_BOKMAL
-#define SUBLANG_NORWEGIAN_NYNORSK_NORWAY       SUBLANG_NORWEGIAN_NYNORSK
-#define SUBLANG_PORTUGUESE_BRAZIL              SUBLANG_PORTUGUESE_BRAZILIAN
-
-#endif
-
-#include "lctab.h"
-
 static Lc_numeric_t    default_numeric = { '.', -1 };
 
 static Lc_t            default_lc =
 {
        "C",
        "POSIX",
-       &language[0],
-       &territory[0],
-       &charset[0],
+       &lc_languages[0],
+       &lc_territories[0],
+       &lc_charsets[0],
        0, 
        LC_default|LC_checked|LC_local,
        0,
@@ -105,9 +66,9 @@
 {
        "debug",
        "debug",
-       &language[1],
-       &territory[1],
-       &charset[0],
+       &lc_languages[1],
+       &lc_territories[1],
+       &lc_charsets[0],
        0, 
        LC_debug|LC_checked|LC_local,
        0,
@@ -184,7 +145,7 @@
 Lc_category_t*
 lccategories(void)
 {
-       return &categories[0];
+       return (Lc_category_t*)&lc_categories[0];
 }
 
 /*
@@ -333,7 +294,7 @@
        }
        if (s < e)
        {
-               if (tp && tp != &territory[0] && (!(flags & 
(LC_abbreviated|LC_default)) || !lp || !streq(lp->code, tp->code)))
+               if (tp && tp != &lc_territories[0] && (!(flags & 
(LC_abbreviated|LC_default)) || !lp || !streq(lp->code, tp->code)))
                {
                        if (lp)
                                *s++ = '_';
@@ -452,7 +413,7 @@
        for (lc = lcs; lc; lc = lc->next)
                if (!strcasecmp(t, lc->code) || !strcasecmp(t, lc->name))
                        return lc;
-       for (mp = map; mp->code; mp++)
+       for (mp = lc_maps; mp->code; mp++)
                if (streq(t, mp->code))
                {
                        lp = mp->language;
@@ -553,15 +514,15 @@
 
        n = strlen(s = language_name);
        if (n == 2)
-               for (lp = language; lp->code && !streq(s, lp->code); lp++);
+               for (lp = lc_languages; lp->code && !streq(s, lp->code); lp++);
        else if (n == 3)
        {
-               for (lp = language; lp->code && (!lp->alternates || !match(s, 
lp->alternates, n, 0)); lp++);
+               for (lp = lc_languages; lp->code && (!lp->alternates || 
!match(s, lp->alternates, n, 0)); lp++);
                if (!lp->code)
                {
                        c = s[2];
                        s[2] = 0;
-                       for (lp = language; lp->code && !streq(s, lp->code); 
lp++);
+                       for (lp = lc_languages; lp->code && !streq(s, 
lp->code); lp++);
                        s[2] = c;
                        if (lp->code)
                                n = 1;
@@ -571,18 +532,18 @@
                lp = 0;
        if (!lp || !lp->code)
        {
-               for (lp = language; lp->code && !match(s, lp->name, 0, 0); 
lp++);
+               for (lp = lc_languages; lp->code && !match(s, lp->name, 0, 0); 
lp++);
                if (!lp || !lp->code)
                {
                        if (!territory_name)
                        {
                                if (n == 2)
-                                       for (tp = territory; tp->code && 
!streq(s, tp->code); tp++);
+                                       for (tp = lc_territories; tp->code && 
!streq(s, tp->code); tp++);
                                else
                                {
                                        z = 0;
                                        tpb = 0;
-                                       for (tp = territory; tp->name; tp++)
+                                       for (tp = lc_territories; tp->name; 
tp++)
                                                if ((i = match(s, tp->name, 3, 
0)) > z)
                                                {
                                                        tpb = tp;
@@ -609,8 +570,8 @@
                                        return 0;
                                name = ((Lc_language_t*)lp)->code = 
((Lc_language_t*)lp)->name = (const char*)(lp + 1);
                                memcpy((char*)lp->code, s, z - 1);
-                               tp = &territory[0];
-                               cp = ((Lc_language_t*)lp)->charset = 
&charset[0];
+                               tp = &lc_territories[0];
+                               cp = ((Lc_language_t*)lp)->charset = 
&lc_charsets[0];
                                al = 0;
                                goto override;
                        }
@@ -627,7 +588,7 @@
                {
                        n = 0;
                        primary = 0;
-                       for (tp = territory; tp->code; tp++)
+                       for (tp = lc_territories; tp->code; tp++)
                                if (tp->languages[0] == lp)
                                {
                                        if (tp->flags & LC_primary)
@@ -648,7 +609,7 @@
                        n = strlen(s);
                        if (n == 2)
                        {
-                               for (tp = territory; tp->code; tp++)
+                               for (tp = lc_territories; tp->code; tp++)
                                        if (streq(s, tp->code))
                                        {
                                                for (i = 0; i < 
elementsof(tp->languages) && lp != tp->languages[i]; i++);
@@ -659,7 +620,7 @@
                        }
                        else
                        {
-                               for (tp = territory; tp->code; tp++)
+                               for (tp = lc_territories; tp->code; tp++)
                                        if (match(s, tp->name, 3, 0))
                                        {
                                                for (i = 0; i < 
elementsof(tp->languages) && lp != tp->languages[i]; i++);
@@ -684,7 +645,7 @@
                        c = *s;
                        *s = 0;
                        if (!(cp = lp->charset) || !match_charset(w, cp))
-                               for (cp = charset; cp->code; cp++)
+                               for (cp = lc_charsets; cp->code; cp++)
                                        if (match_charset(w, cp))
                                        {
                                                ppa = cp;
@@ -721,7 +682,7 @@
         */
 
        if (s = charset_name)
-               for (cp = charset; cp->code; cp++)
+               for (cp = lc_charsets; cp->code; cp++)
                        if (match_charset(s, cp))
                                break;
        if (!cp || !cp->code)
@@ -739,9 +700,9 @@
                return 0;
        strcpy((char*)(lc->name = (const char*)(lc + 1)), name);
        strcpy((char*)(lc->code = lc->name + n), s);
-       lc->language = lp ? lp : &language[0];
-       lc->territory = tp ? tp : &territory[0];
-       lc->charset = cp ? cp : &charset[0];  
+       lc->language = lp ? lp : &lc_languages[0];
+       lc->territory = tp ? tp : &lc_territories[0];
+       lc->charset = cp ? cp : &lc_charsets[0];  
        lc->attributes = al;
        for (i = 0; i < elementsof(lc->info); i++)
                lc->info[i].lc = lc;
@@ -796,22 +757,22 @@
        {
                if (++ls->language >= elementsof(ls->lc.territory->languages) 
|| !(ls->lc.language = ls->lc.territory->languages[ls->language]))
                {
-                       if (++ls->territory >= (elementsof(territory) - 1))
+                       if (!lc_territories[++ls->territory].code)
                        {
                                free(ls);
                                return 0;
                        }
-                       ls->lc.territory = &territory[ls->territory];
+                       ls->lc.territory = &lc_territories[ls->territory];
                        ls->lc.language = 
ls->lc.territory->languages[ls->language = 0];
                }
                if (ls->lc.language)
                {
-                       ls->lc.charset = ls->lc.language->charset ? 
ls->lc.language->charset : &charset[0];
+                       ls->lc.charset = ls->lc.language->charset ? 
ls->lc.language->charset : &lc_charsets[0];
                        ls->list.attribute = 
ls->lc.language->attributes[ls->attribute = 0];
                }
                else
                {
-                       ls->lc.charset = &charset[0];
+                       ls->lc.charset = &lc_charsets[0];
                        ls->list.attribute = 0;
                }
        }
diff -r -N -u ksh93_2007_04_18/src/lib/libast/port/lcgen.c 
ksh93_2007_05_15/src/lib/libast/port/lcgen.c
--- ksh93_2007_04_18/src/lib/libast/port/lcgen.c        2004-05-04 
22:04:13.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/port/lcgen.c        2007-04-20 
21:48:57.000000000 +0200
@@ -294,7 +294,7 @@
        line = 0;
        if (!(hdr = *argv++) || !(lib = *argv++) || *argv)
        {
-               fprintf(stderr, "%s: hdr and lib arguments expected\n", 
command);
+               fprintf(stderr, "%s: { hdr lib tab } arguments expected\n", 
command);
                return 1;
        }
        if (!(hf = fopen(hdr, "w")))
@@ -333,6 +333,10 @@
        fprintf(hf, "#define LC_verbose\t\t0x00200\n");
        fprintf(hf, "#define LC_user\t\t\t0x10000\n");
        fprintf(lf, "/* : : generated by %s : : */\n", command);
+       fprintf(lf, "\n");
+       fprintf(lf, "#include \"lclib.h\"\n");
+       fprintf(lf, "#include \"lclang.h\"\n");
+       fprintf(lf, "\n");
        while (s = fgets(buf, sizeof(buf), stdin))
        {
                line++;
@@ -501,7 +505,7 @@
                        if (s = copy(&b, arg[4]))
                        {
                                i = 0;
-                               fprintf(lf, "\nstatic Lc_attribute_t 
attribute_%s[] =\n{\n", lp->link.code);
+                               fprintf(lf, "\nconst Lc_attribute_t 
attribute_%s[] =\n{\n", lp->link.code);
                                while (*(b = s))
                                {
                                        for (f = 0; *s && *s != '|'; s++)
@@ -686,7 +690,7 @@
        fprintf(hf, "extern Lc_t*\t\tlcscan(Lc_t*);\n");
        fprintf(hf, "\n");
        fprintf(hf, "#undef\textern\n");
-       fprintf(lf, "\nstatic const Lc_charset_t charset[] =\n{\n");
+       fprintf(lf, "\nconst Lc_charset_t lc_charsets[] =\n{\n");
        for (cp = (Charset_t*)state.charset.root; cp; cp = 
(Charset_t*)cp->link.next)
        {
                fprintf(lf, "{\"%s\",", cp->link.code);
@@ -701,12 +705,12 @@
                fprintf(lf, "},\n");
        }
        fprintf(lf, "\t0\n};\n");
-       fprintf(lf, "\nstatic const Lc_language_t language[] =\n{\n");
-       fprintf(lf, "{\"C\",\"C\",\"POSIX\",&charset[0],LC_default,0,");
+       fprintf(lf, "\nconst Lc_language_t lc_languages[] =\n{\n");
+       fprintf(lf, "{\"C\",\"C\",\"POSIX\",&lc_charsets[0],LC_default,0,");
        for (i = 0; i < language_attribute_max; i++)
                fprintf(lf, "0,");
        fprintf(lf, "},\n");
-       fprintf(lf, "{\"debug\",\"debug\",0,&charset[0],LC_debug,0,");
+       fprintf(lf, "{\"debug\",\"debug\",0,&lc_charsets[0],LC_debug,0,");
        for (i = 0; i < language_attribute_max; i++)
                fprintf(lf, "0,");
        fprintf(lf, "},\n");
@@ -717,7 +721,7 @@
                        fprintf(lf, "\"%s\",", lp->alternates);
                else
                        fprintf(lf, "0,");
-               fprintf(lf, "&charset[%d],0,", lp->charset ? 
lp->charset->link.index : 0);
+               fprintf(lf, "&lc_charsets[%d],0,", lp->charset ? 
lp->charset->link.index : 0);
                macro(lf, "LANG", lp->name, (char*)0);
                for (i = 0, al = lp->attributes; al; al = al->next, i++)
                        fprintf(lf, "&attribute_%s[%d],", lp->link.code, 
al->attribute->link.index);
@@ -726,12 +730,12 @@
                fprintf(lf, "\n},\n");
        }
        fprintf(lf, "\t0\n};\n");
-       fprintf(lf, "\nstatic const Lc_territory_t territory[] =\n{\n");
-       fprintf(lf, "{\"C\",\"C\",LC_default,0,&language[0],");
+       fprintf(lf, "\nconst Lc_territory_t lc_territories[] =\n{\n");
+       fprintf(lf, "{\"C\",\"C\",LC_default,0,&lc_languages[0],");
        for (i = 1; i < 2 * territory_language_max; i++)
                fprintf(lf, "0,");
        fprintf(lf, "},\n");
-       fprintf(lf, "{\"debug\",\"debug\",LC_debug,0,&language[1],");
+       fprintf(lf, "{\"debug\",\"debug\",LC_debug,0,&lc_languages[1],");
        for (i = 1; i < 2 * territory_language_max; i++)
                fprintf(lf, "0,");
        fprintf(lf, "},\n");
@@ -744,7 +748,7 @@
                        fprintf(lf, "0,");
                macro(lf, "CTRY", tp->name, (char*)0);
                for (i = 0, ll = tp->languages; ll; ll = ll->next, i++)
-                       fprintf(lf, "&language[%d],", ll->language->link.index);
+                       fprintf(lf, "&lc_languages[%d],", 
ll->language->link.index);
                for (; i < territory_language_max; i++)
                        fprintf(lf, "0,");
                for (i = 0, ll = tp->languages; ll; ll = ll->next, i++)
@@ -754,13 +758,13 @@
                fprintf(lf, "\n},\n");
        }
        fprintf(lf, "\t0\n};\n");
-       fprintf(lf, "\nstatic const Lc_map_t map[] =\n{\n");
+       fprintf(lf, "\nconst Lc_map_t lc_maps[] =\n{\n");
        for (mp = (Map_t*)state.map.root; mp; mp = (Map_t*)mp->link.next)
        {
                fprintf(lf, "{\"%s\",", mp->link.code);
-               fprintf(lf, "&language[%d],", mp->language->link.index);
-               fprintf(lf, "&territory[%d],", mp->territory->link.index);
-               fprintf(lf, "&charset[%d],", mp->charset ? 
mp->charset->link.index : 0);
+               fprintf(lf, "&lc_languages[%d],", mp->language->link.index);
+               fprintf(lf, "&lc_territories[%d],", mp->territory->link.index);
+               fprintf(lf, "&lc_charsets[%d],", mp->charset ? 
mp->charset->link.index : 0);
                if (mp->attribute)
                        fprintf(lf, "&attribute_%s[%d]", 
mp->language->link.code, mp->attribute->link.index);
                else
diff -r -N -u ksh93_2007_04_18/src/lib/libast/port/lclang.h 
ksh93_2007_05_15/src/lib/libast/port/lclang.h
--- ksh93_2007_04_18/src/lib/libast/port/lclang.h       1970-01-01 
01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/port/lclang.h       2007-04-20 
21:09:13.000000000 +0200
@@ -0,0 +1,62 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
+*                      and is licensed under the                       *
+*                  Common Public License, Version 1.0                  *
+*                      by AT&T Knowledge Ventures                      *
+*                                                                      *
+*                A copy of the License is available at                 *
+*            http://www.opensource.org/licenses/cpl1.0.txt             *
+*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
+*                                                                      *
+*              Information and Software Systems Research               *
+*                            AT&T Research                             *
+*                           Florham Park NJ                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                   Phong Vo <kpv at research.att.com>                    *
+*                                                                      *
+***********************************************************************/
+/*
+ * lc (sub)lang definitions -- very windowsish
+ */
+
+#if _WINIX
+
+#include <ast_windows.h>
+
+#define LANG_CHINESE_SIMPLIFIED                        LANG_CHINESE
+#define LANG_CHINESE_TRADITIONAL               LANG_CHINESE
+#define LANG_NORWEGIAN_BOKMAL                  LANG_NORWEGIAN
+#define LANG_NORWEGIAN_NYNORSK                 LANG_NORWEGIAN
+#define LANG_SERBO_CROATIAN                    LANG_CROATIAN
+
+#define CTRY_CZECH_REPUBLIC                    CTRY_CZECH
+
+#define SUBLANG_CHINESE_SIMPLIFIED_CHINA       SUBLANG_CHINESE_SIMPLIFIED
+#define SUBLANG_CHINESE_SIMPLIFIED_HONG_KONG   SUBLANG_CHINESE_HONGKONG
+#define SUBLANG_CHINESE_SIMPLIFIED_SINGAPORE   SUBLANG_CHINESE_SINGAPORE
+#define SUBLANG_CHINESE_TRADITIONAL_TAIWAN     SUBLANG_CHINESE_TRADITIONAL
+#define SUBLANG_DUTCH_NETHERLANDS_ANTILLES     SUBLANG_DUTCH
+#define SUBLANG_DUTCH_BELGIUM                  SUBLANG_DUTCH_BELGIAN
+#define SUBLANG_ENGLISH_AUSTRALIA              SUBLANG_ENGLISH_AUS
+#define SUBLANG_ENGLISH_CANADA                 SUBLANG_ENGLISH_CAN
+#define SUBLANG_ENGLISH_IRELAND                        SUBLANG_ENGLISH_EIRE
+#define SUBLANG_ENGLISH_NEW_ZEALAND            SUBLANG_ENGLISH_NZ
+#define SUBLANG_ENGLISH_TRINIDAD_TOBAGO                
SUBLANG_ENGLISH_CARIBBEAN
+#define SUBLANG_ENGLISH_UNITED_KINGDOM         SUBLANG_ENGLISH_UK
+#define SUBLANG_ENGLISH_UNITED_STATES          SUBLANG_ENGLISH_US
+#define SUBLANG_FRENCH_BELGIUM                 SUBLANG_FRENCH_BELGIAN
+#define SUBLANG_FRENCH_CANADA                  SUBLANG_FRENCH_CANADIAN
+#define SUBLANG_FRENCH_SWITZERLAND             SUBLANG_FRENCH_SWISS
+#define SUBLANG_GERMAN_AUSTRIA                 SUBLANG_GERMAN_AUSTRIAN
+#define SUBLANG_GERMAN_SWITZERLAND             SUBLANG_GERMAN_SWISS
+#define SUBLANG_ITALIAN_SWITZERLAND            SUBLANG_ITALIAN_SWISS
+#define SUBLANG_NORWEGIAN_BOKMAL_NORWAY                SUBLANG_NORWEGIAN_BOKMAL
+#define SUBLANG_NORWEGIAN_NORWAY               SUBLANG_NORWEGIAN_BOKMAL
+#define SUBLANG_NORWEGIAN_NYNORSK_NORWAY       SUBLANG_NORWEGIAN_NYNORSK
+#define SUBLANG_PORTUGUESE_BRAZIL              SUBLANG_PORTUGUESE_BRAZILIAN
+
+#endif
diff -r -N -u ksh93_2007_04_18/src/lib/libast/port/lclib.h 
ksh93_2007_05_15/src/lib/libast/port/lclib.h
--- ksh93_2007_04_18/src/lib/libast/port/lclib.h        2001-08-22 
13:17:15.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/port/lclib.h        2007-04-20 
21:44:16.000000000 +0200
@@ -28,10 +28,15 @@
 #ifndef _LCLIB_H
 #define _LCLIB_H       1
 
-#define categories     _ast_categories
 #define locales                _ast_locales
 #define translate      _ast_translate
 
+#define lc_categories  _ast_lc_categories
+#define lc_charsets    _ast_lc_charsets
+#define lc_languages   _ast_lc_languages
+#define lc_maps                _ast_lc_maps
+#define lc_territories _ast_lc_territories
+
 struct Lc_info_s;
 
 #define _LC_PRIVATE_ \
@@ -53,9 +58,14 @@
 
 #define LCINFO(c)      (&locales[c]->info[c])
 
-extern Lc_category_t   categories[];
-extern Lc_t*           locales[];
+extern const Lc_charset_t      lc_charsets[];
+extern const Lc_language_t     lc_languages[];
+extern const Lc_map_t          lc_maps[];
+extern const Lc_territory_t    lc_territories[];
+
+extern Lc_category_t           lc_categories[];
+extern Lc_t*                   locales[];
 
-extern char*           translate(const char*, const char*, const char*, const 
char*);
+extern char*                   translate(const char*, const char*, const 
char*, const char*);
 
 #endif
diff -r -N -u ksh93_2007_04_18/src/lib/libast/port/mc.c 
ksh93_2007_05_15/src/lib/libast/port/mc.c
--- ksh93_2007_04_18/src/lib/libast/port/mc.c   2004-10-27 21:45:28.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libast/port/mc.c   2007-04-20 21:36:20.000000000 
+0200
@@ -154,7 +154,7 @@
                                                case_C:
                                                        if (!catalog)
                                                                last = 1;
-                                                       v = 
categories[category].name;
+                                                       v = 
lc_categories[category].name;
                                                        break;
                                                default:
                                                        *s++ = c;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/RELEASE 
ksh93_2007_05_15/src/lib/libast/RELEASE
--- ksh93_2007_04_18/src/lib/libast/RELEASE     2007-04-13 19:09:16.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libast/RELEASE     2007-05-16 02:08:01.000000000 
+0200
@@ -1,3 +1,16 @@
+07-05-15 sfio/sfvprintf.c: %h? and SFFMT_SHORT => raw bytes
+07-05-09 features/signal.c,features/siglist: use kill -l & strsignal()
+07-04-25 misc/optctx.c: add for opt_info switching
+07-04-24 misc/cmdarg.c,include/cmdarg.h: add CMD_CHECKED, CMD_SILENT
+07-04-24 misc/procopen.c,include/proc.h: add PROC_CHECK
+07-04-24 misc/procrun.c: add flags arg (current use PROC_ARGMOD)
+07-04-24 misc/cmdarg.c,include/cmdarg.h: move from src/cmd/tw
+07-04-20 port/(lclang.h|lc.c|mc.c|lclib.h|lcgen.c): separate lctab.c
+07-04-20 comp/conf.sh: defer to systems without 'grep -q' -- sigh
+07-04-20 comp/conf.sh: probe for LL integer constant initializer suffix
+07-04-20 include/syslog.h: <namval.h> => <ast_namval.h> for win32
+07-04-20 ast_namval.h: add as copy of include/namval.h for win32
+07-04-19 comp/conf.tab: fix SVID SI entries to probe SI_* (not _SI_*)
 07-04-13 tm/tmxdate.c,tm/tmzone.c: handle [-+]0000 UTC zone offset
 07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
 07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER => nan/inf vs. NAN/INF
@@ -5,6 +18,7 @@
 07-03-28 misc/optget.c: fix l10n --?-
 07-03-25 features/common: fix { ast_std.h ast_map.h stdint.h } logic
 07-03-21 error.h: move from error_info to (*_error_data_)
+07-03-21 misc/error.c: add errorctx() for error_info switching
 07-03-21 option.h: move from opt_info to (*_opt_data_)
 07-03-19 regex/regdecomp.c: fix REX_ONECHAR escapes and add REX_KMP
 07-03-11 tm/tmxscan.c,regex/regnexec.c: fix strict-alias transgressions
diff -r -N -u ksh93_2007_04_18/src/lib/libast/sfio/sfvprintf.c 
ksh93_2007_05_15/src/lib/libast/sfio/sfvprintf.c
--- ksh93_2007_04_18/src/lib/libast/sfio/sfvprintf.c    2007-04-12 
21:34:05.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/sfio/sfvprintf.c    2007-05-15 
22:39:44.000000000 +0200
@@ -716,7 +716,7 @@
 #endif
                                }
 #if defined(mbwide) && defined(mbchar) && defined(mbwidth)
-                               else if (mbwide())
+                               else if (!(flags & SFFMT_SHORT) && mbwide())
                                {       w = 0;
                                        SFMBCLR(&mbs);
                                        ssp = sp;
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/chgrp.c 
ksh93_2007_05_15/src/lib/libcmd/chgrp.c
--- ksh93_2007_04_18/src/lib/libcmd/chgrp.c     2006-11-01 21:15:56.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/chgrp.c     2007-05-08 23:12:57.000000000 
+0200
@@ -372,7 +372,7 @@
        }
        if (!(fts = fts_open(argv + 1, flags, NiL)))
                error(ERROR_system(1), "%s: not found", argv[1]);
-       while (!cmdquit() && (ent = fts_read(fts)))
+       while (!sh_checksig(context) && (ent = fts_read(fts)))
                switch (ent->fts_info)
                {
                case FTS_F:
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/chmod.c 
ksh93_2007_05_15/src/lib/libcmd/chmod.c
--- ksh93_2007_04_18/src/lib/libcmd/chmod.c     2007-01-26 23:43:33.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/chmod.c     2007-05-08 23:13:25.000000000 
+0200
@@ -247,7 +247,7 @@
                        umask(ignore);
                error(ERROR_system(1), "%s: not found", *argv);
        }
-       while (!cmdquit() && (ent = fts_read(fts)))
+       while (!sh_checksig(context) && (ent = fts_read(fts)))
                switch (ent->fts_info)
                {
                case FTS_SL:
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/cksum.c 
ksh93_2007_05_15/src/lib/libcmd/cksum.c
--- ksh93_2007_04_18/src/lib/libcmd/cksum.c     2007-02-07 20:25:43.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/cksum.c     2007-05-08 23:13:36.000000000 
+0200
@@ -560,7 +560,7 @@
                error(ERROR_system(1), "%s: not found", *argv);
        else
        {
-               while (!cmdquit() && (ent = fts_read(fts)))
+               while (!sh_checksig(context) && (ent = fts_read(fts)))
                        switch (ent->fts_info)
                        {
                        case FTS_SL:
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/cmd.h 
ksh93_2007_05_15/src/lib/libcmd/cmd.h
--- ksh93_2007_04_18/src/lib/libcmd/cmd.h       2006-11-27 16:45:45.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/cmd.h       2007-05-11 21:32:56.000000000 
+0200
@@ -31,9 +31,9 @@
 #include <ast.h>
 #include <error.h>
 #include <stak.h>
+#include <shcmd.h>
 
 #define cmdinit                        _cmd_init
-#define cmdquit()              0
 
 #if _BLD_cmd && defined(__EXPORT__)
 #define extern         __EXPORT__
@@ -53,7 +53,7 @@
 
 #include <dlldefs.h>
 
-typedef int (*Builtin_f)(int, char**, void*);
+typedef int (*Shbltin_f)(int, char**, void*);
 
 #else
 
@@ -97,7 +97,7 @@
        register char*  s;
        register char*  t;
        void*           dll;
-       Builtin_f       fun;
+       Shbltin_f       fun;
        char            buf[64];
 
        if (s = strrchr(argv[0], '/'))
@@ -117,16 +117,16 @@
        {
                if (dll = dlopen(NiL, RTLD_LAZY))
                {
-                       if (fun = (Builtin_f)dlsym(dll, buf + 1))
+                       if (fun = (Shbltin_f)dlsym(dll, buf + 1))
                                break;
-                       if (fun = (Builtin_f)dlsym(dll, buf))
+                       if (fun = (Shbltin_f)dlsym(dll, buf))
                                break;
                }
                if (dll = dllfind("cmd", NiL, RTLD_LAZY))
                {
-                       if (fun = (Builtin_f)dlsym(dll, buf + 1))
+                       if (fun = (Shbltin_f)dlsym(dll, buf + 1))
                                break;
-                       if (fun = (Builtin_f)dlsym(dll, buf))
+                       if (fun = (Shbltin_f)dlsym(dll, buf))
                                break;
                }
                return 127;
@@ -139,26 +139,9 @@
 
 #else
 
+#define _CMD_CONTEXT_OK(p)     
(((Shbltin_t*)(p))->version>=20070511&&((Shbltin_t*)(p))->version<20350101)
 #undef cmdinit
-#define cmdinit(a,b,c,d,e)     do{if(_cmd_init(a,b,c,d,e))return -1;}while(0)
-
-#ifndef CMD_BUILTIN
-
-#undef cmdquit
-#define cmdquit()              (_cmd_quit)
-
-#if _BLD_cmd && defined(__EXPORT__)
-#define extern                 extern __EXPORT__
-#endif
-#if !_BLD_cmd && defined(__IMPORT__)
-#define extern                 extern __IMPORT__
-#endif
-
-extern int     _cmd_quit;
-
-#undef extern
-
-#endif
+#define cmdinit(a,b,c,d,e)     
do{if((c)&&!_CMD_CONTEXT_OK(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0)
 
 #if _BLD_cmd && defined(__EXPORT__)
 #define extern                 extern __EXPORT__
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/cmdinit.c 
ksh93_2007_05_15/src/lib/libcmd/cmdinit.c
--- ksh93_2007_04_18/src/lib/libcmd/cmdinit.c   2006-11-24 22:28:38.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/cmdinit.c   2007-05-08 23:10:56.000000000 
+0200
@@ -25,19 +25,13 @@
 
 #include <cmd.h>
 
-int    _cmd_quit = 0;
-
 int
 _cmd_init(int argc, char** argv, void* context, const char* catalog, int flags)
 {
        register char*  cp;
 
        if (argc < 0)
-       {
-               _cmd_quit = 1;
                return -1;
-       }
-       _cmd_quit = 0;
        if (cp = strrchr(argv[0], '/'))
                cp++;
        else
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/cp.c 
ksh93_2007_05_15/src/lib/libcmd/cp.c
--- ksh93_2007_04_18/src/lib/libcmd/cp.c        2006-12-05 10:17:33.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/cp.c        2007-05-08 23:14:23.000000000 
+0200
@@ -229,8 +229,6 @@
        FTSENT*         sub;
        struct stat     st;
 
-       if (cmdquit())
-               return -1;
        if (ent->fts_info == FTS_DC)
        {
                error(2, "%s: directory causes cycle", ent->fts_path);
@@ -904,7 +902,7 @@
                state.flags |= FTS_TOP;
        if (fts = fts_open(argv, state.flags, NiL))
        {
-               while ((ent = fts_read(fts)) && !visit(&state, ent));
+               while (!sh_checksig(context) && (ent = fts_read(fts)) && 
!visit(&state, ent));
                fts_close(fts);
        }
        else if (state.link != pathsetlink)
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/date.c 
ksh93_2007_05_15/src/lib/libcmd/date.c
--- ksh93_2007_04_18/src/lib/libcmd/date.c      2007-03-29 18:52:51.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libcmd/date.c      2007-05-09 06:07:11.000000000 
+0200
@@ -206,7 +206,7 @@
  */
 
 static int
-settime(const char* cmd, Time_t now, int adjust, int network)
+settime(void* context, const char* cmd, Time_t now, int adjust, int network)
 {
        char*           s;
        char**          argv;
@@ -236,7 +236,7 @@
                }
                *argv++ = buf;
                *argv = 0;
-               if (!procrun(s, args))
+               if (!sh_run(context, argv - args, args))
                        return 0;
        }
        return -1;
@@ -473,7 +473,7 @@
                        tmxfmt(buf, sizeof(buf), format, now);
                        sfprintf(sfstdout, "%s\n", buf);
                }
-               else if (settime(cmd, now, increment, network))
+               else if (settime(context, cmd, now, increment, network))
                        error(ERROR_SYSTEM|3, "cannot set system time");
        }
        while (fmts != &fmt)
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/fds.c 
ksh93_2007_05_15/src/lib/libcmd/fds.c
--- ksh93_2007_04_18/src/lib/libcmd/fds.c       2006-11-01 21:16:28.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/fds.c       2007-05-09 20:53:09.000000000 
+0200
@@ -21,7 +21,7 @@
 #pragma prototyped
 
 static const char usage[] =
-"[-?\n@(#)$Id: fds (AT&T Research) 2006-10-26 $\n]"
+"[-?\n@(#)$Id: fds (AT&T Research) 2007-05-09 $\n]"
 USAGE_LICENSE
 "[+NAME?fds - list open file descriptor status]"
 "[+DESCRIPTION?\bfds\b lists the status for each open file descriptor. "
@@ -29,7 +29,7 @@
     "calling shell, otherwise it lists the file descriptors passed across "
     "\bexec\b(2).]"
 "[l:long?List file descriptor details.]"
-"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2)]"
+"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2), \bgetsockname\b(2), 
\bgetsockopts\b(2), ]"
 ;
 
 #include <cmd.h>
@@ -52,6 +52,108 @@
 #define major(x)       (int)(((unsigned int)(x)>>8)&0xff)
 #endif
 
+#undef getconf
+#define getconf(x)     strtol(astconf(x,NiL,NiL),NiL,0)
+
+#ifdef S_IFSOCK
+
+typedef struct NV_s
+{
+       const char*     name;
+       int             value;
+} NV_t;
+
+static const NV_t      family[] =
+{
+#ifdef AF_LOCAL
+       "pipe", AF_LOCAL,
+#endif
+#ifdef AF_UNIX
+       "pipe",         AF_UNIX,
+#endif
+#ifdef AF_FILE
+       "FILE",         AF_FILE,
+#endif
+#ifdef AF_INET
+       "INET",         AF_INET,
+#endif
+#ifdef AF_AX25
+       "AX25",         AF_AX25,
+#endif
+#ifdef AF_IPX
+       "IPX",          AF_IPX,
+#endif
+#ifdef AF_APPLETALK
+       "APPLETALK",    AF_APPLETALK,
+#endif
+#ifdef AF_NETROM
+       "NETROM",       AF_NETROM,
+#endif
+#ifdef AF_BRIDGE
+       "BRIDGE",       AF_BRIDGE,
+#endif
+#ifdef AF_ATMPVC
+       "ATMPVC",       AF_ATMPVC,
+#endif
+#ifdef AF_X25
+       "X25",          AF_X25,
+#endif
+#ifdef AF_INET6
+       "INET6",        AF_INET6,
+#endif
+#ifdef AF_ROSE
+       "ROSE",         AF_ROSE,
+#endif
+#ifdef AF_DECnet
+       "DECnet",       AF_DECnet,
+#endif
+#ifdef AF_NETBEUI
+       "NETBEUI",      AF_NETBEUI,
+#endif
+#ifdef AF_SECURITY
+       "SECURITY",     AF_SECURITY,
+#endif
+#ifdef AF_KEY
+       "KEY",          AF_KEY,
+#endif
+#ifdef AF_NETLINK
+       "NETLINK",      AF_NETLINK,
+#endif
+#ifdef AF_ROUTE
+       "ROUTE",        AF_ROUTE,
+#endif
+#ifdef AF_PACKET
+       "PACKET",       AF_PACKET,
+#endif
+#ifdef AF_ASH
+       "ASH",          AF_ASH,
+#endif
+#ifdef AF_ECONET
+       "ECONET",       AF_ECONET,
+#endif
+#ifdef AF_ATMSVC
+       "ATMSVC",       AF_ATMSVC,
+#endif
+#ifdef AF_SNA
+       "SNA",          AF_SNA,
+#endif
+#ifdef AF_IRDA
+       "IRDA",         AF_IRDA,
+#endif
+#ifdef AF_PPPOX
+       "PPPOX",        AF_PPPOX,
+#endif
+#ifdef AF_WANPIPE
+       "WANPIPE",      AF_WANPIPE,
+#endif
+#ifdef AF_BLUETOOTH
+       "BLUETOOTH",    AF_BLUETOOTH,
+#endif
+       0
+};
+
+#endif
+
 int
 b_fds(int argc, char** argv, void* context)
 {
@@ -61,13 +163,21 @@
        register char*          x;
        int                     flags;
        int                     details;
+       int                     open_max;
        struct stat             st;
 #ifdef S_IFSOCK
        struct sockaddr_in      addr;
+       char*                   a;
+       unsigned char*          b;
+       unsigned char*          e;
+       socklen_t               addrlen;
        socklen_t               len;
        int                     type;
+       int                     port;
        int                     prot;
-       char                    num[32];
+       char                    nam[256];
+       char                    num[64];
+       char                    fam[64];
 #endif
 
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
@@ -91,78 +201,142 @@
        argv += opt_info.index;
        if (error_info.errors || *argv)
                error(ERROR_USAGE|4, "%s", optusage(NiL));
-       for (i = 0; i <= OPEN_MAX; i++)
+       if ((open_max = getconf("OPEN_MAX")) <= 0)
+               open_max = OPEN_MAX;
+       for (i = 0; i <= open_max; i++)
+       {
                if (fstat(i, &st))
-                       /* not open */;
-               else if (details)
                {
-                       if ((flags = fcntl(i, F_GETFL, (char*)0)) == -1)
-                               m = "--";
-                       else
-                               switch (flags & (O_RDONLY|O_WRONLY|O_RDWR))
-                               {
-                               case O_RDONLY:
-                                       m = "r-";
-                                       break;
-                               case O_WRONLY:
-                                       m = "-w";
-                                       break;
-                               case O_RDWR:
-                                       m = "rw";
-                                       break;
-                               default:
-                                       m = "??";
-                                       break;
-                               }
-                       x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-";
-                       if (isatty(i) && (s = ttyname(i)))
-                               sfprintf(sfstdout, "%02d %s%s %s %s\n", i, m, 
x, fmtmode(st.st_mode, 0), s);
+                       /* not open */
+                       continue;
+               }
+               if (!details)
+               {
+                       sfprintf(sfstdout, "%d\n", i);
+                       continue;
+               }
+               if ((flags = fcntl(i, F_GETFL, (char*)0)) == -1)
+                       m = "--";
+               else
+                       switch (flags & (O_RDONLY|O_WRONLY|O_RDWR))
+                       {
+                       case O_RDONLY:
+                               m = "r-";
+                               break;
+                       case O_WRONLY:
+                               m = "-w";
+                               break;
+                       case O_RDWR:
+                               m = "rw";
+                               break;
+                       default:
+                               m = "??";
+                               break;
+                       }
+               x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-";
+               if (isatty(i) && (s = ttyname(i)))
+               {
+                       sfprintf(sfstdout, "%02d %s%s %s %s\n", i, m, x, 
fmtmode(st.st_mode, 0), s);
+                       continue;
+               }
 #ifdef S_IFSOCK
-                       else if ((len = sizeof(addr))
-                                && !getsockname(i, (struct sockaddr*)&addr, 
(void*)&len)
-                                && len == sizeof(addr)
-                                && addr.sin_family == AF_INET
+               addrlen = sizeof(addr);
+               memset(&addr, 0, addrlen);
+               if (!getsockname(i, (struct sockaddr*)&addr, (void*)&addrlen))
+               {
+                       type = 0;
+                       prot = 0;
 #ifdef SO_TYPE
-                                && (len = sizeof(type))
-                                && !getsockopt(i, SOL_SOCKET, SO_TYPE, 
(void*)&type, (void*)&len)
-                                && len == sizeof(type)
-#else
-                                && !(type = 0)
+                       len = sizeof(type);
+                       if (getsockopt(i, SOL_SOCKET, SO_TYPE, (void*)&type, 
(void*)&len))
+                               type = -1;
 #endif
 #ifdef SO_PROTOTYPE
-                                && (len = sizeof(prot))
-                                && (!getsockopt(i, SOL_SOCKET, SO_PROTOTYPE, 
(void*)&prot, (void*)&len) || !(prot = 0))
-#else
-                                && !(prot = 0)
+                       len = sizeof(prot);
+                       if (getsockopt(i, SOL_SOCKET, SO_PROTOTYPE, 
(void*)&prot, (void*)&len))
+                               prot = -1;
 #endif
-                               )
+                       if (!st.st_mode)
+                               st.st_mode = S_IFSOCK|S_IRUSR|S_IWUSR;
+                       s = 0;
+                       switch (type)
                        {
-                               if (!st.st_mode)
-                                       st.st_mode = S_IFSOCK|S_IRUSR|S_IWUSR;
-                               s = 0;
-                               switch (type)
+                       case SOCK_DGRAM:
+                               switch (addr.sin_family)
                                {
-                               case SOCK_DGRAM:
+                               case AF_INET:
+#ifdef AF_INET6
+                               case AF_INET6:
+#endif
                                        s = "udp";
                                        break;
-                               case SOCK_STREAM:
-                                       if (prot == 0)
-                                               s = "tcp";
+                               }
+                               break;
+                       case SOCK_STREAM:
+                               switch (addr.sin_family)
+                               {
+                               case AF_INET:
+#ifdef AF_INET6
+                               case AF_INET6:
+#endif
 #ifdef IPPROTO_SCTP
-                                       else if (prot == IPPROTO_SCTP)
+                                       if (prot == IPPROTO_SCTP)
                                                s = "sctp";
+                                       else
 #endif
+                                               s = "tcp";
                                        break;
                                }
-                               if (!s)
-                                       sfprintf(sfstdout, s = num, 
"type.%d.prot.%d", type, prot);
-                               sfprintf(sfstdout, "%02d %s%s %s 
/dev/%s/%s/%d\n", i, m, x, fmtmode(st.st_mode, 0), s, inet_ntoa(addr.sin_addr), 
ntohs(addr.sin_port));
+                               break;
+#ifdef SOCK_RAW
+                       case SOCK_RAW:
+                               s = "raw";
+                               break;
+#endif
+#ifdef SOCK_RDM
+                       case SOCK_RDM:
+                               s = "rdm";
+                               break;
+#endif
+#ifdef SOCK_SEQPACKET
+                       case SOCK_SEQPACKET:
+                               s = "seqpacket";
+                               break;
+#endif
                        }
+                       if (!s)
+                       {
+                               for (type = 0; family[type].name && 
family[type].value != addr.sin_family; type++);
+                               if (!(s = (char*)family[type].name))
+                                       sfsprintf(s = num, sizeof(num), 
"family.%d", addr.sin_family);
+                       }
+                       port = 0;
+#ifdef INET6_ADDRSTRLEN
+                       if (a = (char*)inet_ntop(addr.sin_family, 
&addr.sin_addr, nam, sizeof(nam)))
+                               port = ntohs(addr.sin_port);
+                       else
 #endif
+                       if (addr.sin_family == AF_INET)
+                       {
+                               a = inet_ntoa(addr.sin_addr);
+                               port = ntohs(addr.sin_port);
+                       }
+                       else
+                       {
+                               a = fam;
+                               e = (b = (unsigned char*)&addr) + addrlen;
+                               while (b < e && a < &fam[sizeof(fam)-1])
+                                       a += sfsprintf(a, &fam[sizeof(fam)] - a 
- 1, ".%d", *b++);
+                               a = fam + 1;
+                       }
+                       if (port)
+                               sfprintf(sfstdout, "%02d %s%s %s 
/dev/%s/%s/%d\n", i, m, x, fmtmode(st.st_mode, 0), s, a, port);
                        else
-                               sfprintf(sfstdout, "%02d %s%s %s 
/dev/inode/%u/%u\n", i, m, x, fmtmode(st.st_mode, 0), st.st_dev, st.st_ino);
+                               sfprintf(sfstdout, "%02d %s%s %s /dev/%s/%s\n", 
i, m, x, fmtmode(st.st_mode, 0), s, a);
+                       continue;
                }
-               else
-                       sfprintf(sfstdout, "%d\n", i);
+#endif
+               sfprintf(sfstdout, "%02d %s%s %s /dev/inode/%u/%u\n", i, m, x, 
fmtmode(st.st_mode, 0), st.st_dev, st.st_ino);
+       }
        return 0;
 }
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/getconf.c 
ksh93_2007_05_15/src/lib/libcmd/getconf.c
--- ksh93_2007_04_18/src/lib/libcmd/getconf.c   2007-02-07 21:08:17.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/getconf.c   2007-05-09 06:09:07.000000000 
+0200
@@ -121,7 +121,7 @@
 
 typedef struct Path_s
 {
-       char*           path;
+       const char*     path;
        int             len;
 } Path_t;
 
@@ -131,8 +131,8 @@
        register char*          name;
        register char*          path;
        register char*          value;
-       register char*          s;
-       register char*          t;
+       register const char*    s;
+       register const char*    t;
        char*                   pattern;
        char*                   native;
        char*                   cmd;
@@ -387,7 +387,8 @@
         * don't blame us for crappy diagnostics
         */
 
-       if ((n = procrun(cmd, oargv)) >= EXIT_NOEXEC)
+       oargv[0] = cmd;
+       if ((n = sh_run(context, argc, oargv)) >= EXIT_NOEXEC)
                error(ERROR_SYSTEM|2, "%s: exec error [%d]", cmd, n);
        return n;
 }
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/join.c 
ksh93_2007_05_15/src/lib/libcmd/join.c
--- ksh93_2007_04_18/src/lib/libcmd/join.c      2006-11-02 16:39:53.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/join.c      2007-05-08 23:15:39.000000000 
+0200
@@ -134,6 +134,7 @@
        int             ignorecase;
        char*           same;
        int             samesize;
+       void*           context;
        File_t          file[2];
 } Join_t;
 
@@ -269,7 +270,7 @@
        register char*          cp;
        register int            n = 0;
 
-       if (cmdquit())
+       if (sh_checksig(jp->context))
                return 0;
        if (discard && fp->discard)
                sfraise(fp->iop, SFSK_DISCARD, NiL);
@@ -666,6 +667,7 @@
 #endif
        if (!(jp = init()))
                error(ERROR_system(1),"out of space");
+       jp->context = context;
        for (;;)
        {
                switch (n = optget(argv, usage))
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/Makefile 
ksh93_2007_05_15/src/lib/libcmd/Makefile
--- ksh93_2007_04_18/src/lib/libcmd/Makefile    2007-02-26 17:32:20.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/Makefile    2007-05-08 23:56:08.000000000 
+0200
@@ -26,7 +26,7 @@
 sumlib.o : +lsum
        $(AR) x $(*:O=1) $(<)
 
-$(INCLUDEDIR) :INSTALLPROTO: cmd.h cmdext.h cmdlist.h
+$(INCLUDEDIR) :INSTALLPROTO: cmd.h cmdext.h cmdlist.h shcmd.h
 
 "win32*" :NOOPTIMIZE: id.c
 
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/Mamfile 
ksh93_2007_05_15/src/lib/libcmd/Mamfile
--- ksh93_2007_04_18/src/lib/libcmd/Mamfile     2007-04-18 20:07:33.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libcmd/Mamfile     2007-05-16 05:16:05.000000000 
+0200
@@ -432,6 +432,8 @@
 exec - else    mv 1.${COTEMP}.h cmdext.h
 exec - fi
 done cmdext.h dontcare generated
+make shcmd.h implicit
+done shcmd.h dontcare
 make ${PACKAGE_ast_INCLUDE}/stak.h implicit
 prev ${PACKAGE_ast_INCLUDE}/stk.h implicit
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
@@ -778,6 +780,14 @@
 exec - else    mv 1.${COTEMP}.x ${PACKAGE_ast_INCLUDE}/cmdlist.h
 exec - fi
 done ${PACKAGE_ast_INCLUDE}/cmdlist.h generated
+make ${PACKAGE_ast_INCLUDE}/shcmd.h
+prev shcmd.h
+exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1992,author=gsf+dgk'  shcmd.h  > 1.${COTEMP}.x
+exec - if      cmp 2>/dev/null -s ${PACKAGE_ast_INCLUDE}/shcmd.h 1.${COTEMP}.x
+exec - then    rm -f 1.${COTEMP}.x
+exec - else    mv 1.${COTEMP}.x ${PACKAGE_ast_INCLUDE}/shcmd.h
+exec - fi
+done ${PACKAGE_ast_INCLUDE}/shcmd.h generated
 done install virtual
 make test
 done test dontcare virtual
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/mkdir.c 
ksh93_2007_05_15/src/lib/libcmd/mkdir.c
--- ksh93_2007_04_18/src/lib/libcmd/mkdir.c     2006-11-01 21:16:49.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/mkdir.c     2007-04-26 02:39:36.000000000 
+0200
@@ -27,7 +27,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: mkdir (AT&T Research) 2006-08-27 $\n]"
+"[-?\n@(#)$Id: mkdir (AT&T Research) 2007-04-25 $\n]"
 USAGE_LICENSE
 "[+NAME?mkdir - make directories]"
 "[+DESCRIPTION?\bmkdir\b creates one or more directories.  By "
@@ -70,6 +70,7 @@
        register int    pflag = 0;
        char*           name;
        mode_t          dmode;
+       struct stat     st;
 
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
        while (n = optget(argv, usage)) switch (n)
@@ -142,7 +143,19 @@
                                        error(ERROR_system(0), "%s:", name);
                                        break;
                                }
-                               *arg = n;
+                               if (!(*arg = n) && (mode & 
(S_ISVTX|S_ISUID|S_ISGID)))
+                               {
+                                       if (stat(name, &st))
+                                       {
+                                               error(ERROR_system(0), "%s: 
cannot stat", name);
+                                               break;
+                                       }
+                                       if ((st.st_mode & 
(S_ISVTX|S_ISUID|S_ISGID)) != (mode & (S_ISVTX|S_ISUID|S_ISGID)) && chmod(name, 
mode))
+                                       {
+                                               error(ERROR_system(0), "%s: 
cannot change mode from %s to %s", name, fmtperm(st.st_mode & 
(S_ISVTX|S_ISUID|S_ISGID)), fmtperm(mode));
+                                               break;
+                                       }
+                               }
                        }
                }
        }
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/pathchk.c 
ksh93_2007_05_15/src/lib/libcmd/pathchk.c
--- ksh93_2007_04_18/src/lib/libcmd/pathchk.c   2006-11-01 21:16:58.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/pathchk.c   2007-04-24 11:58:24.000000000 
+0200
@@ -78,9 +78,9 @@
  */ 
 static long mypathconf(const char *path, int op)
 {
-       register long r;
+       register long                   r;
 
-       static const char*      ops[] = { "NAME_MAX", "PATH_MAX" };
+       static const char* const        ops[] = { "NAME_MAX", "PATH_MAX" };
 
        errno=0;
        if((r=strtol(astconf(ops[op], path, NiL), NiL, 0))<0 && errno==0)
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/RELEASE 
ksh93_2007_05_15/src/lib/libcmd/RELEASE
--- ksh93_2007_04_18/src/lib/libcmd/RELEASE     2007-03-29 18:54:35.000000000 
+0200
+++ ksh93_2007_05_15/src/lib/libcmd/RELEASE     2007-05-11 21:32:32.000000000 
+0200
@@ -1,4 +1,10 @@
-07-03-28 date.c: add --unelepsed=scale, -U: fmtelapsed() => strelapsed()
+07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify >= 20070511 context
+07-05-09 fds.c: handle ipv6 sockets
+07-05-09 cmd.h: <shbltin.h> : cmdquit() => sh_checksig(context)
+07-04-25 mkdir.c: force (S_ISVTX|S_ISUID|S_ISGID) after mkdir(2)
+07-04-24 procrun.c: add -last intercept => sh_run() and whence -q
+07-04-19 uname.c: name operands first checked for CS_NAME, then NAME
+07-03-28 date.c: add --unelapsed=scale, -U: fmtelapsed() => strelapsed()
 07-03-25 wclib.h: iswspace() requires <wctype.h>!
 07-03-11 tty.c: add sysV --line-number, -l
 07-02-26 Makefile: sumlib.o: direct extract from +lsum (vcodex someday)
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/rm.c 
ksh93_2007_05_15/src/lib/libcmd/rm.c
--- ksh93_2007_04_18/src/lib/libcmd/rm.c        2006-11-21 10:36:33.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/rm.c        2007-05-09 05:54:53.000000000 
+0200
@@ -108,8 +108,6 @@
        int             v;
        struct stat     st;
 
-       if (cmdquit())
-               return -1;
        if (ent->fts_info == FTS_NS || ent->fts_info == FTS_ERR || 
ent->fts_info == FTS_SLNONE)
        {
                if (!state->force)
@@ -403,7 +401,7 @@
                set3d = 0;
        if (fts = fts_open(argv, FTS_PHYSICAL, NiL))
        {
-               while ((ent = fts_read(fts)) && !rm(&state, ent));
+               while (!sh_checksig(context) && (ent = fts_read(fts)) && 
!rm(&state, ent));
                fts_close(fts);
        }
        else if (!state.force)
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/shcmd.h 
ksh93_2007_05_15/src/lib/libcmd/shcmd.h
--- ksh93_2007_04_18/src/lib/libcmd/shcmd.h     1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/shcmd.h     2007-05-09 06:11:15.000000000 
+0200
@@ -0,0 +1,80 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1992-2007 AT&T Knowledge Ventures            *
+*                      and is licensed under the                       *
+*                  Common Public License, Version 1.0                  *
+*                      by AT&T Knowledge Ventures                      *
+*                                                                      *
+*                A copy of the License is available at                 *
+*            http://www.opensource.org/licenses/cpl1.0.txt             *
+*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
+*                                                                      *
+*              Information and Software Systems Research               *
+*                            AT&T Research                             *
+*                           Florham Park NJ                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * ksh builtin command api
+ */
+
+#ifndef _SHCMD_H
+#define _SHCMD_H       1
+
+#ifndef SH_VERSION
+#   define Shell_t     void
+#endif
+#ifndef NV_DEFAULT
+#   define Namval_t    void
+#endif
+#ifndef ERROR_NOTIFY
+#   define ERROR_NOTIFY        1
+#endif
+
+typedef int (*Shbltin_f)(int, char**, void*);
+
+#undef Shbltin_t
+typedef struct Shbltin_s
+{
+       Shell_t         *shp;
+       void            *ptr;
+       int             version;
+       int             (*shrun)(int, char**);
+       int             (*shtrap)(const char*, int);
+       void            (*shexit)(int);
+       Namval_t        *(*shbltin)(const char*, Shbltin_f, void*);
+       unsigned char   notify;
+       unsigned char   sigset;
+       unsigned char   nosfio;
+       Namval_t        *bnode;
+       Namval_t        *vnode;
+       char            *data;
+       int             flags;
+} Shbltin_t;
+
+#if defined(SH_VERSION) ||  defined(_SH_PRIVATE)
+#   undef Shell_t
+#   undef Namval_t
+#else 
+#   define sh_run(c, ac, av)   ((c)?(*((Shbltin_t*)(c))->shrun)(ac,av):-1)
+#   define sh_system(c,str)    
((c)?(*((Shbltin_t*)(c))->shtrap)(str,0):system(str))
+#   define sh_exit(c,n)                
((c)?(*((Shbltin_t*)(c))->shexit)(n):exit(n))
+#   define sh_checksig(c)      ((c) && ((Shbltin_t*)(c))->sigset)
+#   if defined(SFIO_VERSION) || defined(_AST_H)
+#      define LIB_INIT(c)
+#   else
+#      define LIB_INIT(c)      ((c) && (((Shbltin_t*)(c))->nosfio = 1))
+#   endif
+#   ifndef _CMD_H
+#      define cmdinit(ac,av,c,cat,flg)         do { if((ac)<=0) return(0); \
+           (((Shbltin_t*)(c))->notify = ((flg)&ERROR_NOTIFY)?1:0);} while(0)
+#   endif
+#endif
+
+#endif
diff -r -N -u ksh93_2007_04_18/src/lib/libcmd/uname.c 
ksh93_2007_05_15/src/lib/libcmd/uname.c
--- ksh93_2007_04_18/src/lib/libcmd/uname.c     2007-01-22 21:49:20.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libcmd/uname.c     2007-05-09 06:09:41.000000000 
+0200
@@ -28,7 +28,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: uname (AT&T Research) 2007-01-22 $\n]"
+"[-?\n@(#)$Id: uname (AT&T Research) 2007-04-19 $\n]"
 USAGE_LICENSE
 "[+NAME?uname - identify the current system ]"
 "[+DESCRIPTION?By default \buname\b writes the operating system name to"
@@ -61,7 +61,9 @@
 "[f:list?List all \bsysinfo\b(2) names and values, one per line.]"
 "[S:sethost?Set the hostname or nodename to \aname\a. No output is"
 "      written to standard output.]:[name]"
-
+"\n"
+"\n[ name ... ]\n"
+"\n"
 "[+SEE ALSO?\bhostname\b(1), \bgetconf\b(1), \buname\b(2),"
 "      \bsysconf\b(2), \bsysinfo\b(2)]"
 ;
@@ -327,7 +329,7 @@
                        if (!streq(argv[0], s) && (!eaccess(s, X_OK) || 
!eaccess(s+=4, X_OK)))
                        {
                                argv[0] = s;
-                               return procrun(s, argv);
+                               return sh_run(context, argc, argv);
                        }
                        error(2, "%s", opt_info.arg);
                        break;
@@ -367,7 +369,7 @@
                        while (t < e && (n = *s++))
                                *t++ = islower(n) ? toupper(n) : n;
                        *t = 0;
-                       sfprintf(sfstdout, "%s%c", *(t = astconf(buf, NiL, 
NiL)) ? t : "unknown", *argv ? ' ' : '\n');
+                       sfprintf(sfstdout, "%s%c", *(t = astconf(buf, NiL, 
NiL)) ? t : *(t = astconf(buf+3, NiL, NiL)) ? t :  "unknown", *argv ? ' ' : 
'\n');
                }
        }
        else
diff -r -N -u ksh93_2007_04_18/src/lib/libsum/sum-md5.c 
ksh93_2007_05_15/src/lib/libsum/sum-md5.c
--- ksh93_2007_04_18/src/lib/libsum/sum-md5.c   2007-02-23 19:09:12.000000000 
+0100
+++ ksh93_2007_05_15/src/lib/libsum/sum-md5.c   2007-04-24 12:06:53.000000000 
+0200
@@ -65,7 +65,7 @@
        unsigned char   digest_sum[16]; /* sum of all digests           */
 } Md5_t;
 
-static unsigned char   md5_pad[] =
+static const unsigned char     md5_pad[] =
 {
        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

Reply via email to