Conoscere la dimensione del Dispositivo a blocchi
Per conoscere la dimensione del Dispositivo a blocchi e delle sue partizioni, è possibile utilizzare alcune funzioni esterne e principalmente la funzione ioctl() dichiarata nel file header .../sys/ioctl.h .
Poiché il secondo parametro della predetta funzione esterna ioctl() richiede in questo caso un valore passato da dalla funzione _IO(0x12,96), definita con l'identificatore BLKGETSIZE, non invocabile da Gambas con Extern, saremo costretti ad utilizzare un'apposita libreria dinamica condivisa esterna, da noi creata, per ottenere il valore rappresentato dal predetto identificatore.
Sarà, altresì, necessario eliminare preliminarmente la protezione del file-device della partizione di cui si intende conoscere la dimensione.
Mostriamo un esempio pratico:
Library "libc:6" Private Const O_RDONLY As Integer = 0 ' int open(const char *__file, int __oflag, ...) ' Open FILE and return a new file descriptor for it. Private Extern open_C(__file As String, oflag As Integer) As Integer Exec "open" ' int close(int _fd) ' Deallocates the file descriptor indicated by fildes. Private Extern close_C(_fd As Integer) As Integer Exec "close" ' int ioctl (int __fd, unsigned long int __request, ...) ' Perform the I/O control operation specified by REQUEST on FD. Private Extern ioctl(__fd As Integer, __request As Long, arg3 As Integer) As Integer ' unsigned int Blkgetsize() ' Individua il valore di 'BLKGETSIZE'. Private Extern Blkgetsize() As Integer In "/tmp/io" Public Sub Main() Dim i As Integer Dim fd, p As Pointer ' Crea la nostra apposita libreria .so: File.Save("/tmp/io.c", "#include <linux/fs.h>" & "\n\n" & "unsigned int Blkgetsize() {\n" & "return BLKGETSIZE;\n}") Shell "gcc -o /tmp/io.so /tmp/io.c -shared" Wait ' '''''''''''''''''''''''''''''''''''''''''''' ' Elimina la protezione al file-device prescelto. ' E' necessario inserire la propria password ! Shell "echo mia-password | sudo -S chmod 4777 '/dev/sda'" Wait fd = open_C("/dev/sda", O_RDONLY) p = Alloc(8) i = ioctl(fd, Blkgetsize(), p) If i < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !") Print "\n\nNumero blocchi: "; Long@(p) & " che corrispondono a "; Format(Long@(p) * 512.0 / (1024 * 1024 * 1024), "##.###"); " GByte" close_C(fd) Free(p) End