diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2010-05-25 20:55:05 +0800 |
---|---|---|
committer | maximilian attems <max@stro.at> | 2011-06-03 18:04:48 +0200 |
commit | dbf2ff1a875c2ca8c4a3144874ca2883e55e7eeb (patch) | |
tree | c98aeb290885004dbe5f05818a9a6690bef7604a | |
parent | 6aacbff0ba1523aa8272340ec14aacde4a649bc8 (diff) | |
download | klibc-dbf2ff1a875c2ca8c4a3144874ca2883e55e7eeb.tar.gz |
[klibc] [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>
Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r-- | usr/dash/var.c | 54 | ||||
-rw-r--r-- | usr/dash/var.h | 2 |
2 files changed, 18 insertions, 38 deletions
diff --git a/usr/dash/var.c b/usr/dash/var.c index fc6d367828d03..12f2f6c65e531 100644 --- a/usr/dash/var.c +++ b/usr/dash/var.c @@ -266,10 +266,22 @@ setvareq(char *s, int flags) if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) ckfree(vp->text); + if (((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) | + (vp->flags & VSTRFIXED)) == VUNSET) { + *vpp = vp->next; + ckfree(vp); +out_free: + if ((flags & (VTEXTFIXED|VSTACK|VNOSAVE)) == VNOSAVE) + ckfree(s); + return; + } + flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET); } else { if (flags & VNOSET) return; + if ((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) == VUNSET) + goto out_free; /* not found */ vp = ckmalloc(sizeof (*vp)); vp->next = *vpp; @@ -588,7 +600,6 @@ unsetcmd(int argc, char **argv) char **ap; int i; int flag = 0; - int ret = 0; while ((i = nextopt("vf")) != '\0') { flag = i; @@ -596,15 +607,13 @@ unsetcmd(int argc, char **argv) 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; } @@ -612,38 +621,9 @@ unsetcmd(int argc, char **argv) * Unset the specified variable. */ -int -unsetvar(const char *s) +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 ((flags & VSTRFIXED) == 0) { - INTOFF; - if ((flags & (VTEXTFIXED|VSTACK)) == 0) - ckfree(vp->text); - *vpp = vp->next; - ckfree(vp); - INTON; - } else if (!(flags & VUNSET)) { - setvar(s, 0, 0); - vp->flags &= ~VEXPORT; - } - retval = 0; - } - -out: - return retval; + setvar(s, 0, 0); } diff --git a/usr/dash/var.h b/usr/dash/var.h index 32b0dde25cd61..2bb82b1793b96 100644 --- a/usr/dash/var.h +++ b/usr/dash/var.h @@ -142,7 +142,7 @@ int localcmd(int, char **); void pushlocalvars(void); void poplocalvars(void); int unsetcmd(int, char **); -int unsetvar(const char *); +void unsetvar(const char *); int varcmp(const char *, const char *); static inline int varequal(const char *a, const char *b) { |