mirror of
https://github.com/vivier/EMILE.git
synced 2024-12-22 10:29:31 +00:00
52 lines
1023 B
C
52 lines
1023 B
C
/*
|
|
*
|
|
* (c) 2005 Laurent Vivier <Laurent@lvivier.info>
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "libcontainer.h"
|
|
#include "container.h"
|
|
|
|
stream_FILE *container_open(stream_VOLUME *volume, char *path)
|
|
{
|
|
container_FILE *file;
|
|
device_io_t *device = (device_io_t*)volume;
|
|
int block_size = device->get_blocksize(device->data);
|
|
unsigned long first, nbblocs;
|
|
int ret;
|
|
|
|
first = strtol(path, &path, 0);
|
|
if (*path != ',')
|
|
return NULL;
|
|
path++;
|
|
nbblocs = strtol(path, &path, 0);
|
|
if (*path != 0)
|
|
return NULL;
|
|
file = (container_FILE *)malloc(sizeof(container_FILE) + block_size);
|
|
if (file == NULL)
|
|
return NULL;
|
|
|
|
file->container = (struct emile_container*)malloc(block_size * nbblocs);
|
|
if (file->container == NULL)
|
|
{
|
|
free(file);
|
|
return NULL;
|
|
}
|
|
|
|
ret = device->read_sector(device->data, first, file->container, block_size * nbblocs);
|
|
if (ret == -1)
|
|
{
|
|
free(file->container);
|
|
free(file);
|
|
}
|
|
|
|
file->offset = 0;
|
|
file->device = device;
|
|
file->current_block = 0;
|
|
return (stream_FILE*)file;
|
|
}
|