Hi!
We've found that ksh removes some variables from environment (for example
variables containing space or hyphen). If you use tcsh, set these
variables, run
ksh and again tcsh, these wariables will be gone. (tcsh and again tcsh
works fine.)
(bugzilla: #464156)
Excerpt from POSIX
(http://www.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap08.html):
Environment variable names used by the utilities in the Shell and Utilities
volume of IEEE Std 1003.1-2001 consist solely of uppercase letters,
digits, and
the '_' (underscore) from the characters defined in Portable Character
Set and
do not begin with a digit. Other characters may be permitted by an
implementation; applications shall tolerate the presence of such names.
Uppercase and lowercase letters shall retain their unique identities and
shall
not be folded together. The name space of environment variable names
containing
lowercase letters is reserved for applications. Applications can define any
environment variables with names from this name space without modifying the
behavior of the standard utilities.
"...applications shall tolerate the presence of such names..."
Therefore ksh should not alter the environment even though it does not
allow to access/set such variables.
I've made patch (attached) to fix this: Variables refused during ksh's
initialization
are kept in separated list and they are added to the environment for
executed
applications.
It's quite simple with only a few new lines added.
What's your opinion about this?
Bye,
Michal
diff -up ./src/cmd/ksh93/include/nval.h.keepenv ./src/cmd/ksh93/include/nval.h
--- ./src/cmd/ksh93/include/nval.h.keepenv 2008-07-23 21:40:05.000000000 +0200
+++ ./src/cmd/ksh93/include/nval.h 2008-10-04 21:05:36.000000000 +0200
@@ -105,6 +105,14 @@ struct Namdecl
void *optinfof;
};
+/* list of strings refused from the environment initialization */
+struct Linelist_s {
+ char *line;
+ struct Linelist_s *next;
+};
+
+extern struct Linelist_s refused_envs;
+
/* attributes of name-value node attribute flags */
#define NV_DEFAULT 0
diff -up ./src/cmd/ksh93/sh/fault.c.keepenv ./src/cmd/ksh93/sh/fault.c
--- ./src/cmd/ksh93/sh/fault.c.keepenv 2008-06-25 18:25:00.000000000 +0200
+++ ./src/cmd/ksh93/sh/fault.c 2008-10-07 17:01:20.717001479 +0200
@@ -551,6 +551,7 @@ void sh_done(void *ptr, register int sig
Shell_t *shp = (Shell_t*)ptr;
register char *t;
register int savxit = shp->exitval;
+ register struct Linelist_s *refenv = refused_envs.next, *freeval;
shp->trapnote = 0;
indone=1;
if(sig==0)
@@ -584,6 +585,17 @@ void sh_done(void *ptr, register int sig
job_walk(sfstderr,job_terminate,SIGHUP,NIL(char**));
#endif /* JOBS */
job_close(shp);
+
+ /* free up refused environment strings */
+ while(refenv)
+ {
+ freeval = refenv;
+ if (freeval->line) free(freeval->line);
+ free(freeval);
+ refenv = refenv->next;
+ }
+ refused_envs.next = NULL;
+
if(nv_search("VMTRACE", shp->var_tree,0))
strmatch((char*)0,(char*)0);
sfsync((Sfio_t*)sfstdin);
diff -up ./src/cmd/ksh93/sh/init.c.keepenv ./src/cmd/ksh93/sh/init.c
--- ./src/cmd/ksh93/sh/init.c.keepenv 2008-07-17 16:47:43.000000000 +0200
+++ ./src/cmd/ksh93/sh/init.c 2008-10-04 21:15:17.000000000 +0200
@@ -1553,6 +1553,7 @@ static void env_init(Shell_t *shp)
shp->env = env_open(environ,3);
env_delete(shp->env,"_");
#endif
+ struct Linelist_s *refenv = &refused_envs;
if(ep)
{
while(cp= *ep++)
@@ -1565,6 +1566,16 @@ static void env_init(Shell_t *shp)
np->nvenv = cp;
nv_close(np);
}
+ else
+ {
+ /* refused string */
+ refenv->next = (struct Linelist_s *) malloc(sizeof(struct Linelist_s *));
+ refenv = refenv->next;
+ /* TODO: if envirnon is always accessible and its data */
+ /* are not changed at all, use pointers only */
+ refenv->line = strdup(cp);
+ refenv->next = NULL;
+ }
}
while(cp=next)
{
diff -up ./src/cmd/ksh93/sh/name.c.keepenv ./src/cmd/ksh93/sh/name.c
--- ./src/cmd/ksh93/sh/name.c.keepenv 2008-07-24 07:05:00.000000000 +0200
+++ ./src/cmd/ksh93/sh/name.c 2008-10-04 21:24:05.000000000 +0200
@@ -71,6 +71,8 @@ struct adata
char *attval;
};
+struct Linelist_s refused_envs = { NULL, NULL };
+
#if SHOPT_TYPEDEF
struct sh_type
{
@@ -1849,6 +1851,7 @@ char **sh_envgen(void)
register char **er;
register int namec;
register char *cp;
+ register struct Linelist_s *refenv = refused_envs.next;
struct adata data;
data.sh = &sh;
data.tp = 0;
@@ -1856,8 +1859,20 @@ char **sh_envgen(void)
nv_offattr(L_ARGNOD,NV_EXPORT);
data.attsize = 6;
namec = nv_scan(sh.var_tree,nullscan,(void*)0,NV_EXPORT,NV_EXPORT);
+ while(refenv)
+ {
+ namec++;
+ refenv = refenv->next;
+ }
er = (char**)stakalloc((namec+4)*sizeof(char*));
data.argnam = (er+=2);
+ refenv = refused_envs.next;
+ while(refenv)
+ {
+ *(data.argnam) = stakcopy(refenv->line);
+ data.argnam++;
+ refenv = refenv->next;
+ }
nv_scan(sh.var_tree, pushnam,&data,NV_EXPORT, NV_EXPORT);
*data.argnam = (char*)stakalloc(data.attsize);
cp = data.attval = strcopy(*data.argnam,e_envmarker);
_______________________________________________
ast-developers mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-developers