diff options
author | Erik Gilling <konkers@android.com> | 2010-10-20 15:59:52 -0700 |
---|---|---|
committer | Erik Gilling <konkers@android.com> | 2010-10-20 16:07:57 -0700 |
commit | 1cb1728b1870a5e37360f65864a3642d5a37b21c (patch) | |
tree | 0b36c34008690d9d58091ad53203b0eb0fd0d2a7 /uevent | |
parent | 8fb5f74df7b25051e007a67eea22b984ef7dc76a (diff) | |
download | hardware_libhardware_legacy-1cb1728b1870a5e37360f65864a3642d5a37b21c.zip hardware_libhardware_legacy-1cb1728b1870a5e37360f65864a3642d5a37b21c.tar.gz hardware_libhardware_legacy-1cb1728b1870a5e37360f65864a3642d5a37b21c.tar.bz2 |
add native uevent handling
Change-Id: I2315f5638668ab802a4b3c723afd97b7edf0c695
Diffstat (limited to 'uevent')
-rw-r--r-- | uevent/uevent.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/uevent/uevent.c b/uevent/uevent.c index d1d4b8e..396bad4 100644 --- a/uevent/uevent.c +++ b/uevent/uevent.c @@ -19,12 +19,23 @@ #include <string.h> #include <unistd.h> #include <poll.h> +#include <pthread.h> #include <sys/socket.h> #include <sys/un.h> +#include <sys/queue.h> #include <linux/netlink.h> +LIST_HEAD(uevent_handler_head, uevent_handler) uevent_handler_list; +pthread_mutex_t uevent_handler_list_lock = PTHREAD_MUTEX_INITIALIZER; + +struct uevent_handler { + void (*handler)(void *data, const char *msg, int msg_len); + void *handler_data; + LIST_ENTRY(uevent_handler) list; +}; + static int fd = -1; /* Returns 0 on failure, 1 on success */ @@ -68,6 +79,12 @@ int uevent_next_event(char* buffer, int buffer_length) if(nr > 0 && fds.revents == POLLIN) { int count = recv(fd, buffer, buffer_length, 0); if (count > 0) { + struct uevent_handler *h; + pthread_mutex_lock(&uevent_handler_list_lock); + LIST_FOREACH(h, &uevent_handler_list, list) + h->handler(h->handler_data, buffer, buffer_length); + pthread_mutex_unlock(&uevent_handler_list_lock); + return count; } } @@ -76,3 +93,39 @@ int uevent_next_event(char* buffer, int buffer_length) // won't get here return 0; } + +int uevent_add_native_handler(void (*handler)(void *data, const char *msg, int msg_len), + void *handler_data) +{ + struct uevent_handler *h; + + h = malloc(sizeof(struct uevent_handler)); + if (h == NULL) + return -1; + h->handler = handler; + h->handler_data = handler_data; + + pthread_mutex_lock(&uevent_handler_list_lock); + LIST_INSERT_HEAD(&uevent_handler_list, h, list); + pthread_mutex_unlock(&uevent_handler_list_lock); + + return 0; +} + +int uevent_remove_native_handler(void (*handler)(void *data, const char *msg, int msg_len)) +{ + struct uevent_handler *h; + int err = -1; + + pthread_mutex_lock(&uevent_handler_list_lock); + LIST_FOREACH(h, &uevent_handler_list, list) { + if (h->handler == handler) { + LIST_REMOVE(h, list); + err = 0; + break; + } + } + pthread_mutex_unlock(&uevent_handler_list_lock); + + return err; +} |