[Libsysio-commit] HEAD: libsysio/src lseek.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2004-08-09 15:30:28
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20858 Modified Files: lseek.c Log Message: Cray SPR_729670: lseek is not checking whence arg. Returns errno 1 instead of errno 22. _sysio_lseek is an internal function but was crafted as an external. It returned API compliant return and set errno accordingly. All callers, though, expected errno or return value. Fixed. Index: lseek.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/lseek.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -w -b -B -p -r1.23 -r1.24 --- lseek.c 27 Jul 2004 15:00:48 -0000 1.23 +++ lseek.c 9 Aug 2004 15:30:06 -0000 1.24 @@ -60,9 +60,7 @@ _sysio_lseek(int fd, _SYSIO_OFF_T offset struct file *fil; _SYSIO_OFF_T off, pos; struct intnl_stat stbuf; - SYSIO_INTERFACE_DISPLAY_BLOCK; - SYSIO_INTERFACE_ENTER; fil = _sysio_fd_find(fd); if (!fil) return -EBADF; @@ -85,42 +83,58 @@ _sysio_lseek(int fd, _SYSIO_OFF_T offset fil->f_ino, &stbuf); if (err) - SYSIO_INTERFACE_RETURN((off_t )-1, (int )err); + return err; } off = stbuf.st_size; break; default: - SYSIO_INTERFACE_RETURN((off_t )-1, -EINVAL); + return -EINVAL; } pos = off + offset; if ((offset < 0 && -offset > off) || (offset > 0 && pos <= off)) - SYSIO_INTERFACE_RETURN((off_t )-1, -EINVAL); + return -EINVAL; #ifdef O_LARGEFILE if (pos >= ((fil->f_flags & O_LARGEFILE) ? _SYSIO_OFF_T_MAX : LONG_MAX)) - SYSIO_INTERFACE_RETURN((off_t )-1, -EOVERFLOW); + return -EOVERFLOW; #else if (pos >= _SYSIO_OFF_T_MAX) - SYSIO_INTERFACE_RETURN((off_t )-1, -EOVERFLOW); + return -EOVERFLOW; #endif pos = (fil->f_ino->i_ops.inop_pos)(fil->f_ino, pos); if (pos < 0) - SYSIO_INTERFACE_RETURN((off_t )-1, (int )pos); + return pos; fil->f_pos = pos; - SYSIO_INTERFACE_RETURN((off_t )pos, 0); + return pos; } #if _LARGEFILE64_SOURCE #undef lseek64 -sysio_sym_weak_alias(_sysio_lseek, SYSIO_INTERFACE_NAME(lseek64)) + +extern off64_t +SYSIO_INTERFACE_NAME(lseek64)(int fd, off64_t offset, int whence) +{ + _SYSIO_OFF_T off; + off_t rtn; + SYSIO_INTERFACE_DISPLAY_BLOCK; + + SYSIO_INTERFACE_ENTER; + off = _sysio_lseek(fd, offset, whence); + if (off < 0) + SYSIO_INTERFACE_RETURN((off_t )-1, (int )off); + rtn = (off64_t )off; + assert(rtn == off); + SYSIO_INTERFACE_RETURN(rtn, 0); +} #ifdef __GLIBC__ #undef __lseek64 -sysio_sym_weak_alias(_sysio_lseek, PREPEND(__, SYSIO_INTERFACE_NAME(lseek64))) +sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(lseek64), + PREPEND(__, SYSIO_INTERFACE_NAME(lseek64))) #endif #ifdef REDSTORM #undef __libc_lseek64 -sysio_sym_weak_alias(_sysio_lseek, +sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(lseek64), PREPEND(__, SYSIO_INTERFACE_NAME(libc_lseek64))) #endif #endif |