Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/12/2008, 05:49
Avatar de Fayca
Fayca
 
Fecha de Ingreso: abril-2008
Mensajes: 164
Antigüedad: 16 años, 1 mes
Puntos: 2
Respuesta: acceder al superbloque de un disquete en C bajo Linux

¿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);
}