aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorspv <spv@spv.sh>2025-12-03 15:10:12 -0500
committerspv <spv@spv.sh>2025-12-03 15:10:12 -0500
commitb0fbe74d91a53a7453c9dced6f75fa4cb78a6688 (patch)
tree67969c938065621ac9a89555ebab25b5e1318315 /src/main.c
parent54b82dcc5990225575fd822cced0ab4bff0bed46 (diff)
now with c!
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c71
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);
+ }
+}