Differenze tra le versioni di "Conoscere la dimensione del Dispositivo a blocchi"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Per conoscere la dimensione del [https://it.wikipedia.org/wiki/Dispositivo_a_blocchi Dispositivo a blocchi] e delle sue partizioni, è possibile utilizzare alcune funzioni esterne e principalmente la funzione ''ioctl()'' dichiarata nel file header ''.../sys/ioctl.h'' .
 
Per conoscere la dimensione del [https://it.wikipedia.org/wiki/Dispositivo_a_blocchi Dispositivo a blocchi] e delle sue partizioni, è possibile utilizzare alcune funzioni esterne e principalmente la funzione ''ioctl()'' dichiarata nel file header ''.../sys/ioctl.h'' .
  
===Conoscere la dimensione in Blocchi===
+
===Conoscere la dimensione in Blocchi (Settori)===
Poiché il secondo parametro della predetta funzione esterna ''ioctl()'' richiede - nel caso di restituzione dlla dimensione in ''Blocchi'' - 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.
+
Poiché il secondo parametro della predetta funzione esterna ''ioctl()'' richiede - nel caso di restituzione dlla dimensione in ''Blocchi'' (Settori) - 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.
 
Sarà, altresì, necessario eliminare preliminarmente la protezione del file-device della partizione di cui si intende conoscere la dimensione.
  
 
+
Mostriamo un esempio pratico con il file-device "/dev/sda":
Mostriamo un esempio pratico:
 
 
  Library "libc:6"
 
  Library "libc:6"
 
   
 
   
Riga 22: Riga 21:
 
  <FONT Color=gray>' ''int ioctl (int __fd, unsigned long int __request, ...)''
 
  <FONT Color=gray>' ''int ioctl (int __fd, unsigned long int __request, ...)''
 
  ' ''Perform the I/O control operation specified by REQUEST on FD.''</font>
 
  ' ''Perform the I/O control operation specified by REQUEST on FD.''</font>
  Private Extern ioctl(__fd As Integer, __request As Long, arg3 As Integer) As Integer
+
  Private Extern ioctl(__fd As Integer, __request As Long, arg3 As Pointer) As Integer
 
   
 
   
 
   
 
   
Riga 30: Riga 29:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim fd, p As Pointer
 
   Dim fd, p As Pointer
 
+
 +
<FONT Color=darkgreen>' ''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
 
  <FONT Color=gray>' ''Crea la nostra apposita libreria .so:''</font>
 
  <FONT Color=gray>' ''Crea la nostra apposita libreria .so:''</font>
  File.Save("/tmp/io.c", "#include <linux/fs.h>" &
+
  File.Save("/tmp/io.c", "#include <linux/fs.h>" &
            "\n\n" &
+
            "\n\n" &
            "unsigned int Blkgetsize() {\n" &
+
            "unsigned int Blkgetsize() {\n" &
            "return BLKGETSIZE;\n}")
+
            "return BLKGETSIZE;\n}")
  Shell "gcc -o /tmp/io.so /tmp/io.c -shared" Wait
+
  Shell "gcc -o /tmp/io.so /tmp/io.c -shared" Wait
  <FONT Color=gray>' '''''''''''''''''''''''''''''''''''''''''''''''''</font>
+
  <FONT Color=darkgreen>' ''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
 
    
 
    
 
  <FONT Color=gray>' ''Elimina la protezione al file-device prescelto.''
 
  <FONT Color=gray>' ''Elimina la protezione al file-device prescelto.''
  ' ''E' necessario inserire la propria password !''</font>
+
  ' '''''E' necessario inserire la propria password !'''''</font>
  Shell "echo <FONT Color=#B22222>mia-password</font> | sudo -S chmod 4777 '/dev/sda'" Wait
+
  Shell "echo <FONT Color=#B22222>MIA-PASSWORD</font> | sudo -S chmod 4444 '/dev/sda'"
 
    
 
    
  fd = open_C("/dev/sda", O_RDONLY)
+
  fd = open_C("/dev/sda", O_RDONLY)
  p = Alloc(8)
+
  p = Alloc(SizeOf(gb.Pointer), 1)
  i = ioctl(fd, Blkgetsize(), p)
+
  i = ioctl(fd, Blkgetsize(), p)
  If i < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !")
+
  If i < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !")
 
    
 
    
  Print "\n\nNumero blocchi: "; Long@(p) &
+
  Print "\n\nNumero blocchi: "; Long@(p) &
  " che corrispondono a "; Format(Long@(p) * 512.0 / (1024 ^ 3), "##.###"); " GByte"
+
  " che corrispondono a "; Format(Long@(p) * 512.0 / (1024 ^ 3), "##.###"); " GByte"
     
+
  close_C(fd)
+
<FONT Color=gray>' ''Chiude il flusso relativo al file-device:''</font>
 
+
  close_C(fd)
  Free(p)
+
<FONT Color=gray>' ''Dealloca l'area di memoria precedentemente riservata, assicurandosi anche che il Puntatore "non" punti ad una cella di memoria rilevante:''</font>
 
+
  Free(p)
  '''End'''
+
  p = 0
 +
 +
  End
  
  
Riga 78: Riga 80:
 
  <FONT Color=gray>' ''int ioctl (int __fd, unsigned long int __request, ...)''
 
  <FONT Color=gray>' ''int ioctl (int __fd, unsigned long int __request, ...)''
 
  ' ''Perform the I/O control operation specified by REQUEST on FD.''</font>
 
  ' ''Perform the I/O control operation specified by REQUEST on FD.''</font>
  Private Extern ioctl(__fd As Integer, __request As Long, arg3 As Integer) As Integer
+
  Private Extern ioctl(__fd As Integer, __request As Long, arg3 As Pointer) As Integer
 
   
 
   
 
   
 
   
Riga 86: Riga 88:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
+
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim fd, p As Pointer
 
   Dim fd, p As Pointer
 +
 +
<FONT Color=darkgreen>' ''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
 +
<FONT Color=gray>' ''Crea la nostra apposita libreria .so:''</font>
 +
  File.Save("/tmp/io.c", "#include <linux/fs.h>\n#include <stddef.h>\n\n" &
 +
            "unsigned int Blkgetsize64() {\n" &
 +
            "return BLKGETSIZE64;\n}")
 +
  Shell "gcc -o /tmp/io.so /tmp/io.c -shared" Wait
 +
<FONT Color=darkgreen>' ''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
 
    
 
    
<FONT Color=gray>' ''Crea la nostra apposita libreria .so:''</font>
 
  File.Save("/tmp/io.c", "#include <linux/fs.h>" &
 
            "\n\n" &
 
            "unsigned int Blkgetsize64() {\n" &
 
            "return BLKGETSIZE64;\n}")
 
  Shell "gcc -o /tmp/io.so /tmp/io.c -shared" Wait
 
<FONT Color=gray>' '''''''''''''''''''''''''''''''''''''''''''''''''</font>
 
 
 
 
  <FONT Color=gray>' ''Elimina la protezione al file-device prescelto.''
 
  <FONT Color=gray>' ''Elimina la protezione al file-device prescelto.''
  ' ''E' necessario inserire la propria password !''</font>
+
  ' '''''E' necessario inserire la propria password !'''''</font>
  Shell "echo <FONT Color=#B22222>mia-password</font> | sudo -S chmod 4777 '/dev/sda'" Wait
+
  Shell "echo <FONT Color=#B22222>MIA-PASSWORD</font> | sudo -S chmod 4444 '/dev/sda'"
 +
 +
  fd = open_C("/dev/sda", O_RDONLY)
 +
  p = Alloc(SizeOf(gb.Pointer), 1)
 +
  i = ioctl(fd, Blkgetsize64(), p)
 +
  If i < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !")
 
    
 
    
  fd = open_C("/dev/sda", O_RDONLY)
+
  Print "\n\nDimensione: "; Format(Long@(p) / 1e9, "##.###"); " GByte"
  p = Alloc(8)
+
  i = ioctl(fd, Blkgetsize64(), p)
+
<FONT Color=gray>' ''Chiude il flusso relativo al file-device:''</font>
  If i < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !")
+
  close_C(fd)
 
+
<FONT Color=gray>' ''Dealloca l'area di memoria precedentemente riservata, assicurandosi anche che il Puntatore "non" punti ad una cella di memoria rilevante:''</font>
  Print "\n\nDimensione: "; Format(Long@(p) / 1e9, "##.###"); " GByte"
+
  Free(p)
     
+
  p = 0
  close_C(fd)
+
 
+
  End
  Free(p)
 
 
 
  '''End'''
 
 
 
  
  

Versione attuale delle 15:44, 14 gen 2024

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 .

Conoscere la dimensione in Blocchi (Settori)

Poiché il secondo parametro della predetta funzione esterna ioctl() richiede - nel caso di restituzione dlla dimensione in Blocchi (Settori) - 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 con il file-device "/dev/sda":

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 Pointer) As Integer


' unsigned int Blkgetsize(void)
' 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 4444 '/dev/sda'"
 
 fd = open_C("/dev/sda", O_RDONLY)
 p = Alloc(SizeOf(gb.Pointer), 1)
 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 ^ 3), "##.###"); " GByte"

