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 3: Riga 3:
 
E' dunque possibile, ad esempio, conoscere i dispositivi usb di memorizzazione di massa presenti e gestiti dal 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''"
+
E' necessario richiamare nell'applicazione Gambas la libreria condivisa: "''libudev.so.1.7.9'' ".
  
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
  Library "libudev:1.3.5"
+
  Library "libudev:1.7.8"
 
   
 
   
 
  <FONT Color=gray>' ''struct udev *udev_new(void)''
 
  <FONT Color=gray>' ''struct udev *udev_new(void)''
Riga 74: Riga 74:
 
    
 
    
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim ud, en, ls, dev As Pointer
 
   Dim ud, en, ls, dev As Pointer
Riga 121: Riga 121:
 
   udev_unref(ud)
 
   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
 
 
 
 
   Dim child, enumerate, devices, dev As Pointer
 
   Dim child, enumerate, devices, dev As Pointer
 
   Dim path As String
 
   Dim path As String
 
+
 
   enumerate = udev_enumerate_new(udev)
 
   enumerate = udev_enumerate_new(udev)
 
   If enumerate == 0 Then Error.Raise("Errore !")
 
   If enumerate == 0 Then Error.Raise("Errore !")
   
+
 
   udev_enumerate_add_match_parent(enumerate, parent)
 
   udev_enumerate_add_match_parent(enumerate, parent)
 
   udev_enumerate_add_match_subsystem(enumerate, subsystem)
 
   udev_enumerate_add_match_subsystem(enumerate, subsystem)
 
   udev_enumerate_scan_devices(enumerate)
 
   udev_enumerate_scan_devices(enumerate)
   
+
 
   devices = udev_enumerate_get_list_entry(enumerate)
 
   devices = udev_enumerate_get_list_entry(enumerate)
 
   If devices == 0 Then Error.Raise("Errore !")
 
   If devices == 0 Then Error.Raise("Errore !")
   
+
 
   dev = devices
 
   dev = devices
 
   Repeat
 
   Repeat
Riga 144: Riga 145:
 
     dev = udev_list_entry_get_next(dev)
 
     dev = udev_list_entry_get_next(dev)
 
   Until dev == 0
 
   Until dev == 0
   
+
 
   udev_enumerate_unref(enumerate)
 
   udev_enumerate_unref(enumerate)
 
   Return child
 
   Return child
 
+
  '''End'''
+
  End
  
  

Versione delle 16:47, 14 gen 2024

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 condivisa: "libudev.so.1.7.9 ".


Mostriamo un esempio pratico:

Library "libudev:1.7.8"

' 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


Riferimenti