Stripped out the HAL support code and replaced with calls to udev. The remainder of the code to extract CPU details parses through the /proc/cpuinfo file since udev/sysfs will not return such information.
Signed-off-by: Darryl L. Pierce <[email protected]> --- configure.ac | 3 +- src/Makefile.am | 4 +- src/processors.cpp | 94 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 79 insertions(+), 22 deletions(-) diff --git a/configure.ac b/configure.ac index 9102c66..c51c23e 100644 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@ AM_INIT_AUTOMAKE AC_PROG_CXX AC_PROG_CC AC_PROG_CPP -AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/ioctl.h sys/socket.h unistd.h]) +AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/ioctl.h sys/socket.h unistd.h libudev.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL @@ -19,6 +19,7 @@ PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.2.12) PKG_CHECK_MODULES(HAL, hal >= 0.5.12) PKG_CHECK_MODULES(LIBVIRT, libvirt >= 0.6.2) PKG_CHECK_MODULES(PCRE, libpcre >= 7.8) +PKG_CHECK_MODULES(UDEV, libudev >= 145) # Checks for library functions. AC_CHECK_FUNCS([gethostname inet_ntoa socket]) diff --git a/src/Makefile.am b/src/Makefile.am index ee30443..b4668b9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/matahari $(HAL_CFLAGS) $(LIBVIRT_CFLAGS) $(PCRE_CFLAGS) +INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/matahari $(HAL_CFLAGS) $(LIBVIRT_CFLAGS) $(PCRE_CFLAGS) $(UDEV_CFLAGS) sbin_PROGRAMS = matahari @@ -41,6 +41,6 @@ CLEANFILES = $(generated_file_list) $(first) matahari_CPPFLAGS = -fno-strict-aliasing matahari_LDFLAGS = -L/usr/local/lib -matahari_LDADD = -lqmf $(HAL_LIBS) $(LIBVIRT_LIBS) $(PCRE_LIBS) +matahari_LDADD = -lqmf $(HAL_LIBS) $(LIBVIRT_LIBS) $(PCRE_LIBS) $(UDEV_LIBS) dist_pkgdata_DATA = schema.xml diff --git a/src/processors.cpp b/src/processors.cpp index 4317b1f..30a2837 100644 --- a/src/processors.cpp +++ b/src/processors.cpp @@ -17,25 +17,19 @@ * also available at http://www.gnu.org/copyleft/gpl.html. */ -#include <iostream> +#include "processors.h" #include <fstream> -#include <sstream> -#include <string> -#include <vector> -#include <stdexcept> - -#include <hal/libhal.h> - +#include <iostream> #include <pcre.h> -#include "hal.h" -#include "processors.h" +// TODO remove this wrapper once rhbz#583747 is fixed +extern "C" { +#include <libudev.h> +} using namespace std; namespace _qmf = qmf::com::redhat::matahari; -extern DBusError dbus_error; - void ProcessorsAgent::setup(ManagementAgent* agent, Manageable* parent) { @@ -43,17 +37,79 @@ ProcessorsAgent::setup(ManagementAgent* agent, Manageable* parent) management_object = new _qmf::Processors(agent, this, parent); agent->addObject(management_object); - LibHalContext* context = get_hal_ctx(); + int core_count = 0; + string model = "unknown"; + + struct udev* udev = udev_new(); + struct udev_enumerate* enumerator = udev_enumerate_new(udev); + + udev_enumerate_add_match_property(enumerator, "DRIVER", "processor"); + if(!udev_enumerate_scan_devices(enumerator)) + { + struct udev_list_entry* entries = udev_enumerate_get_list_entry(enumerator); + struct udev_list_entry* entry; + + udev_list_entry_foreach(entry, entries) + { + core_count++; + } + } + + udev_enumerate_unref(enumerator); + udev_unref(udev); + + ifstream input("/proc/cpuinfo"); + if(input.is_open()) + { + string regexstr = "(.*\\S)\\s*:\\s*(\\S.*)"; + int expected = 3; + int found[expected * 3]; + const char* pcre_error; + int pcre_error_offset; + pcre* regex; + bool done = false; + bool started = false; + + regex = pcre_compile(regexstr.c_str(), 0, &pcre_error, &pcre_error_offset, NULL); + if(!regex) { throw runtime_error("Unable to compile regular expression."); } + + while(!input.eof() && !done) + { + string line; + + getline(input, line); + int match = pcre_exec(regex, NULL, line.c_str(), line.length(), + 0, PCRE_NOTEMPTY,found, expected * 3); - int num_results; - char** processors = libhal_find_device_by_capability(context,"processor", &num_results, &dbus_error); + if(match == expected) + { + string name = line.substr(found[2], found[3] - found[2]); + string value = line.substr(found[4], found[5] - found[4]); - if (!processors) - throw runtime_error("Error: could not query processors via HAL."); + // if we're at a second processor and we've already started, then we're done + if (name == "processor") + { + if (started) + { + done = true; + } + else + { + started = true; + } + } + else + { + if(name == "model name") model = value; + } + } + } + input.close(); + } // populate the managed object's values - management_object->set_model(libhal_device_get_property_string(context, processors[0], "info.product", &dbus_error)); - management_object->set_cores(num_results); + management_object->set_model(model); + management_object->set_cores(core_count); } void -- 1.6.6.1 _______________________________________________ Ovirt-devel mailing list [email protected] https://www.redhat.com/mailman/listinfo/ovirt-devel
