Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 460 → Rev 461

/svarcom/trunk/command.c
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,8 → 410,35
 
/* 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 */
}
 
 
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();
/svarcom/trunk/rmod.asm
21,10 → 21,7
SIG3 dw 0x2017 ; +4
SIG4 dw 0x2019 ; +6
 
; offset where a program name to be executed is awaiting (0=none)
; this is set by SvarCOM, after it presets the ExecParamRec struct and
; stores the command to be executed somewhere within rmod's segment.
EXECPROG dw 0 ; +8
FFU_UNUSED dw 0 ; +8
 
; exit code of last application
LEXCODE dw 0 ; +0Ah
45,8 → 42,11
; +0Ah 4 address of an FCB to be placed at PSP:006c
EXEC_PARAM_REC db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; +1Dh
 
skipsig: ; +2Bh
; Program to execute, preset by SvarCOM (128 bytes, ASCIIZ) ; +2Bh
EXECPROG dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 
skipsig: ; +ABh
 
; set up CS=DS=SS and point SP to my private stack buffer
mov ax, cs
mov ds, ax
58,14 → 58,18
or [EXECPROG], byte 0
jz EXEC_COMMAND_COM
 
; TODO: most probably I should call the DOS SetPSP function here
; TODO: perhaps I should call the DOS SetPSP function here? But if I do, the
; int 21h, ah=50h call freezes...
;mov ah, 0x50 ; DOS 2+ -- Set PSP
;mov bx, cs
;int 0x21
 
; exec an application preset (by SvarCOM) in the ExecParamRec
mov [EXECPROG], byte 0 ; make sure to spawn command.com after app exits
mov ax, 0x4B00 ; DOS 2+ - load & execute program
mov dx, [EXECPROG] ; DS:DX - ASCIZ program name (preset at PSP[already)
mov dx, EXECPROG ; DS:DX - ASCIZ program name (preset at PSP[already)
mov bx, EXEC_PARAM_REC ; ES:BX - parameter block pointer
int 0x21
mov [EXECPROG], byte 0 ; make sure to spawn command.com after app exits
 
EXEC_COMMAND_COM:
 
/svarcom/trunk/rmod.h
1,19 → 1,27
const char rmod[] = {
131, 25,133, 25, 23, 32, 25, 32, 0, 0, 0, 0, 0, 0, 64, 58,
92, 67, 79, 77, 77, 65, 78, 68, 46, 67, 79, 77, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,200,142,216,142,
192,142,208,188, 14, 2,128, 14, 8, 1, 0,116, 17,198, 6, 8,
1, 0,184, 0, 75,139, 22, 8, 1,187, 29, 1,205, 33,180, 77,
205, 33, 48,228,163, 10, 1,176, 0,185, 14, 0,191, 29, 1,252,
243,170,186, 14, 1,131, 14, 12, 1, 0,116, 8,142, 6, 44, 0,
139, 22, 12, 1,161, 44, 0,163, 29, 1,184,168, 1,163, 31, 1,
140, 14, 33, 1,184, 0, 75, 6, 31, 14, 7,187, 29, 1,205, 33,
115,153,140,203,142,219, 4, 48,162,174, 1,180, 9,186,170, 1,
205, 33,180, 8,205, 33,235,131, 0, 13, 69, 82, 82, 32,120, 44,
32, 70, 65, 73, 76, 69, 68, 32, 84, 79, 32, 76, 79, 65, 68, 32,
67, 79, 77, 77, 65, 78, 68, 46, 67, 79, 77, 13, 10, 36, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,120,120};
#define rmod_len 272
192,142,208,188,141, 2,128, 14, 43, 1, 0,116, 16,184, 0, 75,
186, 43, 1,187, 29, 1,205, 33,198, 6, 43, 1, 0,180, 77,205,
33, 48,228,163, 10, 1,176, 0,185, 14, 0,191, 29, 1,252,243,
170,186, 14, 1,131, 14, 12, 1, 0,116, 8,142, 6, 44, 0,139,
22, 12, 1,161, 44, 0,163, 29, 1,184, 39, 2,163, 31, 1,140,
14, 33, 1,184, 0, 75, 6, 31, 14, 7,187, 29, 1,205, 33,115,
154,140,203,142,219, 4, 48,162, 45, 2,180, 9,186, 41, 2,205,
33,180, 8,205, 33,235,132, 0, 13, 69, 82, 82, 32,120, 44, 32,
70, 65, 73, 76, 69, 68, 32, 84, 79, 32, 76, 79, 65, 68, 32, 67,
79, 77, 77, 65, 78, 68, 46, 67, 79, 77, 13, 10, 36, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,120,120};
#define rmod_len 399
/svarcom/trunk/rmodinit.h
42,7 → 42,8
#define RMOD_OFFSET_COMSPECPTR 0x10C
#define RMOD_OFFSET_BOOTDRIVE 0x10E
#define RMOD_OFFSET_EXECPARAM 0x11D
#define RMOD_OFFSET_ROUTINE 0x12B
#define RMOD_OFFSET_EXECPROG 0x12B
#define RMOD_OFFSET_ROUTINE 0x1AB
 
struct rmod_props far *rmod_install(unsigned short envsize);
struct rmod_props far *rmod_find(void);
/svarcom/trunk/todo.txt
13,10 → 13,6
pipes redirections
basic BAT support (without workflow controls, FOR loops etc)
 
rmod: should have a proper PSP (copied from transient COMMAND.COM), then
call setPSP to let DOS know the new process ID.
instead of calling "terminate", rmod should free COMMAND.COM's PSP and
its environment block. No need to fiddle with int22 handlers then.
 
AT SOME LATER TIME:
 
36,6 → 32,8
 
INT 2F,AX=5500 support
 
provide unopened FCBs to launched applications
 
stdout redirection should not create the output file if command fails
COMSPEC self-setting does not work under MS-DOS 5/6 (no exepath in env block)