glusterfs

Форк
0
149 строк · 3.9 Кб
1
#include <stdio.h>
2
#include <string.h>
3
#include <errno.h>
4
#include <sys/types.h>
5
#include <sys/stat.h>
6
#include <fcntl.h>
7
#include <unistd.h>
8
#include <assert.h>
9

10
int
11
main(int argc, char *argv[])
12
{
13
    int fd = -1, ret = -1, len = 0;
14
    char *path = NULL,
15
         buf[128] =
16
             {
17
                 0,
18
             },
19
         *cmd = NULL;
20
    struct stat stbuf = {
21
        0,
22
    };
23
    int write_to_child[2] =
24
        {
25
            0,
26
        },
27
        write_to_parent[2] = {
28
            0,
29
        };
30

31
    path = argv[1];
32
    cmd = argv[2];
33

34
    assert(argc == 3);
35

36
    ret = pipe(write_to_child);
37
    if (ret < 0) {
38
        fprintf(stderr,
39
                "creation of write-to-child pipe failed "
40
                "(%s)\n",
41
                strerror(errno));
42
        goto out;
43
    }
44

45
    ret = pipe(write_to_parent);
46
    if (ret < 0) {
47
        fprintf(stderr,
48
                "creation of write-to-parent pipe failed "
49
                "(%s)\n",
50
                strerror(errno));
51
        goto out;
52
    }
53

54
    ret = fork();
55
    switch (ret) {
56
        case 0:
57
            close(write_to_child[1]);
58
            close(write_to_parent[0]);
59

60
            /* child, wait for instructions to execute command */
61
            ret = read(write_to_child[0], buf, 128);
62
            if (ret < 0) {
63
                fprintf(stderr, "child: read on pipe failed (%s)\n",
64
                        strerror(errno));
65
                goto out;
66
            }
67

68
            system(cmd);
69

70
            ret = write(write_to_parent[1], "1", 2);
71
            if (ret < 0) {
72
                fprintf(stderr, "child: write to pipe failed (%s)\n",
73
                        strerror(errno));
74
                goto out;
75
            }
76
            break;
77

78
        case -1:
79
            fprintf(stderr, "fork failed (%s)\n", strerror(errno));
80
            goto out;
81

82
        default:
83
            close(write_to_parent[1]);
84
            close(write_to_child[0]);
85

86
            fd = open(path, O_CREAT | O_RDWR | O_APPEND, S_IRWXU);
87
            if (fd < 0) {
88
                fprintf(stderr, "open failed (%s)\n", strerror(errno));
89
                goto out;
90
            }
91

92
            len = strlen("test-content") + 1;
93
            ret = write(fd, "test-content", len);
94

95
            if (ret < len) {
96
                fprintf(stderr, "write failed %d (%s)\n", ret, strerror(errno));
97
            }
98

99
            ret = pread(fd, buf, 128, 0);
100
            if ((ret == len) && (strcmp(buf, "test-content") == 0)) {
101
                fprintf(stderr,
102
                        "read should've failed as previous "
103
                        "write would've failed with EDQUOT, but its "
104
                        "successful");
105
                ret = -1;
106
                goto out;
107
            }
108

109
            ret = write(write_to_child[1], "1", 2);
110
            if (ret < 0) {
111
                fprintf(stderr, "parent: write to pipe failed (%s)\n",
112
                        strerror(errno));
113
                goto out;
114
            }
115

116
            ret = read(write_to_parent[0], buf, 128);
117
            if (ret < 0) {
118
                fprintf(stderr, "parent: read from pipe failed (%s)\n",
119
                        strerror(errno));
120
                goto out;
121
            }
122

123
            /* this will force a sync on cached-write and now that quota
124
               limit is increased, sync will be successful. ignore return
125
               value as fstat would fail with EDQUOT (picked up from
126
               cached-write because of previous sync failure.
127
            */
128
            fstat(fd, &stbuf);
129

130
            ret = pread(fd, buf, 128, 0);
131
            if (ret != len) {
132
                fprintf(stderr,
133
                        "post cmd read failed %d (data:%s) "
134
                        "(error:%s)\n",
135
                        ret, buf, strerror(errno));
136
                goto out;
137
            }
138

139
            if (strcmp(buf, "test-content")) {
140
                fprintf(stderr, "wrong data (%s)\n", buf);
141
                goto out;
142
            }
143
    }
144

145
    ret = 0;
146

147
out:
148
    return ret;
149
}
150

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

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

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

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