Blame SPECS/ksh-20120801-oldenvinit.patch

Packit 992a25
diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.fixset ksh-20120801/src/cmd/ksh93/sh/init.c
Packit 992a25
--- ksh-20120801/src/cmd/ksh93/sh/init.c.fixset	2014-11-03 15:45:36.510997271 +0100
Packit 992a25
+++ ksh-20120801/src/cmd/ksh93/sh/init.c	2014-11-03 16:20:44.398917280 +0100
Packit 992a25
@@ -2003,8 +2003,91 @@ static Dt_t *inittree(Shell_t *shp,const
Packit 992a25
  * skip over items that are not name-value pairs
Packit 992a25
  */
Packit 992a25
 
Packit 992a25
+
Packit 992a25
 static void env_init(Shell_t *shp)
Packit 992a25
 {
Packit 992a25
+	register char *cp;
Packit 992a25
+	register Namval_t	*np;
Packit 992a25
+	register char **ep=environ;
Packit 992a25
+	register char *next=0;
Packit 992a25
+#ifdef _ENV_H
Packit 992a25
+	shp->env = env_open(environ,3);
Packit 992a25
+	env_delete(shp->env,"_");
Packit 992a25
+#endif
Packit 992a25
+	if(ep)
Packit 992a25
+	{
Packit 992a25
+		while(cp= *ep++)
Packit 992a25
+		{
Packit 992a25
+			if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=')
Packit 992a25
+				next = cp+4;
Packit 992a25
+			else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL))) 
Packit 992a25
+			{
Packit 992a25
+				nv_onattr(np,NV_IMPORT);
Packit 992a25
+				np->nvenv = cp;
Packit 992a25
+				nv_close(np);
Packit 992a25
+			}
Packit 992a25
+			else  /* swap with front */
Packit 992a25
+			{
Packit 992a25
+				ep[-1] = environ[shp->nenv];
Packit 992a25
+				environ[shp->nenv++] = cp;
Packit 992a25
+			}
Packit 992a25
+		}
Packit 992a25
+		while(cp=next)
Packit 992a25
+		{
Packit 992a25
+			if(next = strchr(++cp,'='))
Packit 992a25
+				*next = 0;
Packit 992a25
+			np = nv_search(cp+2,shp->var_tree,NV_ADD);
Packit 992a25
+			if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
Packit 992a25
+			{
Packit 992a25
+				int flag = *(unsigned char*)cp-' ';
Packit 992a25
+				int size = *(unsigned char*)(cp+1)-' ';
Packit 992a25
+				if((flag&NV_INTEGER) && size==0)
Packit 992a25
+				{
Packit 992a25
+					/* check for floating*/
Packit 992a25
+					char *ep,*val = nv_getval(np);
Packit 992a25
+					strtol(val,&ep,10);
Packit 992a25
+					if(*ep=='.' || *ep=='e' || *ep=='E')
Packit 992a25
+					{
Packit 992a25
+						char *lp;
Packit 992a25
+						flag |= NV_DOUBLE;
Packit 992a25
+						if(*ep=='.')
Packit 992a25
+						{
Packit 992a25
+							strtol(ep+1,&lp,10);
Packit 992a25
+							if(*lp)
Packit 992a25
+								ep = lp;
Packit 992a25
+						}
Packit 992a25
+						if(*ep && *ep!='.')
Packit 992a25
+						{
Packit 992a25
+							flag |= NV_EXPNOTE;
Packit 992a25
+							size = ep-val;
Packit 992a25
+						}
Packit 992a25
+						else
Packit 992a25
+							size = strlen(ep);
Packit 992a25
+						size--;
Packit 992a25
+					}
Packit 992a25
+				}
Packit 992a25
+				nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
Packit 992a25
+			}
Packit 992a25
+			else
Packit 992a25
+				cp += 2;
Packit 992a25
+		}
Packit 992a25
+	}
Packit 992a25
+#ifdef _ENV_H
Packit 992a25
+	env_delete(shp->env,e_envmarker);
Packit 992a25
+#endif
Packit 992a25
+	if(nv_isnull(PWDNOD) || nv_isattr(PWDNOD,NV_TAGGED))
Packit 992a25
+	{
Packit 992a25
+		nv_offattr(PWDNOD,NV_TAGGED);
Packit 992a25
+		path_pwd(shp,0);
Packit 992a25
+	}
Packit 992a25
+	if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED))
Packit 992a25
+		sh_onoption(SH_RESTRICTED); /* restricted shell */
Packit 992a25
+	return;
Packit 992a25
+}
Packit 992a25
+
Packit 992a25
+
Packit 992a25
+static void env_init_backup(Shell_t *shp)
Packit 992a25
+{
Packit 992a25
 	register char		*cp;
Packit 992a25
 	register Namval_t	*np,*mp;
Packit 992a25
 	register char		**ep=environ;