Foros del Web » Programación para mayores de 30 ;) » C/C++ »

acceder al superbloque de un disquete en C bajo Linux

Estas en el tema de acceder al superbloque de un disquete en C bajo Linux en el foro de C/C++ en Foros del Web. Este tema lo publique en el foro de sistemas opertivos pero mi diejron que aqui tamien podia conseguir ayuda asi que se los dejo, todo ...
  #1 (permalink)  
Antiguo 05/12/2008, 06:20
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años
Puntos: 0
acceder al superbloque de un disquete en C bajo Linux

Este tema lo publique en el foro de sistemas opertivos pero mi diejron que aqui tamien podia conseguir ayuda asi que se los dejo, todo lo que puedan aportar es importante.

Cita:
Iniciado por fran_tatengue Ver Mensaje
Hola gente como va?

Les comento, tengo que hacer un trabajo practico para la facultad en linux y me piden que muestre campors de datos del superbloque de un disquete y por otro lado que cree una imagen de un disquete, todo esto desde un programa escrito en C.

Pasando el limpio, necesito una mano para:

- acceder al superbloque de un disquete

- crear una imagen de un disquete

Otra cosita, tengo que montar la disquetera, desde el mismo programa, yo lo hago con un execl("mount".....) el tema esta en que me piden que verifique que el FS (file system) sea Ext2 y con el e2sck (que por lo que lei sirve para verificar si un FS es ext2) con el disquete montado me da un mensaje de warning!! y despues tengo que presionar "S" para que sigua y al terminar nunca me dice que el FS es ext2, Conocen alguna otra forma de verificar eso?

desde ya muchisimas gracias amigos.
  #2 (permalink)  
Antiguo 05/12/2008, 09:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: acceder al superbloque de un disquete en C bajo Linux

open (/dev/fd0 por ejemplo), read, write y close deberia ser suficiente.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 06/12/2008, 05:49
Avatar de Fayca  
Fecha de Ingreso: abril-2008
Mensajes: 164
Antigüedad: 16 años
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);
}
  #4 (permalink)  
Antiguo 06/12/2008, 11:36
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años
Puntos: 0
Respuesta: acceder al superbloque de un disquete en C bajo Linux

Gracias Che me re sirvio !
  #5 (permalink)  
Antiguo 06/12/2008, 11:42
Avatar de Fayca  
Fecha de Ingreso: abril-2008
Mensajes: 164
Antigüedad: 16 años
Puntos: 2
Respuesta: acceder al superbloque de un disquete en C bajo Linux

de nada :)
  #6 (permalink)  
Antiguo 07/12/2008, 08:08
 
Fecha de Ingreso: abril-2008
Mensajes: 19
Antigüedad: 16 años
Puntos: 0
Respuesta: acceder al superbloque de un disquete en C bajo Linux

Fayca como te dije anteriormente tu respuesta fue mas que interesante, es mas, a primera vista era lo que necesitaba justamente, luego viendo bien y queriendo probarlo me di cuenta de algunas cosas que me gustaria preguntarte:

1 - debo decirte que al querer probar el ropgrama en la distro de linux que nos diron en la facultad me lleve la grata sorpresa de que no tiene los ficheros:

#include <mnttab.h>
#include <sys/filsys.h>
#include <sys/ino.h>

Eso quiere decir que estoy perdido, no lo prode pronar de otra forma?

2 - por otro lado yo necesito acceder al superbloque del fichero /dev/fd0 y este no esta montado como lo que vos me mostras en el programa, existe solucion a esto?

Desde ya muchas gracias FAYCA y a todos lo que puedan colaborar con esto
  #7 (permalink)  
Antiguo 07/12/2008, 10:02
Avatar de Fayca  
Fecha de Ingreso: abril-2008
Mensajes: 164
Antigüedad: 16 años
Puntos: 2
Respuesta: acceder al superbloque de un disquete en C bajo Linux

estan la GNU C Library y la segunda pregunta que haces, primero fijate en como funciona el codigo, no estoy seguro que lo allas analisado,

el programa primero abre el fichero /etc/mnttab que es donde se encuentra la lista de todos los dispositibos despues lo carga en una estructura tipo mnttab.
en esta parte del programa abre los ficheros sacandolos de la estructura

Código:
/* 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
            {
despues de eso te muestra la informacion del bloques, tansolo tienes que modificar el programa para que no abra el fichero mnttab y quitar la parte que lo carga en la estructra y abrir directamente /dev/fd0,
o mejor aun puedes buscar si /dev/fd0 se encuentra en la lista o de lo contrario mostrar un error seria algo mas 'pro' XD
  #8 (permalink)  
Antiguo 08/12/2008, 18:07
 
Fecha de Ingreso: diciembre-2008
Mensajes: 1
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: acceder al superbloque de un disquete en C bajo Linux

Hola, yo queria saber si me pueden ayudar con algo que tiene que ver con el mismo tema. Tengo que mostrar por salida estandar el contenido de cada entrada del directorio raíz, identificando el número de entrada. Por ejemplo:
Entrada 0: .
Entrada 1: ..
Entrada 2: archivo.txt

Lo único que sé es que se puede acceder por medio de la estrucura:
struct ext2_dir_entry{
__u32 inode;
__u16 rec_len;
__u8 name_len;
__u8 file_type;
char name [EXT2_NAME_LEN]; };

pero no tengo mucho idea, no me sale. A ver si me pueden dar una mano con ésto, muchas gracias...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:05.