glusterfs
1/* seek.c - use glfs_lseek() to find holes in a file
2*
3* Author: Niels de Vos <ndevos@redhat.com>
4*/
5
6/* needed for SEEK_HOLE/SEEK_DATA */
7#ifndef _GNU_SOURCE8#define _GNU_SOURCE9#endif10
11#include <sys/types.h>12#include <errno.h>13#include <stdio.h>14#include <stdlib.h>15#include <unistd.h>16
17#include <glusterfs/api/glfs.h>18#include <glusterfs/api/glfs-handles.h>19
20int
21main(int argc, char **argv)22{
23glfs_t *fs = NULL;24int ret = 0;25glfs_fd_t *fd = NULL;26char *filename = NULL;27char *volname = NULL;28char *hostname = NULL;29struct stat st = {300,31};32off_t hole_start = 0;33off_t hole_end = 0;34
35if (argc != 4) {36fprintf(stderr, "Invalid argument, use %s <hostname> <vol> <file>\n",37argv[0]);38exit(1);39}40
41hostname = argv[1];42volname = argv[2];43filename = argv[3];44
45fs = glfs_new(volname);46if (!fs) {47perror("glfs_new() returned NULL");48return 1;49}50
51if (glfs_set_volfile_server(fs, "tcp", hostname, 24007)) {52perror("glfs_set_volfile_server");53return 1;54}55
56if (glfs_init(fs)) {57perror("glfs_init");58return 1;59}60
61fd = glfs_open(fs, filename, O_RDONLY);62if (fd <= 0) {63perror("glfs_open");64return 1;65}66
67if (glfs_fstat(fd, &st)) {68perror("glfs_fstat");69return 1;70}71
72while (hole_end < st.st_size) {73hole_start = glfs_lseek(fd, hole_end, SEEK_HOLE);74if (hole_start == -1 && errno == ENXIO)75/* no more holes */76break;77if (hole_start == -1) {78perror("no more holes");79break;80}81
82hole_end = glfs_lseek(fd, hole_start, SEEK_DATA);83if (hole_end == -1 && errno == ENXIO) {84/* no more data */85break;86}87
88printf("HOLE found: %ld - %ld%s\n", hole_start, hole_end,89(hole_end == st.st_size) ? " (EOF)" : "");90}91
92glfs_close(fd);93
94if (fs) {95glfs_fini(fs);96}97
98return ret;99}
100