From 9675287062ed3193c8dbd7f4ad88e07823bdf36e Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Sat, 31 Aug 2013 12:23:44 +1000 Subject: Use ENOMEM instead of ENOSPC From errno(3): ENOMEM Not enough space (POSIX.1) ENOSPC No space left on device (POSIX.1) when we run out memory the reason is a failed malloc, for which ENOMEM seems more appropriate. Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- libevdev/libevdev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'libevdev/libevdev.c') diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 36160f6..436f7a9 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -89,7 +89,7 @@ libevdev_new_from_fd(int fd, struct libevdev **dev) d = libevdev_new(); if (!d) - return -ENOSPC; + return -ENOMEM; rc = libevdev_set_fd(d, fd); if (rc < 0) @@ -152,7 +152,7 @@ libevdev_set_fd(struct libevdev* dev, int fd) free(dev->name); dev->name = strdup(buf); if (!dev->name) { - errno = ENOSPC; + errno = ENOMEM; goto out; } @@ -167,7 +167,7 @@ libevdev_set_fd(struct libevdev* dev, int fd) } else { dev->phys = strdup(buf); if (!dev->phys) { - errno = ENOSPC; + errno = ENOMEM; goto out; } } @@ -182,7 +182,7 @@ libevdev_set_fd(struct libevdev* dev, int fd) } else { dev->uniq = strdup(buf); if (!dev->uniq) { - errno = ENOSPC; + errno = ENOMEM; goto out; } } -- cgit v1.2.1 From 2c101977b7830070bdbd18e696857c667e69dee0 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Sat, 31 Aug 2013 12:33:33 +1000 Subject: Return EBADF when trying to read from an uninitalized device All other functions that check the fd for validity return EBADF, which also makes it easier to debug if the actual device goes away. Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- libevdev/libevdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libevdev/libevdev.c') diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 436f7a9..1c99e1f 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -663,7 +663,7 @@ libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_event int rc = 0; if (dev->fd < 0) - return -ENODEV; + return -EBADF; if (!(flags & (LIBEVDEV_READ_NORMAL|LIBEVDEV_READ_SYNC|LIBEVDEV_FORCE_SYNC))) return -EINVAL; -- cgit v1.2.1 From 22d2a735c473dfa260ffc6bcbb16a5115b8ed719 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Sat, 31 Aug 2013 12:37:14 +1000 Subject: Return -EBADF for functions that need the fd initialized Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- libevdev/libevdev.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'libevdev/libevdev.c') diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 1c99e1f..867e008 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -1130,6 +1130,9 @@ libevdev_kernel_set_abs_info(struct libevdev *dev, unsigned int code, const stru { int rc; + if (dev->fd < 0) + return -EBADF; + if (code > ABS_MAX) return -EINVAL; @@ -1147,6 +1150,9 @@ libevdev_grab(struct libevdev *dev, enum libevdev_grab_mode grab) { int rc = 0; + if (dev->fd < 0) + return -EBADF; + if (grab != LIBEVDEV_GRAB && grab != LIBEVDEV_UNGRAB) return -EINVAL; @@ -1250,6 +1256,9 @@ libevdev_kernel_set_led_values(struct libevdev *dev, ...) int rc = 0; size_t nleds = 0; + if (dev->fd < 0) + return -EBADF; + memset(ev, 0, sizeof(ev)); va_start(args, dev); -- cgit v1.2.1 From 55d67a340b058da84b7a5f135192fe126e5cbe0d Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 26 Aug 2013 13:24:26 +1000 Subject: Drop per-device logging function, use per-library one instead There's no need to have separate logging function for each device created. More likely, libevdev will be hooked up once into the logging system and expected to deal with it. Plus, this allows us to log from the uinput code where we don't have the context anyway. Requires a rename to libevdev_set_log_function to avoid ABI breaks, and while we're breaking the ABI make the logging function more sophisticated to log line, number, etc. Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- libevdev/libevdev.c | 56 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 11 deletions(-) (limited to 'libevdev/libevdev.c') diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 867e008..ff1fd07 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -49,20 +49,35 @@ init_event_queue(struct libevdev *dev) } static void -_libevdev_log(struct libevdev *dev, const char *format, ...) +libevdev_noop_log_func(enum libevdev_log_priority priority, + void *data, + const char *file, int line, const char *func, + const char *format, va_list args) +{ +} + +/* + * Global logging settings. + */ +struct logdata log_data = { + LIBEVDEV_LOG_INFO, + libevdev_noop_log_func, + NULL, +}; + +void +log_msg(enum libevdev_log_priority priority, + void *data, + const char *file, int line, const char *func, + const char *format, ...) { va_list args; va_start(args, format); - dev->log(format, args); + log_data.handler(priority, data, file, line, func, format, args); va_end(args); } -static void -libevdev_noop_log_func(const char *format, va_list args) -{ -} - LIBEVDEV_EXPORT struct libevdev* libevdev_new(void) { @@ -74,7 +89,6 @@ libevdev_new(void) dev->fd = -1; dev->num_slots = -1; dev->current_slot = -1; - dev->log = libevdev_noop_log_func; dev->grabbed = LIBEVDEV_UNGRAB; dev->sync_state = SYNC_NONE; @@ -112,13 +126,33 @@ libevdev_free(struct libevdev *dev) free(dev); } +/* DEPRECATED */ LIBEVDEV_EXPORT void libevdev_set_log_handler(struct libevdev *dev, libevdev_log_func_t logfunc) { - if (dev == NULL) - return; + /* Can't be backwards compatible to this yet, so don't even try */ + fprintf(stderr, "libevdev: ABI change. Log function will not be honored.\n"); +} + +LIBEVDEV_EXPORT void +libevdev_set_log_function(libevdev_log_func_t logfunc, void *data) +{ + log_data.handler = logfunc ? logfunc : libevdev_noop_log_func; + log_data.userdata = data; +} - dev->log = logfunc ? logfunc : libevdev_noop_log_func; +LIBEVDEV_EXPORT void +libevdev_set_log_priority(enum libevdev_log_priority priority) +{ + if (priority > LIBEVDEV_LOG_DEBUG) + priority = LIBEVDEV_LOG_DEBUG; + log_data.priority = priority; +} + +LIBEVDEV_EXPORT enum libevdev_log_priority +libevdev_get_log_priority(void) +{ + return log_data.priority; } LIBEVDEV_EXPORT int -- cgit v1.2.1 From a6e25fab76949c5d7ffbaee676ad380b33d78cdb Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Sat, 31 Aug 2013 12:53:36 +1000 Subject: Log a few errors, specifically application bugs Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- libevdev/libevdev.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'libevdev/libevdev.c') diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index ff1fd07..dcf2beb 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -158,8 +158,10 @@ libevdev_get_log_priority(void) LIBEVDEV_EXPORT int libevdev_change_fd(struct libevdev *dev, int fd) { - if (dev->fd == -1) + if (dev->fd == -1) { + log_bug("device not initialized. call libevdev_set_fd() first\n"); return -1; + } dev->fd = fd; return 0; } @@ -171,8 +173,10 @@ libevdev_set_fd(struct libevdev* dev, int fd) int i; char buf[256]; - if (dev->fd != -1) + if (dev->fd != -1) { + log_bug("device already initialized.\n"); return -EBADF; + } rc = ioctl(fd, EVIOCGBIT(0, sizeof(dev->bits)), dev->bits); if (rc < 0) @@ -696,11 +700,15 @@ libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_event { int rc = 0; - if (dev->fd < 0) + if (dev->fd < 0) { + log_bug("device not initialized. call libevdev_set_fd() first\n"); return -EBADF; + } - if (!(flags & (LIBEVDEV_READ_NORMAL|LIBEVDEV_READ_SYNC|LIBEVDEV_FORCE_SYNC))) + if (!(flags & (LIBEVDEV_READ_NORMAL|LIBEVDEV_READ_SYNC|LIBEVDEV_FORCE_SYNC))) { + log_bug("invalid flags %#x\n.\n", flags); return -EINVAL; + } if (flags & LIBEVDEV_READ_SYNC) { if (dev->sync_state == SYNC_NEEDED) { @@ -782,8 +790,10 @@ libevdev_has_event_pending(struct libevdev *dev) struct pollfd fds = { dev->fd, POLLIN, 0 }; int rc; - if (dev->fd < 0) + if (dev->fd < 0) { + log_bug("device not initialized. call libevdev_set_fd() first\n"); return -EBADF; + } if (queue_num_elements(dev) != 0) return 1; @@ -1164,8 +1174,10 @@ libevdev_kernel_set_abs_info(struct libevdev *dev, unsigned int code, const stru { int rc; - if (dev->fd < 0) + if (dev->fd < 0) { + log_bug("device not initialized. call libevdev_set_fd() first\n"); return -EBADF; + } if (code > ABS_MAX) return -EINVAL; @@ -1184,11 +1196,15 @@ libevdev_grab(struct libevdev *dev, enum libevdev_grab_mode grab) { int rc = 0; - if (dev->fd < 0) + if (dev->fd < 0) { + log_bug("device not initialized. call libevdev_set_fd() first\n"); return -EBADF; + } - if (grab != LIBEVDEV_GRAB && grab != LIBEVDEV_UNGRAB) + if (grab != LIBEVDEV_GRAB && grab != LIBEVDEV_UNGRAB) { + log_bug("invalid grab parameter %#x\n", grab); return -EINVAL; + } if (grab == dev->grabbed) return 0; @@ -1290,8 +1306,10 @@ libevdev_kernel_set_led_values(struct libevdev *dev, ...) int rc = 0; size_t nleds = 0; - if (dev->fd < 0) + if (dev->fd < 0) { + log_bug("device not initialized. call libevdev_set_fd() first\n"); return -EBADF; + } memset(ev, 0, sizeof(ev)); -- cgit v1.2.1 From ad709cf95377d1f95b1db4aa2b7fec11382d44dc Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 3 Sep 2013 16:58:29 +1000 Subject: Log to stderr by default The logging we do use atm inside the library is largely to spot application errors. Log that to stderr by default so it doesn't get lost. Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- libevdev/libevdev.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'libevdev/libevdev.c') diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index dcf2beb..aa5cbd6 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -49,11 +49,32 @@ init_event_queue(struct libevdev *dev) } static void -libevdev_noop_log_func(enum libevdev_log_priority priority, +libevdev_dflt_log_func(enum libevdev_log_priority priority, void *data, const char *file, int line, const char *func, const char *format, va_list args) { + const char *prefix; + switch(priority) { + case LIBEVDEV_LOG_ERROR: prefix = "libevdev error"; break; + case LIBEVDEV_LOG_INFO: prefix = "libevdev info"; break; + case LIBEVDEV_LOG_DEBUG: + prefix = "libevdev debug"; + break; + default: + break; + } + /* default logging format: + libevev error in libevdev_some_func: blah blah + libevev info in libevdev_some_func: blah blah + libevev debug in file.c:123:libevdev_some_func: blah blah + */ + + fprintf(stderr, "%s in ", prefix); + if (priority == LIBEVDEV_LOG_DEBUG) + fprintf(stderr, "%s:%d:", file, line); + fprintf(stderr, "%s: ", func); + vfprintf(stderr, format, args); } /* @@ -61,7 +82,7 @@ libevdev_noop_log_func(enum libevdev_log_priority priority, */ struct logdata log_data = { LIBEVDEV_LOG_INFO, - libevdev_noop_log_func, + libevdev_dflt_log_func, NULL, }; @@ -73,6 +94,9 @@ log_msg(enum libevdev_log_priority priority, { va_list args; + if (!log_data.handler) + return; + va_start(args, format); log_data.handler(priority, data, file, line, func, format, args); va_end(args); @@ -137,7 +161,7 @@ libevdev_set_log_handler(struct libevdev *dev, libevdev_log_func_t logfunc) LIBEVDEV_EXPORT void libevdev_set_log_function(libevdev_log_func_t logfunc, void *data) { - log_data.handler = logfunc ? logfunc : libevdev_noop_log_func; + log_data.handler = logfunc; log_data.userdata = data; } -- cgit v1.2.1