int B_login(int argc,char *argv[],void *extra) { struct checkpt *pp; register struct login *logp=0; register Shell_t *shp; const char *pname; if(argc) shp = ((Shbltin_t*)extra)->shp; else { logp = (struct login*)extra; shp = logp->sh; } pp = (struct checkpt*)shp->jmplist; if(sh_isoption(SH_RESTRICTED)) errormsg(SH_DICT,ERROR_exit(1),e_restricted,argv[0]); else { register struct argnod *arg=shp->envlist; register Namval_t* np; register char *cp; if(shp->subshell && !shp->subshare) sh_subfork(); if(logp && logp->clear) { #ifdef _ENV_H env_close(shp->env); shp->env = env_open((char**)0,3); #else nv_scan(shp->var_tree,noexport,0,NV_EXPORT,NV_EXPORT); #endif } while(arg) { if((cp=strchr(arg->argval,'=')) && (*cp=0,np=nv_search(arg->argval,shp->var_tree,0))) { nv_onattr(np,NV_EXPORT); sh_envput(shp->env,np); } if(cp) *cp = '='; arg=arg->argnxt.ap; } pname = argv[0]; if(logp && logp->arg0) argv[0] = logp->arg0; #ifdef JOBS if(job_close(shp) < 0) return(1); #endif /* JOBS */ /* force bad exec to terminate shell */ pp->mode = SH_JMPEXIT; sh_sigreset(2); sh_freeup(shp); path_exec(pname,argv,NIL(struct argnod*)); sh_done(shp,0); } return(1); }
// // Builtin `login`. // int B_login(int argc, char *argv[], Shbltin_t *context) { checkpt_t *pp; struct login *logp = NULL; Shell_t *shp; const char *pname; if (argc) { shp = context->shp; } else { logp = (struct login *)context; shp = logp->sh; } pp = shp->jmplist; if (sh_isoption(shp, SH_RESTRICTED)) { errormsg(SH_DICT, ERROR_exit(1), e_restricted, argv[0]); __builtin_unreachable(); } else { struct argnod *arg = shp->envlist; Namval_t *np; char *cp; if (shp->subshell && !shp->subshare) sh_subfork(); if (logp && logp->clear) { nv_scan(shp->var_tree, noexport, 0, NV_EXPORT, NV_EXPORT); } while (arg) { cp = strchr(arg->argval, '='); if (cp && (*cp = 0, np = nv_search(arg->argval, shp->var_tree, 0))) { nv_onattr(np, NV_EXPORT); sh_envput(shp, np); } if (cp) *cp = '='; arg = arg->argnxt.ap; } pname = argv[0]; if (logp && logp->arg0) argv[0] = logp->arg0; #ifdef JOBS if (job_close(shp) < 0) return 1; #endif // JOBS // Force bad exec to terminate shell. pp->mode = SH_JMPEXIT; sh_sigreset(shp, 2); sh_freeup(shp); path_exec(shp, pname, argv, NULL); sh_done(shp, 0); } return 1; }