On 12/22/06, Glenn Fowler <gsf at research.att.com> wrote:
>
> new alpha source packages have been posted
> we believe that the multibyte problems have been addressed
> please put it throught the wringer
> we'd like to post official ast source before the new year
>
> thanks to all who helped improve this release
> peace in the new year
>
> the base archives and md5 sums are:
>
>    http://www.research.att.com/~gsf/download/alpha/INIT.2006-12-22.md5
>    http://www.research.att.com/~gsf/download/alpha/INIT.2006-12-22.tgz
>    http://www.research.att.com/~gsf/download/alpha/ast-ksh.2006-12-22.md5
>    http://www.research.att.com/~gsf/download/alpha/ast-ksh.2006-12-22.tgz
>
> -- Glenn Fowler -- AT&T Research, Florham Park NJ --
patch diff from 20061207 to 20061222 attached
-- 
      _        Felix Schulte
    _|_|_     mailto:felix.schulte at gmail.com
    (0 0)
ooO--(_)--Ooo
-------------- next part --------------
diff -r -N -u ksh93_2006_12_07/lib/package/ast-ksh.html 
ksh93_2006_12_22/lib/package/ast-ksh.html
--- ksh93_2006_12_07/lib/package/ast-ksh.html   2006-12-09 06:55:50.000000000 
+0100
+++ ksh93_2006_12_22/lib/package/ast-ksh.html   2006-12-22 15:06:43.000000000 
+0100
@@ -192,7 +192,10 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="ksh93 
changes">ksh93 changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
-06-11-20  --- Release ksh93s  ---
+06-12-18  --- Release ksh93s  ---
+06-12-19  A -v option was added to read.  With this option the value of
+         the first variable name argument will become the default value
+         when read from a terminal device. 
 06-11-20  A bug in which "${foo&#0091;@&#0093;:1}}" expands a null argument 
(instead of
          no argument), when foo&#0091;0&#0093; is not empty has been fixed. 
 06-11-16  The discipline functions have been modified to allow each subscript
@@ -1615,6 +1618,10 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libast 
changes">libast changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+06-12-20 features/libpath.sh: generalize sol.* LIBPATH patterns
+06-12-18 comp/setlocale.c: include ast_standards.h and ast_wchar.h !
+06-12-12 string/strperm.c: octal modes are absolute!
+06-12-11 comp/conf.tab: always defer ARG_MAX
 06-12-07 Makefile: fix conftab.c generation CCFLAGS to match build - doh
 06-12-04 sfio/sfcvt.c: fix (int) vs. (long) cast mismatches
 06-12-01 comp/conf.tab: add changes to cover solaris { bin xpg4 xpg6 }
@@ -3261,7 +3268,7 @@
 <TR>
 <TD align=left></TD>
 <TD align=center></TD>
-<TD align=right>December 09, 2006</TD>
+<TD align=right>December 22, 2006</TD>
 </TR>
 </TABLE>
 <P>
diff -r -N -u ksh93_2006_12_07/lib/package/ast-ksh.README 
ksh93_2006_12_22/lib/package/ast-ksh.README
--- ksh93_2006_12_07/lib/package/ast-ksh.README 2006-12-08 19:40:32.000000000 
+0100
+++ ksh93_2006_12_22/lib/package/ast-ksh.README 2006-12-22 15:06:43.000000000 
+0100
@@ -92,7 +92,10 @@
 
 :::::::: ksh93 ::::::::
 
-06-11-20  --- Release ksh93s  ---
+06-12-18  --- Release ksh93s  ---
+06-12-19  A -v option was added to read.  With this option the value of
+         the first variable name argument will become the default value
+         when read from a terminal device. 
 06-11-20  A bug in which "${f...@]:1}}" expands a null argument (instead of
          no argument), when foo[0] is not empty has been fixed. 
 06-11-16  The discipline functions have been modified to allow each subscript
@@ -1512,6 +1515,10 @@
 
 :::::::: libast ::::::::
 
+06-12-20 features/libpath.sh: generalize sol.* LIBPATH patterns
+06-12-18 comp/setlocale.c: include ast_standards.h and ast_wchar.h !
+06-12-12 string/strperm.c: octal modes are absolute!
+06-12-11 comp/conf.tab: always defer ARG_MAX
 06-12-07 Makefile: fix conftab.c generation CCFLAGS to match build - doh
 06-12-04 sfio/sfcvt.c: fix (int) vs. (long) cast mismatches
 06-12-01 comp/conf.tab: add changes to cover solaris { bin xpg4 xpg6 }
diff -r -N -u ksh93_2006_12_07/lib/package/ast-ksh.ver 
ksh93_2006_12_22/lib/package/ast-ksh.ver
--- ksh93_2006_12_07/lib/package/ast-ksh.ver    2006-12-08 02:04:35.000000000 
+0100
+++ ksh93_2006_12_22/lib/package/ast-ksh.ver    2006-12-22 15:06:42.000000000 
+0100
@@ -1 +1 @@
-ast-ksh 2006-12-07 2006-12-07 1
+ast-ksh 2006-12-22 2006-12-22 1
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/bltins/read.c 
ksh93_2006_12_22/src/cmd/ksh93/bltins/read.c
--- ksh93_2006_12_07/src/cmd/ksh93/bltins/read.c        2006-09-05 
23:45:40.000000000 +0200
+++ ksh93_2006_12_22/src/cmd/ksh93/bltins/read.c        2006-12-19 
20:19:01.000000000 +0100
@@ -43,8 +43,9 @@
 #define        S_FLAG  2       /* save in history file */
 #define        A_FLAG  4       /* read into array */
 #define N_FLAG 8       /* fixed size read at most */
