#include #include #include #include #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); } }