sandbox: Prepare API change for files greater than 2GB

Change the internal sandbox functions to use loff_t for file offsets.

Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Suriyan Ramasami 2014-11-17 14:39:37 -08:00 committed by Tom Rini
parent 9f12cd0e06
commit 96b1046d1c
6 changed files with 77 additions and 41 deletions

View File

@ -385,7 +385,7 @@ const char *os_dirent_get_typename(enum os_dirent_t type)
return os_dirent_typename[OS_FILET_UNKNOWN];
}
ssize_t os_get_filesize(const char *fname)
int os_get_filesize(const char *fname, loff_t *size)
{
struct stat buf;
int ret;
@ -393,7 +393,8 @@ ssize_t os_get_filesize(const char *fname)
ret = stat(fname, &buf);
if (ret)
return ret;
return buf.st_size;
*size = buf.st_size;
return 0;
}
void os_putc(int ch)
@ -427,11 +428,11 @@ int os_read_ram_buf(const char *fname)
{
struct sandbox_state *state = state_get_current();
int fd, ret;
int size;
loff_t size;
size = os_get_filesize(fname);
if (size < 0)
return -ENOENT;
ret = os_get_filesize(fname, &size);
if (ret < 0)
return ret;
if (size != state->ram_size)
return -ENOSPC;
fd = open(fname, O_RDONLY);

View File

@ -49,14 +49,14 @@ static int state_ensure_space(int extra_size)
static int state_read_file(struct sandbox_state *state, const char *fname)
{
int size;
loff_t size;
int ret;
int fd;
size = os_get_filesize(fname);
if (size < 0) {
ret = os_get_filesize(fname, &size);
if (ret < 0) {
printf("Cannot find sandbox state file '%s'\n", fname);
return -ENOENT;
return ret;
}
state->state_fdt = os_malloc(size);
if (!state->state_fdt) {

View File

@ -287,7 +287,7 @@ static int read_fdt_from_file(void)
struct sandbox_state *state = state_get_current();
const char *fname = state->fdt_fname;
void *blob;
ssize_t size;
loff_t size;
int err;
int fd;
@ -300,10 +300,10 @@ static int read_fdt_from_file(void)
return -EINVAL;
}
size = os_get_filesize(fname);
if (size < 0) {
err = os_get_filesize(fname, &size);
if (err < 0) {
printf("Failed to file FDT file '%s'\n", fname);
return -ENOENT;
return err;
}
fd = os_open(fname, OS_O_RDONLY);
if (fd < 0) {

View File

@ -13,10 +13,10 @@ int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
return 0;
}
long sandbox_fs_read_at(const char *filename, unsigned long pos,
void *buffer, unsigned long maxsize)
int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
loff_t maxsize, loff_t *actread)
{
ssize_t size;
loff_t size;
int fd, ret;
fd = os_open(filename, OS_O_RDONLY);
@ -27,16 +27,31 @@ long sandbox_fs_read_at(const char *filename, unsigned long pos,
os_close(fd);
return ret;
}
if (!maxsize)
maxsize = os_get_filesize(filename);
if (!maxsize) {
ret = os_get_filesize(filename, &size);
if (ret) {
os_close(fd);
return ret;
}
maxsize = size;
}
size = os_read(fd, buffer, maxsize);
os_close(fd);
return size;
if (size < 0) {
ret = -1;
} else {
ret = 0;
*actread = size;
}
return ret;
}
long sandbox_fs_write_at(const char *filename, unsigned long pos,
void *buffer, unsigned long towrite)
int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
loff_t towrite, loff_t *actwrite)
{
ssize_t size;
int fd, ret;
@ -52,7 +67,14 @@ long sandbox_fs_write_at(const char *filename, unsigned long pos,
size = os_write(fd, buffer, towrite);
os_close(fd);
return size;
if (size == -1) {
ret = -1;
} else {
ret = 0;
*actwrite = size;
}
return ret;
}
int sandbox_fs_ls(const char *dirname)
@ -74,15 +96,23 @@ int sandbox_fs_ls(const char *dirname)
int sandbox_fs_exists(const char *filename)
{
ssize_t sz;
loff_t size;
int ret;
sz = os_get_filesize(filename);
return sz >= 0;
ret = os_get_filesize(filename, &size);
return ret == 0;
}
int sandbox_fs_size(const char *filename)
{
return os_get_filesize(filename);
loff_t size;
int ret;
ret = os_get_filesize(filename, &size);
if (ret)
return ret;
else
return size;
}
void sandbox_fs_close(void)
@ -91,26 +121,28 @@ void sandbox_fs_close(void)
int fs_read_sandbox(const char *filename, void *buf, int offset, int len)
{
int len_read;
int ret;
loff_t actread;
len_read = sandbox_fs_read_at(filename, offset, buf, len);
if (len_read == -1) {
ret = sandbox_fs_read_at(filename, offset, buf, len, &actread);
if (ret) {
printf("** Unable to read file %s **\n", filename);
return -1;
return ret;
}
return len_read;
return actread;
}
int fs_write_sandbox(const char *filename, void *buf, int offset, int len)
{
int len_written;
int ret;
loff_t actwrite;
len_written = sandbox_fs_write_at(filename, offset, buf, len);
if (len_written == -1) {
ret = sandbox_fs_write_at(filename, offset, buf, len, &actwrite);
if (ret) {
printf("** Unable to write file %s **\n", filename);
return -1;
return ret;
}
return len_written;
return actwrite;
}

View File

@ -217,9 +217,10 @@ const char *os_dirent_get_typename(enum os_dirent_t type);
* Get the size of a file
*
* @param fname Filename to check
* @return size of file, or -1 if an error ocurred
* @param size size of file is returned if no error
* @return 0 on success or -1 if an error ocurred
*/
ssize_t os_get_filesize(const char *fname);
int os_get_filesize(const char *fname, loff_t *size);
/**
* Write a character to the controlling OS terminal

View File

@ -20,8 +20,10 @@
int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
long sandbox_fs_read_at(const char *filename, unsigned long pos,
void *buffer, unsigned long maxsize);
int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
loff_t maxsize, loff_t *actread);
int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
loff_t maxsize, loff_t *actwrite);
void sandbox_fs_close(void);
int sandbox_fs_ls(const char *dirname);