
1: /* Copyright (C) 1993, 1997, 1998, 1999, 2001, 2002, 2003 2: Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: 5: The GNU C Library is free software; you can redistribute it and/or 6: modify it under the terms of the GNU Lesser General Public 7: License as published by the Free Software Foundation; either 8: version 2.1 of the License, or (at your option) any later version. 9: 10: The GNU C Library is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13: Lesser General Public License for more details. 14: 15: You should have received a copy of the GNU Lesser General Public 16: License along with the GNU C Library; if not, write to the Free 17: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18: 02111-1307 USA. 19: 20: As a special exception, if you link the code in this file with 21: files compiled with a GNU compiler to produce an executable, 22: that does not cause the resulting executable to be covered by 23: the GNU Lesser General Public License. This exception does not 24: however invalidate any other reasons why the executable file 25: might be covered by the GNU Lesser General Public License. 26: This exception applies to code released by its copyright holders 27: in files containing the exception. */ 28: 29: #include <stdlib.h> 30: #include <libioP.h> 31: #include <errno.h> 32: #ifndef errno 33: extern int errno; 34: #endif 35: #ifndef __set_errno 36: # define __set_errno(Val) errno = (Val) 37: #endif 38: 39: _IO_off64_t 40: _IO_seekoff_unlocked (fp, offset, dir, mode) 41: _IO_FILE *fp; 42: _IO_off64_t offset; 43: int dir; 44: int mode; 45: { 46: if (dir != _IO_seek_cur && dir != _IO_seek_set && dir != _IO_seek_end) 47: { 48: __set_errno (EINVAL); 49: return EOF; 50: } 51: 52: /* If we have a backup buffer, get rid of it, since the __seekoff 53: callback may not know to do the right thing about it. 54: This may be over-kill, but it'll do for now. TODO */ 55: if (mode != 0 && ((_IO_fwide (fp, 0) < 0 && _IO_have_backup (fp)) 56: || (_IO_fwide (fp, 0) > 0 && _IO_have_wbackup (fp)))) 57: { 58: if (dir == _IO_seek_cur && _IO_in_backup (fp)) 59: { 60: if (_IO_vtable_offset (fp) != 0 || fp->_mode <= 0) 61: offset -= fp->_IO_read_end - fp->_IO_read_ptr; 62: else 63: abort (); 64: } 65: if (_IO_fwide (fp, 0) < 0) 66: INTUSE(_IO_free_backup_area) (fp); 67: else 68: INTUSE(_IO_free_wbackup_area) (fp); 69: } 70: 71: return _IO_SEEKOFF (fp, offset, dir, mode); 72: } 73: 74: 75: _IO_off64_t 76: _IO_seekoff (fp, offset, dir, mode) 77: _IO_FILE *fp; 78: _IO_off64_t offset; 79: int dir; 80: int mode; 81: { 82: _IO_off64_t retval; 83: 84: _IO_acquire_lock (fp); 85: retval = _IO_seekoff_unlocked (fp, offset, dir, mode); 86: _IO_release_lock (fp); 87: return retval; 88: }