diff options
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..80598e1 --- /dev/null +++ b/src/main.c @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <libusb.h> +#include "config.h" +#include "logger.h" + +static char* on_docked; +static char* on_undocked; + +int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event, void *user_data) { + static libusb_device_handle *dev_handle = NULL; + struct libusb_device_descriptor desc; + + (void)libusb_get_device_descriptor(dev, &desc); + + LOG(LOG_DEBUG, "device: 0x%04x 0x%04x\n", desc.idVendor, desc.idProduct); + + if (desc.idVendor == DOCK_VENDOR && desc.idProduct == DOCK_PRODUCT) { + if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) { + if (fork() == 0) { + execl(ON_DOCKED, ON_DOCKED, NULL); + } + LOG(LOG_DEBUG, "docked\n"); + } else { + if (fork() == 0) { + execl(ON_UNDOCKED, ON_UNDOCKED, NULL); + } + LOG(LOG_DEBUG, "undocked\n"); + } + } else { + LOG(LOG_DEBUG, "not dock\n"); + } + + return 0; +} + +int main(int argc, char* argv[]) { + libusb_hotplug_callback_handle callback_handle; + int rc; + + LOG(LOG_INFO, "starting dockd...\n"); + + libusb_init_context(NULL, NULL, 0); + + LOG(LOG_DEBUG, "init'd libusb context.\n"); + + rc = libusb_hotplug_register_callback(NULL, + LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, + LIBUSB_HOTPLUG_MATCH_ANY, + LIBUSB_HOTPLUG_MATCH_ANY, + LIBUSB_HOTPLUG_MATCH_ANY, + hotplug_callback, NULL, + &callback_handle); + + if (rc != LIBUSB_SUCCESS) { + LOG(LOG_ERROR, "failed to register libusb callback.\n"); + exit(rc); + } else { + LOG(LOG_DEBUG, "registered libusb hotplub callback.\n"); + } + + LOG(LOG_DEBUG, "beginning event loop...\n"); + + while (1) { + libusb_handle_events_completed(NULL, NULL); + nanosleep(&(struct timespec){0, 10000000UL}, NULL); + } +} |
