home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / C / FS191 / XSPAWN33 / XSPWNVPE.C < prev    next >
Text File  |  1991-05-04  |  2KB  |  63 lines

  1. /*
  2.  *                   XSPAWN
  3.  *                Version 1.33
  4.  *  (C) Copyright 1990 Whitney Software, Inc.
  5.  *             All Rights Reserved
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <errno.h>
  12. #include "xspawnp.h"
  13.  
  14. int xspawnvpe( modeflag, path, argv, envp )
  15. int modeflag;                    /* execution mode for parent process */
  16. char *path;                      /* file to be executed */
  17. char *argv[];                    /* array of pointers to arguments */
  18. char *envp[];                    /* array of pointers to environment strings */
  19. {
  20.     register char *e;
  21.     register char *p;
  22.     char buf[ 80 ];
  23.     int rc;
  24.  
  25.     if (( rc = xspawnve( modeflag, path, argv, envp )) != -1 ||
  26.         errno != ENOENT || *path == '\\' || *path == '/' ||
  27.         *path && *( path + 1 ) == ':' || ( e = getenv( "PATH" )) == NULL )
  28.     {
  29.         return( rc );
  30.     }
  31.  
  32.     for ( ;; e++ )
  33.     {
  34.         if (( p = strchr( e, ';' )) != NULL )
  35.         {
  36.             if ( p - e > 66 )
  37.             {
  38.                 e = p;
  39.                 continue;
  40.             }
  41.         }
  42.         else if ( strlen( e ) > 66 )
  43.             return( -1 );
  44.         p = buf;
  45.         while ( *e && *e != ';' )
  46.             *p++ = *e++;
  47.         if ( p > buf )
  48.         {
  49.             if ( *( p - 1 ) != '\\' && *( p - 1 ) != '/' )
  50.                 *p++ = '\\';
  51.             strcpy( p, path );
  52.  
  53.             if (( rc = xspawnve( modeflag, buf, argv, envp )) != -1 ||
  54.                 errno != ENOENT )
  55.             {
  56.                 return( rc );
  57.             }
  58.         }
  59.         if ( *e == '\0' )
  60.             return( -1 );
  61.     }
  62. }
  63.