Informaton of pendriver with libudv on linux
- by Catanzaro
I'm doing a little app in C that read the driver information of my pendrive:
Plugged it and typed
dmesg:
[ 7676.243994] scsi 7:0:0:0: Direct-Access Lexar USB Flash Drive 1100 PQ: 0 ANSI: 0 CCS
[ 7676.248359] sd 7:0:0:0: Attached scsi generic sg2 type 0
[ 7676.256733] sd 7:0:0:0: [sdb] 7831552 512-byte logical blocks: (4.00 GB/3.73 GiB)
[ 7676.266559] sd 7:0:0:0: [sdb] Write Protect is off
[ 7676.266566] sd 7:0:0:0: [sdb] Mode Sense: 43 00 00 00
[ 7676.266569] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 7676.285373] sd 7:0:0:0: [sdb] Assuming drive cache: write
through [ 7676.285383] sdb: sdb1
[ 7676.298661] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 7676.298667] sd 7:0:0:0: [sdb] Attached SCSI removable disk
with "udevadm info -q all -n /dev/sdb"
P: /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb
N: sdb
W: 36
S: block/8:16
S: disk/by-id/usb-Lexar_USB_Flash_Drive_AA5OCYQII8PSQXBB-0:0
S: disk/by-path/pci-0000:02:03.0-usb-0:1:1.0-scsi-0:0:0:0
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb
E: MAJOR=8
E: MINOR=16
E: DEVNAME=/dev/sdb
E: DEVTYPE=disk
E: SUBSYSTEM=block
E: ID_VENDOR=Lexar
E: ID_VENDOR_ENC=Lexar\x20\x20\x20
E: ID_VENDOR_ID=05dc
E: ID_MODEL=USB_Flash_Drive
E: ID_MODEL_ENC=USB\x20Flash\x20Drive\x20
E: ID_MODEL_ID=a813
E: ID_REVISION=1100
E: ID_SERIAL=Lexar_USB_Flash_Drive_AA5OCYQII8PSQXBB-0:0
E: ID_SERIAL_SHORT=AA5OCYQII8PSQXBB
E: ID_TYPE=disk
E: ID_INSTANCE=0:0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:080650:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usb-storage
E: ID_PATH=pci-0000:02:03.0-usb-0:1:1.0-scsi-0:0:0:0
E: ID_PART_TABLE_TYPE=dos
E: UDISKS_PRESENTATION_NOPOLICY=0
E: UDISKS_PARTITION_TABLE=1
E: UDISKS_PARTITION_TABLE_SCHEME=mbr
E: UDISKS_PARTITION_TABLE_COUNT=1
E: DEVLINKS=/dev/block/8:16 /dev/disk/by-id/usb-Lexar_USB_Flash_Drive_AA5OCYQII8PSQXBB-0:0 /dev/disk/by-path/pci-0000:02:03.0-usb-0:1:1.0-scsi-0:0:0:0
and my software is:
Codice: Seleziona tutto
#include <stdio.h>
#include <libudev.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
int main(void)
{
struct udev_enumerate *enumerate;
struct udev_list_entry *devices, *dev_list_entry;
struct udev_device *dev;
/* Create the udev object */
struct udev *udev = udev_new();
if (!udev) {
printf("Can't create udev\n");
exit(0);
}
enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "scsi_generic");
udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate);
udev_list_entry_foreach(dev_list_entry, devices) {
const char *path;
/* Get the filename of the /sys entry for the device
and create a udev_device object (dev) representing it */
path = udev_list_entry_get_name(dev_list_entry);
dev = udev_device_new_from_syspath(udev, path);
/* usb_device_get_devnode() returns the path to the device node
itself in /dev. */
printf("Device Node Path: %s\n", udev_device_get_devnode(dev));
/* The device pointed to by dev contains information about
the hidraw device. In order to get information about the
USB device, get the parent device with the
subsystem/devtype pair of "usb"/"usb_device". This will
be several levels up the tree, but the function will find
it.*/
dev = udev_device_get_parent_with_subsystem_devtype(
dev,
"block",
"disk");
if (!dev) {
printf("Errore\n");
exit(1);
}
/* From here, we can call get_sysattr_value() for each file
in the device's /sys entry. The strings passed into these
functions (idProduct, idVendor, serial, etc.) correspond
directly to the files in the directory which represents
the USB device. Note that USB strings are Unicode, UCS2
encoded, but the strings returned from
udev_device_get_sysattr_value() are UTF-8 encoded. */
printf(" VID/PID: %s %s\n",
udev_device_get_sysattr_value(dev,"idVendor"),
udev_device_get_sysattr_value(dev, "idProduct"));
printf(" %s\n %s\n",
udev_device_get_sysattr_value(dev,"manufacturer"),
udev_device_get_sysattr_value(dev,"product"));
printf(" serial: %s\n",
udev_device_get_sysattr_value(dev, "serial"));
udev_device_unref(dev);
}
/* Free the enumerator object */
udev_enumerate_unref(enumerate);
udev_unref(udev);
return 0;
}
the problem is that i obtain in output:
Device Node Path: /dev/sg0
Errore
and dont view information. subsystem and the devtype i think that are inserted well : "block" and "disk".
thanks for help.
Bye