aboutsummaryrefslogtreecommitdiff
path: root/win32/process.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--win32/process.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/win32/process.c b/win32/process.c
index e7c9ca187..0d120936e 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -331,7 +331,9 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv,
331 } else { 331 } else {
332 errno = ENOENT; 332 errno = ENOENT;
333 } 333 }
334#if ENABLE_FEATURE_PREFER_APPLETS && NUM_APPLETS > 1
334 done: 335 done:
336#endif
335 free(path); 337 free(path);
336 free(new_argv); 338 free(new_argv);
337 return ret; 339 return ret;
@@ -499,6 +501,38 @@ static NORETURN void wait_for_child(HANDLE child, const char *cmd)
499 exit((int)code); 501 exit((int)code);
500} 502}
501 503
504static intptr_t
505shell_execute(const char *path, char *const *argv)
506{
507 SHELLEXECUTEINFO info;
508 char *args;
509
510 memset(&info, 0, sizeof(SHELLEXECUTEINFO));
511 info.cbSize = sizeof(SHELLEXECUTEINFO);
512 info.fMask = SEE_MASK_NOCLOSEPROCESS;
513 /* info.hwnd = NULL; */
514 info.lpVerb = "runas";
515 info.lpFile = path;
516
517 args = NULL;
518 if (*argv++) {
519 while (*argv) {
520 char *q = quote_arg(*argv++);
521 args = xappendword(args, q);
522 free(q);
523 }
524 }
525
526 info.lpParameters = args;
527 /* info.lpDirectory = NULL; */
528 info.nShow = SW_SHOWNORMAL;
529
530 mingw_shell_execute(&info);
531
532 free(args);
533 return info.hProcess ? (intptr_t)info.hProcess : -1;
534}
535
502int 536int
503mingw_execvp(const char *cmd, char *const *argv) 537mingw_execvp(const char *cmd, char *const *argv)
504{ 538{
@@ -512,6 +546,16 @@ int
512mingw_execve(const char *cmd, char *const *argv, char *const *envp) 546mingw_execve(const char *cmd, char *const *argv, char *const *envp)
513{ 547{
514 intptr_t ret = mingw_spawn_interpreter(P_NOWAIT, cmd, argv, envp, 0); 548 intptr_t ret = mingw_spawn_interpreter(P_NOWAIT, cmd, argv, envp, 0);
549
550 if (ret == -1 && GetLastError() == ERROR_ELEVATION_REQUIRED) {
551 // Command exists but failed because it wants elevated privileges.
552 // Try again using ShellExecuteEx().
553 SetLastError(0);
554 ret = shell_execute(cmd, argv);
555 if (GetLastError())
556 exit(1);
557 }
558
515 if (ret != -1) 559 if (ret != -1)
516 wait_for_child((HANDLE)ret, cmd); 560 wait_for_child((HANDLE)ret, cmd);
517 return ret; 561 return ret;
@@ -751,7 +795,7 @@ UNUSED_PARAM
751 return sp; 795 return sp;
752} 796}
753 797
754void FAST_FUNC read_cmdline(char *buf, int col, unsigned pid, const char *comm) 798int FAST_FUNC read_cmdline(char *buf, int col, unsigned pid, const char *comm)
755{ 799{
756 const char *str, *cmdline; 800 const char *str, *cmdline;
757 801
@@ -763,6 +807,7 @@ void FAST_FUNC read_cmdline(char *buf, int col, unsigned pid, const char *comm)
763 else 807 else
764 cmdline = comm; 808 cmdline = comm;
765 safe_strncpy(buf, cmdline, col); 809 safe_strncpy(buf, cmdline, col);
810 return 0;
766} 811}
767 812
768/** 813/**