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()
+
  ud = udev_new()
    If IsNull(ud) Then Error.Raise("Impossibile creare un contesto 'udev' !")
+
  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)
+
  en = udev_enumerate_new(ud)
 
      
 
      
    udev_enumerate_add_match_subsystem(en, "scsi")
+
  udev_enumerate_add_match_subsystem(en, "scsi")
    udev_enumerate_add_match_property(en, "DEVTYPE", "scsi_device")
+
  udev_enumerate_add_match_property(en, "DEVTYPE", "scsi_device")
    udev_enumerate_scan_devices(en)
+
  udev_enumerate_scan_devices(en)
    ls = udev_enumerate_get_list_entry(en)
+
  ls = udev_enumerate_get_list_entry(en)
 
          
 
          
    dev = ls
+
  dev = ls
 
   
 
   
    Do
+
  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)
+
    path = udev_list_entry_get_name(dev)
      d = udev_device_new_from_syspath(ud, path)
+
    d = udev_device_new_from_syspath(ud, path)
     
+
    If d == 0 Then Break
      child_1 = Ottiene_child(ud, d, "block")
+
    child_1 = Ottiene_child(ud, d, "block")
      child_2 = Ottiene_child(ud, d, "scsi_disk")
+
    child_2 = Ottiene_child(ud, d, "scsi_disk")    
     
+
    node_path = udev_device_get_devnode(d)
      node_path = udev_device_get_devnode(d)
+
    If Not IsNull(node_path) Then Print "Device Node Path: "; node_path
      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
      t = udev_device_get_parent_with_subsystem_devtype(d, "usb", "usb_device")
+
    If child_1 <> 0 Then Print "  Device Node Path: "; udev_device_get_devnode(child_1)
      If IsNull(t) Then Break
+
     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")
      If Not IsNull(child_1) Then Print "  Device Node Path: "; udev_device_get_devnode(child_1)
+
     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 "  VID/PID: "; udev_device_get_sysattr_value(t, "idVendor"); ":"; udev_device_get_sysattr_value(t, "idProduct")
+
    Print
     
+
    If child_1 <> 0 Then udev_device_unref(child_1)
      If Not IsNull(child_1) Then Print "          "; udev_device_get_sysattr_value(d, "vendor")
+
    If child_2 <> 0 Then udev_device_unref(child_2)
      
+
    udev_device_unref(d)
      Print "          "; udev_device_get_sysattr_value(t, "manufacturer"), udev_device_get_sysattr_value(t, "product")
+
     dev = udev_list_entry_get_next(dev)  
      
+
  Until dev == 0
      Print "  serial:  "; udev_device_get_sysattr_value(t, "serial")
 
      Print
 
 
      If Not IsNull(child_1) Then udev_device_unref(child_1)
 
      If Not IsNull(child_2) Then udev_device_unref(child_2)
 
      udev_device_unref(d)
 
      
 
      dev = udev_list_entry_get_next(dev)
 
 
    Loop Until IsNull(dev)
 
 
   
 
   
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
    udev_enumerate_unref(en)
+
  udev_enumerate_unref(en)
    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
Riga 140: Riga 128:
 
   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 !")
 
      
 
      
    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 !")
 
      
 
      
    dev = devices
+
  dev = devices
     Do
+
  Repeat
      path = udev_list_entry_get_name(dev)
+
     path = udev_list_entry_get_name(dev)
      child = udev_device_new_from_syspath(udev, path)
+
    child = udev_device_new_from_syspath(udev, path)
      dev = udev_list_entry_get_next(dev)
+
    dev = udev_list_entry_get_next(dev)
    Loop Until IsNull(dev)
+
  Until dev == 0
 
      
 
      
    udev_enumerate_unref(enumerate)
+
  udev_enumerate_unref(enumerate)
    Return child
+
  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


Riferimenti