diff options
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | tests/basic/fuse/Makefile.am | 12 | ||||
-rw-r--r-- | tests/basic/fuse/seek.c | 80 |
3 files changed, 93 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index 4e6ef1b8c6a..bc59ef45ee5 100644 --- a/configure.ac +++ b/configure.ac @@ -247,6 +247,7 @@ AC_CONFIG_FILES([Makefile tools/glusterfind/glusterfind tools/glusterfind/Makefile tools/glusterfind/src/Makefile + tests/basic/fuse/Makefile tests/basic/gfapi/Makefile]) AC_CANONICAL_HOST diff --git a/tests/basic/fuse/Makefile.am b/tests/basic/fuse/Makefile.am new file mode 100644 index 00000000000..c446d253228 --- /dev/null +++ b/tests/basic/fuse/Makefile.am @@ -0,0 +1,12 @@ +CFLAGS = -Wall -g +LDFLAGS = + +BINARIES = seek + +%: %.c + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ + +all: $(BINARIES) + +clean: + -$(RM) $(BINARIES) diff --git a/tests/basic/fuse/seek.c b/tests/basic/fuse/seek.c new file mode 100644 index 00000000000..e4db41c03d7 --- /dev/null +++ b/tests/basic/fuse/seek.c @@ -0,0 +1,80 @@ +/* seek.c - use lseek() to find holes in a file + * + * Author: Niels de Vos <ndevos@redhat.com> + */ + +/* needed for SEEK_HOLE/SEEK_DATA */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +int +main (int argc, char **argv) +{ + int ret = EXIT_SUCCESS; + int fd = -1; + char *filename = NULL; + struct stat st = { 0, }; + off_t hole_start = 0; + off_t hole_end = 0; + + if (argc != 2) { + fprintf (stderr, "Invalid argument, use %s <file>\n", argv[0]); + return EXIT_FAILURE; + } + + filename = argv[1]; + + fd = open (filename, O_RDONLY); + if (fd <= 0) { + perror ("open"); + return EXIT_FAILURE; + } + + if (fstat (fd, &st)) { + perror ("fstat"); + return EXIT_FAILURE; + } + + while (hole_end < st.st_size) { + hole_start = lseek (fd, hole_end, SEEK_HOLE); + if (hole_start == -1 && errno == ENXIO) { + /* no more holes */ + break; + } else if (hole_start == -1 && errno == ENOTSUP) { + /* SEEK_HOLE is not supported */ + perror ("lseek(SEEK_HOLE)"); + ret = EXIT_FAILURE; + break; + } else if (hole_start == -1) { + perror ("no more holes"); + break; + } + + hole_end = lseek (fd, hole_start, SEEK_DATA); + if (hole_end == -1 && errno == ENXIO) { + /* no more data */ + break; + } else if (hole_end == -1 && errno == ENOTSUP) { + /* SEEK_DATA is not supported */ + perror ("lseek(SEEK_DATA)"); + ret = EXIT_FAILURE; + break; + } + + printf ("HOLE found: %ld - %ld%s\n", hole_start, hole_end, + (hole_end == st.st_size) ? " (EOF)" : ""); + } + + close (fd); + + return ret; +} |