-#define NN_FLAG        16      /* fixed size read exact */
-#define D_FLAG 6       /* must be number of bits for all flags */
+#define NN_FLAG        0x10    /* fixed size read exact */
+#define V_FLAG 0x20    /* use default value */
+#define D_FLAG 8       /* must be number of bits for all flags */
 
 int    b_read(int argc,char *argv[], void *extra)
 {
@@ -68,8 +69,9 @@
            case 'd':
                if(opt_info.arg && *opt_info.arg!='\n')
                {
+                       char *cp = opt_info.arg;
                        flags &= ~((1<<D_FLAG)-1);
-                       flags |= ((*opt_info.arg)<< D_FLAG);
+                       flags |= (mbchar(cp)<< D_FLAG);
                }
                break;
            case 'p':
@@ -96,6 +98,9 @@
                if(sh_inuse(fd))
                        fd = -1;
                break;
+           case 'v':
+               flags |= V_FLAG;
+               break;
            case ':':
                errormsg(SH_DICT,2, "%s", opt_info.arg);
                break;
@@ -208,6 +213,8 @@
                if(val= strchr(name,'?'))
                        *val = 0;
                np = nv_open(name,shp->var_tree,NV_NOASSIGN|NV_VARNAME);
+               if((flags&V_FLAG) && shp->ed_context)
+                       ((struct edit*)shp->ed_context)->e_default = np;
                if(flags&A_FLAG)
                {
                        flags &= ~A_FLAG;
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/data/builtins.c 
ksh93_2006_12_22/src/cmd/ksh93/data/builtins.c
--- ksh93_2006_12_07/src/cmd/ksh93/data/builtins.c      2006-10-27 
21:10:30.000000000 +0200
+++ ksh93_2006_12_22/src/cmd/ksh93/data/builtins.c      2006-12-19 
20:16:28.000000000 +0100
@@ -1225,7 +1225,7 @@
 ;
 
 const char sh_optread[] =
-"[-1c?\n@(#)$Id: read (AT&T Research) 2003-05-19 $\n]"
+"[-1c?\n@(#)$Id: read (AT&T Research) 2006-12-19 $\n]"
 USAGE_LICENSE
 "[+NAME?read - read a line from standard input]"
 "[+DESCRIPTION?\bread\b reads a line from standard input and breaks it "
@@ -1258,6 +1258,8 @@
        "will be in bytes.]"
 "[N]#[nbyte?Read exactly \ansize\a characters.  For binary fields \asize\a "
        "will be in bytes.]"
+"[v?When reading from a terminal the value of the first variable is displayed "
+       "and used as a default value.]"
 "\n"
 "\n[var?prompt] [var ...]\n"
 "\n"
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/edit/edit.c 
ksh93_2006_12_22/src/cmd/ksh93/edit/edit.c
--- ksh93_2006_12_07/src/cmd/ksh93/edit/edit.c  2006-10-05 08:46:18.000000000 
+0200
+++ ksh93_2006_12_22/src/cmd/ksh93/edit/edit.c  2006-12-19 16:32:15.000000000 
+0100
@@ -748,6 +748,16 @@
 #endif
                ep->e_wsize = MAXLINE - (ep->e_plen-2);
        }
+       if(ep->e_default && (pp = nv_getval(ep->e_default)))
+       {
+               n = strlen(pp);
+               if(n > LOOKAHEAD)
+                       n = LOOKAHEAD;
+               ep->e_lookahead = n;
+               while(n-- > 0)
+                       ep->e_lbuf[n] = *pp++;
+               ep->e_default = 0;
+       }
 }
 
 /*
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/features/poll 
ksh93_2006_12_22/src/cmd/ksh93/features/poll
--- ksh93_2006_12_07/src/cmd/ksh93/features/poll        2005-12-02 
17:47:26.000000000 +0100
+++ ksh93_2006_12_22/src/cmd/ksh93/features/poll        2006-12-10 
10:27:00.000000000 +0100
@@ -1,6 +1,7 @@
 hdr,sys        poll,socket,netinet/in
 lib    select,poll,socket
 lib    htons,htonl sys/types.h sys/socket.h netinet/in.h
+lib    getaddrinfo sys/types.h sys/socket.h netdb.h
 typ    fd_set sys/socket.h sys/select.h
 tst    pipe_socketpair note{ use socketpair() for peekable pipe() }end execute{
        #include <ast.h>
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/include/edit.h 
ksh93_2006_12_22/src/cmd/ksh93/include/edit.h
--- ksh93_2006_12_07/src/cmd/ksh93/include/edit.h       2006-08-30 
18:21:52.000000000 +0200
+++ ksh93_2006_12_22/src/cmd/ksh93/include/edit.h       2006-12-19 
15:41:39.000000000 +0100
@@ -148,6 +148,7 @@
        int     e_multiline;    /* allow multiple lines for editing */
        int     e_winsz;        /* columns in window */ 
        Edpos_t e_curpos;       /* cursor line and column */
+       Namval_t *e_default;    /* variable containing default value */
        Namval_t *e_term;       /* TERM variable */
        char    e_termname[80]; /* terminal name */
 } Edit_t;
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/Mamfile 
ksh93_2006_12_22/src/cmd/ksh93/Mamfile
--- ksh93_2006_12_07/src/cmd/ksh93/Mamfile      2006-12-09 07:48:53.000000000 
+0100
+++ ksh93_2006_12_22/src/cmd/ksh93/Mamfile      2006-12-22 20:21:00.000000000 
+0100
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-07
+info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-12
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/RELEASE 
ksh93_2006_12_22/src/cmd/ksh93/RELEASE
--- ksh93_2006_12_07/src/cmd/ksh93/RELEASE      2006-11-21 21:44:02.000000000 
+0100
+++ ksh93_2006_12_22/src/cmd/ksh93/RELEASE      2006-12-19 20:21:08.000000000 
+0100
@@ -1,4 +1,7 @@
-06-11-20  --- Release ksh93s  ---
+06-12-18  --- Release ksh93s  ---
+06-12-19  A -v option was added to read.  With this option the value of
+         the first variable name argument will become the default value
+         when read from a terminal device. 
 06-11-20  A bug in which "${f...@]:1}}" expands a null argument (instead of
          no argument), when foo[0] is not empty has been fixed. 
 06-11-16  The discipline functions have been modified to allow each subscript
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/sh/io.c 
ksh93_2006_12_22/src/cmd/ksh93/sh/io.c
--- ksh93_2006_12_07/src/cmd/ksh93/sh/io.c      2006-11-17 23:20:44.000000000 
+0100
+++ ksh93_2006_12_22/src/cmd/ksh93/sh/io.c      2006-12-11 20:27:10.000000000 
+0100
@@ -18,6 +18,7 @@
 *                                                                      *
 ***********************************************************************/
 #pragma prototyped
