Annotation of embedaddon/smartmontools/os_win32/runcmd.c, revision 1.1.1.1

1.1       misho       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: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>