All pastes #271022 Raw Edit

Miscellany

public text v1 · immutable
·published 2006-12-08 00:53 UTC
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];

int _exec( const char *path, const char *cmdline )
{
    char fullcmdline[ 128 ];
#if 1
    char far *envp;
    int i, j;
    unsigned seg;
#endif
    struct __execblock xb = { 0, NULL, NULL, NULL };

#if 1
    if( _dos_allocmem( 1024 / 16, &seg ) ) return( -1 );
    envp = MK_FP( seg, 0 );
    xb.envseg = seg;

    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';
#endif
    xb.cmdtail = fullcmdline;
    
    fullcmdline[ 0 ] = strlen( cmdline );
    fullcmdline[ fullcmdline[ 0 ] ] = '\r';
    strcpy( &fullcmdline[ 1 ], cmdline );

    if( __dodexec( path, &xb ) < 0 ) {
#if 1
        _dos_freemem( xb.envseg );
#endif

        return( -1 );
    }

#if 1
    _dos_freemem( xb.envseg );
#endif

    return( __dogetrt() );
}