206,6 → 206,37 |
} |
|
|
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); |
unsigned short varcount; |
char buff[256] = "COMSPEC="; |
char *buffptr = buff + 8; |
/* who am i? look into my own environment, at the end of it should be my EXEPATH string */ |
while (*myenv != 0) { |
/* consume a NULL-terminated string */ |
while (*myenv != 0) myenv++; |
/* move to next string */ |
myenv++; |
} |
/* get next word, if 1 then EXEPATH follows */ |
myenv++; |
varcount = *myenv; |
myenv++; |
varcount |= (*myenv << 8); |
myenv++; |
if (varcount != 1) return; /* NO EXEPATH FOUND */ |
while (*myenv != 0) { |
*buffptr = *myenv; |
buffptr++; |
myenv++; |
} |
*buffptr = 0; |
/* printf("EXEPATH: '%s'\r\n", buff); */ |
env_setvar(envseg, buff); |
} |
|
|
int main(int argc, char **argv) { |
struct config cfg; |
unsigned short rmod_seg; |
220,9 → 251,8 |
if (rmod_seg == 0xffff) { |
puts("ERROR: rmod_install() failed"); |
return(1); |
} else { |
printf("rmod installed at seg 0x%04X\r\n", rmod_seg); |
} |
printf("rmod installed at seg 0x%04X\r\n", rmod_seg); |
} else { |
printf("rmod found at seg 0x%04x\r\n", rmod_seg); |
} |
230,6 → 260,9 |
rmod_envseg = MK_FP(rmod_seg, RMOD_OFFSET_ENVSEG); |
lastexitcode = MK_FP(rmod_seg, RMOD_OFFSET_LEXITCODE); |
|
/* make COMPSEC point to myself */ |
set_comspec_to_self(*rmod_envseg); |
|
{ |
unsigned short envsiz; |
unsigned short far *sizptr = MK_FP(*rmod_envseg - 1, 3); |
311,20 → 344,13 |
/* move pointer forward to skip over any leading spaces */ |
while (*cmdline == ' ') cmdline++; |
|
/* update rmod's ptr to COMPSPEC so it is always up to date */ |
rmod_updatecomspecptr(rmod_seg, *rmod_envseg); |
|
/* try matching (and executing) an internal command */ |
{ |
int ecode = cmd_process(*rmod_envseg, cmdline); |
if (ecode >= 0) *lastexitcode = ecode; |
/* update rmod's ptr to COMPSPEC, in case it changed */ |
{ |
unsigned short far *comspecptr = MK_FP(rmod_seg, RMOD_OFFSET_COMSPECPTR); |
char far *comspecfp = env_lookup(*rmod_envseg, "COMSPEC"); |
if (comspecfp != NULL) { |
*comspecptr = FP_OFF(comspecfp) + 8; /* +8 to skip the "COMSPEC=" prefix */ |
} else { |
*comspecptr = 0; |
} |
} |
if (ecode >= -1) continue; /* internal command executed */ |
} |
|