#include #include #include #include #include #include #include #include static const char __exe[] = ".EXE"; static const char __com[] = ".COM"; static const char __bat[] = ".BAT"; static char __batflag = 0; static char *__getcomexe( const char *path ) { char *p; static char fullpath[ PATH_MAX ]; strcpy( fullpath, path ); if( ( p = strrchr( fullpath, '\\' ) ) == NULL ) p = fullpath; while( *p && *p != '.' ) p++; if( *p == '.' ) { if( strcmp( p, __exe ) != 0 && strcmp( p, __com ) != 0 && strcmp( p, __bat ) != 0 ) while( *p ) p++; else { return( ( char * )__retsfn( fullpath ) ); } } strcpy( p, __com ); if( access( fullpath, F_OK ) == 0 ) return( ( char * )__retsfn( fullpath ) ); strcpy( p, __exe ); if( access( fullpath, F_OK ) == 0 ) return( ( char * )__retsfn( fullpath ) ); strcpy( p, __bat ); __batflag = 1; if( access( fullpath, F_OK ) == 0 ) return( ( char * )__retsfn( fullpath ) ); return( NULL ); } int spawnv( int mode, const char *path, char **argv ) { char *fullpath = __getcomexe( path ); char cmdline[ _POSIX_ARG_MAX ]; int retval; cmdline[ 0 ] = '\0'; if( mode == P_NOWAIT ) { errno = EINVAL; return( -1 ); } if( fullpath == NULL ) { errno = ENOENT; return( -1 ); } if( __batflag ) { strcpy( cmdline, "/c " ); strcat( cmdline, fullpath ); fullpath = getenv( "COMSPEC" ); if( fullpath == NULL ) { errno = ENOENT; return( -1 ); } } if( *argv == NULL ) goto skip; argv++; /* We don't use argv[ 0 ] */ for( ; *argv != NULL; argv++ ) { strcat( cmdline, " \"" ); strcat( cmdline, *argv ); strcat( cmdline, "\"" ); } skip: retval = _exec( fullpath, cmdline ); if( mode == P_OVERLAY ) exit( retval ); return( retval ); }