diff options
Diffstat (limited to 'usr/src/lib/libshell/common/sh/name.c')
-rw-r--r-- | usr/src/lib/libshell/common/sh/name.c | 87 |
1 files changed, 50 insertions, 37 deletions
diff --git a/usr/src/lib/libshell/common/sh/name.c b/usr/src/lib/libshell/common/sh/name.c index 2189a3a42a..84e9cced11 100644 --- a/usr/src/lib/libshell/common/sh/name.c +++ b/usr/src/lib/libshell/common/sh/name.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 * @@ -53,8 +53,8 @@ pathnative(const char* path, char* buf, size_t siz) static void attstore(Namval_t*,void*); #ifndef _ENV_H -static void pushnam(Namval_t*,void*); -static char *staknam(Namval_t*, char*); + static void pushnam(Namval_t*,void*); + static char *staknam(Namval_t*, char*); #endif static void ltou(char*); static void utol(char*); @@ -538,7 +538,11 @@ void nv_setlist(register struct argnod *arg,register int flags, Namval_t *typ) } if(!nv_isarray(np) && !typ && (tp->com.comarg || !tp->com.comset || tp->com.comset->argval[0]!='[')) + { nv_setvtree(np); + if(tp->com.comarg || tp->com.comset) + np->nvfun->dsize = 0; + } #if SHOPT_TYPEDEF goto check_type; #else @@ -753,7 +757,7 @@ Namval_t *nv_create(const char *name, Dt_t *root, int flags, Namfun_t *dp) if(shp->var_tree->walk == shp->var_base) { nq = np; - if(flags&NV_NOSCOPE) + if((flags&NV_NOSCOPE) && *cp!='.') { if(mode==0) root = shp->var_base; @@ -857,7 +861,7 @@ Namval_t *nv_create(const char *name, Dt_t *root, int flags, Namfun_t *dp) } shp->last_root = root; - if(cp[1]=='.') + if(*cp && cp[1]=='.') cp++; if(c=='.' && (cp[1]==0 || cp[1]=='=' || cp[1]=='+')) { @@ -1357,9 +1361,7 @@ void nv_putval(register Namval_t *np, const char *string, int flags) register char *cp; register int size = 0; register int dot; -#ifdef _ENV_H int was_local = nv_local; -#endif union Value u; if(!(flags&NV_RDONLY) && nv_isattr (np, NV_RDONLY)) errormsg(SH_DICT,ERROR_exit(1),e_readonly, nv_name(np)); @@ -1376,10 +1378,8 @@ void nv_putval(register Namval_t *np, const char *string, int flags) { nv_local=1; nv_putv(np,sp,flags,np->nvfun); -#ifdef _ENV_H if(sp && ((flags&NV_EXPORT) || nv_isattr(np,NV_EXPORT))) sh_envput(sh.env,np); -#endif return; } /* called from disc, assign the actual value */ @@ -1639,7 +1639,7 @@ void nv_putval(register Namval_t *np, const char *string, int flags) } if(nv_isattr(np,NV_BINARY) && !(flags&NV_RAW)) tofree = 0; - if(nv_isattr(np,NV_LJUST|NV_RJUST)) + if(nv_isattr(np,NV_LJUST|NV_RJUST) && nv_isattr(np,NV_LJUST|NV_RJUST)!=(NV_LJUST|NV_RJUST)) tofree = 0; if (sp) { @@ -1680,11 +1680,11 @@ void nv_putval(register Namval_t *np, const char *string, int flags) } else #endif - if(size==0 && nv_isattr(np,NV_LJUST|NV_RJUST|NV_ZFILL)) + if(size==0 && nv_isattr(np,NV_HOST)!=NV_HOST &&nv_isattr(np,NV_LJUST|NV_RJUST|NV_ZFILL)) nv_setsize(np,size=dot); else if(size > dot) dot = size; - else if(nv_isattr(np,NV_LJUST) && dot>size) + else if(nv_isattr(np,NV_LJUST|NV_RJUST)==NV_LJUST && dot>size) dot = size; if(size==0 || tofree || !(cp=(char*)up->cp)) { @@ -1709,9 +1709,9 @@ void nv_putval(register Namval_t *np, const char *string, int flags) cp[dot] = c; if(nv_isattr(np, NV_RJUST) && nv_isattr(np, NV_ZFILL)) rightjust(cp,size,'0'); - else if(nv_isattr(np, NV_RJUST)) + else if(nv_isattr(np, NV_LJUST|NV_RJUST)==NV_RJUST) rightjust(cp,size,' '); - else if(nv_isattr(np, NV_LJUST)) + else if(nv_isattr(np, NV_LJUST|NV_RJUST)==NV_LJUST) { register char *dp; dp = strlen (cp) + cp; @@ -1729,10 +1729,8 @@ void nv_putval(register Namval_t *np, const char *string, int flags) if(tofree && tofree!=Empty) free((void*)tofree); } -#ifdef _ENV_H if(!was_local && ((flags&NV_EXPORT) || nv_isattr(np,NV_EXPORT))) sh_envput(sh.env,np); -#endif return; } @@ -1920,11 +1918,8 @@ static void pushnam(Namval_t *np, void *data) register struct adata *ap = (struct adata*)data; ap->sh = &sh; ap->tp = 0; - if(nv_isattr(np,NV_IMPORT)) - { - if(np->nvenv) - *ap->argnam++ = np->nvenv; - } + if(nv_isattr(np,NV_IMPORT) && np->nvenv) + *ap->argnam++ = np->nvenv; else if(value=nv_getval(np)) *ap->argnam++ = staknam(np,value); if(nv_isattr(np,NV_RDONLY|NV_UTOL|NV_LTOU|NV_RJUST|NV_LJUST|NV_ZFILL|NV_INTEGER)) @@ -2001,7 +1996,7 @@ static int scanfilter(Dt_t *dict, void *arg, void *data) register struct adata *tp = (struct adata*)sp->scandata; NOT_USED(dict); #if SHOPT_TYPEDEF - if(tp && !is_abuiltin(np) && tp && tp->tp && nv_type(np)!=tp->tp) + if(!is_abuiltin(np) && tp && tp->tp && nv_type(np)!=tp->tp) return(0); #endif /*SHOPT_TYPEDEF */ if(sp->scanmask?(k&sp->scanmask)==sp->scanflags:(!sp->scanflags || (k&sp->scanflags))) @@ -2153,10 +2148,8 @@ static void table_unset(Shell_t *shp, register Dt_t *root, int flags, Dt_t *oroo shp->subshell = subshell; np->nvfun = 0; } -#ifdef _ENV_H if(nv_isattr(nq,NV_EXPORT)) sh_envput(shp->env,nq); -#endif } npnext = (Namval_t*)dtnext(root,np); shp->last_root = root; @@ -2556,8 +2549,10 @@ done: if(up->cp && nv_isattr(np,NV_BINARY) && !nv_isattr(np,NV_RAW)) { char *cp; + char *ep; int size= nv_size(np), insize=(4*size)/3+size/45+8; - base64encode(up->cp, size, (void**)0, cp=getbuf(insize), insize, (void**)0); + base64encode(up->cp, size, (void**)0, cp=getbuf(insize), insize, (void**)&ep); + *ep = 0; return(cp); } #endif @@ -2673,7 +2668,6 @@ void nv_newattr (register Namval_t *np, unsigned newatts, int size) n = np->nvflag; if(newatts&NV_EXPORT) nv_offattr(np,NV_IMPORT); -#ifdef _ENV_H if(((n^newatts)&NV_EXPORT)) { /* record changes to the environment */ @@ -2682,7 +2676,6 @@ void nv_newattr (register Namval_t *np, unsigned newatts, int size) else sh_envput(sh.env,np); } -#endif oldsize = nv_size(np); if((size==oldsize|| (n&NV_INTEGER)) && ((n^newatts)&~NV_NOCHANGE)==0) { @@ -2726,7 +2719,7 @@ void nv_newattr (register Namval_t *np, unsigned newatts, int size) } else nv_unset(np); - if(size==0 && (newatts&(NV_LJUST|NV_RJUST|NV_ZFILL))) + if(size==0 && (newatts&NV_HOST)!=NV_HOST && (newatts&(NV_LJUST|NV_RJUST|NV_ZFILL))) size = n; } else @@ -2749,7 +2742,6 @@ void nv_newattr (register Namval_t *np, unsigned newatts, int size) return; } -#ifndef _NEXT_SOURCE static char *oldgetenv(const char *string) { register char c0,c1; @@ -2774,20 +2766,34 @@ static char *oldgetenv(const char *string) /* * This version of getenv uses the hash storage to access environment values */ -char *getenv(const char *name) +char *sh_getenv(const char *name) /*@ assume name!=0; @*/ { register Namval_t *np; if(!sh.var_tree) - return(oldgetenv(name)); - if((np = nv_search(name,sh.var_tree,0)) && nv_isattr(np,NV_EXPORT)) + { +#if 0 + if(name[0] == 'P' && name[1] == 'A' && name[2] == 'T' && name[3] == 'H' && name[4] == 0 || name[0] == 'L' && ((name[1] == 'C' || name[1] == 'D') && name[2] == '_' || name[1] == 'A' && name[1] == 'N') || name[0] == 'V' && name[1] == 'P' && name[2] == 'A' && name[3] == 'T' && name[4] == 'H' && name[5] == 0 || name[0] == '_' && name[1] == 'R' && name[2] == 'L' && name[3] == 'D' || name[0] == '_' && name[1] == 'A' && name[2] == 'S' && name[3] == 'T' && name[4] == '_') +#endif + return(oldgetenv(name)); + } + else if((np = nv_search(name,sh.var_tree,0)) && nv_isattr(np,NV_EXPORT)) return(nv_getval(np)); - if(name[0] == 'P' && name[1] == 'A' && name[2] == 'T' && name[3] == 'H' && name[4] == 0) - return(oldgetenv(name)); return(0); } + +#ifndef _NEXT_SOURCE +/* + * Some dynamic linkers will make this file see the libc getenv(), + * so sh_getenv() is used for the astintercept() callback. Plain + * getenv() is provided for static links. + */ +char *getenv(const char *name) +{ + return sh_getenv(name); +} #endif /* _NEXT_SOURCE */ #undef putenv @@ -2806,11 +2812,10 @@ int putenv(const char *name) return(0); } - /* - * Override libast setenv() + * Override libast setenviron(). */ -char* setenviron(const char *name) +char* sh_setenviron(const char *name) { register Namval_t *np; if(name) @@ -2824,6 +2829,14 @@ char* setenviron(const char *name) } /* + * Same linker dance as with getenv() above. + */ +char* setenviron(const char *name) +{ + return sh_setenviron(name); +} + +/* * convert <str> to upper case */ static void ltou(register char *str) |