summaryrefslogtreecommitdiffstats
path: root/source/ap/ksh93/patches/ksh-20120801-oldenvinit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/ap/ksh93/patches/ksh-20120801-oldenvinit.patch')
-rw-r--r--source/ap/ksh93/patches/ksh-20120801-oldenvinit.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/source/ap/ksh93/patches/ksh-20120801-oldenvinit.patch b/source/ap/ksh93/patches/ksh-20120801-oldenvinit.patch
new file mode 100644
index 000000000..8ee086314
--- /dev/null
+++ b/source/ap/ksh93/patches/ksh-20120801-oldenvinit.patch
@@ -0,0 +1,95 @@
+diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.fixset ksh-20120801/src/cmd/ksh93/sh/init.c
+--- ksh-20120801/src/cmd/ksh93/sh/init.c.fixset 2014-11-03 15:45:36.510997271 +0100
++++ ksh-20120801/src/cmd/ksh93/sh/init.c 2014-11-03 16:20:44.398917280 +0100
+@@ -2003,8 +2003,91 @@ static Dt_t *inittree(Shell_t *shp,const
+ * skip over items that are not name-value pairs
+ */
+
++
+ static void env_init(Shell_t *shp)
+ {
++ register char *cp;
++ register Namval_t *np;
++ register char **ep=environ;
++ register char *next=0;
++#ifdef _ENV_H
++ shp->env = env_open(environ,3);
++ env_delete(shp->env,"_");
++#endif
++ if(ep)
++ {
++ while(cp= *ep++)
++ {
++ if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=')
++ next = cp+4;
++ else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL)))
++ {
++ nv_onattr(np,NV_IMPORT);
++ np->nvenv = cp;
++ nv_close(np);
++ }
++ else /* swap with front */
++ {
++ ep[-1] = environ[shp->nenv];
++ environ[shp->nenv++] = cp;
++ }
++ }
++ while(cp=next)
++ {
++ if(next = strchr(++cp,'='))
++ *next = 0;
++ np = nv_search(cp+2,shp->var_tree,NV_ADD);
++ if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
++ {
++ int flag = *(unsigned char*)cp-' ';
++ int size = *(unsigned char*)(cp+1)-' ';
++ if((flag&NV_INTEGER) && size==0)
++ {
++ /* check for floating*/
++ char *ep,*val = nv_getval(np);
++ strtol(val,&ep,10);
++ if(*ep=='.' || *ep=='e' || *ep=='E')
++ {
++ char *lp;
++ flag |= NV_DOUBLE;
++ if(*ep=='.')
++ {
++ strtol(ep+1,&lp,10);
++ if(*lp)
++ ep = lp;
++ }
++ if(*ep && *ep!='.')
++ {
++ flag |= NV_EXPNOTE;
++ size = ep-val;
++ }
++ else
++ size = strlen(ep);
++ size--;
++ }
++ }
++ nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
++ }
++ else
++ cp += 2;
++ }
++ }
++#ifdef _ENV_H
++ env_delete(shp->env,e_envmarker);
++#endif
++ if(nv_isnull(PWDNOD) || nv_isattr(PWDNOD,NV_TAGGED))
++ {
++ nv_offattr(PWDNOD,NV_TAGGED);
++ path_pwd(shp,0);
++ }
++ if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED))
++ sh_onoption(SH_RESTRICTED); /* restricted shell */
++ return;
++}
++
++
++static void env_init_backup(Shell_t *shp)
++{
+ register char *cp;
+ register Namval_t *np,*mp;
+ register char **ep=environ;