From 508c6e6cf4429311e30b47284ed865b06266091c Mon Sep 17 00:00:00 2001 From: qingdoa daoo Date: Wed, 5 Apr 2006 11:37:01 -0700 Subject: [PATCH] msvcrt: Append extension(.exe) for _spawnve argument. --- dlls/msvcrt/process.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index 43e1084aa3..a16f8f102f 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -442,13 +442,41 @@ MSVCRT_intptr_t _spawnve(int flags, const char* name, const char* const* argv, { 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);