diff options
Diffstat (limited to 'private/crt32/exec/system.c')
-rw-r--r-- | private/crt32/exec/system.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/private/crt32/exec/system.c b/private/crt32/exec/system.c new file mode 100644 index 000000000..44536cf38 --- /dev/null +++ b/private/crt32/exec/system.c @@ -0,0 +1,95 @@ +/*** +*system.c - pass a command line to the shell +* +* Copyright (c) 1985-1993, Microsoft Corporation. All rights reserved. +* +*Purpose: +* defines system() - passes a command to the shell +* +*Revision History: +* 12-01-83 RN written +* 10-23-86 SKS Fixed use of strtok(), added check for NULL rtn from getenv +* 12-18-86 SKS PROTMODE symbol used for dual-modal version +* 02-23-86 JCR Put in support for NULL command pointer (MSDOS only) +* 04-13-86 JCR Added const to declaration +* 06-30-87 JCR Re-wrote system to use spawnvpe, removed XENIX conditional +* code, lots of general cleaning up. +* 07-01-87 PHG removed P->PROTMODE compile switch hack +* 09-22-87 SKS remove extern variable declarations, add ";" to assert()'s +* 11-10-87 SKS Removed IBMC20 switch, change PROTMODE to OS2 +* 12-11-87 JCR Added "_LOAD_DS" to declaration +* 02-22-88 JCR Added cast to get rid of cl const warning +* 09-05-88 SKS Treat EACCES the same as ENOENT -- keep trying +* 03-08-90 GJF Replaced _LOAD_DS with _CALLTYPE1, added #include +* <cruntime.h>, removed some leftover DOS support and +* fixed the copyright. Also, cleaned up the formatting +* formatting a bit. +* 07-23-90 SBM Compiles cleanly with -W3 (removed unreferenced +* variable), removed redundant includes, replaced +* <assertm.h> by <assert.h>, minor optimizations +* 09-27-90 GJF New-style function declarator. +* 01-17-91 GJF ANSI naming. +* 02-14-90 SRW Use NULL instead of _environ to get default. +* 02-23-93 SKS Remove reference to _osmode and use of "command.com" +* +*******************************************************************************/ + +#include <cruntime.h> +#include <assert.h> +#include <process.h> +#include <io.h> +#include <stdlib.h> +#include <errno.h> + +/*** +*int system(command) - send the command line to a shell +* +*Purpose: +* Executes a shell and passes the command line to it. +* If command is NULL, determine if a command processor exists. +* +*Entry: +* char *command - command to pass to the shell (if NULL, just determine +* if command processor exists) +* +*Exit: +* if command != NULL returns status of the shell +* if command == NULL returns non-zero if CP exists, zero if CP doesn't exist +* +*Exceptions: +* +*******************************************************************************/ + +int _CALLTYPE1 system ( + const char *command + ) +{ + int catch; + char *argv[4]; + + argv[0] = getenv("COMSPEC"); + + if (command == NULL) { + return (!_access(argv[0],0)); + } + + assert(*command != '\0'); + + argv[1] = "/c"; + argv[2] = (char *) command; + argv[3] = NULL; + + /* If there is a COMSPEC defined, try spawning the shell */ + + if (argv[0]) /* Do not try to spawn the null string */ + if ((catch = _spawnve(_P_WAIT,argv[0],argv,NULL)) != -1 + || (errno != ENOENT && errno != EACCES)) + return(catch); + + /* No COMSPEC so set argv[0] to what COMSPEC should be. */ + argv[0] = "cmd.exe"; + + /* Let the _spawnvpe routine do the path search and spawn. */ + + return(_spawnvpe(_P_WAIT,argv[0],argv,NULL)); +} |