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>
master
Suriyan Ramasami 10 years ago committed by Tom Rini
parent 9f12cd0e06
commit 96b1046d1c
  1. 13
      arch/sandbox/cpu/os.c
  2. 8
      arch/sandbox/cpu/state.c
  3. 8
      common/board_f.c
  4. 78
      fs/sandbox/sandboxfs.c
  5. 5
      include/os.h
  6. 6
      include/sandboxfs.h

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

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

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

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

@ -217,9 +217,10 @@ const char *os_dirent_get_typename(enum os_dirent_t type);
* Get the size of a file * Get the size of a file
* *
* @param fname Filename to check * @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 * Write a character to the controlling OS terminal

@ -20,8 +20,10 @@
int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info); 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, int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
void *buffer, unsigned long maxsize); 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); void sandbox_fs_close(void);
int sandbox_fs_ls(const char *dirname); int sandbox_fs_ls(const char *dirname);

Loading…
Cancel
Save