Emulare in Gambas le macro IOC, IOR, IOW e IOWR usate con la funzione ioctl()

Da Gambas-it.org - Wikipedia.

Le macro _IOC, _IOR, _IOW e _IOWR soono utilizzate nel linguaggio C per creare il numero del comando per la funzione "ioctl()".

Queste macro sono specificate nel file header "/usr/include/asm-generic/ioctl.h ", e ciascuna di esse restituisce un valore da passare al 2° parametro della predetta funzione "ioctl()". [nota 1]

Di seguito verranno mostrate le mmodalità per emulare in Gambas tali macro.


Macro _IOC

La macro

_IOC(dir, type, nr, size)

che sta a significare Input Output Control è costitutiva della definizione delle altre macro in questa pagina prese in esame.

In Gambas si potrà emulare come segue:

Shl((dir), _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) as Long

il parametro (dir), come espresso nel file header "/usr/include/asm-generic/ioctl.h", può essere a seconda della macro alla quale in quel particolare caso _IOC() appartiene, uno dei seguenti: _IOC_NONE, _IOC_READ, _IOC_WRITE, _IOC_READ Or _IOC_WRITE.

Esempio pratico:

Private Const _IOC_NRSHIFT As Integer = 0
Private Const _IOC_NRBITS As Integer = 8
Private _IOC_TYPESHIFT As Integer = _IOC_NRSHIFT + _IOC_NRBITS

Private Const _IOC_TYPEBITS As Integer = 8
Private _IOC_SIZESHIFT As Integer = _IOC_TYPESHIFT + _IOC_TYPEBITS

Private Const _IOC_SIZEBITS As Integer = 14
Private _IOC_DIRSHIFT As Integer = _IOC_SIZESHIFT + _IOC_SIZEBITS

Private Const _IOC_READ As Long = 2


Public Sub Main()
 
 Dim ris As Long
 
' Impostiamo dei valori meramente esemplificativi:
 ris = _IOC(_IOC_READ, Asc("E"), &h06, 256)    ' _IOC(dir,type,nr,size)
 
' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()":
 Print ris
  
End


Private Function _IOC(iocread As Long, type As Long, nr As Long, size As Long) As Long
 
 Return Shl(iocread, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
End


Macro _IOR

La macro

_IOR(int type, int number, data_type)

è utilizzata con la funzione ioctl( ) per leggere i dati dal driver del dispositivo. Il driver potrà restituire all'utente sizeof(data_type) byte.

In Gambas si potrà emulare come segue:

Shl(_IOC_READ, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) As Long

Esempio pratico:

Private Const _IOC_NRSHIFT As Integer = 0
Private Const _IOC_TYPESHIFT As Integer = 8
Private Const _IOC_SIZESHIFT As Integer = 16
Private Const _IOC_DIRSHIFT As Integer = 30
Private Const _IOC_READ As Long = 2


Public Sub Main()
 
 Dim ris As Long
 
' Impostiamo dei valori meramente esemplificativi:
 ris = _IOR(Asc("|"), &01, 256)   ' _IOR(type,nr,size)
 
' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()":
 Print ris
 
End


Private Function _IOR(type As Long, nr As Long, size As Long) As Long
 
 Return Shl(_IOC_READ, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
End


Macro _IOW

La macro

_IOW(int type, int number, data_type)

è utilizzata con la funzione ioctl( ) per scrivere sizeof(data_type) byte-dati nel driver del dispositivo.

In Gambas si potrà emulare come segue:

Shl(_IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) As Long

Esempio pratico:

Private Const _IOC_NRSHIFT As Integer = 0
Private Const _IOC_TYPESHIFT As Integer = 8
Private Const _IOC_SIZESHIFT As Integer = 16
Private Const _IOC_DIRSHIFT As Integer = 30
Private Const _IOC_WRITE As Long = 1


Public Sub Main()
 
 Dim ris As Long
 
' Impostiamo dei valori meramente esemplificativi:
 ris = _IOW(Asc("|"), &01, 256)   ' _IOW(type,nr,size)
 
' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()":
 Print ris
 
End


Private Function _IOW(type As Long, nr As Long, size As Long) As Long
 
 Return Shl(_IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
End


Macro _IOWR

La macro

_IOWR(int type, int number, data_type)

è utilizzata con la funzione ioctl( ) per leggere e scrivere sizeof(data_type) byte-dati da/nel driver del dispositivo.

In Gambas si potrà emulare come segue:

Shl(_IOC_READ Or _IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) As Long

Esempio pratico:

Private Const _IOC_NRSHIFT As Integer = 0
Private Const _IOC_TYPESHIFT As Integer = 8
Private Const _IOC_SIZESHIFT As Integer = 16
Private Const _IOC_DIRSHIFT As Integer = 30
Private Const _IOC_WRITE As Long = 1
Private Const _IOC_READ As Long = 2


Public Sub Main()
 
 Dim ris As Long
 
' Impostiamo dei valori meramente esemplificativi:
 ris = _IOWR(Asc("|"), &01, 256)   ' _IOWR(type,nr,size)
 
' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()":
 Print ris
 
End


Private Function _IOWR(type As Long, nr As Long, size As Long) As Long
 
 Return Shl(_IOC_READ Or _IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
End


Note

[1] Vedere anche la seguente pagina: Ioctl()


Riferimenti