diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2008-08-01 08:59:27 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2008-08-01 08:59:27 +0200 |
commit | f295acb556da2b7a5e3b270ea8d34ea058fe7dc9 (patch) | |
tree | a8e939e1133401ddd493f4f1fb0dfcd3257abd23 | |
parent | ec1b86784d4c08f8f0897161e142745080625698 (diff) | |
download | barebox-f295acb556da2b7a5e3b270ea8d34ea058fe7dc9.tar.gz barebox-f295acb556da2b7a5e3b270ea8d34ea058fe7dc9.tar.xz |
lseek: return -1 for errors and check for that return value
We cannot check for < 0 in lseek, otherwise we get problems with files > 0x7fffffff
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | commands/mem.c | 10 | ||||
-rw-r--r-- | fs/devfs.c | 4 | ||||
-rw-r--r-- | fs/fs.c | 10 | ||||
-rw-r--r-- | lib/driver.c | 2 |
4 files changed, 14 insertions, 12 deletions
diff --git a/commands/mem.c b/commands/mem.c index f7b9e4bb60..dfafda3c95 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -110,7 +110,7 @@ int memory_display(char *addr, ulong offs, ulong nbytes, int size) return 0; } -int open_and_lseek(const char *filename, int mode, ulong pos) +int open_and_lseek(const char *filename, int mode, off_t pos) { int fd, ret; @@ -122,9 +122,9 @@ int open_and_lseek(const char *filename, int mode, ulong pos) if (!pos) return fd; - +printf("lseek to 0x%08x\n", pos); ret = lseek(fd, pos, SEEK_SET); - if (ret < 0) { + if (ret == -1) { perror("lseek"); close(fd); return ret; @@ -532,7 +532,7 @@ static struct driver_d mem_drv = { .close = dev_close_default, .read = mem_read, .write = mem_write, - .lseek = dev_lseek_default, + .lseek = dev_lseek_default, }; static struct driver_d ram_drv = { @@ -542,7 +542,7 @@ static struct driver_d ram_drv = { .close = dev_close_default, .read = mem_read, .write = mem_write, - .lseek = dev_lseek_default, + .lseek = dev_lseek_default, .type = DEVICE_TYPE_DRAM, }; diff --git a/fs/devfs.c b/fs/devfs.c index 12abc1829d..cd9bed2676 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -47,11 +47,11 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) { struct device_d *dev = f->inode; - int ret; + off_t ret; ret = dev_lseek(dev, pos); - if (ret >= 0) + if (ret != -1) f->pos = pos; return ret; @@ -516,14 +516,16 @@ off_t lseek(int fildes, off_t offset, int whence) struct device_d *dev; struct fs_driver_d *fsdrv; FILE *f = &files[fildes]; - ulong pos; + off_t pos; errno = 0; dev = f->dev; fsdrv = (struct fs_driver_d *)dev->driver->type_data; - if (!fsdrv->lseek) - return -ENOSYS; + if (!fsdrv->lseek) { + errno = -ENOSYS; + return -1; + } switch(whence) { case SEEK_SET: @@ -549,7 +551,7 @@ off_t lseek(int fildes, off_t offset, int whence) out: errno = -EINVAL; - return errno; + return -1; } EXPORT_SYMBOL(lseek); diff --git a/lib/driver.c b/lib/driver.c index 45417c28a9..dcb6727671 100644 --- a/lib/driver.c +++ b/lib/driver.c @@ -217,7 +217,7 @@ off_t dev_lseek(struct device_d *dev, off_t offset) if (dev->driver->lseek) return dev->driver->lseek(dev, offset); errno = -ENOSYS; - return -ENOSYS; + return -1; } int dev_open(struct device_d *dev, struct filep *f) |