Annotation of embedaddon/smartmontools/os_win32/runcmd.c, revision 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>