update repository
[cmdllinux.git] / example_n_useful / utils / seekfd.c
blob525e611da410062f91fa2350d7223ae008d27fb5
1 #define _FILE_OFFSET_BITS 64
2 #include <string.h>
3 #include <errno.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <sys/types.h>
7 #include <unistd.h>
9 int main(int argc, char* argv[])
11 /* Arguments: fd [offset [whence]]
12 * where
13 * fd: file descriptor to seek
14 * offset: number of bytes from position specified in whence
15 * whence: one of
16 * SEEK_SET (==0): from start of file
17 * SEEK_CUR (==1): from current position
18 * SEEK_END (==2): from end of file
20 int fd;
21 long long scan_offset = 0;
22 off_t offset = 0;
23 int whence = SEEK_SET;
24 int errsv; int rv;
25 if (argc == 1) {
26 fprintf(stderr, "usage: seekfd fd [offset [whence]]\n");
27 exit(1);
29 if (argc >= 2) {
30 if (sscanf(argv[1], "%d", &fd) == EOF) {
31 errsv = errno;
32 fprintf(stderr, "%s: %s\n", argv[0], strerror(errsv));
33 exit(1);
36 if (argc >= 3) {
37 rv = sscanf(argv[2], "%lld", &scan_offset);
38 if (rv == EOF) {
39 errsv = errno;
40 fprintf(stderr, "%s: %s\n", argv[0], strerror(errsv));
41 exit(1);
43 offset = (off_t) scan_offset;
45 if (argc >= 4) {
46 if (sscanf(argv[3], "%d", &whence) == EOF) {
47 errsv = errno;
48 fprintf(stderr, "%s: %s\n", argv[0], strerror(errsv));
49 exit(1);
53 if (lseek(fd, offset, whence) == (off_t) -1) {
54 errsv = errno;
55 fprintf(stderr, "%s: %s\n", argv[0], strerror(errsv));
56 exit(2);
59 return 0;