minios: fix bug in lseek for mini-os

lseek always used files[fd].file.offset. It should
use the offset of whatever union member is actually
being used.

Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
Matthew Fioravante committed 2012-11-19 12:59:47 +00:00
1 parent 2ac19a6b38
commit 7967bbb45e
1 file changed
+38 -29
+38 -29
View File
@@ -360,45 +360,54 @@ int write(int fd, const void *buf, size_t nbytes)
off_t lseek(int fd, off_t offset, int whence)
{
off_t* target = NULL;
switch(files[fd].type) {
#if defined(CONFIG_BLKFRONT) || defined(CONFIG_TPMFRONT) || defined(CONFIG_TPM_TIS)
#ifdef CONFIG_BLKFRONT
case FTYPE_BLK:
target = &files[fd].blk.offset;
break;
#endif
#ifdef CONFIG_TPMFRNT
#ifdef CONFIG_TPMFRONT
case FTYPE_TPMFRONT:
target = &files[fd].tpmfront.offset;
break;
#endif
#ifdef CONFIG_TPM_TIS
case FTYPE_TPM_TIS:
target = &files[fd].tpm_tis.offset;
break;
#endif
switch (whence) {
case SEEK_SET:
files[fd].file.offset = offset;
break;
case SEEK_CUR:
files[fd].file.offset += offset;
break;
case SEEK_END:
{
struct stat st;
int ret;
ret = fstat(fd, &st);
if (ret)
return -1;
files[fd].file.offset = st.st_size + offset;
break;
}
default:
errno = EINVAL;
return -1;
}
return files[fd].file.offset;
break;
#endif
default: /* Not implemented on this FTYPE */
errno = ESPIPE;
return (off_t) -1;
case FTYPE_FILE:
target = &files[fd].file.offset;
break;
default:
/* Not implemented for this filetype */
errno = ESPIPE;
return (off_t) -1;
}
switch (whence) {
case SEEK_SET:
*target = offset;
break;
case SEEK_CUR:
*target += offset;
break;
case SEEK_END:
{
struct stat st;
int ret;
ret = fstat(fd, &st);
if (ret)
return -1;
*target = st.st_size + offset;
break;
}
default:
errno = EINVAL;
return -1;
}
return *target;
}
int fsync(int fd) {
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.