Hans Leidekker : msvcrt: Implement _execl{e, pe}.

Alexandre Julliard julliard at winehq.org
Tue Jan 8 10:21:44 CST 2008


Module: wine
Branch: master
Commit: c91a597305c90d4ffc194c6da6e8d5a48133ebb3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c91a597305c90d4ffc194c6da6e8d5a48133ebb3

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Mon Jan  7 14:22:57 2008 +0100

msvcrt: Implement _execl{e, pe}.

---

 dlls/msvcrt/process.c |   52 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c
index dc22fcb..d2df7fa 100644
--- a/dlls/msvcrt/process.c
+++ b/dlls/msvcrt/process.c
@@ -387,8 +387,29 @@ MSVCRT_intptr_t CDECL _execl(const char* name, const char* arg0, ...)
  */
 MSVCRT_intptr_t CDECL _execle(const char* name, const char* arg0, ...)
 {
-    FIXME("stub\n");
-    return -1;
+  va_list ap;
+  MSVCRT_wchar_t *nameW, *args, *envs = NULL;
+  const char * const *envp;
+  MSVCRT_intptr_t ret;
+
+  if (!(nameW = msvcrt_wstrdupa(name))) return -1;
+
+  va_start(ap, arg0);
+  args = msvcrt_valisttos_aw(arg0, ap, ' ');
+  va_end(ap);
+
+  va_start(ap, arg0);
+  while (va_arg( ap, char * ) != NULL) /*nothing*/;
+  envp = va_arg( ap, const char * const * );
+  if (envp) envs = msvcrt_argvtos_aw(envp, 0);
+  va_end(ap);
+
+  ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, nameW, args, envs);
+
+  MSVCRT_free(nameW);
+  MSVCRT_free(args);
+  MSVCRT_free(envs);
+  return ret;
 }
 
 /*********************************************************************
@@ -423,8 +444,31 @@ MSVCRT_intptr_t CDECL _execlp(const char* name, const char* arg0, ...)
  */
 MSVCRT_intptr_t CDECL _execlpe(const char* name, const char* arg0, ...)
 {
-    FIXME("stub\n");
-    return -1;
+  static const MSVCRT_wchar_t path[] = {'P','A','T','H',0};
+  va_list ap;
+  MSVCRT_wchar_t *nameW, *args, *envs = NULL, fullname[MAX_PATH];
+  const char * const *envp;
+  MSVCRT_intptr_t ret;
+
+  if (!(nameW = msvcrt_wstrdupa(name))) return -1;
+  _wsearchenv(nameW, path, fullname);
+
+  va_start(ap, arg0);
+  args = msvcrt_valisttos_aw(arg0, ap, ' ');
+  va_end(ap);
+
+  va_start(ap, arg0);
+  while (va_arg( ap, char * ) != NULL) /*nothing*/;
+  envp = va_arg( ap, const char * const * );
+  if (envp) envs = msvcrt_argvtos_aw(envp, 0);
+  va_end(ap);
+
+  ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, fullname[0] ? fullname : nameW, args, envs);
+
+  MSVCRT_free(nameW);
+  MSVCRT_free(args);
+  MSVCRT_free(envs);
+  return ret;
 }
 
 /*********************************************************************




More information about the wine-cvs mailing list