cpu plugin: Check if all required sysctl defines are present.
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sun, 15 Feb 2009 14:01:05 +0000 (15:01 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sun, 15 Feb 2009 14:07:37 +0000 (15:07 +0100)
Rather than checking for OpenBSD, since this interface may work with
other *BSDs, too. The order of the initialization code has been fixed,
too, and some other minor fixes..

src/cpu.c

index 6e8a62d..1f1284a 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -49,7 +49,8 @@
 # include <sys/sysinfo.h>
 #endif /* HAVE_LIBKSTAT */
 
-#ifdef HAVE_SYSCTLBYNAME
+#if (defined(HAVE_SYSCTL) && HAVE_SYSCTL) \
+       || (defined(HAVE_SYSCTLBYNAME) && HAVE_SYSCTLBYNAME)
 # ifdef HAVE_SYS_SYSCTL_H
 #  include <sys/sysctl.h>
 # endif
 #  define CP_IDLE   4
 #  define CPUSTATES 5
 # endif
-#endif /* HAVE_SYSCTLBYNAME */
-
-#ifdef __OpenBSD__
-# ifdef HAVE_SYS_SYSCTL_H
-#  include <sys/sysctl.h>
-# endif
-
-# ifdef HAVE_SYS_DKSTAT_H
-#  include <sys/dkstat.h>
+#endif /* HAVE_SYSCTL || HAVE_SYSCTLBYNAME */
+
+#if HAVE_SYSCTL
+# if defined(CTL_HW) && defined(HW_NCPU) \
+       && defined(CTL_KERN) && defined(KERN_CPTIME) && defined(CPUSTATES)
+#  define CAN_USE_SYSCTL 1
+# else
+#  define CAN_USE_SYSCTL 0
 # endif
-#endif /* __OpenBSD__ */
+#else
+# define CAN_USE_SYSCTL 0
+#endif
 
 #if HAVE_STATGRAB_H
 # include <statgrab.h>
 #endif
 
 #if !PROCESSOR_CPU_LOAD_INFO && !KERNEL_LINUX && !HAVE_LIBKSTAT \
-       && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB && !__OpenBSD__
+       && !CAN_USE_SYSCTL && !HAVE_SYSCTLBYNAME && !HAVE_LIBSTATGRAB
 # error "No applicable input method."
 #endif
 
@@ -111,7 +113,11 @@ static kstat_t *ksp[MAX_NUMCPU];
 static int numcpu;
 /* #endif HAVE_LIBKSTAT */
 
-#elif defined(HAVE_SYSCTLBYNAME) || __OpenBSD__
+#elif CAN_USE_SYSCTL
+static int numcpu;
+/* #endif CAN_USE_SYSCTL */
+
+#elif defined(HAVE_SYSCTLBYNAME)
 static int numcpu;
 /* #endif HAVE_SYSCTLBYNAME */
 
@@ -156,37 +162,41 @@ static int init (void)
                        ksp[numcpu++] = ksp_chain;
 /* #endif HAVE_LIBKSTAT */
 
-#elif defined (HAVE_SYSCTLBYNAME)
+#elif CAN_USE_SYSCTL
        size_t numcpu_size;
+       int mib[2] = {CTL_HW, HW_NCPU};
+       int status;
 
+       numcpu = 0;
        numcpu_size = sizeof (numcpu);
 
-       if (sysctlbyname ("hw.ncpu", &numcpu, &numcpu_size, NULL, 0) < 0)
+       status = sysctl (mib, STATIC_ARRAY_SIZE (mib),
+                       &numcpu, &numcpu_size, NULL, 0);
+       if (status == -1)
        {
                char errbuf[1024];
-               WARNING ("cpu plugin: sysctlbyname: %s",
+               WARNING ("cpu plugin: sysctl: %s",
                                sstrerror (errno, errbuf, sizeof (errbuf)));
                return (-1);
        }
+/* #endif CAN_USE_SYSCTL */
 
-       if (numcpu != 1)
-               NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu);
-/* #endif HAVE_SYSCTLBYNAME */
-
-#elif defined __OpenBSD__
+#elif defined (HAVE_SYSCTLBYNAME)
        size_t numcpu_size;
-       int mib[2] = {CTL_HW, HW_NCPU};
 
        numcpu_size = sizeof (numcpu);
 
-       if (sysctl (mib, 2, &numcpu, &numcpu_size, NULL, 0) < 0)
+       if (sysctlbyname ("hw.ncpu", &numcpu, &numcpu_size, NULL, 0) < 0)
        {
                char errbuf[1024];
-               WARNING ("cpu plugin: sysctl: %s",
+               WARNING ("cpu plugin: sysctlbyname: %s",
                                sstrerror (errno, errbuf, sizeof (errbuf)));
                return (-1);
        }
-/* #endif __OpenBSD__ */
+
+       if (numcpu != 1)
+               NOTICE ("cpu: Only one processor supported when using `sysctlbyname' (found %i)", numcpu);
+/* #endif HAVE_SYSCTLBYNAME */
 
 #elif defined(HAVE_LIBSTATGRAB)
        /* nothing to initialize */
@@ -387,50 +397,69 @@ static int cpu_read (void)
        }
 /* #endif defined(HAVE_LIBKSTAT) */
 
-#elif defined __OpenBSD__
-       int64_t cpuinfo[numcpu][CPUSTATES];
+#elif CAN_USE_SYSCTL
+       uint64_t cpuinfo[numcpu][CPUSTATES];
        size_t cpuinfo_size;
+       int status;
        int i;
 
-       if (numcpu > 1) {
-               cpuinfo_size = CPUSTATES * sizeof(int64_t);
+       if (numcpu < 1)
+       {
+               ERROR ("cpu plugin: Could not determine number of "
+                               "installed CPUs using sysctl(3).");
+               return (-1);
+       }
+
+       memset (cpuinfo, 0, sizeof (cpuinfo));
 
+#if defined(KERN_CPTIME2)
+       if (numcpu > 1) {
                for (i = 0; i < numcpu; i++) {
                        int mib[] = {CTL_KERN, KERN_CPTIME2, i};
 
-                       if (sysctl(mib, 3, cpuinfo[i], &cpuinfo_size, NULL, 0) < 0) {
+                       cpuinfo_size = sizeof (cpuinfo[0]);
+
+                       status = sysctl (mib, STATIC_ARRAY_SIZE (mib),
+                                       cpuinfo[i], &cpuinfo_size, NULL, 0);
+                       if (status == -1) {
                                char errbuf[1024];
                                ERROR ("cpu plugin: sysctl failed: %s.",
                                                sstrerror (errno, errbuf, sizeof (errbuf)));
                                return (-1);
                        }
                }
-       } else {
+       }
+       else
+#endif /* defined(KERN_CPTIME2) */
+       {
                int mib[] = {CTL_KERN, KERN_CPTIME};
                long cpuinfo_tmp[CPUSTATES];
 
                cpuinfo_size = sizeof(cpuinfo_tmp);
 
-               if (sysctl(mib, 2, &cpuinfo_tmp, &cpuinfo_size, NULL, 0) < 0)
+               status = sysctl (mib, STATIC_ARRAY_SIZE (mib),
+                                       &cpuinfo_tmp, &cpuinfo_size, NULL, 0);
+               if (status == -1)
                {
                        char errbuf[1024];
                        ERROR ("cpu plugin: sysctl failed: %s.",
                                        sstrerror (errno, errbuf, sizeof (errbuf)));
                        return (-1);
                }
+
                for(i = 0; i < CPUSTATES; i++) {
                        cpuinfo[0][i] = cpuinfo_tmp[i];
                }
        }
 
        for (i = 0; i < numcpu; i++) {
-               submit (i, "user", cpuinfo[i][CP_USER]);
-               submit (i, "nice", cpuinfo[i][CP_NICE]);
-               submit (i, "system", cpuinfo[i][CP_SYS]);
-               submit (i, "idle", cpuinfo[i][CP_IDLE]);
+               submit (i, "user",      cpuinfo[i][CP_USER]);
+               submit (i, "nice",      cpuinfo[i][CP_NICE]);
+               submit (i, "system",    cpuinfo[i][CP_SYS]);
+               submit (i, "idle",      cpuinfo[i][CP_IDLE]);
                submit (i, "interrupt", cpuinfo[i][CP_INTR]);
        }
-/* #endif __OpenBSD__ */
+/* #endif CAN_USE_SYSCTL */
 
 #elif defined(HAVE_SYSCTLBYNAME)
        long cpuinfo[CPUSTATES];