aboutsummaryrefslogtreecommitdiff
path: root/shell/ash.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-07-25 16:29:36 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-07-25 16:29:36 +0200
commitb28d4c3462e6b0e66322503f5ef0b941e0bb9cb8 (patch)
treed25bf78558574cdd8de6b802cf6486f66dfc6db9 /shell/ash.c
parentbe669fa1fdff6f751c8cdd3fc18a9fa7a7f46cd3 (diff)
downloadbusybox-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.c57
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 */
2334static int 2345static void
2335unsetvar(const char *s) 2346unsetvar(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
13240static const unsigned char timescmd_str[] ALIGN1 = { 13215static const unsigned char timescmd_str[] ALIGN1 = {