[Apcupsd-commits] apcupsd/src/lib apcexec.c,1.12,1.13
Brought to you by:
adk0212
From: Adam K. <ad...@us...> - 2006-05-23 21:55:17
|
Update of /cvsroot/apcupsd/apcupsd/src/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25189/src/lib Modified Files: apcexec.c Log Message: Add a first-cut implementation of execute_command() for Mingw. Index: apcexec.c =================================================================== RCS file: /cvsroot/apcupsd/apcupsd/src/lib/apcexec.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- apcexec.c 11 Jun 2005 13:56:01 -0000 1.12 +++ apcexec.c 23 May 2006 21:55:07 -0000 1.13 @@ -74,6 +74,71 @@ } } +#ifdef HAVE_MINGW +int execute_command(UPSINFO *ups, UPSCOMMANDS cmd) +{ + char cmdline[MAXSTRING]; + char *comspec; + PROCESS_INFORMATION procinfo; + STARTUPINFOA startinfo; + BOOL rc; + char apccontrol[strlen(APCCONTROL)+1]; + + if (cmd.pid && (kill(cmd.pid, 0) == 0)) { + /* + * Command is already running. No point in running it two + * times. + */ + return SUCCESS; + } + + /* Find command interpreter */ + comspec = getenv("COMSPEC"); + if (comspec == NULL) + return FAILURE; + + /* HACK! The APCCONTROL constant is currently using UNIX slashes */ + conv_unix_to_win32_path(APCCONTROL, apccontrol, sizeof(apccontrol)); + + /* Build the command line */ + asnprintf(cmdline, sizeof(cmdline), "/c %s %s \"%s\" %d %d", + apccontrol, cmd.command, ups->upsname, + !ups->is_slave(), ups->is_plugged()); + + /* Initialize the STARTUPINFOA struct; no special settings needed. */ + memset(&startinfo, 0, sizeof(startinfo)); + startinfo.cb = sizeof(startinfo); + + Dmsg2(200, "execute_command: CreateProcessA(%s, %s, ...)\n", + comspec, cmdline); + + /* Execute the process */ + rc = CreateProcessA(comspec, + cmdline, // command line + NULL, // process security attributes + NULL, // primary thread security attributes + TRUE, // handles are inherited + 0, // creation flags + NULL, // use parent's environment + NULL, // use parent's current directory + &startinfo, // STARTUPINFO pointer + &procinfo); // receives PROCESS_INFORMATION + if (!rc) { + log_event(ups, LOG_WARNING, "execute failed: CreateProcessA(%s, %s, ...)=%d\n", + comspec, cmdline, GetLastError()); + return FAILURE; + } + + /* Extract pid */ + cmd.pid = procinfo.dwProcessId; + + /* Don't need handles */ + CloseHandle(procinfo.hProcess); + CloseHandle(procinfo.hThread); + + return SUCCESS; +} +#else int execute_command(UPSINFO *ups, UPSCOMMANDS cmd) { char *argv[6]; @@ -137,3 +202,4 @@ return SUCCESS; } +#endif /* HAVE_MINGW */ |