¿tienes alguna idea sobre llamadas al sistema en linux?, te dejo las funciones que pudieran funcionarte para hacer lo que pides
----------------------------------------------------------
para montar:
int mount(char *spec, char *dir, int rwflag)
spec = la rauta del disco "/dev/disk"
dir = el lugar de montado
rwflag = si se monta como escritura lectura o ambos
un ejemplo:
mount("/dev/sda1", "/media/disk", 0);
-----------------------------------------------------------------
para desmontar:
umount(char *name);
name = el lugar donde montaste el sistema de ficheros
ejemplo:
umount(/media/disk);
------------------------------------------------------------------------
para acceder al superbloque
#include <sys/types.h>
#include <ustat.h>
int ustat(dev_t dev, struct ustat *buf);
dev es el numero de dispositivo de la sección del disco -major y minor number-
buf es un puntero a una estructura
la estructura es esta:
struct ustat
{
daddr_t f_tfree; //Numero de bloques libres
ino_t f_tinode; //Número de nodos-i libres
char f_name[6]; //Nombre del sistema de ficheros
char f_fpack[6]; //Nombre dek oaquete del sistema de ficheros
};
y aqui un pequeño ejemplo sobre acceso al superbloque
Código:
#include <stdio.h>
#include <sys/types.h>
#include <time.h>
#include <fcntl.h>
#include <mnttab.h>
#include <sys/filsys.h>
#include <sys/ino.h>
/* Número de bloques de 512 bytes que contiene un bloque del sistema. */
#define BLK512 (BSIZE/512)
/* Tamaño de un nodo-i. */
#define ISIZE (sizeof(struct dinode))
int main(int argc, char *argv[])
{
struct mnttab mntbuf; /* Estructura para leer del fichero mnttab. */
struct filsys sbbuf; /* Estructura para leer el superbloque. */
int mnttabfd, sbfd;
char sbdev[50];
/* Análisis de los parámetros de la línea de órdenes. */
if(argc != 1)
{
fprintf(stderr, "%s: demasiados parámetros\n", argv[0]);
exit(-1);
}
/* Apertura del fichero /etc/mnttab. */
if((mnttabfd = open("/etc/mnttab", O_RDONLY)) == -1)
{
perror ("/etc/mnttab");
exit(-1);
}
/* Lectura y procesamiento de las entradas de /etc/mnttab. */
while(read(mnttabfd, &mntbuf, sizeof(mntbuf)) == sizeof (mntbuf))
if(strcmp(mntbuf.mt_dev, "") != 0)
{
printf("Sistema /dev/%s\n", mntbuf.mt_dev);
printf(" Montado en %s\n", mntbuf.mt_filsys);
printf(" Modo: %s\n", mntbuf.mt_ro_flg == 1 ? "sólo lectura": "lectura/escritura");
printf(" Fecha de montaje: %s", asctime(localtime(&mntbuf.mt_time)));
/* Apertura del fichero de dispositivo asociado al sistema de ficheros. */
sprintf(sbdev, "dev/%s", mntbuf.mt_dev);
if((sbfd = open(sbdev, O_RDONLY)) == -1)
{
printf("\007!!! ACCESO AL SISTEMA [%s] DENEGADO !!!\0007\n", sbdev);
printf("Pulse ENTER para continuar.");
while(putchar(getchar()) != 10);
}
/* El puntero de lectura/escritura se sitúa en el segundo bloque
El primer bloque lo ocupa el programa 'boot'. */
else if(lseek(sbfd, BSIZE, SEEK_SET) == -1)
perror(sbdev);
/* Lectura del superbloque */
else if(read(sbfd, &sbbuf, sizeof(sbbuf)) != sizeof(sbbuf))
perror(sbdev);
else
{
/* Informacion sobre bloques */
/* Número de bloques de 512 bytes. */
printf("\tBloques: %1d = %1d bytes\n", sbbuf.s_fsize*BLK512, sbbuf.s_fsize*BSIZE);
/* Número de bloques usados. */
printf("\tBloques usados:%1d bloques=%1d bytes=%g%%\n", (sbbuf.s_fsize - sbbuf.s_tfree)*BLK512,
(sbbuf.s_fsize - sbbuf.s_tfree)*BSIZE,
(sbbuf.s_fsize - sbbuf.s_tfree)*100.0/sbbuf.s_fsize);
/* Numero de bloques libres. */
printf("\tBloques lobres: %1d bloques = %1d bytes\n", sbbuf.s_tfree*BLK512, sbbuf.s_tfree*BSIZE);
/* Informacion sobre los nodos-i. */
/* Numero de nodos-i */
printf("\tNodos-i = %1d bloques = %1d nodos-i\n", sbbuf.s_isize*BLK512, sbbuf.s_isize*BSIZE/ISIZE);
/* Número de nodos-i usados. */
printf("\tNodos-i usados: %1d nodos-i = %g%%\n", sbbuf.s_isize*BSIZE/ISIZE - sbbuf.s_tinode,
(sbbuf.s_isize*BSIZE/ISIZE - sbbuf.s_tinode)*100.0 / (sbbuf.s_isize*BSIZE/ISIZE));
/* Número de nodos-i libres. */
printf("\tInodes libres: %1d inodes\n", sbbuf.s_tinode);
/* Fecha de última actualización del superbloque. */
printf("\tÚltima actualización superbloque: %s", asctime(localtime(&sbbuf.s_time)));
printf("\n");
close(sbfd);
}
}
close(mnttabfd);
exit(0);
}