+
 /*
  * Input/output file processing
  *
@@ -84,10 +85,222 @@
 #         define pipe(v) 
((socketpair(AF_UNIX,SOCK_STREAM,0,v)<0||shutdown((v)[0],1)<0||shutdown((v)[1],0)<0)?(-1):0)
 #      endif
 #   endif
-    static int str2inet(const char*, struct sockaddr_in*);
-#   define SOCKET      1
+
+#if !_lib_getaddrinfo
+
+#undef EAI_SYSTEM
+
+#define EAI_SYSTEM             1
+
+#undef addrinfo
+#undef getaddrinfo
+#undef freeaddrinfo
+
+#define addrinfo               local_addrinfo
+#define getaddrinfo            local_getaddrinfo
+#define freeaddrinfo           local_freeaddrinfo
+
+struct addrinfo
+{
+        int                    ai_flags;
+        int                    ai_family;
+        int                    ai_socktype;
+        int                    ai_protocol;
+        socklen_t              ai_addrlen;
+        struct sockaddr*       ai_addr;
+        struct addrinfo*       ai_next;
+};
+
+static int
+getaddrinfo(const char* node, const char* service, const struct addrinfo* 
hint, struct addrinfo **addr)
+{
+       unsigned long           ip_addr = 0;
+       unsigned short          ip_port = 0;
+       struct addrinfo*        ap;
+       struct hostent*         hp;
+       struct sockaddr_in*     ip;
+       char*                   prot;
+       long                    n;
+       
+       if (!(hp = gethostbyname(node)) || hp->h_addrtype!=AF_INET || 
hp->h_length>sizeof(struct in_addr))
+       {
+               errno = EADDRNOTAVAIL;
+               return EAI_SYSTEM;
+       }
+       ip_addr = (unsigned long)((struct in_addr*)hp->h_addr)->s_addr;
+       if ((n = strtol(service, &prot, 10)) > 0 && n <= USHRT_MAX && !*prot)
+               ip_port = htons((unsigned short)n);
+       else
+       {
+               struct servent* sp;
+               const char*     protocol = 0;
+
+               if (hint)
+                       switch (hint->ai_socktype)
+                       {
+                       case SOCK_STREAM:
+                               switch (hint->ai_protocol)
+                               {
+                               case 0:           
+                                       protocol = "tcp";
+                                       break;
+#ifdef IPPROTO_SCTP
+                               case IPPROTO_SCTP:
+                                       protocol = "sctp";
+                                       break;
+#endif
+                               }
+                               break;
+                       case SOCK_DGRAM:
+                               protocol = "udp";
+                               break;
+                       }
+               if (!protocol)
+               {
+                       errno =  EPROTONOSUPPORT;
+                       return 1;
+               }
+               if (sp = getservbyname(service, protocol))
+                       ip_port = sp->s_port;
+       }
+       if (!ip_port)
+       {
+               errno = EADDRNOTAVAIL;
+               return EAI_SYSTEM;
+       }
+       if (!(ap = newof(0, struct addrinfo, 1, sizeof(struct sockaddr_in))))
+               return EAI_SYSTEM;
+       if (hint)
+               *ap = *hint;
+       ap->ai_family = hp->h_addrtype;
+       ap->ai_addrlen  = sizeof(struct sockaddr_in);
+       ap->ai_addr = (struct sockaddr *)(ap+1);
+       ip = (struct sockaddr_in *)ap->ai_addr;
+       ip->sin_family = AF_INET;
+       ip->sin_port = ip_port;
+       ip->sin_addr.s_addr = ip_addr;
+       *addr = ap;
+       return 0;
+}
+
+static void
+freeaddrinfo(struct addrinfo* ap)
+{
+       if (ap)
+               free(ap);
+}
+
+#endif
+
+/*
+ * return <protocol>/<host>/<service> fd
+ */
+
+typedef int (*Inetintr_f)(struct addrinfo*, void*);
+
+static int
+inetopen(const char* path, int server, Inetintr_f onintr, void* handle)
+{
+       register char*          s;
+       register char*          t;
+       int                     fd;
+       int                     oerrno;
+       struct addrinfo         hint;
+       struct addrinfo*        addr;
+       struct addrinfo*        p;
+
+       memset(&hint, 0, sizeof(hint));
+       hint.ai_family = PF_UNSPEC;
+       switch (path[0])
+       {
+#ifdef IPPROTO_SCTP
+       case 's':
+               if (path[1]!='c' || path[2]!='t' || path[3]!='p' || 
path[4]!='/')
+               {
+                       errno = ENOTDIR;
+                       return -1;
+               }
+               hint.ai_socktype = SOCK_STREAM;
+               hint.ai_protocol = IPPROTO_SCTP;
+               path += 5;
+               break;
+#endif
+       case 't':
+               if (path[1]!='c' || path[2]!='p' || path[3]!='/')
+               {
+                       errno = ENOTDIR;
+                       return -1;
+               }
+               hint.ai_socktype = SOCK_STREAM;
+               path += 4;
+               break;
+       case 'u':
+               if (path[1]!='d' || path[2]!='p' || path[3]!='/')
+               {
+                       errno = ENOTDIR;
+                       return -1;
+               }
+               hint.ai_socktype = SOCK_DGRAM;
+               path += 4;
+               break;
+       default:
+               errno = ENOTDIR;
+               return -1;
+       }
+       if (!(s = strdup(path)))
+               return -1;
+       if (t = strchr(s, '/'))
+       {
+               *t++ = 0;
+               if (streq(s, "local"))
+                       s = "localhost";
+               fd = getaddrinfo(s, t, &hint, &addr);
+       }
+       else
+               fd = -1;
+       free(s);
+       if (fd)
+       {
+               if (fd != EAI_SYSTEM)
+                       errno = ENOTDIR;
+               return -1;
+       }
+       oerrno = errno;
+       errno = 0;
+       fd = -1;
+       for (p = addr; p; p = p->ai_next)
+       {
+               /*
+                * some api's don't take the hint
+                */
+
+               if (!p->ai_protocol)
+                       p->ai_protocol = hint.ai_protocol;
+               if (!p->ai_socktype)
+                       p->ai_socktype = hint.ai_socktype;
+               while ((fd = socket(p->ai_family, p->ai_socktype, 
p->ai_protocol)) >= 0)
+               {
+                       if (server && !bind(fd, p->ai_addr, p->ai_addrlen) && 
!listen(fd, 5) || !server && !connect(fd, p->ai_addr, p->ai_addrlen))
+                               goto done;
+                       close(fd);
+                       fd = -1;
+                       if (errno != EINTR || !onintr)
+                               break;
+                       if ((*onintr)(addr, handle))
+                               return -1;
+               }
+       }
+ done:
+       freeaddrinfo(addr);
+       if (fd >= 0)
+               errno = oerrno;
+       return fd;
+}
+
 #else
