Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: parameter: Fix some issues in the parameter module
use strtol, not strtod
use WEXITSTATUS on returned status, though I'm not sure when this path
can actually be taken?
don't abort getting group names just because one name is missing
storing ${(kv)parameters} in a copy and then reading that wouldn't say
what type a nameref pointed to
setting multiple options via options=( foo on ) didn't verify the option
name before trying to set it, reporting it as a failure to set it instead
---
Src/Modules/parameter.c | 42 ++++++++++++++++++++++++-----------------
1 file changed, 25 insertions(+), 17 deletions(-)
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index 66483ad244..6d1f74d226 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -40,7 +40,7 @@ static int incleanup;
/**/
static char *
-paramtypestr(Param pm)
+paramtypestr(Param pm, int append)
{
char *val = NULL;
int f = pm->node.flags;
@@ -91,6 +91,13 @@ paramtypestr(Param pm)
} else
val = dupstring("");
+ if (append) {
+ if ((pm->node.flags & PM_NAMEREF) && pm->u.str && *(pm->u.str) &&
+ (pm = (Param) realparamtab->getnode(realparamtab, pm->node.nam)) &&
+ !(pm->node.flags & PM_UNSET)) {
+ val = zhtricat(val, "-", paramtypestr(pm, 0));
+ }
+ }
return val;
}
@@ -106,12 +113,7 @@ getpmparameter(UNUSED(HashTable ht), const char *name)
pm->gsu.s = &nullsetscalar_gsu;
if ((rpm = (Param) realparamtab->getnode2(realparamtab, name)) &&
!(rpm->node.flags & PM_UNSET)) {
- pm->u.str = paramtypestr(rpm);
- if ((rpm->node.flags & PM_NAMEREF) && rpm->u.str && *(rpm->u.str) &&
- (rpm = (Param) realparamtab->getnode(realparamtab, name)) &&
- !(rpm->node.flags & PM_UNSET)) {
- pm->u.str = zhtricat(pm->u.str, "-", paramtypestr(rpm));
- }
+ pm->u.str = paramtypestr(rpm, 1);
} else {
pm->u.str = dupstring("");
pm->node.flags |= (PM_UNSET|PM_SPECIAL);
@@ -139,7 +141,7 @@ scanpmparameters(UNUSED(HashTable ht), ScanFunc func, int flags)
if (func != scancountparams &&
((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) ||
!(flags & SCANPM_WANTKEYS)))
- pm.u.str = paramtypestr((Param) hn);
+ pm.u.str = paramtypestr((Param) hn, 1);
func(&pm.node, flags);
}
}
@@ -962,6 +964,7 @@ setpmoptions(Param pm, HashTable ht)
for (hn = ht->nodes[i]; hn; hn = hn->next) {
struct value v;
char *val;
+ int n;
v.scanflags = v.valflags = v.start = 0;
v.end = -1;
@@ -971,8 +974,9 @@ setpmoptions(Param pm, HashTable ht)
val = getstrvalue(&v);
if (!val || (strcmp(val, "on") && strcmp(val, "off")))
zwarn("invalid value: %s", val);
- else if (dosetopt(optlookup(hn->nam),
- (val && strcmp(val, "off")), 0, opts))
+ else if (!(n = optlookup(hn->nam)))
+ zwarn("no such option: %s", hn->nam);
+ else if (dosetopt(n, (val && strcmp(val, "off")), 0, opts))
zwarn("can't change option: %s", hn->nam);
}
/* See setpmcommands() above */
@@ -1288,7 +1292,7 @@ getpmjobtext(UNUSED(HashTable ht), const char *name)
selectjobtab(&jtab, &jmax);
- job = strtod(name, &pend);
+ job = strtol(name, &pend, 10);
/* Non-numeric keys are looked up by job name */
if (*pend)
job = getjob(name, NULL);
@@ -1362,7 +1366,8 @@ pmjobstate(Job jtab, int job)
state = "running";
else if (WIFEXITED(pn->status)) {
if (WEXITSTATUS(pn->status))
- sprintf((state = buf2), "exit %d", (pn->status));
+ sprintf((state = buf2), "exit %d",
+ WEXITSTATUS(pn->status));
else
state = "done";
} else if (WIFSTOPPED(pn->status))
@@ -1396,7 +1401,7 @@ getpmjobstate(UNUSED(HashTable ht), const char *name)
selectjobtab(&jtab, &jmax);
- job = strtod(name, &pend);
+ job = strtol(name, &pend, 10);
if (*pend)
job = getjob(name, NULL);
if (job >= 1 && job <= jmax &&
@@ -1468,7 +1473,7 @@ getpmjobdir(UNUSED(HashTable ht), const char *name)
selectjobtab(&jtab, &jmax);
- job = strtod(name, &pend);
+ job = strtol(name, &pend, 10);
if (*pend)
job = getjob(name, NULL);
if (job >= 1 && job <= jmax &&
@@ -2086,9 +2091,12 @@ static Groupset get_all_groups(void)
for (gaptr = gs->array; gaptr < gs->array + gs->num; gaptr++) {
grptr = getgrgid(gaptr->gid);
if (!grptr) {
- return NULL;
- }
- gaptr->name = dupstring(grptr->gr_name);
+ /* a group we're in has been deleted from /etc/groups */
+ char buf[DIGBUFSIZE];
+ convbase(buf, (zlong)gaptr->gid, 10);
+ gaptr->name = dupstring(buf);
+ } else
+ gaptr->name = dupstring(grptr->gr_name);
}
return gs;
--
2.38.1
Messages sorted by:
Reverse Date,
Date,
Thread,
Author