Add logging infrastructure

Also added some debug/error messages to existing code. For now debugging is
always on, this will be made optional later.
This commit is contained in:
Daniel Drake 2007-10-10 15:51:50 +01:00 committed by Daniel Drake
parent 016ff33533
commit ec91736ac4
3 changed files with 74 additions and 3 deletions

View file

@ -21,14 +21,51 @@
#include <glib.h>
#include <usb.h>
#include <stdio.h>
#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;

View file

@ -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;
}

View file

@ -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;