glusterfs
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
10int
11main(int argc, char *argv[])12{
13int fd = -1, ret = -1, len = 0;14char *path = NULL,15buf[128] =16{170,18},19*cmd = NULL;20struct stat stbuf = {210,22};23int write_to_child[2] =24{250,26},27write_to_parent[2] = {280,29};30
31path = argv[1];32cmd = argv[2];33
34assert(argc == 3);35
36ret = pipe(write_to_child);37if (ret < 0) {38fprintf(stderr,39"creation of write-to-child pipe failed "40"(%s)\n",41strerror(errno));42goto out;43}44
45ret = pipe(write_to_parent);46if (ret < 0) {47fprintf(stderr,48"creation of write-to-parent pipe failed "49"(%s)\n",50strerror(errno));51goto out;52}53
54ret = fork();55switch (ret) {56case 0:57close(write_to_child[1]);58close(write_to_parent[0]);59
60/* child, wait for instructions to execute command */61ret = read(write_to_child[0], buf, 128);62if (ret < 0) {63fprintf(stderr, "child: read on pipe failed (%s)\n",64strerror(errno));65goto out;66}67
68system(cmd);69
70ret = write(write_to_parent[1], "1", 2);71if (ret < 0) {72fprintf(stderr, "child: write to pipe failed (%s)\n",73strerror(errno));74goto out;75}76break;77
78case -1:79fprintf(stderr, "fork failed (%s)\n", strerror(errno));80goto out;81
82default:83close(write_to_parent[1]);84close(write_to_child[0]);85
86fd = open(path, O_CREAT | O_RDWR | O_APPEND, S_IRWXU);87if (fd < 0) {88fprintf(stderr, "open failed (%s)\n", strerror(errno));89goto out;90}91
92len = strlen("test-content") + 1;93ret = write(fd, "test-content", len);94
95if (ret < len) {96fprintf(stderr, "write failed %d (%s)\n", ret, strerror(errno));97}98
99ret = pread(fd, buf, 128, 0);100if ((ret == len) && (strcmp(buf, "test-content") == 0)) {101fprintf(stderr,102"read should've failed as previous "103"write would've failed with EDQUOT, but its "104"successful");105ret = -1;106goto out;107}108
109ret = write(write_to_child[1], "1", 2);110if (ret < 0) {111fprintf(stderr, "parent: write to pipe failed (%s)\n",112strerror(errno));113goto out;114}115
116ret = read(write_to_parent[0], buf, 128);117if (ret < 0) {118fprintf(stderr, "parent: read from pipe failed (%s)\n",119strerror(errno));120goto out;121}122
123/* this will force a sync on cached-write and now that quota124limit is increased, sync will be successful. ignore return
125value as fstat would fail with EDQUOT (picked up from
126cached-write because of previous sync failure.
127*/
128fstat(fd, &stbuf);129
130ret = pread(fd, buf, 128, 0);131if (ret != len) {132fprintf(stderr,133"post cmd read failed %d (data:%s) "134"(error:%s)\n",135ret, buf, strerror(errno));136goto out;137}138
139if (strcmp(buf, "test-content")) {140fprintf(stderr, "wrong data (%s)\n", buf);141goto out;142}143}144
145ret = 0;146
147out:148return ret;149}
150