74 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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 <stdio.h>
 | |
| #include <errno.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #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,
 | |
|      char *key )
 | |
| {
 | |
|   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[] = {
 | |
|   "Enable $MYPID.",
 | |
|   "",
 | |
|   "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
 | |
| };
 | 