-#   undef SOCKET
+
+#undef O_SERVICE
+
 #endif
 
 struct fdsave
@@ -97,7 +310,6 @@
        int     subshell;       /* saved for subshell */
 };
 
-
 static int     subexcept(Sfio_t*, int, void*, Sfdisc_t*);
 static int     eval_exceptf(Sfio_t*, int, void*, Sfdisc_t*);
 static int     slowexcept(Sfio_t*, int, void*, Sfdisc_t*);
@@ -370,6 +582,22 @@
        return(r);
 }
 
+static int
+onintr(struct addrinfo* addr, void* handle)
+{
+       Shell_t*        sh = (Shell_t*)handle;
+
+       if (sh->trapnote&SH_SIGSET)
+       {
+               freeaddrinfo(addr);
+               sh_exit(SH_EXITSIG);
+               return -1;
+       }
+       if (sh->trapnote)
+               sh_chktrap();
+       return 0;
+}
+
 /*
  * Mimic open(2) with checks for pseudo /dev/ files.
  */
@@ -378,12 +606,6 @@
        register int            fd = -1;
        mode_t                  mode;
        char                    *e;
-#ifdef SOCKET
-       int                     type = -1;
-       int                     prot = -1;
-       int                     info = 0;
-       struct sockaddr_in      addr;
-#endif /* SOCKET */
        va_list                 ap;
        va_start(ap, flags);
        mode = (flags & O_CREAT) ? va_arg(ap, int) : 0;
@@ -395,6 +617,7 @@
                return(-1);
        }
        if (path[0]=='/' && path[1]=='d' && path[2]=='e' && path[3]=='v' && 
path[4]=='/')
+       {
                switch (path[5])
                {
                case 'f':
@@ -422,34 +645,17 @@
                                                fd = 1;
                                        break;
                                }
-#if defined(SOCKET) && defined(IPPROTO_SCTP)
-                       else if (path[6]=='c' && path[7]=='t' && path[8]=='p' 
&& path[9]=='/')
-                       {
-                               type = SOCK_STREAM;
-                               prot = IPPROTO_SCTP;
-                               info = 10;
-                       }
-#endif
-                       break;
-#ifdef SOCKET
-               case 't':
-                       if (path[6]=='c' && path[7]=='p' && path[8]=='/')
-                       {
-                               type = SOCK_STREAM;
-                               prot = 0;
-                               info = 9;
-                       }
-                       break;
-               case 'u':
-                       if (path[6]=='d' && path[7]=='p' && path[8]=='/')
-                       {
-                               type = SOCK_DGRAM;
-                               prot = 0;
-                               info = 9;
-                       }
-                       break;
-#endif
                }
+#ifdef O_SERVICE
+               if (fd < 0)
+               {
+                       if ((fd = inetopen(path+5, !!(flags & O_SERVICE), 
onintr, &sh)) < 0 && errno != ENOTDIR)
+                               return -1;
+                       if (fd >= 0)
+                               goto ok;
+               }
+#endif
+       }
        if (fd > 0)
        {
                if((mode=sh_iocheckfd(fd))==IOCLOSE)
@@ -462,42 +668,12 @@
                if((fd=dup(fd))<0)
                        return(-1);
        }
-#ifdef SOCKET
-       else if (type > 0 && str2inet(path+info, &addr))
-       {
-               if ((fd = socket(AF_INET, type, prot)) >= 0)
-               {
-                       if(flags&O_SERVICE)
-                       {
-                               if(bind(fd, (struct sockaddr*)&addr, 
sizeof(addr)) || listen(fd,5))
-                               {
-                                       close(fd);
-                                       fd = -1;
-                               }
-                       }
-                       else while(connect(fd, (struct sockaddr*)&addr, 
sizeof(addr)))
-                       {
-                               if(errno==EINTR)
-                               {
-                                       if(sh.trapnote&SH_SIGSET)
-                                       {
-                                               close(fd);
-                                               sh_exit(SH_EXITSIG);
-                                       }
-                                       if(sh.trapnote)
-                                               sh_chktrap();
-                                       continue;
-                               }
-                               close(fd);
-                               fd = -1;
-                               break;
-                       }
-               }
-       }
-#endif /* SOCKET */
        else while((fd = open(path, flags, mode)) < 0)
                if(errno!=EINTR || sh.trapnote)
                        return(-1);
+#ifdef O_SERVICE
+ ok:
+#endif
        flags &= O_ACCMODE;
        if(flags==O_WRONLY)
                mode = IOWRITE;
@@ -1239,80 +1415,6 @@
        return(-1);
 }
 
-#ifdef SOCKET
-
-#ifndef INADDR_LOOPBACK
-#define INADDR_LOOPBACK                0x7f000001L
-#endif
-
-/*
- * convert string to sockaddr_in
- * 0 returned on error
- */
-
-static int str2inet(register const char *sp, struct sockaddr_in *addr)
-{
-       char            *proto = (char*)sp;
-       register int    n=0,c,v;
-       unsigned long   a=0;
-       unsigned short  p=0;
-
-       sp += 4;
-       if(memcmp(sp,"local/",6)==0)
-       {
-               a = INADDR_LOOPBACK;
-               n=4;
-               sp+=6;
-       }
-       else if(!isdigit(*sp))
-       {
-               struct hostent *hp;
-               char *cp = strchr(sp,'/');
-               *cp = 0;
-               hp = gethostbyname(sp);
-               *cp = '/';
-               if(!hp || hp->h_addrtype!=AF_INET || hp->h_length>sizeof(struct 
in_addr))
-                       return 0;
-               a = (unsigned long)((struct in_addr*)hp->h_addr)->s_addr;
-               n=6;
-               sp = cp+1;
-               if(!isdigit(*sp))
-               {
-                       struct servent *xp;
-                       proto[3] = 0;
-                       if(xp = getservbyname(sp,proto))
-                       {
-                               p = xp->s_port;
-                               sp = "";
-                       }
-                       proto[3] = '/';
-               }
-       }
-       while(*sp)
-       {
-               v = 0;
-               while ((c = *sp++) >= '0' && c <= '9')
-                       v = v * 10 + c - '0';
-               if (++n <= 4) a = (a << 8) | (v & 0xff);
-               else
-               {
-                       if (c) return(0);
-                       if (n <= 5)
-                               a = htonl(a);
-                       p = htons(v);
-                       break;
-               }
-               if (c != '.' && c != '/') return(0);
-       }
-       memset((char*)addr, 0, sizeof(*addr));
-       addr->sin_family = AF_INET;
-       addr->sin_addr.s_addr = a;
-       addr->sin_port = p;
-       return(1);
-}
-#endif /* SOCKET */
-
-
 /*
  *  Handle interrupts for slow streams
  */
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/sh/macro.c 
ksh93_2006_12_22/src/cmd/ksh93/sh/macro.c
--- ksh93_2006_12_07/src/cmd/ksh93/sh/macro.c   2006-11-29 15:32:12.000000000 
+0100
+++ ksh93_2006_12_22/src/cmd/ksh93/sh/macro.c   2006-12-18 17:45:48.000000000 
+0100
@@ -1368,16 +1368,13 @@
                                        if((c=mbsize(v))<1)
                                                c = 1;
                                        v += c;
