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:
parent
1e96013367
commit
0b0d0094b9
1 changed files with 19 additions and 31 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue