Informaton of pendriver with libudv on linux

Posted by Catanzaro on Super User See other posts from Super User or by Catanzaro
Published on 2013-10-31T15:37:32Z Indexed on 2013/10/31 15:59 UTC
Read the original article Hit count: 160

Filed under:
|
|

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

© Super User or respective owner

Related posts about linux

Related posts about c