-                                       vsize -= c;
                                }
                                c = ':';
                        }
 #endif /* SHOPT_MULTIBYTE */
                        else
-                       {
                                v += type;
-                               vsize -= type;
-                       }
+                       vsize -= type;
                }
                if(*ptr==':')
                {
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/sh/nvtree.c 
ksh93_2006_12_22/src/cmd/ksh93/sh/nvtree.c
--- ksh93_2006_12_07/src/cmd/ksh93/sh/nvtree.c  2006-10-16 22:42:37.000000000 
+0200
+++ ksh93_2006_12_22/src/cmd/ksh93/sh/nvtree.c  2006-12-14 03:46:11.000000000 
+0100
@@ -498,8 +498,9 @@
                if(n==0 || strncmp(arg,prefix-n,m+n)==0)
                {
                        cp +=m;
+                       r = 0;
                        if(*cp=='.')
-                               cp++;
+                               cp++,r++;
                        if(nextcp=nextdot(cp))
                        {
                                if(outfile)
@@ -508,7 +509,7 @@
                                        nv_outname(outfile,cp,nextcp-cp);
                                        sfputc(outfile,'=');
                                }
-                               argv = genvalue(argv,outfile,cp,n+m 
,indent,noscope);
+                               argv = genvalue(argv,outfile,cp,n+m+r 
,indent,noscope);
                                if(outfile)
                                        sfputc(outfile,'\n');
                                if(*argv)
@@ -523,7 +524,7 @@
                                sfnputc(outfile,'\t',indent);
                                nv_attribute(np,outfile,"typeset",1);
                                nv_close(np);
-                               sfputr(outfile,arg+m,'=');
+                               sfputr(outfile,arg+m+(n?n+1:0),'=');
                                argv = genvalue(++argv,outfile,cp,cp-arg 
,indent,noscope);
                                sfputc(outfile,'\n');
                        }
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/sh/path.c 
ksh93_2006_12_22/src/cmd/ksh93/sh/path.c
--- ksh93_2006_12_07/src/cmd/ksh93/sh/path.c    2006-10-18 09:32:00.000000000 
+0200
+++ ksh93_2006_12_22/src/cmd/ksh93/sh/path.c    2006-12-22 19:55:23.000000000 
+0100
@@ -39,6 +39,8 @@
 #if SHOPT_PFSH 
 #   ifdef _hdr_exec_attr
 #      include <exec_attr.h>
+#   else
+#      undef SHOPT_PFSH
 #   endif
 #endif
 
@@ -56,13 +58,14 @@
 static int onstdpath(const char *name)
 {
        register const char *cp = std_path, *sp;
-       while(*cp)
-       {
-               for(sp=name; *sp && (*cp == *sp); sp++,cp++);
-               if(*sp==0 && (*cp==0 || *cp==':'))
-                       return(1);
-               while(*cp && *cp++!=':');
-       }
+       if(cp)
+               while(*cp)
+               {
+                       for(sp=name; *sp && (*cp == *sp); sp++,cp++);
+                       if(*sp==0 && (*cp==0 || *cp==':'))
+                               return(1);
+                       while(*cp && *cp++!=':');
+               }
        return(0);
 }
 
@@ -1348,9 +1351,8 @@
                strcpy(pp->blib,LIBCMD);
                return(first);
        }
-       if(flag!=PATH_PATH)
-               return(first);
-       path_chkpaths(first,old,pp,offset);
+       if((flag&(PATH_PATH|PATH_SKIP))==PATH_PATH)
+               path_chkpaths(first,old,pp,offset);
        return(first);
 }
 
@@ -1558,7 +1560,7 @@
                        if(pp->ino==pq->ino && pp->dev==pq->dev)
                                pq->flags |= PATH_SKIP;
                }
-               if(pp->flags==PATH_PATH)
+               if((pp->flags&(PATH_PATH|PATH_SKIP))==PATH_PATH)
                {
                        /* try to insert .paths component */
                        int offset = staktell();
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/sh/streval.c 
ksh93_2006_12_22/src/cmd/ksh93/sh/streval.c
--- ksh93_2006_12_07/src/cmd/ksh93/sh/streval.c 2006-08-23 21:22:52.000000000 
+0200
+++ ksh93_2006_12_22/src/cmd/ksh93/sh/streval.c 2006-12-20 20:34:34.000000000 
+0100
@@ -744,7 +744,7 @@
                                        vp->nextchr++;
                        }
                        else
