1 /*
2 * Copyright (c) 2003 Gunnar Ritter
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 *
8 * Permission is granted to anyone to use this software for any purpose,
9 * including commercial applications, and to alter it and redistribute
10 * it freely, subject to the following restrictions:
11 *
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 *
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 *
20 * 3. This notice may not be removed or altered from any source distribution.
21 */
22 /* Sccsid @(#)ib_seek.c 1.4 (gritter) 5/8/03 */
23
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <fcntl.h>
27 #include <unistd.h>
28 #include <string.h>
29 #include <errno.h>
30 #include <stdlib.h>
31
32 #include "iblok.h"
33
34 off_t
ib_seek(struct iblok * ip,off_t off,int whence)35 ib_seek(struct iblok *ip, off_t off, int whence)
36 {
37 if (whence == SEEK_CUR) {
38 off = ip->ib_endoff - (ip->ib_end - ip->ib_cur);
39 whence = SEEK_SET;
40 }
41 if (ip->ib_seekable && whence == SEEK_SET && ip->ib_cur && ip->ib_end &&
42 off < ip->ib_endoff &&
43 off >= ip->ib_endoff - (ip->ib_end - ip->ib_blk)) {
44 ip->ib_cur = ip->ib_end - (ip->ib_endoff - off);
45 return off;
46 }
47 if ((off = lseek(ip->ib_fd, off, whence)) == (off_t)-1)
48 return -1;
49 ip->ib_cur = ip->ib_end = NULL;
50 ip->ib_endoff = off;
51 ip->ib_seekable = 1;
52 return off;
53 }
54