static struct varinit * findvar(struct varinit *vp, const char *name) { for (; vp; vp = (struct varinit *)get_addr((vp->next_offset))) { if (varequal((char *)get_addr(vp->name_offset), name)) { break; } } return vp; }
void setvareq(char *s, int flags) { struct var *vp, **vpp; int len; if (aflag) flags |= VEXPORT; vpp = hashvar(s); for (vp = *vpp ; vp ; vp = vp->next) { if (varequal(s, vp->text)) { if (vp->flags & VREADONLY) { len = strchr(s, '=') - s; error("%.*s: is read only", len, s); } INTOFF; if (vp->func && (flags & VNOFUNC) == 0) (*vp->func)(strchr(s, '=') + 1); if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) ckfree(vp->text); vp->flags &= ~(VTEXTFIXED|VSTACK|VUNSET); vp->flags |= flags; vp->text = s; /* * We could roll this to a function, to handle it as * a regular variable function callback, but why bother? */ if (vp == &vmpath || (vp == &vmail && ! mpathset())) chkmail(1); if ((vp->flags & VEXPORT) && localevar(s)) { putenv(s); (void) setlocale(LC_ALL, ""); } INTON; return; } } /* not found */ vp = ckmalloc(sizeof (*vp)); vp->flags = flags; vp->text = s; vp->next = *vpp; vp->func = NULL; INTOFF; *vpp = vp; if ((vp->flags & VEXPORT) && localevar(s)) { putenv(s); (void) setlocale(LC_ALL, ""); } INTON; }
char * bltinlookup(char *name, int doall) { struct strlist *sp; struct var *v; for (sp = cmdenviron ; sp ; sp = sp->next) { if (varequal(sp->text, name)) return strchr(sp->text, '=') + 1; } for (v = *hashvar(name) ; v ; v = v->next) { if (varequal(v->text, name)) { if ((v->flags & VUNSET) || (!doall && (v->flags & VEXPORT) == 0)) return NULL; return strchr(v->text, '=') + 1; } } return NULL; }
STATIC int localevar(char *s) { static char *lnames[7] = { "ALL", "COLLATE", "CTYPE", "MONETARY", "NUMERIC", "TIME", NULL }; char **ss; if (*s != 'L') return 0; if (varequal(s + 1, "ANG")) return 1; if (strncmp(s + 1, "C_", 2) != 0) return 0; for (ss = lnames; *ss ; ss++) if (varequal(s + 3, *ss)) return 1; return 0; }
char * lookupvar(char *name) { struct var *v; for (v = *hashvar(name) ; v ; v = v->next) { if (varequal(v->text, name)) { if (v->flags & VUNSET) return NULL; return strchr(v->text, '=') + 1; } } return NULL; }