qingdoa daoo : msvcrt: Append extension(.exe) for _spawnve argument.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Apr 6 05:52:54 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 508c6e6cf4429311e30b47284ed865b06266091c
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=508c6e6cf4429311e30b47284ed865b06266091c

Author: qingdoa daoo <qingdao33122 at yahoo.com>
Date:   Wed Apr  5 11:37:01 2006 -0700

msvcrt: Append extension(.exe) for _spawnve argument.

---

 dlls/msvcrt/process.c |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c
index 43e1084..a16f8f1 100644
--- a/dlls/msvcrt/process.c
+++ b/dlls/msvcrt/process.c
@@ -442,13 +442,41 @@ MSVCRT_intptr_t _spawnve(int flags, cons
 {
   char * args = msvcrt_argvtos(argv,' ');
   char * envs = msvcrt_argvtos(envv,0);
-  const char *fullname = name;
+  char fullname[MAX_PATH];
+  const char *p;
+  int len;
   MSVCRT_intptr_t ret = -1;
 
-  FIXME(":not translating name %s to locate program\n",fullname);
   TRACE(":call (%s), params (%s), env (%s)\n",debugstr_a(name),debugstr_a(args),
    envs?"Custom":"Null");
 
+  /* no check for NULL name.
+     native doesn't do it */
+
+  p = memchr(name, '\0', MAX_PATH);
+  if( !p )
+    p = name + MAX_PATH - 1;
+  len = p - name;
+
+  /* extra-long names are silently truncated. */
+  memcpy(fullname, name, len);
+
+  for( p--; p >= name; p-- )
+  {
+    if( *p == '\\' || *p == '/' || *p == ':' || *p == '.' )
+      break;
+  }
+
+  /* if no extension is given, assume .exe */
+  if( (p < name || *p != '.') && len <= MAX_PATH - 5 )
+  {
+    FIXME("only trying .exe when no extension given\n");
+    memcpy(fullname+len, ".exe", 4);
+    len += 4;
+  }
+
+  fullname[len] = '\0';
+
   if (args)
   {
     ret = msvcrt_spawn(flags, fullname, args, envs);




More information about the wine-cvs mailing list