From 8346a5e8d28899f88c92ea3cd772012ad4a50e49 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 5 Jun 2006 13:21:56 +0000 Subject: [PATCH] 22483: add $sysparams to zsh/system --- ChangeLog | 5 +++ Doc/Zsh/mod_system.yo | 18 +++++++- Src/Modules/system.c | 97 +++++++++++++++++++++++++++++++++++++++---- Src/params.c | 4 +- 4 files changed, 112 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42b04e5e5..4075922f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-06-05 Peter Stephenson + + * 22483: Src/params.c, Src/Modules/system.c, + Doc/Zsh/mod_system.yo: add $sysparams to zsh/system. + 2006-06-02 Clint Adams * 22481: Oliver Kiddle: Completion/Unix/Command/_subversion: diff --git a/Doc/Zsh/mod_system.yo b/Doc/Zsh/mod_system.yo index ca15fb5ec..3540a168f 100644 --- a/Doc/Zsh/mod_system.yo +++ b/Doc/Zsh/mod_system.yo @@ -2,7 +2,7 @@ COMMENT(!MOD!zsh/system A builtin interface to various low-level system features. !MOD!) The tt(zsh/system) module makes available three builtin commands and -a parameter. +two parameters. sect(Builtins) @@ -114,6 +114,7 @@ enditem() sect(Parameters) startitem() +vindex(errnos) item(tt(errnos))( A readonly array of the names of errors defined on the system. These are typically macros defined in C by including the system header file @@ -125,4 +126,19 @@ tt(E)var(num) in the array. Note that aliases for errors are not handled; only the canonical name is used. ) +vindex(sysparams) +item(tt(sysparams))( +A readonly associative array. The keys are: +startitem() +item(tt(pid))( +Returns the process ID of the current process, even in subshells. Compare +tt($$), which returns the process ID of the main shell process. +) +item(tt(ppid))( +Returns the process ID of the parent of the current process, even in +subshells. Compare tt($PPID), which returns the process ID of the parent +of the main shell process. +) +enditem() +) enditem() diff --git a/Src/Modules/system.c b/Src/Modules/system.c index dfdf094b9..1eaa2fabd 100644 --- a/Src/Modules/system.c +++ b/Src/Modules/system.c @@ -340,6 +340,12 @@ bin_syserror(char *nam, char **args, Options ops, UNUSED(int func)) return 0; } +static struct builtin bintab[] = { + BUILTIN("syserror", 0, bin_syserror, 0, 1, 0, "e:p:", NULL), + BUILTIN("sysread", 0, bin_sysread, 0, 1, 0, "c:i:o:s:t:", NULL), + BUILTIN("syswrite", 0, bin_syswrite, 1, 1, 0, "c:o:", NULL), +}; + /* Functions for the errnos special parameter. */ @@ -351,16 +357,54 @@ errnosgetfn(UNUSED(Param pm)) return arrdup((char **)sys_errnames); } - -static struct builtin bintab[] = { - BUILTIN("syserror", 0, bin_syserror, 0, 1, 0, "e:p:", NULL), - BUILTIN("sysread", 0, bin_sysread, 0, 1, 0, "c:i:o:s:t:", NULL), - BUILTIN("syswrite", 0, bin_syswrite, 1, 1, 0, "c:o:", NULL), -}; - static const struct gsu_array errnos_gsu = { errnosgetfn, arrsetfn, stdunsetfn }; + +/* Functions for the sysparams special parameter. */ + +/**/ +static char * +sysparamgetfn(Param pm) +{ + char buf[DIGBUFSIZE]; + int num; + + if (!strcmp(pm->node.nam, "pid")) { + num = (int)getpid(); + } else if (!strcmp(pm->node.nam, "ppid")) { + num = (int)getppid(); + } + else { +#ifdef DEBUG + dputs("Bad sysparam parameter"); +#endif + return ""; + } + + sprintf(buf, "%d", num); + return dupstring(buf); +} + +static const struct gsu_scalar sysparam_gsu = +{ sysparamgetfn, strsetfn, stdunsetfn }; + +static void +fixsysparams(HashNode hn, int flags) +{ + Param pm = (Param)hn; + + if (flags) { + /* prepare to free */ + pm->node.flags &= ~PM_READONLY; + } else { + /* assign */ + pm->gsu.s = &sysparam_gsu; + pm->node.flags |= PM_READONLY; + } +} + + /* The load/unload routines required by the zsh library interface */ /**/ @@ -385,7 +429,12 @@ tidyparam(Param pm) int boot_(Module m) { - Param pm_nos; + Param pm_nos, pm_params; + HashTable ht; + const char *sysparams_args[] = { + "pid", "ppid", NULL + }, **srcptr; + char **arglist, **dstptr; /* this takes care of an autoload on errnos */ unsetparam("errnos"); @@ -394,8 +443,31 @@ boot_(Module m) return 1; pm_nos->gsu.a = &errnos_gsu; + if (!(pm_params = createparam("sysparams", PM_HASHED|PM_SPECIAL| + PM_HIDE|PM_HIDEVAL|PM_REMOVABLE))) { + tidyparam(pm_nos); + return 1; + } + pm_params->level = pm_params->old ? locallevel : 0; + pm_params->gsu.h = &stdhash_gsu; + pm_params->u.hash = ht = newparamtable(0, "sysparams"); + + arglist = (char **)zshcalloc((2*arrlen((char **)sysparams_args) + 1) * + sizeof(char *)); + for (srcptr = sysparams_args, dstptr = arglist; *srcptr; ) { + *dstptr++ = ztrdup(*srcptr++); + *dstptr++ = ztrdup(""); + } + *dstptr = NULL; + /* make sure we don't overwrite the hash table: use the "augment" arg */ + arrhashsetfn(pm_params, arglist, 1); + scanhashtable(ht, 0, 0, 0, fixsysparams, 0); + + pm_params->node.flags |= PM_READONLY; + if (!addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab))) { tidyparam(pm_nos); + tidyparam(pm_params); return 1; } return 0; @@ -406,7 +478,14 @@ boot_(Module m) int cleanup_(Module m) { - tidyparam((Param)paramtab->getnode(paramtab, "errnos")); + Param pm; + if ((pm = (Param)paramtab->getnode(paramtab, "errnos"))) + tidyparam(pm); + if ((pm = (Param)paramtab->getnode(paramtab, "sysparams"))) + { + scanhashtable(pm->u.hash, 0, 0, 0, fixsysparams, 1); + tidyparam(pm); + } deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); return 0; diff --git a/Src/params.c b/Src/params.c index 6965df0ed..7deee4288 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2516,7 +2516,7 @@ strgetfn(Param pm) /* Function to set value of a scalar (string) parameter */ /**/ -static void +mod_export void strsetfn(Param pm, char *x) { zsfree(pm->u.str); @@ -2587,7 +2587,7 @@ nullsethashfn(UNUSED(Param pm), HashTable x) /* Function to set value of an association parameter using key/value pairs */ /**/ -static void +mod_export void arrhashsetfn(Param pm, char **val, int augment) { /* Best not to shortcut this by using the existing hash table, *