-                               d = (*vp->convert)(&vp->nextchr, &lvalue, 
LOOKUP, d);
+                               d = (*vp->convert)(&vp->nextchr, &lvalue, 
LOOKUP, 0);
                        if (vp->nextchr == pos)
                        {
                                if(vp->errmsg.value = lvalue.value)
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/sh.1 
ksh93_2006_12_22/src/cmd/ksh93/sh.1
--- ksh93_2006_12_07/src/cmd/ksh93/sh.1 2006-10-31 02:59:42.000000000 +0100
+++ ksh93_2006_12_22/src/cmd/ksh93/sh.1 2006-12-19 20:24:15.000000000 +0100
@@ -6059,6 +6059,11 @@
 .B \-N
 is specified, the bytes that are read are stored directly
 into the variable.
+If the
+.B \-v
+is specified, then the value of the first
+.I vname\^
+will be used as a default value when reading from a terminal device.
 The
 .B \-A
 option causes the variable
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/tests/builtins.sh 
ksh93_2006_12_22/src/cmd/ksh93/tests/builtins.sh
--- ksh93_2006_12_07/src/cmd/ksh93/tests/builtins.sh    2006-11-23 
07:37:36.000000000 +0100
+++ ksh93_2006_12_22/src/cmd/ksh93/tests/builtins.sh    2006-12-20 
19:33:39.000000000 +0100
@@ -174,6 +174,7 @@
 then   err_exit "read -r of blank line not working"
 fi
 mkdir -p /tmp/ksh$$/a/b/c 2>/dev/null || err_exit  "mkdir -p failed"
+$SHELL -c "cd /tmp/ksh$$/a/b; cd c" 2>/dev/null || err_exit "initial script 
relative cd fails"
 rm -r /tmp/ksh$$ || err_exit "rm -r /tmp/ksh$$ failed"
 trap 'print HUP' HUP
 if     [[ $(trap) != "trap -- 'print HUP' HUP" ]]
@@ -334,7 +335,7 @@
 do     IFS=:
        set -- $v
        IFS=$ifs
-       env="$env $2=\"\$$2\""
+       eval [[ \$$2 ]] && env="$env $2=\"\$$2\""
 done
 set --glob
 if     [[ $(foo=bar; eval foo=\$foo $env exec -c \$SHELL -c \'print \$foo\') 
!= bar ]]
diff -r -N -u ksh93_2006_12_07/src/cmd/ksh93/tests/substring.sh 
ksh93_2006_12_22/src/cmd/ksh93/tests/substring.sh
--- ksh93_2006_12_07/src/cmd/ksh93/tests/substring.sh   2006-12-01 
21:11:30.000000000 +0100
+++ ksh93_2006_12_22/src/cmd/ksh93/tests/substring.sh   2006-12-18 
17:50:34.000000000 +0100
@@ -496,5 +496,5 @@
 string='foo(d:\nt\box\something)bar'
 expected='d:\nt\box\something'
 [[ ${string/*\(+([!\)])\)*/\1} == "$expected" ]] || err_exit "substring 
expansion failed '${string/*\(+([!\)])\)*/\1}' returned -- '$expected' expected"
-
+LC_ALL=en_US.UTF-8 $SHELL -c 'b1="????????????w????????????"; [[ ${b1:4:1} == 
w ]]' || err_exit 'Multibyte ${var:offset:len} not working correctly'
 exit $((Errors))
diff -r -N -u ksh93_2006_12_07/src/lib/libast/comp/conf.sh 
ksh93_2006_12_22/src/lib/libast/comp/conf.sh
--- ksh93_2006_12_07/src/lib/libast/comp/conf.sh        2006-11-18 
08:46:03.000000000 +0100
+++ ksh93_2006_12_22/src/lib/libast/comp/conf.sh        2006-12-11 
17:23:03.000000000 +0100
@@ -21,7 +21,7 @@
 ########################################################################
 : generate getconf and limits info
 #
-# @(#)conf.sh (AT&T Research) 2006-11-15
+# @(#)conf.sh (AT&T Research) 2006-12-11
 #
 # this script generates these files from the table file in the first arg
 # the remaining args are the C compiler name and flags
@@ -1387,11 +1387,11 @@
 
 int    conf_elements = (int)sizeof(conf) / (int)sizeof(conf[0]);
 !
-} > $tmp.2
-proto < $tmp.2 > $tmp.3
+} > $tmp.3
+proto < $tmp.3 > $tmp.4
 case $debug in
--d7)   echo $command: $tmp.3 ${base}.c ;;
-*)     cmp -s $tmp.3 ${base}.c 2>/dev/null || mv $tmp.3 ${base}.c ;;
+-d7)   echo $command: $tmp.4 ${base}.c ;;
+*)     cmp -s $tmp.4 ${base}.c 2>/dev/null || mv $tmp.4 ${base}.c ;;
 esac
 
 # limits.h generation code
diff -r -N -u ksh93_2006_12_07/src/lib/libast/comp/conf.tab 
ksh93_2006_12_22/src/lib/libast/comp/conf.tab
--- ksh93_2006_12_07/src/lib/libast/comp/conf.tab       2006-12-04 
23:12:14.000000000 +0100
+++ ksh93_2006_12_22/src/lib/libast/comp/conf.tab       2006-12-12 
09:38:22.000000000 +0100
@@ -46,7 +46,7 @@
 AIO_PRIO_DELTA_MAX             POSIX   SC 1 LMU
 ALLOC_SIZE_MIN                 POSIX   PC 1 LUVW
 ARCHITECTURE                   SVID    SI 1 0
-ARG_MAX                                POSIX   SC 1 LMUX       NCARGS 4096
+ARG_MAX                                POSIX   SC 1 CDLMUX     NCARGS 4096
 ASYNCHRONOUS_IO                        POSIX   SC 1 CDFUW
 ASYNC_IO                       POSIX   PC 1 FUW
 ATEXIT_MAX                     XOPEN   SC 1 LMU        32
diff -r -N -u ksh93_2006_12_07/src/lib/libast/comp/setlocale.c 
ksh93_2006_12_22/src/lib/libast/comp/setlocale.c
--- ksh93_2006_12_07/src/lib/libast/comp/setlocale.c    2005-03-10 
14:50:54.000000000 +0100
+++ ksh93_2006_12_22/src/lib/libast/comp/setlocale.c    2006-12-19 
06:08:54.000000000 +0100
@@ -28,8 +28,11 @@
  * and persistent private data for locale related functions
  */
 
+#include <ast_standards.h>
+
 #include "lclib.h"
 
+#include <ast_wchar.h>
 #include <ctype.h>
 #include <mc.h>
 #include <namval.h>
diff -r -N -u ksh93_2006_12_07/src/lib/libast/features/libpath.sh 
ksh93_2006_12_22/src/lib/libast/features/libpath.sh
--- ksh93_2006_12_07/src/lib/libast/features/libpath.sh 2006-08-30 
10:12:16.000000000 +0200
+++ ksh93_2006_12_22/src/lib/libast/features/libpath.sh 2006-12-20 
20:02:52.000000000 +0100
@@ -47,11 +47,12 @@
                then    
libpath="lib64:LD_LIBRARY64_PATH:sgi.mips[4-9]|sgi.*-64,$libpath"
                fi
                ;;
