Exemple #1
0
static char *FindExtender( char *fullpath, char **endname )
{
#if defined(DOS4G)
    char        *name;
    const char  __far *d4gname;
    unsigned    len;

    d4gname = DOSEnvFind( "DOS4GPATH" );
    if( d4gname != NULL ) {
_DBG_Write("Got DOS4GPATH -<");
_DBG_Write(d4gname);
_DBG_Writeln(">");
        len = _fstrlen( d4gname );
        if( len > 4 ) {
            const char __far *ext = d4gname + len - 4;
            if( ext[0] == '.'
                && LOW( ext[1] ) == 'e'
                && LOW( ext[2] ) == 'x'
                && LOW( ext[3] ) == 'e' ) {
_DBG_Writeln( "is exe\r\n" );
                *endname = CopyStr( d4gname, fullpath );
                return( fullpath );
            }
        }
        name = CheckPath( d4gname, fullpath, endname );
        if( name != NULL ) {
_DBG_Writeln( "found in path\r\n" );
            return( name );
        }
    }
#endif
    return( CheckPath( DOSEnvFind( "PATH" ), fullpath, endname ) );
}
Exemple #2
0
size_t EnvLkup( const char *name, char *buff, size_t buff_len )
{
    const char  __far *env;
    size_t      len;
    bool        output;
    char        c;

    env = DOSEnvFind( name );
    if( env == NULL )
        return( 0 );

    output = false;
    if( buff_len != 0 && buff != NULL ) {
        --buff_len;
        output = true;
    }
    for( len = 0; (c = *env++) != NULLCHAR; ++len ) {
        if( output ) {
            if( len >= buff_len ) {
                break;
            }
            *buff++ = c;
        }
    }
    if( output ) {
        buff[len] = NULLCHAR;
    }
    return( len );
}
Exemple #3
0
unsigned EnvLkup( char *src, char *buff, unsigned max_len )
{
    char        *env;
    unsigned    len;
    int         output = 0;
    char        c;

    env = DOSEnvFind( src );
    if( env == NULL )
        return( 0 );
    if( max_len != 0 && buff != NULL ) {
        --max_len;
        output = 1;
    }
    for( len = 0; (c = *env++) != '\0'; ++len ) {
        if( output ) {
            if( len >= max_len ) {
                break;
            }
            *buff++ = c;
        }
    }
    if( output ) {
        buff[len] = '\0';
    }
    return( len );
}
Exemple #4
0
unsigned EnvLkup( const char *name, char *buff, unsigned buff_len )
{
    const char  __far *env;
    unsigned    len;
    int         output = 0;
    char        c;

    env = DOSEnvFind( name );
    if( env == NULL )
        return( 0 );
    if( buff_len != 0 && buff != NULL ) {
        --buff_len;
        output = 1;
    }
    for( len = 0; (c = *env++) != '\0'; ++len ) {
        if( output ) {
            if( len >= buff_len ) {
                break;
            }
            *buff++ = c;
        }
    }
    if( output ) {
        buff[len] = '\0';
    }
    return( len );
}
Exemple #5
0
long FindFilePath( char *pgm, char *buffer, char *ext_list )
{
    const char  far *path;
    char        *p2;
    char        *p3;
    tiny_ret_t  rc;
    int         have_ext;
    int         have_path;

    have_ext = 0;
    have_path = 0;
    for( p3 = pgm, p2 = buffer; *p2 = *p3; ++p3, ++p2 ) {
        switch( *p3 ) {
        case '\\':
        case '/':
        case ':':
            have_path = 1;
            have_ext = 0;
            break;
        case '.':
            have_ext = 1;
            break;
        }
    }
    if( have_ext )
        ext_list = "";
    rc = TryPath( buffer, p2, ext_list );
    if( TINY_OK( rc ) || have_path )
        return( rc );
    path = DOSEnvFind( "PATH" );
    if( path == NULL )
        return( rc );
    for(;;) {
        if( *path == '\0' )
            break;
        p2 = buffer;
        while( *path ) {
            if( *path == ';' )
                break;
            *p2++ = *path++;
        }
        if( p2[-1] != '\\' && p2[-1] != '/' ) {
            *p2++ = '\\';
        }
        for( p3 = pgm; *p2 = *p3; ++p2, ++p3 )
            {}
        rc = TryPath( buffer, p2, ext_list );
        if( TINY_OK( rc ) )
            break;
        if( *path == '\0' )
            break;
        ++path;
    }
    return( rc );
}
Exemple #6
0
const char *RemoteLink( const char *parms, bool server )
{
#ifdef SERVER
    unsigned long       link;
  #if defined(ACAD)
    {
        XVersion = 2;
        if( GetCS() & 3 ) {
            Meg1 = 0x37;
        } else {
            Meg1 = 0x60;
        }
    }
  #elif defined(PHARLAP)
    {
        CONFIG_INF              config;
        static unsigned char    buff[256];

        _dx_config_inf(&config, buff );
        XVersion = config.c_major;
        if( XVersion >= 3 ) {
            Meg1 = config.c_dos_sel;
        } else {
            Meg1 = 0x60;
        }
    }
  #elif defined(CAUSEWAY)
    Meg1 = GetZeroSel();
  #endif
    parms = parms;
    link = GetDosLong( LINK_VECTOR * 4 );
    if( link >= (1024UL * 1024UL) || GetDosLong( link ) != LINK_SIGNATURE ) {
        return( TRP_ERR_not_from_command );
    }
    RMBuffPtr = RMLinToPM( GetDosLong( link + 4 ), 0 );
    RMProcAddr = GetDosLong( link + 8 );
    PutDosLong( LINK_VECTOR * 4, GetDosLong( link + 12 ) );
#else
    static char     fullpath[256];              /* static because ss != ds */
    static char     buff[256];
    static char     *endname;
    char            *name;
    char            *buffp;
    char            *endparm;
    void            __far *link[4];
    void            __far * __far * link_ptr;
    unsigned        len;
  #if defined(PHARLAP)
    const char      *exe_name;
  #endif

    _DBG_EnterFunc( "RemoteLink()" );
    BackFromFork = 0;
    link_ptr = (void __far *)(LINK_VECTOR * 4);
    link[ 3 ] = *link_ptr;
    link[ 2 ] = MK_FP( GetCS(), (unsigned )BackFromProtMode );
    link[ 1 ] = (void __far *)MK_LINEAR( &Buff );
    link[ 0 ] = (void __far *)LINK_SIGNATURE;
    *link_ptr = (void __far *)MK_LINEAR( &link );
    // parms has following format
    // "trap parameters string"+"\0"+"command line string"+"\0"
    _DBG_Write( "Parms: " );
    _DBG_NoTabWriteln( parms );
    while( *parms == ' ' )
        ++parms;
    if( *parms == '`' ) {
        ++parms;
        buffp = buff;
        while( *parms != '\0' ) {
            if( *parms == '`' ) {
                ++parms;
                break;
            }
            *buffp++ = *parms++;
        }
        *buffp = '\0';
    }
    while( *parms == ' ' )
        ++parms;
    if( setjmp( RealModeState ) == 0 ) {
        name = FindExtender( fullpath, &endname );
        if( name == NULL ) {
            _DBG_ExitFunc( "RemoteLink(), unable to find extender" );
            return( TRP_ERR_no_extender );
        }
        _DBG_Write( "Extender name: " );
        _DBG_NoTabWriteln( name );
        while( *endname++ != '\0' ) {}      // skip after extender name + '\0'
  #if defined(ACAD)
        buffp = buff;
        *buffp = '\0';
  #else
        {
            static char     *endhelp;
            const char      *help_name;

    #if defined(PHARLAP)
            exe_name = parms;
            while( *exe_name++ != '\0' ) {} // skip to command line
            help_name = GetHelpName( exe_name );
    #else
            help_name = HELPNAME;
    #endif
            buffp = SearchPath( DOSEnvFind( "PATH" ), help_name, buff, &endhelp );
            if( *buffp == '\0' ) {
                _DBG_ExitFunc( "RemoteLink(), unable to find extender help file" );
                return( TRP_ERR_no_extender );
            }
        }
  #endif
        _DBG_Write( "Extender help name: " );
        _DBG_NoTabWriteln( buffp );
        endparm = CopyStr( parms, endname + 1 );     // reserve length byte
        endparm = CopyStr( buffp, CopyStr( " ", endparm ) );
  #if defined(PHARLAP)
        endparm = CopyStr( " ", endparm );
        endparm = CopyStr( exe_name, endparm );     // add extra executable name
  #endif
        len = endparm - ( endname + 1 );
        if( len > 126 )
            len = 126;
        *endname = len;       // setup length byte
        endparm = endname + len + 1;
        endparm[0] = '\r';
        endparm[1] = '\0';
        _DBG_Write( "Extender Cmd line: " );
        _DBG_NoTabWriteln( endname + 1 );
        _DBG_Writeln( "calling _fork() to start extender/debugee" );
        if( _fork( name, endname ) != 0 ) {
            _DBG_ExitFunc( "RemoteLink(), unable to start extender" );
            return( TRP_ERR_cant_start_extender );
        }
    } else if( BackFromFork || !BeenToProtMode ) {
        _DBG_ExitFunc( "RemoteLink(), extender could not start extender help file" );
        return( TRP_ERR_cant_start_extender );
    }
#endif
    server = server;
    _DBG_ExitFunc( "RemoteLink()" );
    return( NULL );
}