Emulare in Gambas le macro IOC, IOR, IOW e IOWR usate con la funzione ioctl()
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()