summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/sh/init.c
diff options
context:
space:
mode:
authorRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-04-03 09:48:44 -0700
committerRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-04-03 09:48:44 -0700
commit3e14f97f673e8a630f076077de35afdd43dc1587 (patch)
tree9828b6b676f58d7b27dd28e00202d3f3461a5cd8 /usr/src/lib/libshell/common/sh/init.c
parent4f60987df4dcaa54a88b596f861fbf4f3382c65e (diff)
downloadillumos-gate-3e14f97f673e8a630f076077de35afdd43dc1587.tar.gz
6939349 RFE: Update ksh93 to ast-ksh.2010-03-09
6877392 ksh93 regresses 'uniq -c' performance 6887363 Korn shell 93 sometimes mishandles return value of its child process 6900314 (while true ; do true|true ; done) hang in ioctl() with SIGTTOU 6904557 wc no longer counts number of bytes correctly 6904575 cut -d with multibyte character no longer works 6904597 paste -d no longer works with multibyte characters 6904780 /usr/bin/cksum changed output in snv_128 6904870 uniq -s does not skip multibyte characters correctly 6904878 join -t no longer works with multibyte char separator 6907460 EXIT trap handlers are sometimes executed twice 6909579 libast getopt solaris compatibility broken 6920072 ksh93 tail -f, with unconditional .25s sleep and line parsing, about 37x slower than cat 6932124 mktemp in ksh93 is broken Contributed by Olga Kryzhanovska <olga.kryzhanovska@gmail.com>
Diffstat (limited to 'usr/src/lib/libshell/common/sh/init.c')
-rw-r--r--usr/src/lib/libshell/common/sh/init.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/usr/src/lib/libshell/common/sh/init.c b/usr/src/lib/libshell/common/sh/init.c
index 7371b8de98..97f060ae27 100644
--- a/usr/src/lib/libshell/common/sh/init.c
+++ b/usr/src/lib/libshell/common/sh/init.c
@@ -1,7 +1,7 @@
/***********************************************************************
* *
* This software is part of the ast package *
-* Copyright (c) 1982-2009 AT&T Intellectual Property *
+* Copyright (c) 1982-2010 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
@@ -360,12 +360,8 @@ static void put_cdpath(register Namval_t* np,const char *val,int flags,Namfun_t
{
Shell_t *shp = nv_shell(np);
int type;
- char *lc_all = nv_getval(LCALLNOD);
+ char *cp;
char *name = nv_name(np);
- if((shp->test&1) && !val && !nv_getval(np))
- return;
- if(shp->test&2)
- nv_putv(np, val, flags, fp);
if(name==(LCALLNOD)->nvname)
type = LC_ALL;
else if(name==(LCTYPENOD)->nvname)
@@ -381,25 +377,32 @@ static void put_cdpath(register Namval_t* np,const char *val,int flags,Namfun_t
type = LC_LANG;
#else
#define LC_LANG LC_ALL
- else if(name==(LANGNOD)->nvname && (!lc_all || !*lc_all))
+ else if(name==(LANGNOD)->nvname && (!(cp=nv_getval(LCALLNOD)) || !*cp))
type = LC_LANG;
#endif
else
type= -1;
- if(sh_isstate(SH_INIT) && type>=0 && type!=LC_ALL && lc_all && *lc_all)
- type= -1;
- if(type>=0 || type==LC_ALL || type==LC_LANG)
+ if(!sh_isstate(SH_INIT) && (type>=0 || type==LC_ALL || type==LC_LANG))
{
- if(!setlocale(type,val?val:"-") && val)
+ struct lconv* lc;
+ char* r;
+#ifdef AST_LC_setenv
+ ast.locale.set |= AST_LC_setenv;
+#endif
+ r = setlocale(type,val?val:"");
+#ifdef AST_LC_setenv
+ ast.locale.set ^= AST_LC_setenv;
+#endif
+ if(!r && val)
{
if(!sh_isstate(SH_INIT) || shp->login_sh==0)
errormsg(SH_DICT,0,e_badlocale,val);
return;
}
+ shp->decomma = (lc=localeconv()) && lc->decimal_point && *lc->decimal_point==',';
}
- if(!(shp->test&2))
- nv_putv(np, val, flags, fp);
- if(CC_NATIVE==CC_ASCII && (type==LC_ALL || type==LC_LANG || type==LC_CTYPE))
+ nv_putv(np, val, flags, fp);
+ if(CC_NATIVE!=CC_ASCII && (type==LC_ALL || type==LC_LANG || type==LC_CTYPE))
{
if(sh_lexstates[ST_BEGIN]!=sh_lexrstates[ST_BEGIN])
free((void*)sh_lexstates[ST_BEGIN]);
@@ -1022,6 +1025,7 @@ Shell_t *sh_init(register int argc,register char *argv[], Shinit_f userinit)
Shell_t *shp = &sh;
register int n;
int type;
+ long v;
static char *login_files[3];
memfatal();
n = strlen(e_version);
@@ -1107,6 +1111,8 @@ Shell_t *sh_init(register int argc,register char *argv[], Shinit_f userinit)
shp->lim.arg_max = ARG_MAX;
if(shp->lim.child_max <=0)
shp->lim.child_max = CHILD_MAX;
+ if((v = getconf("PID_MAX")) > 0 && shp->lim.child_max > v)
+ shp->lim.child_max = v;
if(shp->lim.open_max <0)
shp->lim.open_max = OPEN_MAX;
if(shp->lim.open_max > (SHRT_MAX-2))
@@ -1301,8 +1307,8 @@ Shell_t *sh_init(register int argc,register char *argv[], Shinit_f userinit)
shp->bltindata.shexit = sh_exit;
shp->bltindata.shbltin = sh_addbuiltin;
#if _AST_VERSION >= 20080617L
- shp->bltindata.shgetenv = getenv;
- shp->bltindata.shsetenv = setenviron;
+ shp->bltindata.shgetenv = sh_getenv;
+ shp->bltindata.shsetenv = sh_setenviron;
astintercept(&shp->bltindata,1);
#endif
#if 0
@@ -1732,7 +1738,7 @@ static void env_init(Shell_t *shp)
np->nvenv = cp;
nv_close(np);
}
- else /* swap with fron */
+ else /* swap with front */
{
ep[-1] = environ[shp->nenv];
environ[shp->nenv++] = cp;
@@ -1743,7 +1749,7 @@ static void env_init(Shell_t *shp)
if(next = strchr(++cp,'='))
*next = 0;
np = nv_search(cp+2,shp->var_tree,NV_ADD);
- if(nv_isattr(np,NV_IMPORT|NV_EXPORT))
+ if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
{
int flag = *(unsigned char*)cp-' ';
int size = *(unsigned char*)(cp+1)-' ';
@@ -1774,6 +1780,8 @@ static void env_init(Shell_t *shp)
}
nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
}
+ else
+ cp += 2;
}
}
#ifdef _ENV_H