ash: [VAR] Move unsetvar functionality into setvareq
Upstream commit:
Date: Tue, 25 May 2010 20:55:05 +0800
[VAR] Move unsetvar functionality into setvareq
This patch moves the unsetvar code into setvareq so that we can
no have a pathological case of an unset variable hanging around
unless it has a bit pinning it like VEXPORT.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function old new delta
setvareq 227 303 +76
expmeta 517 521 +4
localcmd 364 366 +2
unsetcmd 96 76 -20
unsetvar 129 7 -122
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/2 up/down: 82/-142) Total: -60 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
57
shell/ash.c
57
shell/ash.c
@@ -2269,11 +2269,22 @@ setvareq(char *s, int flags)
|
||||
if (!(vp->flags & (VTEXTFIXED|VSTACK)))
|
||||
free((char*)vp->var_text);
|
||||
|
||||
if (((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) | (vp->flags & VSTRFIXED)) == VUNSET) {
|
||||
*vpp = vp->next;
|
||||
free(vp);
|
||||
out_free:
|
||||
if ((flags & (VTEXTFIXED|VSTACK|VNOSAVE)) == VNOSAVE)
|
||||
free(s);
|
||||
return;
|
||||
}
|
||||
|
||||
flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET);
|
||||
} else {
|
||||
/* variable s is not found */
|
||||
if (flags & VNOSET)
|
||||
return;
|
||||
if ((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) == VUNSET)
|
||||
goto out_free;
|
||||
vp = ckzalloc(sizeof(*vp));
|
||||
vp->next = *vpp;
|
||||
/*vp->func = NULL; - ckzalloc did it */
|
||||
@@ -2331,43 +2342,10 @@ setvar0(const char *name, const char *val)
|
||||
/*
|
||||
* Unset the specified variable.
|
||||
*/
|
||||
static int
|
||||
static void
|
||||
unsetvar(const char *s)
|
||||
{
|
||||
struct var **vpp;
|
||||
struct var *vp;
|
||||
int retval;
|
||||
|
||||
vpp = findvar(hashvar(s), s);
|
||||
vp = *vpp;
|
||||
retval = 2;
|
||||
if (vp) {
|
||||
int flags = vp->flags;
|
||||
|
||||
retval = 1;
|
||||
if (flags & VREADONLY)
|
||||
goto out;
|
||||
#if ENABLE_ASH_RANDOM_SUPPORT
|
||||
vp->flags &= ~VDYNAMIC;
|
||||
#endif
|
||||
if (flags & VUNSET)
|
||||
goto ok;
|
||||
if ((flags & VSTRFIXED) == 0) {
|
||||
INT_OFF;
|
||||
if ((flags & (VTEXTFIXED|VSTACK)) == 0)
|
||||
free((char*)vp->var_text);
|
||||
*vpp = vp->next;
|
||||
free(vp);
|
||||
INT_ON;
|
||||
} else {
|
||||
setvar0(s, NULL);
|
||||
vp->flags &= ~VEXPORT;
|
||||
}
|
||||
ok:
|
||||
retval = 0;
|
||||
}
|
||||
out:
|
||||
return retval;
|
||||
setvar0(s, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -13218,7 +13196,6 @@ unsetcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
||||
char **ap;
|
||||
int i;
|
||||
int flag = 0;
|
||||
int ret = 0;
|
||||
|
||||
while ((i = nextopt("vf")) != 0) {
|
||||
flag = i;
|
||||
@@ -13226,15 +13203,13 @@ unsetcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
||||
|
||||
for (ap = argptr; *ap; ap++) {
|
||||
if (flag != 'f') {
|
||||
i = unsetvar(*ap);
|
||||
ret |= i;
|
||||
if (!(i & 2))
|
||||
continue;
|
||||
unsetvar(*ap);
|
||||
continue;
|
||||
}
|
||||
if (flag != 'v')
|
||||
unsetfunc(*ap);
|
||||
}
|
||||
return ret & 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const unsigned char timescmd_str[] ALIGN1 = {
|
||||
|
||||
Reference in New Issue
Block a user