#include #include #include #include #define MAX_WAIT_HANDLES MAXIMUM_WAIT_OBJECTS __cdecl main (c, v) int c; char *v[]; { HANDLE hEvents[ 4 * MAX_WAIT_HANDLES ]; char *EventNames[ 4 * MAX_WAIT_HANDLES ]; char *s; ULONG nEvents, dwWaitResult; BOOLEAN fWaitAny = FALSE; BOOLEAN fWait = FALSE; BOOLEAN fVerbose = FALSE; BOOLEAN fUsage = TRUE; nEvents = 0; while (--c) { s = *++v; if (!_stricmp( s, "-a" )) { fWaitAny = TRUE; fWait = TRUE; } else if (!_stricmp( s, "-w" )) fWait = TRUE; else if (!_stricmp( s, "-v" )) fVerbose = TRUE; else if (nEvents == (4 * MAX_WAIT_HANDLES)) { fprintf( stderr, "CMDEVENT: Cant wait on more than %u events.\n", 4 * MAX_WAIT_HANDLES ); exit( -1 ); } else { fUsage = FALSE; if (nEvents == MAX_WAIT_HANDLES && !fVerbose) { fprintf( stderr, "CMDEVENT: Waiting on more than %u events. Forcing -v\n", MAX_WAIT_HANDLES ); fVerbose = TRUE; } { char *d; d = s; while (*d) { if (*d == '\\') { *d = '_'; } d++; } } hEvents[ nEvents ] = fWait ? CreateEvent( NULL, TRUE, FALSE, s ) : OpenEvent( EVENT_ALL_ACCESS, FALSE, s ); if (hEvents[ nEvents ] == NULL) { fprintf( stderr, "CMDEVENT: Unable to %s event named '%s' - %u\n", fWait ? "create" : "open", s, GetLastError() ); exit( -1 ); break; } else if (!fWait) { if (!SetEvent( hEvents[ nEvents ] )) { fprintf( stderr, "CMDEVENT: Unable to signal event named '%s' - %u\n", s, GetLastError() ); } } else { EventNames[ nEvents ] = s; nEvents += 1; } } } if (fUsage) { fprintf( stderr, "usage: CMDEVENT [-w] [-v] EventName(s)...\n" ); exit( -1 ); } else if (fWait) { if (fVerbose) { fprintf( stderr, "\nWaiting for %u events:", nEvents ); fflush( stderr ); } while (nEvents) { dwWaitResult = WaitForMultipleObjects( nEvents > MAX_WAIT_HANDLES ? MAX_WAIT_HANDLES : nEvents, hEvents, FALSE, INFINITE ); if (dwWaitResult == WAIT_FAILED) { fprintf( stderr, "\nCMDEVENT: Unable to wait for event(s) - %u\n", GetLastError() ); exit( -1 ); } else if (dwWaitResult < nEvents) { CloseHandle( hEvents[ dwWaitResult ] ); if (fVerbose) { fprintf( stderr, " %s", EventNames[ dwWaitResult ] ); fflush( stderr ); } if (fWaitAny) { exit( dwWaitResult+1 ); } nEvents -= 1; if (dwWaitResult < nEvents) { memmove( &hEvents[ dwWaitResult ], &hEvents[ dwWaitResult+1 ], (nEvents - dwWaitResult + 1) * sizeof( hEvents[ 0 ] ) ); memmove( &EventNames[ dwWaitResult ], &EventNames[ dwWaitResult+1 ], (nEvents - dwWaitResult + 1) * sizeof( EventNames[ 0 ] ) ); } } } if (fVerbose) { fprintf( stderr, "\n" ); } } exit( 0 ); return( 0 ); }