#include #include #include #include #include #include static int count = 0; void get_partition(uint16_t idVendor, uint16_t idProduct) { struct udev *udev = udev_new(); if (!udev) { printf("Error: Failed to initialize udev.\n"); return; } struct udev_enumerate *enumerate = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(enumerate, "block"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry; udev_list_entry_foreach(entry, devices) { const char *path = udev_list_entry_get_name(entry); struct udev_device *dev = udev_device_new_from_syspath(udev, path); // Obtén el idVendor e idProduct del dispositivo USB actual const char *vendor_id_str = udev_device_get_sysattr_value(dev, "idVendor"); const char *product_id_str = udev_device_get_sysattr_value(dev, "idProduct"); printf(vendor_id_str); if (vendor_id_str && product_id_str) { uint16_t vendor_id = strtol(vendor_id_str, NULL, 16); uint16_t product_id = strtol(product_id_str, NULL, 16); if (vendor_id == idVendor && product_id == idProduct) { const char *partition = udev_device_get_devnode(dev); if (partition) { // Extraer el nombre de la partición const char *partition_name = strrchr(partition, '/'); if (partition_name) { printf("Partition: %s\n", partition_name + 1); } else { printf("Partition: %s\n", partition); } } else { printf("Error: Failed to get partition.\n"); } break; } } udev_device_unref(dev); } udev_enumerate_unref(enumerate); udev_unref(udev); } 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; int rc; printf("Entering callback\n"); // DEBUG (void)libusb_get_device_descriptor(dev, &desc); printf("%04x:%04x (bus %d, device %d)\n", desc.idVendor, desc.idProduct, libusb_get_bus_number(dev), libusb_get_device_address(dev)); if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) { rc = libusb_open(dev, &dev_handle); if (LIBUSB_SUCCESS != rc) { printf("Could not open USB device\n"); } // Obtén la partición del dispositivo get_partition(desc.idVendor, desc.idProduct); } else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { if (dev_handle) { libusb_close(dev_handle); dev_handle = NULL; } } else { printf("Unhandled event %d\n", event); } count++; return 0; } int main (void) { libusb_hotplug_callback_handle callback_handle; int rc; libusb_init(NULL); 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 (LIBUSB_SUCCESS != rc) { printf("Error creating a hotplug callback\n"); libusb_exit(NULL); return EXIT_FAILURE; } while (count < 2) { libusb_handle_events_completed(NULL, NULL); nanosleep(&(struct timespec){0, 10000000UL}, NULL); } libusb_hotplug_deregister_callback(NULL, callback_handle); libusb_exit(NULL); return 0; }