Differenze tra le versioni di "Conoscere i dispositivi usb di memorizzazione di massa con le funzioni esterne di libudev"
Da Gambas-it.org - Wikipedia.
Riga 81: | Riga 81: | ||
<FONT Color=gray>' ''Crea un contesto "udev":''</font> | <FONT Color=gray>' ''Crea un contesto "udev":''</font> | ||
− | + | ud = udev_new() | |
− | + | If ud == 0 Then Error.Raise("Impossibile creare un contesto 'udev' !") | |
<FONT Color=gray>' ''Crea una lista di dispositivi nel sottosistema "scsi":''</font> | <FONT Color=gray>' ''Crea una lista di dispositivi nel sottosistema "scsi":''</font> | ||
− | + | en = udev_enumerate_new(ud) | |
− | + | udev_enumerate_add_match_subsystem(en, "scsi") | |
− | + | udev_enumerate_add_match_property(en, "DEVTYPE", "scsi_device") | |
− | + | udev_enumerate_scan_devices(en) | |
− | + | ls = udev_enumerate_get_list_entry(en) | |
− | + | dev = ls | |
− | + | Repeat | |
− | |||
<FONT Color=gray>' ''Ottiene il nome del file della voce /sys per il dispositivo e crea un oggetto udev_device object(dev) che lo rappresenta:''</font> | <FONT Color=gray>' ''Ottiene il nome del file della voce /sys per il dispositivo e crea un oggetto udev_device object(dev) che lo rappresenta:''</font> | ||
− | + | path = udev_list_entry_get_name(dev) | |
− | + | d = udev_device_new_from_syspath(ud, path) | |
− | + | If d == 0 Then Break | |
− | + | child_1 = Ottiene_child(ud, d, "block") | |
− | + | child_2 = Ottiene_child(ud, d, "scsi_disk") | |
− | + | node_path = udev_device_get_devnode(d) | |
− | + | If Not IsNull(node_path) Then Print "Device Node Path: "; node_path | |
− | + | t = udev_device_get_parent_with_subsystem_devtype(d, "usb", "usb_device") | |
− | + | If t == 0 Then Break | |
− | + | If child_1 <> 0 Then Print " Device Node Path: "; udev_device_get_devnode(child_1) | |
− | + | Print " VID/PID: "; udev_device_get_sysattr_value(t, "idVendor"); ":"; udev_device_get_sysattr_value(t, "idProduct") | |
− | + | If child_1 <> 0 Then Print " "; udev_device_get_sysattr_value(d, "vendor") | |
− | + | Print " "; udev_device_get_sysattr_value(t, "manufacturer"), udev_device_get_sysattr_value(t, "product") | |
− | + | Print " serial: "; udev_device_get_sysattr_value(t, "serial") | |
− | + | Print | |
− | + | If child_1 <> 0 Then udev_device_unref(child_1) | |
− | + | If child_2 <> 0 Then udev_device_unref(child_2) | |
− | + | udev_device_unref(d) | |
− | + | dev = udev_list_entry_get_next(dev) | |
− | + | Until dev == 0 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<FONT Color=gray>' ''Va in chiusura:''</font> | <FONT Color=gray>' ''Va in chiusura:''</font> | ||
− | + | udev_enumerate_unref(en) | |
− | + | udev_unref(ud) | |
− | '''End''' | + | '''End''' |
− | |||
'''Private''' Function Ottiene_child(udev As Pointer, parent As Pointer, subsystem As String) As Pointer | '''Private''' Function Ottiene_child(udev As Pointer, parent As Pointer, subsystem As String) As Pointer | ||
Riga 140: | Riga 128: | ||
Dim path As String | Dim path As String | ||
− | + | enumerate = udev_enumerate_new(udev) | |
+ | If enumerate == 0 Then Error.Raise("Errore !") | ||
− | + | udev_enumerate_add_match_parent(enumerate, parent) | |
− | + | udev_enumerate_add_match_subsystem(enumerate, subsystem) | |
− | + | udev_enumerate_scan_devices(enumerate) | |
− | + | devices = udev_enumerate_get_list_entry(enumerate) | |
+ | If devices == 0 Then Error.Raise("Errore !") | ||
− | + | dev = devices | |
− | + | Repeat | |
− | + | path = udev_list_entry_get_name(dev) | |
− | + | child = udev_device_new_from_syspath(udev, path) | |
− | + | dev = udev_list_entry_get_next(dev) | |
− | + | Until dev == 0 | |
− | + | udev_enumerate_unref(enumerate) | |
− | + | Return child | |
'''End''' | '''End''' | ||
− | |||
Versione delle 02:14, 11 mag 2023
La libreria Libudev consente di elencare e conoscere alcune caratteristiche dei dispositivi locali del sistema.
E' dunque possibile, ad esempio, conoscere i dispositivi usb di memorizzazione di massa presenti e gestiti dal sistema.
E' necessario richiamare nell'applicazione Gambas la libreria dinamica condivisa: "libudev.so.1.3.5"
Mostriamo un esempio pratico:
Library "libudev:1.3.5" ' struct udev *udev_new(void) ' Create udev library context. Private Extern udev_new() As Pointer ' struct udev_enumerate *udev_enumerate_new(struct udev *udev) ' Create, acquire and release a udev enumerate object. Private Extern udev_enumerate_new(udev As Pointer) As Pointer ' int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem) ' Filter for a subsystem of the device to include in the list. Private Extern udev_enumerate_add_match_subsystem(udev_enumerate As Pointer, subsystem As String) As Integer ' int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value) ' Add a filter to match devices with the specified key and value. Private Extern udev_enumerate_add_match_property(udev_enumerate As Pointer, propert As String, value As String) As Integer ' int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate) ' Query or modify a udev enumerate object. Private Extern udev_enumerate_scan_devices(udev_enumerate As Pointer) As Integer ' struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate) ' Query or modify a udev enumerate object. Private Extern udev_enumerate_get_list_entry(udev_enumerate As Pointer) As Pointer ' struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry) ' Iterate and access udev lists. Private Extern udev_list_entry_get_next(list_entry As Pointer) As Pointer ' const char *udev_list_entry_get_name(struct udev_list_entry *list_entry) ' Iterate and access udev lists. Private Extern udev_list_entry_get_name(list_entry As Pointer) As String ' struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath) ' Create, acquire and release a udev device object. Private Extern udev_device_new_from_syspath(udev As Pointer, syspath As String) As Pointer ' const char *udev_device_get_devnode(struct udev_device *udev_device) ' Returns the path to the device node itself in /dev. Private Extern udev_device_get_devnode(udev_device As Pointer) As String ' struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device, const char *subsystem, const char *devtype) ' Find the next parent device, with a matching subsystem and devtype value, and fill in information from the sys device and the udev database entry. Private Extern udev_device_get_parent_with_subsystem_devtype(udev_device As Pointer, subsystem As String, devtype As String) As Pointer ' const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr) ' The retrieved value is cached in the device. Private Extern udev_device_get_sysattr_value(udev_device As Pointer, sysattr As String) As String ' int udev_enumerate_add_match_parent(struct udev_enumerate *udev_enumerate, struct udev_device *parent) ' Modify filters. Private Extern udev_enumerate_add_match_parent(udev_enumerate As Pointer, parent As Pointer) As Pointer ' struct udev_device *udev_device_unref(struct udev_device *udev_device) ' Drop a reference of a udev device. Private Extern udev_device_unref(udev_device As Pointer) As Pointer ' struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate) ' Drop a reference of an enumeration context. Private Extern udev_enumerate_unref(udev_enumerate As Pointer) As Pointer ' struct udev *udev_unref(struct udev *udev) ' Drop a reference of the udev library context. Private Extern udev_unref(udev As Pointer) As Pointer Public Sub Main() Dim ud, en, ls, dev As Pointer Dim d, t, child_1, child_2 As Pointer Dim path, node_path As String ' Crea un contesto "udev": ud = udev_new() If ud == 0 Then Error.Raise("Impossibile creare un contesto 'udev' !") ' Crea una lista di dispositivi nel sottosistema "scsi": en = udev_enumerate_new(ud) udev_enumerate_add_match_subsystem(en, "scsi") udev_enumerate_add_match_property(en, "DEVTYPE", "scsi_device") udev_enumerate_scan_devices(en) ls = udev_enumerate_get_list_entry(en) dev = ls Repeat ' Ottiene il nome del file della voce /sys per il dispositivo e crea un oggetto udev_device object(dev) che lo rappresenta: path = udev_list_entry_get_name(dev) d = udev_device_new_from_syspath(ud, path) If d == 0 Then Break child_1 = Ottiene_child(ud, d, "block") child_2 = Ottiene_child(ud, d, "scsi_disk") node_path = udev_device_get_devnode(d) If Not IsNull(node_path) Then Print "Device Node Path: "; node_path t = udev_device_get_parent_with_subsystem_devtype(d, "usb", "usb_device") If t == 0 Then Break If child_1 <> 0 Then Print " Device Node Path: "; udev_device_get_devnode(child_1) Print " VID/PID: "; udev_device_get_sysattr_value(t, "idVendor"); ":"; udev_device_get_sysattr_value(t, "idProduct") If child_1 <> 0 Then Print " "; udev_device_get_sysattr_value(d, "vendor") Print " "; udev_device_get_sysattr_value(t, "manufacturer"), udev_device_get_sysattr_value(t, "product") Print " serial: "; udev_device_get_sysattr_value(t, "serial") Print If child_1 <> 0 Then udev_device_unref(child_1) If child_2 <> 0 Then udev_device_unref(child_2) udev_device_unref(d) dev = udev_list_entry_get_next(dev) Until dev == 0 ' Va in chiusura: udev_enumerate_unref(en) udev_unref(ud) End Private Function Ottiene_child(udev As Pointer, parent As Pointer, subsystem As String) As Pointer Dim child, enumerate, devices, dev As Pointer Dim path As String enumerate = udev_enumerate_new(udev) If enumerate == 0 Then Error.Raise("Errore !") udev_enumerate_add_match_parent(enumerate, parent) udev_enumerate_add_match_subsystem(enumerate, subsystem) udev_enumerate_scan_devices(enumerate) devices = udev_enumerate_get_list_entry(enumerate) If devices == 0 Then Error.Raise("Errore !") dev = devices Repeat path = udev_list_entry_get_name(dev) child = udev_device_new_from_syspath(udev, path) dev = udev_list_entry_get_next(dev) Until dev == 0 udev_enumerate_unref(enumerate) Return child End