1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

bltins/misc.c: exec: finish cleanup (re: d8eba9d1)

An obsolete struct was left that passed some variables on between
b_exec() and the deleted B_login(). We can simply make those local
variables now. Let's get rid of the redundant sh pointer, too.
This commit is contained in:
Martijn Dekker 2021-11-18 04:27:48 +01:00
parent 1e96013367
commit 0b0d0094b9

View file

@ -61,15 +61,6 @@
#define DOTMAX MAXDEPTH /* maximum level of . nesting */ #define DOTMAX MAXDEPTH /* maximum level of . nesting */
static void noexport(Namval_t*,void*);
struct login
{
Shell_t *sh;
int clear;
char *arg0;
};
/* /*
* Handler function for nv_scan() that unsets a variable's export attribute * Handler function for nv_scan() that unsets a variable's export attribute
*/ */
@ -88,23 +79,20 @@ int b_redirect(int argc,char *argv[],Shbltin_t *context){}
#endif #endif
int b_exec(int argc,char *argv[], Shbltin_t *context) int b_exec(int argc,char *argv[], Shbltin_t *context)
{ {
struct login logdata;
register int n; register int n;
struct checkpt *pp; struct checkpt *pp;
const char *pname; const char *pname;
int clear = 0;
logdata.clear = 0; char *arg0 = 0;
logdata.arg0 = 0; NOT_USED(argc);
logdata.sh = context->shp; sh.st.ioset = 0;
logdata.sh->st.ioset = 0;
while (n = optget(argv, *argv[0]=='r' ? sh_optredirect : sh_optexec)) switch (n) while (n = optget(argv, *argv[0]=='r' ? sh_optredirect : sh_optexec)) switch (n)
{ {
case 'a': case 'a':
logdata.arg0 = opt_info.arg; arg0 = opt_info.arg;
argc = 0;
break; break;
case 'c': case 'c':
logdata.clear=1; clear=1;
break; break;
case ':': case ':':
errormsg(SH_DICT,2, "%s", opt_info.arg); errormsg(SH_DICT,2, "%s", opt_info.arg);
@ -135,42 +123,42 @@ int b_exec(int argc,char *argv[], Shbltin_t *context)
} }
else else
{ {
register struct argnod *arg=logdata.sh->envlist; register struct argnod *arg=sh.envlist;
register Namval_t* np; register Namval_t* np;
register char *cp; register char *cp;
if(logdata.sh->subshell && !logdata.sh->subshare) if(sh.subshell && !sh.subshare)
sh_subfork(); sh_subfork();
if(logdata.clear) if(clear)
nv_scan(logdata.sh->var_tree,noexport,0,NV_EXPORT,NV_EXPORT); nv_scan(sh.var_tree,noexport,0,NV_EXPORT,NV_EXPORT);
while(arg) while(arg)
{ {
if((cp=strchr(arg->argval,'=')) && if((cp=strchr(arg->argval,'=')) &&
(*cp=0,np=nv_search(arg->argval,logdata.sh->var_tree,0))) (*cp=0,np=nv_search(arg->argval,sh.var_tree,0)))
{ {
nv_onattr(np,NV_EXPORT); nv_onattr(np,NV_EXPORT);
sh_envput(logdata.sh->env,np); sh_envput(sh.env,np);
} }
if(cp) if(cp)
*cp = '='; *cp = '=';
arg=arg->argnxt.ap; arg=arg->argnxt.ap;
} }
pname = argv[0]; pname = argv[0];
if(logdata.arg0) if(arg0)
argv[0] = logdata.arg0; argv[0] = arg0;
#ifdef JOBS #ifdef JOBS
if(job_close(logdata.sh) < 0) if(job_close(&sh) < 0)
return(1); return(1);
#endif /* JOBS */ #endif /* JOBS */
/* if the main shell is about to be replaced, decrease SHLVL to cancel out a subsequent increase */ /* if the main shell is about to be replaced, decrease SHLVL to cancel out a subsequent increase */
if(!shgd->realsubshell) if(!shgd->realsubshell)
(*SHLVL->nvalue.ip)--; (*SHLVL->nvalue.ip)--;
/* force bad exec to terminate shell */ /* force bad exec to terminate shell */
pp = (struct checkpt*)logdata.sh->jmplist; pp = (struct checkpt*)sh.jmplist;
pp->mode = SH_JMPEXIT; pp->mode = SH_JMPEXIT;
sh_sigreset(2); sh_sigreset(2);
sh_freeup(logdata.sh); sh_freeup(&sh);
path_exec(logdata.sh,pname,argv,NIL(struct argnod*)); path_exec(&sh,pname,argv,NIL(struct argnod*));
} }
return(1); return(1);
} }