-       sol*.sun*|sol*.sparc*)
-               if      test -d /lib/sparcv9
-               then    
libpath="lib/sparcv9:LD_LIBRARY_PATH_64:sol.*64*,$libpath"
+       sol*.*) if      test -d /lib/32
+               then    libpath="lib/32:LD_LIBRARY_PATH_32,$libpath"
+               fi
+               if      test -d /lib/64
+               then    libpath="lib/64:LD_LIBRARY_PATH_64:sol.*64*,$libpath"
                fi
-               libpath="$libpath,lib:LD_LIBRARY_PATH_32"
                ;;
        esac
 elif   test -x /lib/dld.sl
diff -r -N -u ksh93_2006_12_07/src/lib/libast/features/standards 
ksh93_2006_12_22/src/lib/libast/features/standards
--- ksh93_2006_12_07/src/lib/libast/features/standards  2006-12-05 
05:44:53.000000000 +0100
+++ ksh93_2006_12_22/src/lib/libast/features/standards  2006-12-19 
18:51:35.000000000 +0100
@@ -1,4 +1,39 @@
-if tst note{ _ISOC99_SOURCE & _POSIX_SOURCE & _POSIX_C_SOURCE & _XOPEN_SOURCE 
& __EXTENSIONS__ works }end compile{
+if tst note{ _ALL_SOURCE & _ISOC99_SOURCE & _POSIX_SOURCE & _POSIX_C_SOURCE & 
_XOPEN_SOURCE & __EXTENSIONS__ works }end compile{
+               #define _ALL_SOURCE     1
+               #define _ISOC99_SOURCE  1
+               #define _POSIX_SOURCE   1
+               #define _POSIX_C_SOURCE 21000101L
+               #define _XOPEN_SOURCE   9900
+               #define _GNU_SOURCE     1
+               #define __EXTENSIONS__  1
+               #include <sys/types.h>
+               #include <sys/stat.h>
+               #include <stdlib.h>
+               #include <unistd.h>
+       }end {
+               #ifndef _ALL_SOURCE
+               #define _ALL_SOURCE     1
+               #endif
+               #ifndef _ISOC99_SOURCE
+               #define _ISOC99_SOURCE  1
+               #endif
+               #ifndef _POSIX_SOURCE
+               #define _POSIX_SOURCE   1
+               #endif
+               #ifndef _POSIX_C_SOURCE
+               #define _POSIX_C_SOURCE 21000101L
+               #endif
+               #ifndef _XOPEN_SOURCE
+               #define _XOPEN_SOURCE   9900
+               #endif
+               #ifndef _GNU_SOURCE
+               #define _GNU_SOURCE     1
+               #endif
+               #ifndef __EXTENSIONS__
+               #define __EXTENSIONS__  1
+               #endif
+       }
+elif tst note{ _ISOC99_SOURCE & _POSIX_SOURCE & _POSIX_C_SOURCE & 
_XOPEN_SOURCE & __EXTENSIONS__ works }end compile{
                #define _ISOC99_SOURCE  1
                #define _POSIX_SOURCE   1
                #define _POSIX_C_SOURCE 21000101L
diff -r -N -u ksh93_2006_12_07/src/lib/libast/Makefile 
ksh93_2006_12_22/src/lib/libast/Makefile
--- ksh93_2006_12_07/src/lib/libast/Makefile    2006-12-08 19:39:09.000000000 
+0100
+++ ksh93_2006_12_22/src/lib/libast/Makefile    2006-12-11 17:49:36.000000000 
+0100
@@ -317,7 +317,7 @@
  */
 
 .check.hdr : .IGNORE .VIRTUAL \
-               FEATURE/standards - FEATURE/lib - FEATURE/common - \
+               FEATURE/standards - FEATURE/lib - FEATURE/common - 
FEATURE/param - \
                ast_map.h - ast_limits.h - ast_stdio.h ast_nl_types.h - 
ast_wchar.h
        : clean up obsolete headers :
        $(RM) -rf $(HEADERSTD) ast_hdr.h ast_types.h ast_unistd.h iffeio.h \
diff -r -N -u ksh93_2006_12_07/src/lib/libast/Mamfile 
ksh93_2006_12_22/src/lib/libast/Mamfile
--- ksh93_2006_12_07/src/lib/libast/Mamfile     2006-12-09 07:48:59.000000000 
+0100
+++ ksh93_2006_12_22/src/lib/libast/Mamfile     2006-12-22 20:21:02.000000000 
+0100
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-07
+info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-12
 setv INSTALLROOT ../../..
 setv PACKAGEROOT ../../../../..
 setv AR ar
@@ -58,7 +58,21 @@
 done features/common
 exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} 
'   run features/common
 done FEATURE/common generated
-make ast_map.h
+make FEATURE/param
+meta FEATURE/param features/%.sh>FEATURE/% features/param.sh param
+make features/param.sh
+done features/param.sh
+exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} 
'   run features/param.sh
+make std/endian.h implicit
+make std/bytesex.h implicit
+make ast_common.h implicit
+prev FEATURE/common
+exec - sed '/define _def_map_ast/d' < FEATURE/common > 1.${COTEMP}.x
+exec - if      cmp 2>/dev/null -s ast_common.h 1.${COTEMP}.x
+exec - then    rm -f 1.${COTEMP}.x
+exec - else    mv 1.${COTEMP}.x ast_common.h
+exec - fi
+make ast_map.h implicit
 make FEATURE/map
 meta FEATURE/map features/%.c>FEATURE/% features/map.c map
 make features/map.c
@@ -80,7 +94,16 @@
 exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I.  
${LDFLAGS} '   run features/map.c
 done FEATURE/map generated
 exec - cmp 2>/dev/null -s FEATURE/map ast_map.h || { rm -f ast_map.h; silent 
test -d . || mkdir .; ${STDCP} FEATURE/map ast_map.h; }
-done ast_map.h generated
+done ast_map.h dontcare generated
+done ast_common.h dontcare generated
+done std/bytesex.h dontcare
+done std/endian.h dontcare
+make comp/getopt.h implicit
+make include/ast_getopt.h implicit
+done include/ast_getopt.h dontcare
+done comp/getopt.h dontcare
+done FEATURE/param generated
+prev ast_map.h
 make ast_limits.h
 make FEATURE/limits
 meta FEATURE/limits features/%.c>FEATURE/% features/limits.c limits
