#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <malloc.h>
#include <errno.h>

typedef struct cabecera {
char novale[14];
short entradas;
} cabecera_t;

typedef struct entrada {
char nombre[40];
int nose;
int origen;
int longitud;
} entrada_t;

int main (argc, argv)
int argc;
char *argv[];

{
int fd1, fd2;
FILE *in;
cabecera_t *cab;
entrada_t *ent, *tent[512];
unsigned int off;
int i, j;
char *buffer;

ent = (entrada_t *) malloc (sizeof (entrada_t) );
cab = (cabecera_t *) malloc (sizeof (cabecera_t) );

if (argc < 2 ) {
fprintf (stderr, "Número incorrecto de parametros.\n" );
exit ( EINVAL );
}
if ((fd1 = open ( argv[1], O_RDONLY )) < 0 ) {
fprintf (stderr, "El fichero no se puede abrir.\n" );
exit ( ENOENT );
}
if ( read ( fd1, cab, sizeof(cabecera_t) ) < 0 ) exit (errno);
off = sizeof(cabecera_t) + sizeof(entrada_t) * cab->entradas;
printf ( "Tipo filesystem : %s\n", cab->novale );
printf ( "N. entradas : %10u\n", cab->entradas );
printf ( "Offset comienzo : %10u\n", off );
printf ( "Comienzo Longitud Nose Nombre\n" );
printf ( "---------- ---------- ---------- ----------------------------------------\n" );
for ( i = 0; i < cab->entradas; i++ ) {
tent[i] = (entrada_t *) malloc (sizeof (entrada_t) );
if ( read ( fd1, tent[i], sizeof(entrada_t) ) < 0 ) exit (errno);
for ( j = 0; j < strlen(tent[i]->nombre); j++ ) {
if (tent[i]->nombre[j] == '\\') tent[i]->nombre[j] = '/';
} 
printf ( "%10u %10u %10x %s\n", off + tent[i]->origen, tent[i]->longitud, tent[i]->nose, tent[i]->nombre );
}
for ( i = 0; i < cab->entradas; i++ ) {
if ( tent[i]->longitud > 0 ) {
buffer = (char *) malloc (tent[i]->longitud);
if ( buffer == NULL ) exit (errno);
if ((fd2 = open ( tent[i]->nombre, O_WRONLY|O_CREAT|O_TRUNC )) < 0 ) {
fprintf ( stderr, "El fichero no se puede crear.\n" );
exit ( ENOENT );
}
if ( read ( fd1, buffer, tent[i]->longitud ) < 0 ) exit (errno);
write ( fd2, buffer, tent[i]->longitud );
close (fd2);
free(buffer);
}
}
close (fd1);
exit (0);
}

