glusterfs

Форк
0
99 строк · 2.0 Кб
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_SOURCE
8
#define _GNU_SOURCE
9
#endif
10

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

20
int
21
main(int argc, char **argv)
22
{
23
    glfs_t *fs = NULL;
24
    int ret = 0;
25
    glfs_fd_t *fd = NULL;
26
    char *filename = NULL;
27
    char *volname = NULL;
28
    char *hostname = NULL;
29
    struct stat st = {
30
        0,
31
    };
32
    off_t hole_start = 0;
33
    off_t hole_end = 0;
34

35
    if (argc != 4) {
36
        fprintf(stderr, "Invalid argument, use %s <hostname> <vol> <file>\n",
37
                argv[0]);
38
        exit(1);
39
    }
40

41
    hostname = argv[1];
42
    volname = argv[2];
43
    filename = argv[3];
44

45
    fs = glfs_new(volname);
46
    if (!fs) {
47
        perror("glfs_new() returned NULL");
48
        return 1;
49
    }
50

51
    if (glfs_set_volfile_server(fs, "tcp", hostname, 24007)) {
52
        perror("glfs_set_volfile_server");
53
        return 1;
54
    }
55

56
    if (glfs_init(fs)) {
57
        perror("glfs_init");
58
        return 1;
59
    }
60

61
    fd = glfs_open(fs, filename, O_RDONLY);
62
    if (fd <= 0) {
63
        perror("glfs_open");
64
        return 1;
65
    }
66

67
    if (glfs_fstat(fd, &st)) {
68
        perror("glfs_fstat");
69
        return 1;
70
    }
71

72
    while (hole_end < st.st_size) {
73
        hole_start = glfs_lseek(fd, hole_end, SEEK_HOLE);
74
        if (hole_start == -1 && errno == ENXIO)
75
            /* no more holes */
76
            break;
77
        if (hole_start == -1) {
78
            perror("no more holes");
79
            break;
80
        }
81

82
        hole_end = glfs_lseek(fd, hole_start, SEEK_DATA);
83
        if (hole_end == -1 && errno == ENXIO) {
84
            /* no more data */
85
            break;
86
        }
87

88
        printf("HOLE found: %ld - %ld%s\n", hole_start, hole_end,
89
               (hole_end == st.st_size) ? " (EOF)" : "");
90
    }
91

92
    glfs_close(fd);
93

94
    if (fs) {
95
        glfs_fini(fs);
96
    }
97

98
    return ret;
99
}
100

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.