@@ -133,29 +156,7 @@
 make conftab.c
 done conftab.c generated
 done joint.conflim.h virtual
-make FEATURE/param implicit
-meta FEATURE/param features/%.sh>FEATURE/% features/param.sh param
-make features/param.sh
-done features/param.sh
-exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} 
'   run features/param.sh
-make std/endian.h implicit
-make std/bytesex.h implicit
-make ast_common.h implicit
-prev FEATURE/common
-exec - sed '/define _def_map_ast/d' < FEATURE/common > 1.${COTEMP}.x
-exec - if      cmp 2>/dev/null -s ast_common.h 1.${COTEMP}.x
-exec - then    rm -f 1.${COTEMP}.x
-exec - else    mv 1.${COTEMP}.x ast_common.h
-exec - fi
-prev ast_map.h implicit
-done ast_common.h dontcare generated
-done std/bytesex.h dontcare
-done std/endian.h dontcare
-done FEATURE/param generated
-make comp/getopt.h implicit
-make include/ast_getopt.h implicit
-done include/ast_getopt.h dontcare
-done comp/getopt.h dontcare
+prev FEATURE/param implicit
 prev FEATURE/common implicit
 prev FEATURE/lib implicit
 prev FEATURE/standards implicit
@@ -390,7 +391,7 @@
 prev FEATURE/param implicit
 done features/mode.c
 prev ast.req
-exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. 
-Iinclude -Istd  ${LDFLAGS} '   run features/mode.c
+exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp 
-Iinclude -Istd  ${LDFLAGS} '   run features/mode.c
 done FEATURE/mode generated
 exec - cmp 2>/dev/null -s FEATURE/mode ast_mode.h || { rm -f ast_mode.h; 
silent test -d . || mkdir .; ${STDCP} FEATURE/mode ast_mode.h; }
 done ast_mode.h dontcare generated
@@ -1327,7 +1328,12 @@
 make include/mc.h implicit
 prev include/ast.h implicit
 done include/mc.h
+prev ast_wchar.h implicit
 prev port/lclib.h implicit
+make ast_standards.h implicit
+prev FEATURE/standards
+exec - cmp 2>/dev/null -s FEATURE/standards ast_standards.h || { rm -f 
ast_standards.h; silent test -d . || mkdir .; ${STDCP} FEATURE/standards 
ast_standards.h; }
+done ast_standards.h generated
 done comp/setlocale.c
 meta setlocale.o %.c>%.o comp/setlocale.c setlocale
 prev comp/setlocale.c
@@ -6816,10 +6822,7 @@
 exec - fi
 done ${INSTALLROOT}/include/ast/ast_limits.h generated
 make ${INSTALLROOT}/include/ast/ast_standards.h
-make ast_standards.h
-prev FEATURE/standards
-exec - cmp 2>/dev/null -s FEATURE/standards ast_standards.h || { rm -f 
ast_standards.h; silent test -d . || mkdir .; ${STDCP} FEATURE/standards 
ast_standards.h; }
-done ast_standards.h generated
+prev ast_standards.h
 exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  ast_standards.h  > 1.${COTEMP}.x
 exec - if      cmp 2>/dev/null -s ${INSTALLROOT}/include/ast/ast_standards.h 
1.${COTEMP}.x
 exec - then    rm -f 1.${COTEMP}.x
diff -r -N -u ksh93_2006_12_07/src/lib/libast/RELEASE 
ksh93_2006_12_22/src/lib/libast/RELEASE
--- ksh93_2006_12_07/src/lib/libast/RELEASE     2006-12-08 19:40:00.000000000 
+0100
+++ ksh93_2006_12_22/src/lib/libast/RELEASE     2006-12-20 19:59:23.000000000 
+0100
@@ -1,3 +1,7 @@
+06-12-20 features/libpath.sh: generalize sol.* LIBPATH patterns
+06-12-18 comp/setlocale.c: include ast_standards.h and ast_wchar.h !
+06-12-12 string/strperm.c: octal modes are absolute!
+06-12-11 comp/conf.tab: always defer ARG_MAX
 06-12-07 Makefile: fix conftab.c generation CCFLAGS to match build - doh
 06-12-04 sfio/sfcvt.c: fix (int) vs. (long) cast mismatches
 06-12-01 comp/conf.tab: add changes to cover solaris { bin xpg4 xpg6 }
diff -r -N -u ksh93_2006_12_07/src/lib/libast/string/strperm.c 
ksh93_2006_12_22/src/lib/libast/string/strperm.c
--- ksh93_2006_12_07/src/lib/libast/string/strperm.c    2006-11-20 
17:25:41.000000000 +0100
+++ ksh93_2006_12_22/src/lib/libast/string/strperm.c    2006-12-12 
15:43:06.000000000 +0100
@@ -80,7 +80,11 @@
                                continue;
                        default:
                                if (c >= '0' && c <= '7')
+                               {
+                                       if (!who)
+                                               who = 
S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
                                        c = '=';
+                               }
                                expr--;
                                /*FALLTHROUGH*/
                        case '=':
@@ -244,6 +248,8 @@
                                                        return perm & S_IPERM;
                                                }
                                                num = (num << 3) | (c - '0');
+                                               if (!who && (op == '+' || op == 
'-'))
+                                                       who = 
S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
                                                if (*expr < '0' || *expr > '7')
                                                {
                                                        typ |= modei(num);
diff -r -N -u ksh93_2006_12_07/src/lib/libcmd/Mamfile 
ksh93_2006_12_22/src/lib/libcmd/Mamfile
--- ksh93_2006_12_07/src/lib/libcmd/Mamfile     2006-12-09 07:49:00.000000000 
+0100
+++ ksh93_2006_12_22/src/lib/libcmd/Mamfile     2006-12-22 20:21:04.000000000 
+0100
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-07
+info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-12
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
diff -r -N -u ksh93_2006_12_07/src/lib/libdll/Mamfile 
ksh93_2006_12_22/src/lib/libdll/Mamfile
--- ksh93_2006_12_07/src/lib/libdll/Mamfile     2006-12-09 07:49:00.000000000 
+0100
+++ ksh93_2006_12_22/src/lib/libdll/Mamfile     2006-12-22 20:21:04.000000000 
+0100
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-07
+info mam static 00000 1994-07-17 make (AT&T Research) 5.1 2006-12-12
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib

Reply via email to