Module: monitoring-plugins
    Branch: master
    Commit: 5e03bd8e8cf4ea41aef6cf5d7f115afa7565c861
    Author: Gunnar Beutner <[email protected]>
 Committer: Holger Weiss <[email protected]>
      Date: Mon Apr 21 21:51:19 2014 +0200
       URL: 
https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=5e03bd8

Make check_users work on Windows.

---

 configure.ac          | 10 +++++++++-
 plugins/Makefile.am   |  2 +-
 plugins/check_users.c | 44 +++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index f405cce..244df42 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 6b347fe..0ddf9bd 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 458a7ca..a009f20 100644
--- a/plugins/check_users.c
+++ b/plugins/check_users.c
@@ -37,7 +37,12 @@ const char *email = "[email protected]";
 #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 ();
 

Reply via email to