diff options
author | Gunnar Beutner <gunnar@beutner.name> | 2014-04-21 21:51:19 +0200 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2014-04-27 19:59:06 +0200 |
commit | 5e03bd8e8cf4ea41aef6cf5d7f115afa7565c861 (patch) | |
tree | e3b9e30280782fa171b3e13f1d41cd580e7c1b87 | |
parent | e0af39d7e9fcd084cf7d2d8a57d07ab1f8038150 (diff) | |
download | monitoring-plugins-5e03bd8e8cf4ea41aef6cf5d7f115afa7565c861.tar.gz |
Make check_users work on Windows.
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | plugins/Makefile.am | 2 | ||||
-rw-r--r-- | plugins/check_users.c | 44 |
3 files changed, 51 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac index f405cce7..244df427 100644 --- a/configure.ac +++ b/configure.ac @@ -364,8 +364,16 @@ dnl Check for headers used by check_users AC_CHECK_HEADERS(utmpx.h) AM_CONDITIONAL([HAVE_UTMPX], [test "$ac_cv_header_utmpx_h" = "yes"]) +AC_CHECK_HEADERS(wtsapi32.h, [], [], [#include <windows.h>]) +AM_CONDITIONAL([HAVE_WTS32API], [test "$ac_cv_header_wtsapi32_h" = "yes"]) + +if test "$ac_cv_header_wtsapi32_h" = "yes"; then + WTSAPI32LIBS="-lwtsapi32" + AC_SUBST(WTSAPI32LIBS) +fi + dnl Fallback to who(1) if the system doesn't provide an utmpx(5) interface -if test "$ac_cv_header_utmpx_h" = "no" +if test "$ac_cv_header_utmpx_h" = "no" -a "$ac_cv_header_wtsapi32_h" = "no" then AC_PATH_PROG(PATH_TO_WHO,who) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 6b347fe9..0ddf9bd1 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -107,7 +107,7 @@ check_tcp_LDADD = $(SSLOBJS) check_time_LDADD = $(NETLIBS) check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS) check_ups_LDADD = $(NETLIBS) -check_users_LDADD = $(BASEOBJS) +check_users_LDADD = $(BASEOBJS) $(WTSAPI32LIBS) check_by_ssh_LDADD = $(NETLIBS) check_ide_smart_LDADD = $(BASEOBJS) negate_LDADD = $(BASEOBJS) diff --git a/plugins/check_users.c b/plugins/check_users.c index 458a7ca6..a009f20b 100644 --- a/plugins/check_users.c +++ b/plugins/check_users.c @@ -37,7 +37,12 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "utils.h" -#if HAVE_UTMPX_H +#if HAVE_WTSAPI32_H +# include <windows.h> +# include <wtsapi32.h> +# undef ERROR +# define ERROR -1 +#elif HAVE_UTMPX_H # include <utmpx.h> #else # include "popen.h" @@ -58,7 +63,11 @@ main (int argc, char **argv) int users = -1; int result = STATE_UNKNOWN; char *perf; -#if HAVE_UTMPX_H +#if HAVE_WTSAPI32_H + WTS_SESSION_INFO *wtsinfo; + DWORD wtscount; + DWORD index; +#elif HAVE_UTMPX_H struct utmpx *putmpx; #else char input_buffer[MAX_INPUT_BUFFER]; @@ -78,7 +87,36 @@ main (int argc, char **argv) users = 0; -#if HAVE_UTMPX_H +#if HAVE_WTSAPI32_H + if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, + 0, 1, &wtsinfo, &wtscount)) { + printf(_("Could not enumerate RD sessions: %d\n"), GetLastError()); + return STATE_UNKNOWN; + } + + for (index = 0; index < wtscount; index++) { + LPTSTR username; + DWORD size; + int len; + + if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, + wtsinfo[index].SessionId, WTSUserName, &username, &size)) + continue; + + len = lstrlen(username); + + WTSFreeMemory(username); + + if (len == 0) + continue; + + if (wtsinfo[index].State == WTSActive || + wtsinfo[index].State == WTSDisconnected) + users++; + } + + WTSFreeMemory(wtsinfo); +#elif HAVE_UTMPX_H /* get currently logged users from utmpx */ setutxent (); |