winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
January 2008
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
3 participants
699 discussions
Start a n
N
ew thread
Hans Leidekker : msvcrt: Implement _wexecl{, e, p, pe}.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 3fd647c24306e12c226b85f2d830e99aa5f90c8a URL:
http://source.winehq.org/git/wine.git/?a=commit;h=3fd647c24306e12c226b85f2d…
Author: Hans Leidekker <hans(a)it.vu.nl> Date: Mon Jan 7 14:23:19 2008 +0100 msvcrt: Implement _wexecl{, e, p, pe}. --- dlls/msvcrt/msvcrt.spec | 8 +- dlls/msvcrt/process.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 4 deletions(-) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index b0fa5e9..cff8ecd 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -518,10 +518,10 @@ @ cdecl _wcsupr(wstr) ntdll._wcsupr @ cdecl _wctime(ptr) MSVCRT__wctime @ extern _wenviron -@ stub _wexecl #(wstr wstr) varargs -@ stub _wexecle #(wstr wstr) varargs -@ stub _wexeclp #(wstr wstr) varargs -@ stub _wexeclpe #(wstr wstr) varargs +@ varargs _wexecl(wstr wstr) +@ varargs _wexecle(wstr wstr) +@ varargs _wexeclp(wstr wstr) +@ varargs _wexeclpe(wstr wstr) @ stub _wexecv #(wstr ptr) @ stub _wexecve #(wstr ptr ptr) @ stub _wexecvp #(wstr ptr) diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index 7835d88..fa8f52a 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -81,6 +81,9 @@ static MSVCRT_intptr_t msvcrt_spawn(int flags, const MSVCRT_wchar_t* exe, MSVCRT return -1; /* can't reach here */ } +/* INTERNAL: Convert wide argv list to a single 'delim'-separated wide string, with an + * extra '\0' to terminate it. + */ static MSVCRT_wchar_t* msvcrt_argvtos(const MSVCRT_wchar_t* const* arg, MSVCRT_wchar_t delim) { const MSVCRT_wchar_t* const* a; @@ -165,6 +168,59 @@ static MSVCRT_wchar_t *msvcrt_argvtos_aw(const char * const *arg, MSVCRT_wchar_t return ret; } +/* INTERNAL: Convert wide va_list to a single 'delim'-separated wide string, with an + * extra '\0' to terminate it. + */ +static MSVCRT_wchar_t *msvcrt_valisttos(const MSVCRT_wchar_t *arg0, va_list alist, MSVCRT_wchar_t delim) +{ + va_list alist2; + unsigned long len; + const MSVCRT_wchar_t *arg; + MSVCRT_wchar_t *p, *ret; + +#ifdef HAVE_VA_COPY + va_copy(alist2,alist); +#else +# ifdef HAVE___VA_COPY + __va_copy(alist2,alist); +# else + alist2 = alist; +# endif +#endif + + if (!arg0) + { + /* Return NULL for an empty environment list */ + return NULL; + } + + /* get length */ + arg = arg0; + len = 0; + do { + len += strlenW(arg) + 1; + arg = va_arg(alist, MSVCRT_wchar_t*); + } while (arg != NULL); + + ret = MSVCRT_malloc((len + 1) * sizeof(MSVCRT_wchar_t)); + if (!ret) + return NULL; + + /* fill string */ + arg = arg0; + p = ret; + do { + len = strlenW(arg); + memcpy(p, arg, len * sizeof(MSVCRT_wchar_t)); + p += len; + *p++ = delim; + arg = va_arg(alist2, MSVCRT_wchar_t*); + } while (arg != NULL); + if (delim && p > ret) p[-1] = 0; + else *p = 0; + return ret; +} + /* INTERNAL: Convert ansi va_list to a single 'delim'-separated wide string, with an * extra '\0' to terminate it. */ @@ -266,6 +322,27 @@ MSVCRT_intptr_t CDECL _cwait(int *status, MSVCRT_intptr_t pid, int action) } /********************************************************************* + * _wexecl (MSVCRT.@) + * + * Unicode version of _execl + */ +MSVCRT_intptr_t CDECL _wexecl(const MSVCRT_wchar_t* name, const MSVCRT_wchar_t* arg0, ...) +{ + va_list ap; + MSVCRT_wchar_t *args; + MSVCRT_intptr_t ret; + + va_start(ap, arg0); + args = msvcrt_valisttos(arg0, ap, ' '); + va_end(ap); + + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, name, args, NULL); + + MSVCRT_free(args); + return ret; +} + +/********************************************************************* * _execl (MSVCRT.@) * * Like on Windows, this function does not handle arguments with spaces @@ -291,6 +368,35 @@ MSVCRT_intptr_t CDECL _execl(const char* name, const char* arg0, ...) } /********************************************************************* + * _wexecle (MSVCRT.@) + * + * Unicode version of _execle + */ +MSVCRT_intptr_t CDECL _wexecle(const MSVCRT_wchar_t* name, const MSVCRT_wchar_t* arg0, ...) +{ + va_list ap; + MSVCRT_wchar_t *args, *envs = NULL; + const MSVCRT_wchar_t * const *envp; + MSVCRT_intptr_t ret; + + va_start(ap, arg0); + args = msvcrt_valisttos(arg0, ap, ' '); + va_end(ap); + + va_start(ap, arg0); + while (va_arg( ap, MSVCRT_wchar_t * ) != NULL) /*nothing*/; + envp = va_arg( ap, const MSVCRT_wchar_t * const * ); + if (envp) envs = msvcrt_argvtos(envp, 0); + va_end(ap); + + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, name, args, envs); + + MSVCRT_free(args); + MSVCRT_free(envs); + return ret; +} + +/********************************************************************* * _execle (MSVCRT.@) */ MSVCRT_intptr_t CDECL _execle(const char* name, const char* arg0, ...) @@ -321,6 +427,30 @@ MSVCRT_intptr_t CDECL _execle(const char* name, const char* arg0, ...) } /********************************************************************* + * _wexeclp (MSVCRT.@) + * + * Unicode version of _execlp + */ +MSVCRT_intptr_t CDECL _wexeclp(const MSVCRT_wchar_t* name, const MSVCRT_wchar_t* arg0, ...) +{ + static const MSVCRT_wchar_t path[] = {'P','A','T','H',0}; + va_list ap; + MSVCRT_wchar_t *args, fullname[MAX_PATH]; + MSVCRT_intptr_t ret; + + _wsearchenv(name, path, fullname); + + va_start(ap, arg0); + args = msvcrt_valisttos(arg0, ap, ' '); + va_end(ap); + + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, fullname[0] ? fullname : name, args, NULL); + + MSVCRT_free(args); + return ret; +} + +/********************************************************************* * _execlp (MSVCRT.@) * * Like on Windows, this function does not handle arguments with spaces @@ -348,6 +478,38 @@ MSVCRT_intptr_t CDECL _execlp(const char* name, const char* arg0, ...) } /********************************************************************* + * _wexeclpe (MSVCRT.@) + * + * Unicode version of _execlpe + */ +MSVCRT_intptr_t CDECL _wexeclpe(const MSVCRT_wchar_t* name, const MSVCRT_wchar_t* arg0, ...) +{ + static const MSVCRT_wchar_t path[] = {'P','A','T','H',0}; + va_list ap; + MSVCRT_wchar_t *args, *envs = NULL, fullname[MAX_PATH]; + const MSVCRT_wchar_t * const *envp; + MSVCRT_intptr_t ret; + + _wsearchenv(name, path, fullname); + + va_start(ap, arg0); + args = msvcrt_valisttos(arg0, ap, ' '); + va_end(ap); + + va_start(ap, arg0); + while (va_arg( ap, MSVCRT_wchar_t * ) != NULL) /*nothing*/; + envp = va_arg( ap, const MSVCRT_wchar_t * const * ); + if (envp) envs = msvcrt_argvtos(envp, 0); + va_end(ap); + + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, fullname[0] ? fullname : name, args, envs); + + MSVCRT_free(args); + MSVCRT_free(envs); + return ret; +} + +/********************************************************************* * _execlpe (MSVCRT.@) */ MSVCRT_intptr_t CDECL _execlpe(const char* name, const char* arg0, ...)
1
0
0
0
Hans Leidekker : msvcrt: Rewrite _spawnve as a wrapper.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 516b4ebd0eaef17fc0be24eae46ba512226cf810 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=516b4ebd0eaef17fc0be24eae…
Author: Hans Leidekker <hans(a)it.vu.nl> Date: Mon Jan 7 14:23:08 2008 +0100 msvcrt: Rewrite _spawnve as a wrapper. --- dlls/msvcrt/process.c | 169 +++++++------------------------------------------ 1 files changed, 23 insertions(+), 146 deletions(-) diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index d2df7fa..7835d88 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -35,54 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); -/* INTERNAL: Spawn a child process */ -static MSVCRT_intptr_t msvcrt_spawn(int flags, const char* exe, char* cmdline, char* env) -{ - STARTUPINFOA si; - PROCESS_INFORMATION pi; - - if ((unsigned)flags > MSVCRT__P_DETACH) - { - *MSVCRT__errno() = MSVCRT_EINVAL; - return -1; - } - - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - msvcrt_create_io_inherit_block(&si.cbReserved2, &si.lpReserved2); - if (!CreateProcessA(exe, cmdline, NULL, NULL, TRUE, - flags == MSVCRT__P_DETACH ? DETACHED_PROCESS : 0, - env, NULL, &si, &pi)) - { - msvcrt_set_errno(GetLastError()); - MSVCRT_free(si.lpReserved2); - return -1; - } - - MSVCRT_free(si.lpReserved2); - switch(flags) - { - case MSVCRT__P_WAIT: - WaitForSingleObject(pi.hProcess, INFINITE); - GetExitCodeProcess(pi.hProcess,&pi.dwProcessId); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return pi.dwProcessId; - case MSVCRT__P_DETACH: - CloseHandle(pi.hProcess); - pi.hProcess = 0; - /* fall through */ - case MSVCRT__P_NOWAIT: - case MSVCRT__P_NOWAITO: - CloseHandle(pi.hThread); - return (MSVCRT_intptr_t)pi.hProcess; - case MSVCRT__P_OVERLAY: - MSVCRT__exit(0); - } - return -1; /* can't reach here */ -} - -static MSVCRT_intptr_t msvcrt_spawn_wide(int flags, const MSVCRT_wchar_t* exe, MSVCRT_wchar_t* cmdline, MSVCRT_wchar_t* env) +static MSVCRT_intptr_t msvcrt_spawn(int flags, const MSVCRT_wchar_t* exe, MSVCRT_wchar_t* cmdline, MSVCRT_wchar_t* env) { STARTUPINFOW si; PROCESS_INFORMATION pi; @@ -128,52 +81,7 @@ static MSVCRT_intptr_t msvcrt_spawn_wide(int flags, const MSVCRT_wchar_t* exe, M return -1; /* can't reach here */ } -/* INTERNAL: Convert argv list to a single 'delim'-separated string, with an - * extra '\0' to terminate it - */ -static char* msvcrt_argvtos(const char* const* arg, char delim) -{ - const char* const* a; - long size; - char* p; - char* ret; - - if (!arg && !delim) - { - /* Return NULL for an empty environment list */ - return NULL; - } - - /* get length */ - a = arg; - size = 0; - while (*a) - { - size += strlen(*a) + 1; - a++; - } - - ret = MSVCRT_malloc(size + 1); - if (!ret) - return NULL; - - /* fill string */ - a = arg; - p = ret; - while (*a) - { - int len = strlen(*a); - memcpy(p,*a,len); - p += len; - *p++ = delim; - a++; - } - if (delim && p > ret) p[-1] = 0; - else *p = 0; - return ret; -} - -static MSVCRT_wchar_t* msvcrt_argvtos_wide(const MSVCRT_wchar_t* const* arg, MSVCRT_wchar_t delim) +static MSVCRT_wchar_t* msvcrt_argvtos(const MSVCRT_wchar_t* const* arg, MSVCRT_wchar_t delim) { const MSVCRT_wchar_t* const* a; long size; @@ -375,7 +283,7 @@ MSVCRT_intptr_t CDECL _execl(const char* name, const char* arg0, ...) args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, nameW, args, NULL); + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, nameW, args, NULL); MSVCRT_free(nameW); MSVCRT_free(args); @@ -404,7 +312,7 @@ MSVCRT_intptr_t CDECL _execle(const char* name, const char* arg0, ...) if (envp) envs = msvcrt_argvtos_aw(envp, 0); va_end(ap); - ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, nameW, args, envs); + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, nameW, args, envs); MSVCRT_free(nameW); MSVCRT_free(args); @@ -432,7 +340,7 @@ MSVCRT_intptr_t CDECL _execlp(const char* name, const char* arg0, ...) args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, fullname[0] ? fullname : nameW, args, NULL); + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, fullname[0] ? fullname : nameW, args, NULL); MSVCRT_free(nameW); MSVCRT_free(args); @@ -463,7 +371,7 @@ MSVCRT_intptr_t CDECL _execlpe(const char* name, const char* arg0, ...) if (envp) envs = msvcrt_argvtos_aw(envp, 0); va_end(ap); - ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, fullname[0] ? fullname : nameW, args, envs); + ret = msvcrt_spawn(MSVCRT__P_OVERLAY, fullname[0] ? fullname : nameW, args, envs); MSVCRT_free(nameW); MSVCRT_free(args); @@ -537,7 +445,7 @@ MSVCRT_intptr_t CDECL _spawnl(int flags, const char* name, const char* arg0, ... args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn_wide(flags, nameW, args, NULL); + ret = msvcrt_spawn(flags, nameW, args, NULL); MSVCRT_free(nameW); MSVCRT_free(args); @@ -566,7 +474,7 @@ MSVCRT_intptr_t CDECL _spawnle(int flags, const char* name, const char* arg0, .. if (envp) envs = msvcrt_argvtos_aw(envp, 0); va_end(ap); - ret = msvcrt_spawn_wide(flags, nameW, args, envs); + ret = msvcrt_spawn(flags, nameW, args, envs); MSVCRT_free(nameW); MSVCRT_free(args); @@ -595,7 +503,7 @@ MSVCRT_intptr_t CDECL _spawnlp(int flags, const char* name, const char* arg0, .. args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn_wide(flags, fullname[0] ? fullname : nameW, args, NULL); + ret = msvcrt_spawn(flags, fullname[0] ? fullname : nameW, args, NULL); MSVCRT_free(nameW); MSVCRT_free(args); @@ -626,7 +534,7 @@ MSVCRT_intptr_t CDECL _spawnlpe(int flags, const char* name, const char* arg0, . if (envp) envs = msvcrt_argvtos_aw(envp, 0); va_end(ap); - ret = msvcrt_spawn_wide(flags, fullname[0] ? fullname : nameW, args, envs); + ret = msvcrt_spawn(flags, fullname[0] ? fullname : nameW, args, envs); MSVCRT_free(nameW); MSVCRT_free(args); @@ -643,50 +551,19 @@ MSVCRT_intptr_t CDECL _spawnlpe(int flags, const char* name, const char* arg0, . MSVCRT_intptr_t CDECL _spawnve(int flags, const char* name, const char* const* argv, const char* const* envv) { - char * args = msvcrt_argvtos(argv,' '); - char * envs = msvcrt_argvtos(envv,0); - char fullname[MAX_PATH]; - const char *p; - int len; - MSVCRT_intptr_t ret = -1; - - 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); + MSVCRT_wchar_t *nameW, *args, *envs; + MSVCRT_intptr_t ret; - for( p--; p >= name; p-- ) - { - if( *p == '\\' || *p == '/' || *p == ':' || *p == '.' ) - break; - } + if (!(nameW = msvcrt_wstrdupa(name))) return -1; - /* 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; - } + args = msvcrt_argvtos_aw(argv, ' '); + envs = msvcrt_argvtos_aw(envv, 0); - fullname[len] = '\0'; + ret = msvcrt_spawn(flags, nameW, args, envs); - if (args) - { - ret = msvcrt_spawn(flags, fullname, args, envs); - MSVCRT_free(args); - } + MSVCRT_free(nameW); + MSVCRT_free(args); MSVCRT_free(envs); - return ret; } @@ -698,8 +575,8 @@ MSVCRT_intptr_t CDECL _spawnve(int flags, const char* name, const char* const* a MSVCRT_intptr_t CDECL _wspawnve(int flags, const MSVCRT_wchar_t* name, const MSVCRT_wchar_t* const* argv, const MSVCRT_wchar_t* const* envv) { - MSVCRT_wchar_t * args = msvcrt_argvtos_wide(argv,' '); - MSVCRT_wchar_t * envs = msvcrt_argvtos_wide(envv,0); + MSVCRT_wchar_t * args = msvcrt_argvtos(argv,' '); + MSVCRT_wchar_t * envs = msvcrt_argvtos(envv,0); MSVCRT_wchar_t fullname[MAX_PATH]; const MSVCRT_wchar_t *p; int len; @@ -739,7 +616,7 @@ MSVCRT_intptr_t CDECL _wspawnve(int flags, const MSVCRT_wchar_t* name, const MSV if (args) { - ret = msvcrt_spawn_wide(flags, fullname, args, envs); + ret = msvcrt_spawn(flags, fullname, args, envs); MSVCRT_free(args); } MSVCRT_free(envs); @@ -888,7 +765,7 @@ MSVCRT_FILE* CDECL MSVCRT__wpopen(const MSVCRT_wchar_t* command, const MSVCRT_wc strcatW(fullcmd, command); HeapFree(GetProcessHeap(), 0, comspec); - if (msvcrt_spawn_wide(MSVCRT__P_NOWAIT, NULL, fullcmd, NULL) == -1) + if (msvcrt_spawn(MSVCRT__P_NOWAIT, NULL, fullcmd, NULL) == -1) { MSVCRT__close(fds[fdToOpen]); ret = NULL; @@ -976,7 +853,7 @@ int CDECL _wsystem(const MSVCRT_wchar_t* cmd) strcatW(fullcmd, flag); strcatW(fullcmd, cmd); - res = msvcrt_spawn_wide(MSVCRT__P_WAIT, comspec, fullcmd, NULL); + res = msvcrt_spawn(MSVCRT__P_WAIT, comspec, fullcmd, NULL); HeapFree(GetProcessHeap(), 0, comspec); HeapFree(GetProcessHeap(), 0, fullcmd);
1
0
0
0
Hans Leidekker : msvcrt: Implement _execl{e, pe}.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: c91a597305c90d4ffc194c6da6e8d5a48133ebb3 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=c91a597305c90d4ffc194c6da…
Author: Hans Leidekker <hans(a)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; } /*********************************************************************
1
0
0
0
Hans Leidekker : msvcrt: Rewrite _execl/ _spawnl functions as wrappers around wide character implementations.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 1ba54f3337df5b9d03cb939315224ae824c08886 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=1ba54f3337df5b9d03cb93931…
Author: Hans Leidekker <hans(a)it.vu.nl> Date: Mon Jan 7 14:22:46 2008 +0100 msvcrt: Rewrite _execl/_spawnl functions as wrappers around wide character implementations. --- dlls/msvcrt/process.c | 188 +++++++++++++++++++++++++++++++----------------- 1 files changed, 121 insertions(+), 67 deletions(-) diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index 2db9a7d..dc22fcb 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -215,16 +215,57 @@ static MSVCRT_wchar_t* msvcrt_argvtos_wide(const MSVCRT_wchar_t* const* arg, MSV return ret; } -/* INTERNAL: Convert va_list to a single 'delim'-separated string, with an - * extra '\0' to terminate it +/* INTERNAL: Convert ansi argv list to a single 'delim'-separated wide string, with an + * extra '\0' to terminate it. */ -static char* msvcrt_valisttos(const char* arg0, va_list alist, char delim) +static MSVCRT_wchar_t *msvcrt_argvtos_aw(const char * const *arg, MSVCRT_wchar_t delim) +{ + const char * const *a; + unsigned long len; + MSVCRT_wchar_t *p, *ret; + + if (!arg && !delim) + { + /* Return NULL for an empty environment list */ + return NULL; + } + + /* get length */ + a = arg; + len = 0; + while (*a) + { + len += MultiByteToWideChar(CP_ACP, 0, *a, -1, NULL, 0); + a++; + } + + ret = MSVCRT_malloc((len + 1) * sizeof(MSVCRT_wchar_t)); + if (!ret) + return NULL; + + /* fill string */ + a = arg; + p = ret; + while (*a) + { + p += MultiByteToWideChar(CP_ACP, 0, *a, strlen(*a), p, len - (p - ret)); + *p++ = delim; + a++; + } + if (delim && p > ret) p[-1] = 0; + else *p = 0; + return ret; +} + +/* INTERNAL: Convert ansi va_list to a single 'delim'-separated wide string, with an + * extra '\0' to terminate it. + */ +static MSVCRT_wchar_t *msvcrt_valisttos_aw(const char *arg0, va_list alist, MSVCRT_wchar_t delim) { va_list alist2; - long size; + unsigned long len; const char *arg; - char* p; - char *ret; + MSVCRT_wchar_t *p, *ret; #ifdef HAVE_VA_COPY va_copy(alist2,alist); @@ -244,13 +285,13 @@ static char* msvcrt_valisttos(const char* arg0, va_list alist, char delim) /* get length */ arg = arg0; - size = 0; + len = 0; do { - size += strlen(arg) + 1; + len += MultiByteToWideChar(CP_ACP, 0, arg, -1, NULL, 0); arg = va_arg(alist, char*); } while (arg != NULL); - ret = MSVCRT_malloc(size + 1); + ret = MSVCRT_malloc((len + 1) * sizeof(MSVCRT_wchar_t)); if (!ret) return NULL; @@ -258,9 +299,7 @@ static char* msvcrt_valisttos(const char* arg0, va_list alist, char delim) arg = arg0; p = ret; do { - int len = strlen(arg); - memcpy(p,arg,len); - p += len; + p += MultiByteToWideChar(CP_ACP, 0, arg, strlen(arg), p, len - (p - ret)); *p++ = delim; arg = va_arg(alist2, char*); } while (arg != NULL); @@ -327,16 +366,19 @@ MSVCRT_intptr_t CDECL _cwait(int *status, MSVCRT_intptr_t pid, int action) MSVCRT_intptr_t CDECL _execl(const char* name, const char* arg0, ...) { va_list ap; - char * args; - MSVCRT_intptr_t ret; + MSVCRT_wchar_t *nameW, *args; + MSVCRT_intptr_t ret = -1; + + if (!(nameW = msvcrt_wstrdupa(name))) return -1; va_start(ap, arg0); - args = msvcrt_valisttos(arg0, ap, ' '); + args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn(MSVCRT__P_OVERLAY, name, args, NULL); - MSVCRT_free(args); + ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, nameW, args, NULL); + MSVCRT_free(nameW); + MSVCRT_free(args); return ret; } @@ -357,20 +399,22 @@ MSVCRT_intptr_t CDECL _execle(const char* name, const char* arg0, ...) */ MSVCRT_intptr_t CDECL _execlp(const char* name, const char* arg0, ...) { + static const MSVCRT_wchar_t path[] = {'P','A','T','H',0}; va_list ap; - char * args; + MSVCRT_wchar_t *nameW, *args, fullname[MAX_PATH]; MSVCRT_intptr_t ret; - char fullname[MAX_PATH]; - _searchenv(name, "PATH", fullname); + if (!(nameW = msvcrt_wstrdupa(name))) return -1; + _wsearchenv(nameW, path, fullname); va_start(ap, arg0); - args = msvcrt_valisttos(arg0, ap, ' '); + args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn(MSVCRT__P_OVERLAY, fullname[0] ? fullname : name, args, NULL); - MSVCRT_free(args); + ret = msvcrt_spawn_wide(MSVCRT__P_OVERLAY, fullname[0] ? fullname : nameW, args, NULL); + MSVCRT_free(nameW); + MSVCRT_free(args); return ret; } @@ -440,16 +484,19 @@ MSVCRT_intptr_t CDECL _execvp(const char* name, char* const* argv) MSVCRT_intptr_t CDECL _spawnl(int flags, const char* name, const char* arg0, ...) { va_list ap; - char * args; + MSVCRT_wchar_t *nameW, *args; MSVCRT_intptr_t ret; + if (!(nameW = msvcrt_wstrdupa(name))) return -1; + va_start(ap, arg0); - args = msvcrt_valisttos(arg0, ap, ' '); + args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn(flags, name, args, NULL); - MSVCRT_free(args); + ret = msvcrt_spawn_wide(flags, nameW, args, NULL); + MSVCRT_free(nameW); + MSVCRT_free(args); return ret; } @@ -458,26 +505,29 @@ MSVCRT_intptr_t CDECL _spawnl(int flags, const char* name, const char* arg0, ... */ MSVCRT_intptr_t CDECL _spawnle(int flags, const char* name, const char* arg0, ...) { - va_list ap; - char *args, *envs = NULL; - const char * const *envp; - MSVCRT_intptr_t ret; + va_list ap; + MSVCRT_wchar_t *nameW, *args, *envs = NULL; + const char * const *envp; + MSVCRT_intptr_t ret; - va_start(ap, arg0); - args = msvcrt_valisttos(arg0, ap, ' '); - va_end(ap); + if (!(nameW = msvcrt_wstrdupa(name))) return -1; - va_start(ap, arg0); - while (va_arg( ap, char * ) != NULL) /*nothing*/; - envp = va_arg( ap, const char * const * ); - if (envp) envs = msvcrt_argvtos(envp, 0); - va_end(ap); + va_start(ap, arg0); + args = msvcrt_valisttos_aw(arg0, ap, ' '); + va_end(ap); - ret = msvcrt_spawn(flags, name, args, envs); + 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); - MSVCRT_free(args); - MSVCRT_free(envs); - return ret; + ret = msvcrt_spawn_wide(flags, nameW, args, envs); + + MSVCRT_free(nameW); + MSVCRT_free(args); + MSVCRT_free(envs); + return ret; } @@ -489,20 +539,22 @@ MSVCRT_intptr_t CDECL _spawnle(int flags, const char* name, const char* arg0, .. */ MSVCRT_intptr_t CDECL _spawnlp(int flags, const char* name, const char* arg0, ...) { + static const MSVCRT_wchar_t path[] = {'P','A','T','H',0}; va_list ap; - char * args; + MSVCRT_wchar_t *nameW, *args, fullname[MAX_PATH]; MSVCRT_intptr_t ret; - char fullname[MAX_PATH]; - _searchenv(name, "PATH", fullname); + if (!(nameW = msvcrt_wstrdupa(name))) return -1; + _wsearchenv(nameW, path, fullname); va_start(ap, arg0); - args = msvcrt_valisttos(arg0, ap, ' '); + args = msvcrt_valisttos_aw(arg0, ap, ' '); va_end(ap); - ret = msvcrt_spawn(flags, fullname[0] ? fullname : name, args, NULL); - MSVCRT_free(args); + ret = msvcrt_spawn_wide(flags, fullname[0] ? fullname : nameW, args, NULL); + MSVCRT_free(nameW); + MSVCRT_free(args); return ret; } @@ -511,29 +563,31 @@ MSVCRT_intptr_t CDECL _spawnlp(int flags, const char* name, const char* arg0, .. */ MSVCRT_intptr_t CDECL _spawnlpe(int flags, const char* name, const char* arg0, ...) { - va_list ap; - char *args, *envs = NULL; - const char * const *envp; - MSVCRT_intptr_t ret; - char fullname[MAX_PATH]; + 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; - _searchenv(name, "PATH", fullname); + if (!(nameW = msvcrt_wstrdupa(name))) return -1; + _wsearchenv(nameW, path, fullname); - va_start(ap, arg0); - args = msvcrt_valisttos(arg0, ap, ' '); - va_end(ap); + 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(envp, 0); - 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(flags, fullname[0] ? fullname : name, args, envs); + ret = msvcrt_spawn_wide(flags, fullname[0] ? fullname : nameW, args, envs); - MSVCRT_free(args); - MSVCRT_free(envs); - return ret; + MSVCRT_free(nameW); + MSVCRT_free(args); + MSVCRT_free(envs); + return ret; } /*********************************************************************
1
0
0
0
Hans Leidekker : msvcrt: Implement _wpopen and forward _popen to it.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 118bee860a3108ce3ab01823dc93d4f186ecba77 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=118bee860a3108ce3ab01823d…
Author: Hans Leidekker <hans(a)it.vu.nl> Date: Mon Jan 7 14:22:36 2008 +0100 msvcrt: Implement _wpopen and forward _popen to it. --- dlls/msvcrt/msvcrt.h | 1 + dlls/msvcrt/process.c | 69 ++++++++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 59c42cb..bc94284 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -623,6 +623,7 @@ MSVCRT_clock_t MSVCRT_clock(void); double MSVCRT_difftime(MSVCRT_time_t time1, MSVCRT_time_t time2); MSVCRT_time_t MSVCRT_time(MSVCRT_time_t*); MSVCRT_FILE* MSVCRT__fdopen(int, const char *); +MSVCRT_FILE* MSVCRT__wfdopen(int, const MSVCRT_wchar_t *); int MSVCRT_vsnprintf(char *str, unsigned int len, const char *format, va_list valist); int MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, unsigned int len, const MSVCRT_wchar_t *format, va_list valist ); diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index 46481ef..2db9a7d 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -721,22 +721,21 @@ MSVCRT_intptr_t CDECL _wspawnvp(int flags, const MSVCRT_wchar_t* name, const MSV } /********************************************************************* - * _popen (MSVCRT.@) - * FIXME: convert to _wpopen and call that from here instead? But it - * would have to convert the command back to ANSI to call msvcrt_spawn, - * less than ideal. + * _wpopen (MSVCRT.@) + * + * Unicode version of _popen */ -MSVCRT_FILE* CDECL MSVCRT__popen(const char* command, const char* mode) +MSVCRT_FILE* CDECL MSVCRT__wpopen(const MSVCRT_wchar_t* command, const MSVCRT_wchar_t* mode) { - static const char wcmd[] = "cmd", cmdFlag[] = " /C ", comSpec[] = "COMSPEC"; MSVCRT_FILE *ret; BOOL readPipe = TRUE; int textmode, fds[2], fdToDup, fdToOpen, fdStdHandle = -1, fdStdErr = -1; - const char *p; - char *cmdcopy; - DWORD comSpecLen; + const MSVCRT_wchar_t *p; + MSVCRT_wchar_t *comspec, *fullcmd; + unsigned int len; + static const MSVCRT_wchar_t flag[] = {' ','/','c',' ',0}; - TRACE("(command=%s, mode=%s)\n", debugstr_a(command), debugstr_a(mode)); + TRACE("(command=%s, mode=%s)\n", debugstr_w(command), debugstr_w(mode)); if (!command || !mode) return NULL; @@ -782,27 +781,27 @@ MSVCRT_FILE* CDECL MSVCRT__popen(const char* command, const char* mode) MSVCRT__close(fds[fdToDup]); - comSpecLen = GetEnvironmentVariableA(comSpec, NULL, 0); - if (!comSpecLen) - comSpecLen = strlen(wcmd) + 1; - cmdcopy = HeapAlloc(GetProcessHeap(), 0, comSpecLen + strlen(cmdFlag) - + strlen(command)); - if (!GetEnvironmentVariableA(comSpec, cmdcopy, comSpecLen)) - strcpy(cmdcopy, wcmd); - strcat(cmdcopy, cmdFlag); - strcat(cmdcopy, command); - if (msvcrt_spawn(MSVCRT__P_NOWAIT, NULL, cmdcopy, NULL) == -1) + if (!(comspec = msvcrt_get_comspec())) goto error; + len = strlenW(comspec) + strlenW(flag) + strlenW(command) + 1; + + if (!(fullcmd = HeapAlloc(GetProcessHeap(), 0, len * sizeof(MSVCRT_wchar_t)))) goto error; + strcpyW(fullcmd, comspec); + strcatW(fullcmd, flag); + strcatW(fullcmd, command); + HeapFree(GetProcessHeap(), 0, comspec); + + if (msvcrt_spawn_wide(MSVCRT__P_NOWAIT, NULL, fullcmd, NULL) == -1) { MSVCRT__close(fds[fdToOpen]); ret = NULL; } else { - ret = MSVCRT__fdopen(fds[fdToOpen], mode); + ret = MSVCRT__wfdopen(fds[fdToOpen], mode); if (!ret) MSVCRT__close(fds[fdToOpen]); } - HeapFree(GetProcessHeap(), 0, cmdcopy); + HeapFree(GetProcessHeap(), 0, fullcmd); MSVCRT__dup2(fdStdHandle, fdToDup); MSVCRT__close(fdStdHandle); if (readPipe) @@ -821,12 +820,30 @@ error: } /********************************************************************* - * _wpopen (MSVCRT.@) + * _popen (MSVCRT.@) */ -MSVCRT_FILE* CDECL MSVCRT__wpopen(const MSVCRT_wchar_t* command, const MSVCRT_wchar_t* mode) +MSVCRT_FILE* CDECL MSVCRT__popen(const char* command, const char* mode) { - FIXME("(command=%s, mode=%s): stub\n", debugstr_w(command), debugstr_w(mode)); - return NULL; + MSVCRT_FILE *ret; + MSVCRT_wchar_t *cmdW, *modeW; + + TRACE("(command=%s, mode=%s)\n", debugstr_a(command), debugstr_a(mode)); + + if (!command || !mode) + return NULL; + + if (!(cmdW = msvcrt_wstrdupa(command))) return NULL; + if (!(modeW = msvcrt_wstrdupa(mode))) + { + HeapFree(GetProcessHeap(), 0, cmdW); + return NULL; + } + + ret = MSVCRT__wpopen(cmdW, modeW); + + HeapFree(GetProcessHeap(), 0, cmdW); + HeapFree(GetProcessHeap(), 0, modeW); + return ret; } /*********************************************************************
1
0
0
0
Hans Leidekker : msvcrt: Implement _wsystem and forward system to it. Respect COMSPEC environment variable.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 3debf28215fcf5d76e034dfc17354391512500a1 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=3debf28215fcf5d76e034dfc1…
Author: Hans Leidekker <hans(a)it.vu.nl> Date: Mon Jan 7 14:22:23 2008 +0100 msvcrt: Implement _wsystem and forward system to it. Respect COMSPEC environment variable. --- dlls/msvcrt/data.c | 4 +- dlls/msvcrt/msvcrt.h | 2 + dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/process.c | 63 +++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c index fa53b85..578130b 100644 --- a/dlls/msvcrt/data.c +++ b/dlls/msvcrt/data.c @@ -229,7 +229,7 @@ char*** CDECL __p___initenv(void) { return &MSVCRT___initenv; } MSVCRT_wchar_t*** CDECL __p___winitenv(void) { return &MSVCRT___winitenv; } /* INTERNAL: Create a wide string from an ascii string */ -static MSVCRT_wchar_t *wstrdupa(const char *str) +MSVCRT_wchar_t *msvcrt_wstrdupa(const char *str) { const size_t len = strlen(str) + 1 ; MSVCRT_wchar_t *wstr = MSVCRT_malloc(len* sizeof (MSVCRT_wchar_t)); @@ -249,7 +249,7 @@ void msvcrt_init_args(void) DWORD version; MSVCRT__acmdln = _strdup( GetCommandLineA() ); - MSVCRT__wcmdln = wstrdupa(MSVCRT__acmdln); + MSVCRT__wcmdln = msvcrt_wstrdupa(MSVCRT__acmdln); MSVCRT___argc = __wine_main_argc; MSVCRT___argv = __wine_main_argv; MSVCRT___wargv = __wine_main_wargv; diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 5d4540f..59c42cb 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -125,6 +125,8 @@ extern MSVCRT_wchar_t **_wenviron; extern char ** msvcrt_SnapshotOfEnvironmentA(char **); extern MSVCRT_wchar_t ** msvcrt_SnapshotOfEnvironmentW(MSVCRT_wchar_t **); +MSVCRT_wchar_t *msvcrt_wstrdupa(const char *); + /* FIXME: This should be declared in new.h but it's not an extern "C" so * it would not be much use anyway. Even for Winelib applications. */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index fffe883..b0fa5e9 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -570,7 +570,7 @@ @ cdecl _wstat64(wstr ptr) MSVCRT__wstat64 @ cdecl _wstrdate(ptr) @ cdecl _wstrtime(ptr) -@ stub _wsystem #(wstr) +@ cdecl _wsystem(wstr) @ cdecl _wtempnam(wstr wstr) @ stub _wtmpnam #(ptr) @ cdecl _wtoi(wstr) ntdll._wtoi diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index 14f8e9a..46481ef 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -269,6 +269,22 @@ static char* msvcrt_valisttos(const char* arg0, va_list alist, char delim) return ret; } +/* INTERNAL: retrieve COMSPEC environment variable */ +static MSVCRT_wchar_t *msvcrt_get_comspec(void) +{ + static const MSVCRT_wchar_t cmd[] = {'c','m','d',0}; + static const MSVCRT_wchar_t comspec[] = {'C','O','M','S','P','E','C',0}; + MSVCRT_wchar_t *ret; + unsigned int len; + + if (!(len = GetEnvironmentVariableW(comspec, NULL, 0))) len = sizeof(cmd)/sizeof(MSVCRT_wchar_t); + if ((ret = HeapAlloc(GetProcessHeap(), 0, len * sizeof(MSVCRT_wchar_t)))) + { + if (!GetEnvironmentVariableW(comspec, ret, len)) strcpyW(ret, cmd); + } + return ret; +} + /********************************************************************* * _cwait (MSVCRT.@) */ @@ -822,19 +838,50 @@ int CDECL MSVCRT__pclose(MSVCRT_FILE* file) } /********************************************************************* + * _wsystem (MSVCRT.@) + * + * Unicode version of system + */ +int CDECL _wsystem(const MSVCRT_wchar_t* cmd) +{ + int res; + MSVCRT_wchar_t *comspec, *fullcmd; + unsigned int len; + static const MSVCRT_wchar_t flag[] = {' ','/','c',' ',0}; + + if (!(comspec = msvcrt_get_comspec())) return -1; + len = strlenW(comspec) + strlenW(flag) + strlenW(cmd) + 1; + + if (!(fullcmd = HeapAlloc(GetProcessHeap(), 0, len * sizeof(MSVCRT_wchar_t)))) + { + HeapFree(GetProcessHeap(), 0, comspec); + return -1; + } + strcpyW(fullcmd, comspec); + strcatW(fullcmd, flag); + strcatW(fullcmd, cmd); + + res = msvcrt_spawn_wide(MSVCRT__P_WAIT, comspec, fullcmd, NULL); + + HeapFree(GetProcessHeap(), 0, comspec); + HeapFree(GetProcessHeap(), 0, fullcmd); + return res; +} + +/********************************************************************* * system (MSVCRT.@) */ int CDECL MSVCRT_system(const char* cmd) { - char* cmdcopy; - int res; + int res = -1; + MSVCRT_wchar_t *cmdW; - /* Make a writable copy for CreateProcess */ - cmdcopy=_strdup(cmd); - /* FIXME: should probably launch cmd interpreter in COMSPEC */ - res=msvcrt_spawn(MSVCRT__P_WAIT, NULL, cmdcopy, NULL); - MSVCRT_free(cmdcopy); - return res; + if ((cmdW = msvcrt_wstrdupa(cmd))) + { + res = _wsystem(cmdW); + HeapFree(GetProcessHeap(), 0, cmdW); + } + return res; } /*********************************************************************
1
0
0
0
Andrey Esin : shell32: Fixed typo.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 2adba0d7cd232704d1e369aae86ae55aac0172df URL:
http://source.winehq.org/git/wine.git/?a=commit;h=2adba0d7cd232704d1e369aae…
Author: Andrey Esin <andrey(a)esin.name> Date: Mon Jan 7 19:21:13 2008 +0300 shell32: Fixed typo. --- dlls/shell32/shell32_Ru.rc | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/dlls/shell32/shell32_Ru.rc b/dlls/shell32/shell32_Ru.rc index 7bc7848..411c510 100644 --- a/dlls/shell32/shell32_Ru.rc +++ b/dlls/shell32/shell32_Ru.rc @@ -84,7 +84,7 @@ BEGIN MENUITEM "&����������", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR MENUITEM "������� &�����", FCIDM_SHVIEW_CREATELINK - MENUITEM "&�������", FCIDM_SHVIEW_DELETE + MENUITEM "&�������", FCIDM_SHVIEW_DELETE MENUITEM "�����&��������", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR MENUITEM "���&�����", FCIDM_SHVIEW_PROPERTIES
1
0
0
0
Andrey Esin : wordpad: Russian translation.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: fd78ab799b1554f3ce6528122d254b6c741d4cc3 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=fd78ab799b1554f3ce6528122…
Author: Andrey Esin <andrey(a)esin.name> Date: Tue Jan 8 00:26:32 2008 +0300 wordpad: Russian translation. --- programs/wordpad/Ru.rc | 158 ++++++++++++++++++++++++------------------------ 1 files changed, 79 insertions(+), 79 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=fd78ab799b1554f3ce652…
1
0
0
0
Paul Vriens : advapi32/tests: Don't crash on win98.
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: d2e0786eb26e9dc8e1f9460ad02148bb7024fca8 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=d2e0786eb26e9dc8e1f9460ad…
Author: Paul Vriens <paul.vriens.wine(a)gmail.com> Date: Tue Jan 8 10:18:17 2008 +0100 advapi32/tests: Don't crash on win98. --- dlls/advapi32/tests/security.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-) diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index e9f4795..217d89c 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1627,11 +1627,18 @@ static void test_security_descriptor(void) SECURITY_DESCRIPTOR sd; char buf[8192]; DWORD size; - BOOL isDefault, isPresent; + BOOL isDefault, isPresent, ret; PACL pacl; PSID psid; - InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); + SetLastError(0xdeadbeef); + ret = InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); + if (ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + skip("InitializeSecurityDescriptor is not implemented\n"); + return; + } + ok(GetSecurityDescriptorOwner(&sd, &psid, &isDefault), "GetSecurityDescriptorOwner failed\n"); expect_eq(psid, NULL, PSID, "%p"); expect_eq(isDefault, FALSE, BOOL, "%d"); @@ -2253,6 +2260,12 @@ static void test_PrivateObjectSecurity(void) ULONG len; PSECURITY_DESCRIPTOR buf; + if (!pConvertStringSecurityDescriptorToSecurityDescriptorA) + { + skip("ConvertStringSecurityDescriptorToSecurityDescriptor is not available\n"); + return; + } + ok(pConvertStringSecurityDescriptorToSecurityDescriptorA( "O:SY" "G:S-1-5-21-93476-23408-4576" @@ -2308,6 +2321,12 @@ static void test_acls(void) SetLastError(0xdeadbeef); ret = InitializeAcl(pAcl, sizeof(ACL) - 1, ACL_REVISION); + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + skip("InitializeAcl is not implemented\n"); + return; + } + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "InitializeAcl with too small a buffer should have failed with ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); SetLastError(0xdeadbeef);
1
0
0
0
Dmitry Timoshkov : comdlg32: If lpstrFile points to a valid string use it as a default value for edit control .
by Alexandre Julliard
08 Jan '08
08 Jan '08
Module: wine Branch: master Commit: 77c0fad57207dd38864eaa8a54ae0571f37e5b20 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=77c0fad57207dd38864eaa8a5…
Author: Dmitry Timoshkov <dmitry(a)codeweavers.com> Date: Tue Jan 8 16:43:14 2008 +0800 comdlg32: If lpstrFile points to a valid string use it as a default value for edit control. --- dlls/comdlg32/filedlg31.c | 85 ++++++++++++++++++++++++-------------------- 1 files changed, 46 insertions(+), 39 deletions(-) diff --git a/dlls/comdlg32/filedlg31.c b/dlls/comdlg32/filedlg31.c index 5b76d8e..6e8cdcb 100644 --- a/dlls/comdlg32/filedlg31.c +++ b/dlls/comdlg32/filedlg31.c @@ -113,9 +113,35 @@ BOOL FD31_CallWindowProc(const FD31_DATA *lfs, UINT wMsg, WPARAM wParam, } /*********************************************************************** + * FD31_GetFileType [internal] + */ +static LPCWSTR FD31_GetFileType(LPCWSTR cfptr, LPCWSTR fptr, const WORD index) +{ + int n, i; + i = 0; + if (cfptr) + for ( ;(n = lstrlenW(cfptr)) != 0; i++) + { + cfptr += n + 1; + if (i == index) + return cfptr; + cfptr += lstrlenW(cfptr) + 1; + } + if (fptr) + for ( ;(n = lstrlenW(fptr)) != 0; i++) + { + fptr += n + 1; + if (i == index) + return fptr; + fptr += lstrlenW(fptr) + 1; + } + return FILE_star; /* FIXME */ +} + +/*********************************************************************** * FD31_ScanDir [internal] */ -static BOOL FD31_ScanDir(HWND hWnd, LPCWSTR newPath) +static BOOL FD31_ScanDir(const OPENFILENAMEW *ofn, HWND hWnd, LPCWSTR newPath) { WCHAR buffer[BUFFILE]; HWND hdlg, hdlgDir; @@ -125,10 +151,10 @@ static BOOL FD31_ScanDir(HWND hWnd, LPCWSTR newPath) TRACE("Trying to change to %s\n", debugstr_w(newPath)); if ( newPath[0] && !SetCurrentDirectoryW( newPath )) return FALSE; - lstrcpynW(buffer, newPath, sizeof(buffer)/sizeof(WCHAR)); /* get the list of spec files */ - GetDlgItemTextW(hWnd, edt1, buffer, sizeof(buffer)/sizeof(WCHAR)); + lstrcpynW(buffer, FD31_GetFileType(ofn->lpstrCustomFilter, + ofn->lpstrFilter, ofn->nFilterIndex - 1), BUFFILE); hCursorWait = LoadCursorA(0, (LPSTR)IDC_WAIT); oldCursor = SetCursor(hCursorWait); @@ -162,33 +188,6 @@ static BOOL FD31_ScanDir(HWND hWnd, LPCWSTR newPath) } /*********************************************************************** - * FD31_GetFileType [internal] - */ - -static LPCWSTR FD31_GetFileType(LPCWSTR cfptr, LPCWSTR fptr, const WORD index) -{ - int n, i; - i = 0; - if (cfptr) - for ( ;(n = lstrlenW(cfptr)) != 0; i++) - { - cfptr += n + 1; - if (i == index) - return cfptr; - cfptr += lstrlenW(cfptr) + 1; - } - if (fptr) - for ( ;(n = lstrlenW(fptr)) != 0; i++) - { - fptr += n + 1; - if (i == index) - return fptr; - fptr += lstrlenW(fptr) + 1; - } - return FILE_star; /* FIXME */ -} - -/*********************************************************************** * FD31_WMDrawItem [internal] */ LONG FD31_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam, @@ -374,7 +373,7 @@ static LRESULT FD31_DirListDblClick( const FD31_DATA *lfs ) } strcatW(tmpstr, FILE_bslash); - FD31_ScanDir(hWnd, tmpstr); + FD31_ScanDir(lfs->ofnW, hWnd, tmpstr); /* notify the app */ if (lfs->hook) { @@ -449,7 +448,7 @@ static LRESULT FD31_TestPath( const FD31_DATA *lfs, LPWSTR path ) TRACE("path=%s, tmpstr2=%s\n", debugstr_w(path), debugstr_w(tmpstr2)); SetDlgItemTextW( hWnd, edt1, tmpstr2 ); - FD31_ScanDir(hWnd, path); + FD31_ScanDir(lfs->ofnW, hWnd, path); return (lfs->ofnW->Flags & OFN_NOVALIDATE) ? TRUE : FALSE; } @@ -461,7 +460,7 @@ static LRESULT FD31_TestPath( const FD31_DATA *lfs, LPWSTR path ) strcatW(path, FILE_bslash); /* if ScanDir succeeds, we have changed the directory */ - if (FD31_ScanDir(hWnd, path)) + if (FD31_ScanDir(lfs->ofnW, hWnd, path)) return FALSE; /* and path is not a valid file name */ /* if not, this must be a filename */ @@ -476,7 +475,7 @@ static LRESULT FD31_TestPath( const FD31_DATA *lfs, LPWSTR path ) lstrcpynW(tmpstr2, pBeginFileName + 1, sizeof(tmpstr2)/sizeof(WCHAR) ); /* Should we MessageBox() if this fails? */ - if (!FD31_ScanDir(hWnd, path)) + if (!FD31_ScanDir(lfs->ofnW, hWnd, path)) { return FALSE; } @@ -870,11 +869,19 @@ LONG FD31_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL) ofn->nFilterIndex = 1; SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0); - lstrcpynW(tmpstr, FD31_GetFileType(ofn->lpstrCustomFilter, + if (ofn->lpstrFile && ofn->lpstrFile[0]) + { + TRACE( "SetText of edt1 to %s\n", debugstr_w(ofn->lpstrFile) ); + SetDlgItemTextW( hWnd, edt1, ofn->lpstrFile ); + } + else + { + lstrcpynW(tmpstr, FD31_GetFileType(ofn->lpstrCustomFilter, ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE); - TRACE("nFilterIndex = %d, SetText of edt1 to %s\n", + TRACE("nFilterIndex = %d, SetText of edt1 to %s\n", ofn->nFilterIndex, debugstr_w(tmpstr)); - SetDlgItemTextW( hWnd, edt1, tmpstr ); + SetDlgItemTextW( hWnd, edt1, tmpstr ); + } /* get drive list */ *tmpstr = 0; DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE); @@ -895,9 +902,9 @@ LONG FD31_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) } else *tmpstr = 0; - if (!FD31_ScanDir(hWnd, tmpstr)) { + if (!FD31_ScanDir(ofn, hWnd, tmpstr)) { *tmpstr = 0; - if (!FD31_ScanDir(hWnd, tmpstr)) + if (!FD31_ScanDir(ofn, hWnd, tmpstr)) WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr)); } /* select current drive in combo 2, omit missing drives */
1
0
0
0
← Newer
1
...
43
44
45
46
47
48
49
...
70
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Results per page:
10
25
50
100
200