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 ) ); }
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 ); }
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 ); }
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 ); }
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 ); }
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 ); }