loader: Add missing \n on message printing
[mesa.git] / src / loader / loader.c
index 6fe8c8fc453b4ee29ea026a2f8701be06cef2c66..6d179a1da961fbac222fd94dc78d696769bb129c 100644 (file)
@@ -67,6 +67,8 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
+#include <assert.h>
+#include <dlfcn.h>
 #include "loader.h"
 
 #ifndef __NOT_HAVE_DRM_H
@@ -83,30 +85,55 @@ static void default_logger(int level, const char *fmt, ...)
       va_start(args, fmt);
       vfprintf(stderr, fmt, args);
       va_end(args);
-      fprintf(stderr, "\n");
    }
 }
 
-static void (*log)(int level, const char *fmt, ...) = default_logger;
+static void (*log_)(int level, const char *fmt, ...) = default_logger;
 
 #ifdef HAVE_LIBUDEV
 #include <libudev.h>
 
+static void *udev_handle = NULL;
+
+static void *
+udev_dlopen_handle(void)
+{
+   if (!udev_handle) {
+      udev_handle = dlopen("libudev.so.1", RTLD_LOCAL | RTLD_LAZY);
+   }
+
+   return udev_handle;
+}
+
+static void *
+asserted_dlsym(void *dlopen_handle, const char *name)
+{
+   void *result = dlsym(dlopen_handle, name);
+   assert(result);
+   return result;
+}
+
+#define UDEV_SYMBOL(ret, name, args) \
+   ret (*name) args = asserted_dlsym(udev_dlopen_handle(), #name);
+
+
 static inline struct udev_device *
 udev_device_new_from_fd(struct udev *udev, int fd)
 {
    struct udev_device *device;
    struct stat buf;
+   UDEV_SYMBOL(struct udev_device *, udev_device_new_from_devnum,
+               (struct udev *udev, char type, dev_t devnum));
 
    if (fstat(fd, &buf) < 0) {
-      log(_LOADER_WARNING, "MESA-LOADER: failed to stat fd %d", fd);
+      log_(_LOADER_WARNING, "MESA-LOADER: failed to stat fd %d\n", fd);
       return NULL;
    }
 
    device = udev_device_new_from_devnum(udev, 'c', buf.st_rdev);
    if (device == NULL) {
-      log(_LOADER_WARNING,
-              "MESA-LOADER: could not create udev device for fd %d", fd);
+      log_(_LOADER_WARNING,
+              "MESA-LOADER: could not create udev device for fd %d\n", fd);
       return NULL;
    }
 
@@ -118,8 +145,15 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
 {
    struct udev *udev = NULL;
    struct udev_device *device = NULL, *parent;
-   struct stat buf;
    const char *pci_id;
+   UDEV_SYMBOL(struct udev *, udev_new, (void));
+   UDEV_SYMBOL(struct udev_device *, udev_device_get_parent,
+               (struct udev_device *));
+   UDEV_SYMBOL(const char *, udev_device_get_property_value,
+               (struct udev_device *, const char *));
+   UDEV_SYMBOL(struct udev_device *, udev_device_unref,
+               (struct udev_device *));
+   UDEV_SYMBOL(struct udev *, udev_unref, (struct udev *));
 
    *chip_id = -1;
 
@@ -130,14 +164,14 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
 
    parent = udev_device_get_parent(device);
    if (parent == NULL) {
-      log(_LOADER_WARNING, "MESA-LOADER: could not get parent device");
+      log_(_LOADER_WARNING, "MESA-LOADER: could not get parent device\n");
       goto out;
    }
 
    pci_id = udev_device_get_property_value(parent, "PCI_ID");
    if (pci_id == NULL ||
        sscanf(pci_id, "%x:%x", vendor_id, chip_id) != 2) {
-      log(_LOADER_WARNING, "MESA-LOADER: malformed or no PCI ID");
+      log_(_LOADER_WARNING, "MESA-LOADER: malformed or no PCI ID\n");
       *chip_id = -1;
       goto out;
    }
@@ -167,11 +201,11 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
 
    version = drmGetVersion(fd);
    if (!version) {
-      log(_LOADER_WARNING, "MESA-LOADER: invalid drm fd");
+      log_(_LOADER_WARNING, "MESA-LOADER: invalid drm fd\n");
       return FALSE;
    }
    if (!version->name) {
-      log(_LOADER_WARNING, "MESA-LOADER: unable to determine the driver name");
+      log_(_LOADER_WARNING, "MESA-LOADER: unable to determine the driver name\n");
       drmFreeVersion(version);
       return FALSE;
    }
@@ -187,7 +221,7 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
       gp.value = chip_id;
       ret = drmCommandWriteRead(fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
       if (ret) {
-         log(_LOADER_WARNING, "MESA-LOADER: failed to get param for i915");
+         log_(_LOADER_WARNING, "MESA-LOADER: failed to get param for i915\n");
         *chip_id = -1;
       }
    }
@@ -202,7 +236,7 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id)
       info.value = (unsigned long) chip_id;
       ret = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));
       if (ret) {
-         log(_LOADER_WARNING, "MESA-LOADER: failed to get info for radeon");
+         log_(_LOADER_WARNING, "MESA-LOADER: failed to get info for radeon\n");
         *chip_id = -1;
       }
    }
@@ -241,6 +275,12 @@ loader_get_device_name_for_fd(int fd)
    struct udev *udev;
    struct udev_device *device;
    const char *const_device_name;
+   UDEV_SYMBOL(struct udev *, udev_new, (void));
+   UDEV_SYMBOL(const char *, udev_device_get_devnode,
+               (struct udev_device *));
+   UDEV_SYMBOL(struct udev_device *, udev_device_unref,
+               (struct udev_device *));
+   UDEV_SYMBOL(struct udev *, udev_unref, (struct udev *));
 
    udev = udev_new();
    device = udev_device_new_from_fd(udev, fd);
@@ -275,12 +315,12 @@ loader_get_driver_for_fd(int fd, unsigned driver_types)
       drmVersionPtr version = drmGetVersion(fd);
 
       if (!version) {
-         log(_LOADER_WARNING, "failed to get driver name for fd %d", fd);
+         log_(_LOADER_WARNING, "failed to get driver name for fd %d\n", fd);
          return NULL;
       }
 
       driver = strndup(version->name, version->name_len);
-      log(_LOADER_INFO, "using driver %s for %d", driver, fd);
+      log_(_LOADER_INFO, "using driver %s for %d\n", driver, fd);
 
       drmFreeVersion(version);
 #endif
@@ -308,8 +348,8 @@ loader_get_driver_for_fd(int fd, unsigned driver_types)
    }
 
 out:
-   log(driver ? _LOADER_INFO : _LOADER_WARNING,
-         "pci id for fd %d: %04x:%04x, driver %s",
+   log_(driver ? _LOADER_INFO : _LOADER_WARNING,
+         "pci id for fd %d: %04x:%04x, driver %s\n",
          fd, vendor_id, chip_id, driver);
    return driver;
 }
@@ -317,5 +357,5 @@ out:
 void
 loader_set_logger(void (*logger)(int level, const char *fmt, ...))
 {
-   log = logger;
+   log_ = logger;
 }