From ec91736ac4fb77e5d852959820d0070d1b4fc56f Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Wed, 10 Oct 2007 15:51:50 +0100 Subject: [PATCH] Add logging infrastructure Also added some debug/error messages to existing code. For now debugging is always on, this will be made optional later. --- libfprint/core.c | 55 ++++++++++++++++++++++++++++++++++++++--- libfprint/data.c | 1 + libfprint/fp_internal.h | 21 ++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/libfprint/core.c b/libfprint/core.c index d2fe52f..19a78b8 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -21,14 +21,51 @@ #include #include +#include #include "fp_internal.h" static GList *registered_drivers = NULL; +void fpi_log(enum fpi_log_level level, const char *component, + const char *function, const char *format, ...) +{ + va_list args; + FILE *stream = stdout; + const char *prefix; + + switch (level) { + case LOG_LEVEL_INFO: + prefix = "info"; + break; + case LOG_LEVEL_WARNING: + stream = stderr; + prefix = "warning"; + break; + case LOG_LEVEL_ERROR: + stream = stderr; + prefix = "error"; + break; + case LOG_LEVEL_DEBUG: + stream = stderr; + prefix = "debug"; + break; + } + + fprintf(stream, "%s:%s [%s] ", component ? component : "fp", prefix, + function); + + va_start (args, format); + vfprintf(stream, format, args); + va_end (args); + + fprintf(stream, "\n"); +} + static void register_driver(const struct fp_driver *drv) { registered_drivers = g_list_prepend(registered_drivers, (gpointer) drv); + fp_dbg("registered driver %s", drv->name); } static const struct fp_driver * const drivers[] = { @@ -53,8 +90,11 @@ static const struct fp_driver *find_supporting_driver(struct usb_device *udev) for (id = drv->id_table; id->vendor; id++) if (udev->descriptor.idVendor == id->vendor && - udev->descriptor.idProduct == id->product) + udev->descriptor.idProduct == id->product) { + fp_dbg("driver %s supports USB device %04x:%04x", + drv->name, id->vendor, id->product); return drv; + } } while (elem = g_list_next(elem)); return NULL; } @@ -130,8 +170,10 @@ API_EXPORTED struct fp_dev *fp_dev_open(struct fp_dscv_dev *ddev) int r; usb_dev_handle *udevh = usb_open(ddev->udev); - if (!udevh) + if (!udevh) { + fp_err("usb_open failed"); return NULL; + } dev = g_malloc0(sizeof(*dev)); dev->drv = drv; @@ -140,17 +182,20 @@ API_EXPORTED struct fp_dev *fp_dev_open(struct fp_dscv_dev *ddev) if (drv->init) { r = drv->init(dev); if (r) { + fp_err("device initialisation failed, driver=%s", drv->name); usb_close(udevh); g_free(dev); return NULL; } } + fp_dbg(""); return dev; } API_EXPORTED void fp_dev_close(struct fp_dev *dev) { + fp_dbg(""); if (dev->drv->exit) dev->drv->exit(dev); usb_close(dev->udev); @@ -181,14 +226,18 @@ API_EXPORTED enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev, struct fp_print_data **print_data) { const struct fp_driver *drv = dev->drv; - if (!dev->nr_enroll_stages || !drv->enroll) + if (!dev->nr_enroll_stages || !drv->enroll) { + fp_err("driver %s has 0 enroll stages or no enroll func", + dev->drv->name); return FP_ENROLL_FAIL; + } return drv->enroll(dev, print_data); } API_EXPORTED int fp_init(void) { + fp_dbg(""); usb_init(); register_drivers(); return 0; diff --git a/libfprint/data.c b/libfprint/data.c index b922237..d3b416c 100644 --- a/libfprint/data.c +++ b/libfprint/data.c @@ -27,6 +27,7 @@ struct fp_print_data *fpi_print_data_new(struct fp_driver *drv, size_t length) { struct fp_print_data *data = g_malloc(sizeof(*data) + length); + fp_dbg("length=%z", length); data->driver_name = drv->name; data->length = length; } diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 0d380c4..69af87d 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -28,6 +28,27 @@ #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a)) +enum fpi_log_level { + LOG_LEVEL_DEBUG, + LOG_LEVEL_INFO, + LOG_LEVEL_WARNING, + LOG_LEVEL_ERROR, +}; + +void fpi_log(enum fpi_log_level, const char *component, const char *function, + const char *format, ...); + +#ifndef FP_COMPONENT +#define FP_COMPONENT NULL +#endif + +#define _fpi_log(level, fmt...) fpi_log(level, FP_COMPONENT, __FUNCTION__, fmt) + +#define fp_dbg(fmt...) _fpi_log(LOG_LEVEL_DEBUG, fmt) +#define fp_info(fmt...) _fpi_log(LOG_LEVEL_INFO, fmt) +#define fp_warn(fmt...) _fpi_log(LOG_LEVEL_WARNING, fmt) +#define fp_err(fmt...) _fpi_log(LOG_LEVEL_ERROR, fmt) + struct fp_dev { const struct fp_driver *drv; usb_dev_handle *udev;