' Chiude il flusso relativo al file-device:
 close_C(fd)
' Dealloca l'area di memoria precedentemente riservata, assicurandosi anche che il Puntatore "non" punti ad una cella di memoria rilevante:
 Free(p)
 p = 0

End


Conoscere la dimensione in Byte

Per avere, invece, la dimensione in byte, si dovrà utilizzare l'identificatore "BLKGETSIZE64":

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 Pointer) As Integer


' unsigned int Blkgetsize64(void)
' Individua il valore di 'BLKGETSIZE64'.
Private Extern Blkgetsize64() 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#include <stddef.h>\n\n" &
           "unsigned int Blkgetsize64() {\n" &
           "return BLKGETSIZE64;\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 4444 '/dev/sda'"

 fd = open_C("/dev/sda", O_RDONLY)
 p = Alloc(SizeOf(gb.Pointer), 1)
 i = ioctl(fd, Blkgetsize64(), p)
 If i < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !")
 
 Print "\n\nDimensione: "; Format(Long@(p) / 1e9, "##.###"); " GByte"

' Chiude il flusso relativo al file-device:
 close_C(fd)
' Dealloca l'area di memoria precedentemente riservata, assicurandosi anche che il Puntatore "non" punti ad una cella di memoria rilevante:
 Free(p)
 p = 0

End


Riferimenti