diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-25 16:29:36 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-25 16:29:36 +0200 |
commit | b28d4c3462e6b0e66322503f5ef0b941e0bb9cb8 (patch) | |
tree | d25bf78558574cdd8de6b802cf6486f66dfc6db9 /shell/ash.c | |
parent | be669fa1fdff6f751c8cdd3fc18a9fa7a7f46cd3 (diff) | |
download | busybox-w32-b28d4c3462e6b0e66322503f5ef0b941e0bb9cb8.tar.gz busybox-w32-b28d4c3462e6b0e66322503f5ef0b941e0bb9cb8.tar.bz2 busybox-w32-b28d4c3462e6b0e66322503f5ef0b941e0bb9cb8.zip |
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>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 57 |
1 files changed, 16 insertions, 41 deletions
diff --git a/shell/ash.c b/shell/ash.c index 0ae086e98..72ceba782 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -2269,11 +2269,22 @@ setvareq(char *s, int flags) | |||
2269 | if (!(vp->flags & (VTEXTFIXED|VSTACK))) | 2269 | if (!(vp->flags & (VTEXTFIXED|VSTACK))) |
2270 | free((char*)vp->var_text); | 2270 | free((char*)vp->var_text); |
2271 | 2271 | ||
2272 | if (((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) | (vp->flags & VSTRFIXED)) == VUNSET) { | ||
2273 | *vpp = vp->next; | ||
2274 | free(vp); | ||
2275 | out_free: | ||
2276 | if ((flags & (VTEXTFIXED|VSTACK|VNOSAVE)) == VNOSAVE) | ||
2277 | free(s); | ||
2278 | return; | ||
2279 | } | ||
2280 | |||
2272 | flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET); | 2281 | flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET); |
2273 | } else { | 2282 | } else { |
2274 | /* variable s is not found */ | 2283 | /* variable s is not found */ |
2275 | if (flags & VNOSET) | 2284 | if (flags & VNOSET) |
2276 | return; | 2285 | return; |
2286 | if ((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) == VUNSET) | ||
2287 | goto out_free; | ||
2277 | vp = ckzalloc(sizeof(*vp)); | 2288 | vp = ckzalloc(sizeof(*vp)); |
2278 | vp->next = *vpp; | 2289 | vp->next = *vpp; |
2279 | /*vp->func = NULL; - ckzalloc did it */ | 2290 | /*vp->func = NULL; - ckzalloc did it */ |
@@ -2331,43 +2342,10 @@ setvar0(const char *name, const char *val) | |||
2331 | /* | 2342 | /* |
2332 | * Unset the specified variable. | 2343 | * Unset the specified variable. |
2333 | */ | 2344 | */ |
2334 | static int | 2345 | static void |
2335 | unsetvar(const char *s) | 2346 | unsetvar(const char *s) |
2336 | { | 2347 | { |
2337 | struct var **vpp; | 2348 | setvar0(s, NULL); |
2338 | struct var *vp; | ||
2339 | int retval; | ||
2340 | |||
2341 | vpp = findvar(hashvar(s), s); | ||
2342 | vp = *vpp; | ||
2343 | retval = 2; | ||
2344 | if (vp) { | ||
2345 | int flags = vp->flags; | ||
2346 | |||
2347 | retval = 1; | ||
2348 | if (flags & VREADONLY) | ||
2349 | goto out; | ||
2350 | #if ENABLE_ASH_RANDOM_SUPPORT | ||
2351 | vp->flags &= ~VDYNAMIC; | ||
2352 | #endif | ||
2353 | if (flags & VUNSET) | ||
2354 | goto ok; | ||
2355 | if ((flags & VSTRFIXED) == 0) { | ||
2356 | INT_OFF; | ||
2357 | if ((flags & (VTEXTFIXED|VSTACK)) == 0) | ||
2358 | free((char*)vp->var_text); | ||
2359 | *vpp = vp->next; | ||
2360 | free(vp); | ||
2361 | INT_ON; | ||
2362 | } else { | ||
2363 | setvar0(s, NULL); | ||
2364 | vp->flags &= ~VEXPORT; | ||
2365 | } | ||
2366 | ok: | ||
2367 | retval = 0; | ||
2368 | } | ||
2369 | out: | ||
2370 | return retval; | ||
2371 | } | 2349 | } |
2372 | 2350 | ||
2373 | /* | 2351 | /* |
@@ -13218,7 +13196,6 @@ unsetcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
13218 | char **ap; | 13196 | char **ap; |
13219 | int i; | 13197 | int i; |
13220 | int flag = 0; | 13198 | int flag = 0; |
13221 | int ret = 0; | ||
13222 | 13199 | ||
13223 | while ((i = nextopt("vf")) != 0) { | 13200 | while ((i = nextopt("vf")) != 0) { |
13224 | flag = i; | 13201 | flag = i; |
@@ -13226,15 +13203,13 @@ unsetcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
13226 | 13203 | ||
13227 | for (ap = argptr; *ap; ap++) { | 13204 | for (ap = argptr; *ap; ap++) { |
13228 | if (flag != 'f') { | 13205 | if (flag != 'f') { |
13229 | i = unsetvar(*ap); | 13206 | unsetvar(*ap); |
13230 | ret |= i; | 13207 | continue; |
13231 | if (!(i & 2)) | ||
13232 | continue; | ||
13233 | } | 13208 | } |
13234 | if (flag != 'v') | 13209 | if (flag != 'v') |
13235 | unsetfunc(*ap); | 13210 | unsetfunc(*ap); |
13236 | } | 13211 | } |
13237 | return ret & 1; | 13212 | return 0; |
13238 | } | 13213 | } |
13239 | 13214 | ||
13240 | static const unsigned char timescmd_str[] ALIGN1 = { | 13215 | static const unsigned char timescmd_str[] ALIGN1 = { |