home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / crt / src / execle.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  2KB  |  90 lines

  1. /***
  2. *execle.c - execute a file with arg list and environment
  3. *
  4. *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
  5. *
  6. *Purpose:
  7. *       defines _execle() - execute a file
  8. *
  9. *******************************************************************************/
  10.  
  11. #include <cruntime.h>
  12. #include <stddef.h>
  13. #include <process.h>
  14. #include <stdarg.h>
  15. #include <internal.h>
  16. #include <malloc.h>
  17. #include <tchar.h>
  18. #include <dbgint.h>
  19.  
  20. /***
  21. *int _execle(filename, arglist) - execute a file
  22. *
  23. *Purpose:
  24. *       Execute the given file (overlays the calling process).
  25. *       We must dig the environment vector out of the stack and pass it
  26. *       and address of argument vector to execve.
  27. *
  28. *Entry:
  29. *       _TSCHAR *filename - file to execute
  30. *       _TSCHAR *arglist  - argument list followed by environment
  31. *       should be called like _execle(path, arg0, arg1, ..., argn, NULL, envp);
  32. *
  33. *Exit:
  34. *       destroys calling process (hopefully)
  35. *       if fails, returns -1.
  36. *
  37. *Exceptions:
  38. *
  39. *******************************************************************************/
  40.  
  41. int __cdecl _texecle (
  42.         const _TSCHAR *filename,
  43.         const _TSCHAR *arglist,
  44.         ...
  45.         )
  46. {
  47. #ifdef _M_IX86
  48.  
  49.         REG1 const _TSCHAR **e_search = &arglist;
  50.  
  51.         _ASSERTE(filename != NULL);
  52.         _ASSERTE(*filename != _T('\0'));
  53.         _ASSERTE(arglist != NULL);
  54.         _ASSERTE(*arglist != _T('\0'));
  55.  
  56.         while (*e_search++)
  57.                 ;
  58.  
  59.         return(_texecve(filename,&arglist,(_TSCHAR **)*e_search));
  60.  
  61. #else  /* _M_IX86 */
  62.  
  63.         va_list vargs;
  64.         _TSCHAR * argbuf[64];
  65.         _TSCHAR ** argv;
  66.         _TSCHAR ** envp;
  67.         int result;
  68.  
  69.         _ASSERTE(filename != NULL);
  70.         _ASSERTE(*filename != _T('\0'));
  71.         _ASSERTE(arglist != NULL);
  72.         _ASSERTE(*arglist != _T('\0'));
  73.  
  74.         va_start(vargs, arglist);
  75. #ifdef WPRFLAG
  76.         argv = _wcapture_argv(&vargs, arglist, argbuf, 64);
  77. #else  /* WPRFLAG */
  78.         argv = _capture_argv(&vargs, arglist, argbuf, 64);
  79. #endif  /* WPRFLAG */
  80.         envp = va_arg(vargs, _TSCHAR **);
  81.         va_end(vargs);
  82.  
  83.         result = _texecve(filename,argv,envp);
  84.         if (argv && argv != argbuf)
  85.             _free_crt(argv);
  86.         return result;
  87.  
  88. #endif  /* _M_IX86 */
  89. }
  90.