msvcrt-B06: _system
Jaco Greeff
jaco at puxedo.org
Tue Nov 5 05:23:31 CST 2002
Fixed the FIXME in process.c/system to allow for system calls to be
xecuted via the COMSPEC interpreter
License:
LGPL
Changelog:
* dlls/msvcrt/process.c: Jaco Greeff <jaco at puxedo.org>
- Updated the system call to launch system commands via COMSPEC
-------------- next part --------------
diff -aurN msvcrt-B05/dlls/msvcrt/process.c msvcrt-B06/dlls/msvcrt/process.c
--- msvcrt-B05/dlls/msvcrt/process.c Fri Oct 4 02:27:10 2002
+++ msvcrt-B06/dlls/msvcrt/process.c Tue Nov 5 13:04:49 2002
@@ -1,10 +1,11 @@
-/*
+ /*
* msvcrt.dll spawn/exec functions
*
* Copyright 1996,1998 Marcus Meissner
* Copyright 1996 Jukka Iivonen
* Copyright 1997,2000 Uwe Bonnes
* Copyright 2000 Jon Griffiths
+ * Copyright 2002 Jaco Greeff
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,6 +29,7 @@
#include "config.h"
#include <stdarg.h>
+#include <stdio.h>
#include "msvcrt.h"
#include "msvcrt/errno.h"
@@ -437,12 +439,34 @@
*/
int MSVCRT_system(const char* cmd)
{
+ static const char szExec[] = " /c ";
+ char szComspec[1024+1];
char* cmdcopy;
int res;
- /* Make a writable copy for CreateProcess */
- cmdcopy=_strdup(cmd);
- /* FIXME: should probably launch cmd interpreter in COMSPEC */
+ TRACE("(cmd == %s)\n", cmd);
+
+ /* Get the value of COMSPEC which should point to our
+ * default command interpreter. If the interpreter is
+ * not available, fail.
+ */
+ if (!GetEnvironmentVariableA("COMSPEC", szComspec, 1024))
+ {
+ TRACE("COMSPEC not available, _system call fails\n");
+ return -1;
+ }
+
+ /* Allocate enough memory to hold the interpreter + command
+ * string and set it. When using the command interpreter in
+ * this way, it is executed as "comspec /c command"
+ */
+ if (!(cmdcopy = (char *)MSVCRT_malloc(strlen(szComspec)+strlen(szExec)+strlen(cmd)+1)))
+ {
+ TRACE("Unable to allocate memory for _system call\n");
+ return -1;
+ }
+ sprintf(cmdcopy, "%s%s%s", szComspec, szExec, cmd);
+
res=msvcrt_spawn(_P_WAIT, NULL, cmdcopy, NULL);
MSVCRT_free(cmdcopy);
return res;
More information about the wine-patches
mailing list