346,7 → 346,7 |
} |
|
|
static void run_as_external(char *buff, const char far *cmdline, unsigned short envseg) { |
static void run_as_external(char *buff, const char far *cmdline, unsigned short envseg, struct rmod_props far *rmod) { |
char const **argvlist = (void *)(buff + 512); |
char *cmdfile = buff + 1024; |
const char far *pathptr; |
353,6 → 353,15 |
int lookup; |
unsigned short i; |
const char *ext; |
const char far *cmdtail; |
char far *rmod_execprog = MK_FP(rmod->rmodseg, RMOD_OFFSET_EXECPROG); |
char far *rmod_cmdtail = MK_FP(rmod->rmodseg, 0x81); |
_Packed struct { |
unsigned short envseg; |
unsigned long cmdtail; |
unsigned long fcb1; |
unsigned long fcb2; |
} far *ExecParam = MK_FP(rmod->rmodseg, RMOD_OFFSET_EXECPARAM); |
|
cmd_explode(buff + 2048, cmdline, argvlist); |
|
401,11 → 410,38 |
|
/* printf("Exec: '%s'\r\n", cmdfile); */ |
|
/* this call should never return, unless the program failed to be executed */ |
execvp(cmdfile, argvlist); |
/* find cmdtail */ |
cmdtail = cmdline; |
while (*cmdtail == ' ') cmdtail++; |
while ((*cmdtail != ' ') && (*cmdtail != '/') && (*cmdtail != '+') && (*cmdtail != 0)) { |
cmdtail++; |
} |
|
/* copy full filename to execute */ |
for (i = 0; cmdfile[i] != 0; i++) rmod_execprog[i] = cmdfile[i]; |
rmod_execprog[i] = 0; |
|
/* copy cmdtail to rmod's PSP and compute its len */ |
for (i = 0; cmdtail[i] != 0; i++) rmod_cmdtail[i] = cmdtail[i]; |
rmod_cmdtail[i] = '\r'; |
rmod_cmdtail[-1] = i; |
|
printf("Exec: '"); |
for (i = 0; rmod_execprog[i] != 0; i++) { |
printf("%c", rmod_execprog[i]); |
} |
printf("'\r\n"); |
|
/* set up rmod to execute the command */ |
|
ExecParam->envseg = 0; /* 0 = use parent's env segment */ |
ExecParam->cmdtail = (unsigned long)MK_FP(rmod->rmodseg, 0x80); /* farptr, must be in PSP format (lenbyte args \r) */ |
ExecParam->fcb1 = 0; /* TODO farptr */ |
ExecParam->fcb2 = 0; /* TODO farptr */ |
exit(0); /* let rmod do the job now */ |
} |
|
|
static void set_comspec_to_self(unsigned short envseg) { |
unsigned short *psp_envseg = (void *)(0x2c); /* pointer to my env segment field in the PSP */ |
char far *myenv = MK_FP(*psp_envseg, 0); |
594,7 → 630,7 |
} |
|
/* if here, then this was not an internal command */ |
run_as_external(BUFFER, cmdline, *rmod_envseg); |
run_as_external(BUFFER, cmdline, *rmod_envseg, rmod); |
|
/* revert stdout (in case it was redirected) */ |
redir_revert(); |