/* This module should be dynamically loaded with enable -f * which would create a new builtin named mypid. You'll need * the source code for GNU bash to recompile this module. * * Then, from within bash, enable -f ./mypid enable_mypid, where ./mypid * is the binary obtained from running make. Hereafter, `${MYPID}' * is a shell builtin variable. */ #include #include #include #include "builtins.h" #include "shell.h" #define INIT_DYNAMIC_VAR(var, val, gfunc, afunc) \ do \ { SHELL_VAR *v = bind_variable (var, (val), 0); \ v->dynamic_value = gfunc; \ v->assign_func = afunc; \ } \ while (0) static SHELL_VAR * assign_mypid ( SHELL_VAR *self, char *value, arrayind_t unused ) { return (self); } static SHELL_VAR * get_mypid (SHELL_VAR *var) { int rv; char *p; rv = getpid(); p = itos (rv); FREE (value_cell (var)); VSETATTR (var, att_integer); var_setvalue (var, p); return (var); } int enable_mypid_builtin(WORD_LIST *list) { INIT_DYNAMIC_VAR ("MYPID", (char *)NULL, get_mypid, assign_mypid); return 0; } char const *enable_mypid_doc[] = { "Enables use of the ${MYPID} dynamic variable. ", "It will yield the current pid of a subshell.", (char *)0 }; struct builtin enable_mypid_struct = { "enable_mypid", enable_mypid_builtin, BUILTIN_ENABLED, (char**)(void*)enable_mypid_doc, "enable_mypid N", 0 };