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; +}  | 
