/* seek.c - use glfs_lseek() to find holes in a file * * Author: Niels de Vos */ /* needed for SEEK_HOLE/SEEK_DATA */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include int main (int argc, char **argv) { glfs_t *fs = NULL; int ret = 0; glfs_fd_t *fd = NULL; char *filename = NULL; char *volname = NULL; char *hostname = NULL; struct stat st = { 0, }; off_t hole_start = 0; off_t hole_end = 0; if (argc != 4) { fprintf (stderr, "Invalid argument, use %s \n", argv[0]); exit (1); } hostname = argv[1]; volname = argv[2]; filename = argv[3]; fs = glfs_new (volname); if (!fs) { perror ("glfs_new() returned NULL"); return 1; } if (glfs_set_volfile_server (fs, "tcp", hostname, 24007)) { perror ("glfs_set_volfile_server"); return 1; } if (glfs_init (fs)) { perror ("glfs_init"); return 1; } fd = glfs_open (fs, filename, O_RDONLY); if (fd <= 0) { perror ("glfs_open"); return 1; } if (glfs_fstat (fd, &st)) { perror ("glfs_fstat"); return 1; } while (hole_end < st.st_size) { hole_start = glfs_lseek (fd, hole_end, SEEK_HOLE); if (hole_start == -1 && errno == ENXIO) /* no more holes */ break; if (hole_start == -1) { perror ("no more holes"); break; } hole_end = glfs_lseek (fd, hole_start, SEEK_DATA); if (hole_end == -1 && errno == ENXIO) { /* no more data */ break; } printf ("HOLE found: %ld - %ld%s\n", hole_start, hole_end, (hole_end == st.st_size) ? " (EOF)" : ""); } glfs_close (fd); if (fs) { glfs_fini (fs); } return ret; }