]>
Commit | Line | Data |
---|---|---|
d008864d GI |
1 | /* |
2 | * Run console command and wait for user input | |
3 | * | |
4 | * Home page of code is: http://smartmontools.sourceforge.net | |
5 | * | |
6 | * Copyright (C) 2011 Christian Franke <smartmontools-support@lists.sourceforge.net> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License as published by | |
10 | * the Free Software Foundation; either version 2, or (at your option) | |
11 | * any later version. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License | |
14 | * (for example COPYING); If not, see <http://www.gnu.org/licenses/>. | |
15 | * | |
16 | */ | |
17 | ||
18 | char svnid[] = "$Id: runcmd.c 3453 2011-10-16 12:45:27Z chrfranke $"; | |
19 | ||
20 | #include <stdio.h> | |
21 | #include <windows.h> | |
22 | ||
23 | int main(int argc, char **argv) | |
24 | { | |
25 | char * cmd = GetCommandLineA(); | |
26 | DWORD exitcode; | |
27 | STARTUPINFOA si = { sizeof(si), }; | |
28 | PROCESS_INFORMATION pi; | |
29 | int key; | |
30 | ||
31 | if (*cmd == '"') { | |
32 | cmd++; | |
33 | while (*cmd && !(*cmd == '"' && cmd[-1] != '\\')) | |
34 | cmd++; | |
35 | if (*cmd) | |
36 | cmd++; | |
37 | } | |
38 | else { | |
39 | while (*cmd && !(*cmd == ' ' || *cmd == '\t')) | |
40 | cmd++; | |
41 | } | |
42 | ||
43 | while (*cmd == ' ' || *cmd == '\t') | |
44 | cmd++; | |
45 | ||
46 | if (*cmd) { | |
47 | printf("%s\n\n", cmd); fflush(stdout); | |
48 | } | |
49 | ||
50 | if (!*cmd) { | |
51 | printf("Usage: %s COMMAND [ARG ...]\n", argv[0]); | |
52 | exitcode = 1; | |
53 | } | |
54 | else if (!CreateProcessA((char *)0, cmd, | |
55 | (SECURITY_ATTRIBUTES *)0, (SECURITY_ATTRIBUTES *)0, | |
56 | TRUE/*inherit*/, 0/*no flags*/, (void *)0, (char *)0, &si, &pi) | |
57 | ) { | |
58 | DWORD err = GetLastError(); | |
59 | if (err == ERROR_FILE_NOT_FOUND) | |
60 | printf("Command not found\n"); | |
61 | else | |
62 | printf("CreateProcess() failed with error=%u\n", err); | |
63 | exitcode = 1; | |
64 | } | |
65 | else { | |
66 | CloseHandle(pi.hThread); | |
67 | ||
68 | exitcode = 42; | |
69 | WaitForSingleObject(pi.hProcess, INFINITE); | |
70 | GetExitCodeProcess(pi.hProcess, &exitcode); | |
71 | CloseHandle(pi.hProcess); | |
72 | ||
73 | if (exitcode) | |
74 | printf("\nExitcode: %u (0x%02x)", exitcode, exitcode); | |
75 | } | |
76 | ||
77 | printf("\nType <return> to exit: "); fflush(stdout); | |
78 | while (!((key = getc(stdin)) == EOF || key == '\n' || key == '\r')) | |
79 | ; | |
80 | printf("\n"); | |
81 | ||
82 | return exitcode; | |
83 | } |