rendered paste body#include <dos.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
struct __execblock {
unsigned short envseg;
void far * cmdtail;
void far * fcb1;
void far * fcb2;
};
int __dodexec( const char *path, struct __execblock *xb );
#pragma aux __dodexec = \
"mov ax, 0x4B00" \
"int 0x21" \
"jnc finish" \
"mov _doserrno, ax" \
"mov ax, 0xFFFF" \
"finish:" \
parm [dx] [bx] \
value [ax] \
modify [ax bx dx];
unsigned char __dogetrt( void );
#pragma aux __dogetrt = \
"mov ah, 0x4D" \
"int 0x21" \
value [al] \
modify [ax];
unsigned short __makeenv( int size, char *envp );
#pragma aux __makeenv = \
"mov ah, 0x48" \
"int 0x21" \
"jnc docopy" \
"mov ax, 0" \
"jmp end" \
"docopy:" \
"push es" \
"mov es, ax" \
"mov bx, 0" \
"cont:" \
"mov cx, [si]" \
"mov es:[bx], cx" \
"inc bx" \
"inc si" \
"cmp -2[si], 0" \
"jnz cont" \
"cmp -1[si], 0" \
"jnz cont" \
"pop es" \
"end:" \
parm [bx] [si] \
value [ax] \
modify [ax bx cx si];
int _exec( const char *path, const char *cmdline )
{
char fullcmdline[ 128 ];
char environment[ 4096 ], *envp = environment;
int i, j;
struct __execblock xb = { 0, NULL, NULL, NULL };
for( i = 0; environ[ i ] != NULL; i++ ) {
for( j = 0; environ[ i ][ j ] != '\0'; j++ ) {
*envp = environ[ i ][ j ];
envp++;
}
*envp = '\0';
envp++;
}
*envp = '\0';
xb.envseg = __makeenv( ( 4096 / 16 ), environment );
xb.cmdtail = fullcmdline;
fullcmdline[ 0 ] = strlen( cmdline );
fullcmdline[ fullcmdline[ 0 ] ] = '\r';
strcpy( &fullcmdline[ 1 ], cmdline );
if( __dodexec( path, &xb ) < 0 ) {
_dos_freemem( xb.envseg );
return( -1 );
}
_dos_freemem( xb.envseg );
return( __dogetrt() );
}