diff options
Diffstat (limited to 'Src/Modules/parameter.c')
| -rw-r--r-- | Src/Modules/parameter.c | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index 779dcd024..2bcfe81a3 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); } } @@ -150,17 +152,12 @@ scanpmparameters(UNUSED(HashTable ht), ScanFunc func, int flags) static void setpmcommand(Param pm, char *value) { - if (isset(RESTRICTED)) { - zwarn("restricted: %s", value); - zsfree(value); - } else { - Cmdnam cn = zshcalloc(sizeof(*cn)); + Cmdnam cn = zshcalloc(sizeof(*cn)); - cn->node.flags = HASHED; - cn->u.cmd = value; + cn->node.flags = HASHED; + cn->u.cmd = value; - cmdnamtab->addnode(cmdnamtab, ztrdup(pm->node.nam), &cn->node); - } + cmdnamtab->addnode(cmdnamtab, ztrdup(pm->node.nam), &cn->node); } /**/ @@ -220,10 +217,20 @@ getpmcommand(UNUSED(HashTable ht), const char *name) Cmdnam cmd; Param pm = NULL; - if (!(cmd = (Cmdnam) cmdnamtab->getnode(cmdnamtab, name)) && - isset(HASHLISTALL)) { - cmdnamtab->filltable(cmdnamtab); - cmd = (Cmdnam) cmdnamtab->getnode(cmdnamtab, name); + if (!(cmd = (Cmdnam) cmdnamtab->getnode(cmdnamtab, name))) { + if (isset(HASHLISTALL)) { + cmdnamtab->filltable(cmdnamtab); + cmd = (Cmdnam) cmdnamtab->getnode(cmdnamtab, name); + } else { + /* this will return the path even if hashcmds is disabled, + * and store it in the hash if it is enabled */ + char *found = findcmd((char*)name, 1, 0); + if (found) { + cmd = (Cmdnam) hcalloc(sizeof(*cmd)); + cmd->u.cmd = found; + cmd->node.flags = HASHED; + } + } } pm = (Param) hcalloc(sizeof(struct param)); pm->node.nam = dupstring(name); @@ -967,6 +974,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; @@ -976,8 +984,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 */ @@ -1293,7 +1302,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); @@ -1367,7 +1376,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)) @@ -1401,7 +1411,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 && @@ -1473,7 +1483,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 && @@ -2091,9 +2101,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; |
