int main(int argc, char ** argv) { char src[PATH_MAX], dst[PATH_MAX], *root; char *dname = "/tmp/zdtm_ext_auto.XXXXXX"; int status; pid_t pid; root = getenv("ZDTM_ROOT"); if (root == NULL) { pr_perror("root"); return 1; } sprintf(dst, "%s/ext_mounts", getenv("ZDTM_ROOT")); if (strcmp(getenv("ZDTM_NEWNS"), "1")) goto test; pid = fork(); if (pid < 0) return 1; if (pid == 0) { test_ext_init(argc, argv); mkdir(dname, 755); sprintf(src, "%s/test", dname); if (mount("zdtm_auto_ext_mnt", dname, "tmpfs", 0, NULL)) { pr_perror("mount"); return 1; } mkdir(src, 755); mkdir(dst, 755); if (mount(src, dst, NULL, MS_BIND, NULL)) { pr_perror("bind"); return 1; } return 0; } wait(&status); if (status != 0) return 1; test: test_init(argc, argv); test_daemon(); test_waitsig(); pass(); return 0; }
int main(int argc, char **argv) { int fd, fd_s, ctl_fd; pid_t extpid; int pfd[2]; int sk_bsize; int ret, snd, snd_size, rcv_size = 0, rcv_buf_size; #ifdef ZDTM_TCP_LOCAL test_init(argc, argv); #endif if (pipe(pfd)) { pr_perror("pipe() failed"); return 1; } extpid = fork(); if (extpid < 0) { pr_perror("fork() failed"); return 1; } else if (extpid == 0) { int size; char c; #ifndef ZDTM_TCP_LOCAL test_ext_init(argc, argv); #endif close(pfd[1]); read_safe(pfd[0], &port, sizeof(port)); fd = tcp_init_client(ZDTM_FAMILY, "127.0.0.1", port); if (fd < 0) return 1; ctl_fd = tcp_init_client(ZDTM_FAMILY, "127.0.0.1", port); if (fd < 0) return 1; snd_size = fill_sock_buf(fd); if (snd_size <= 0) return 1; write_safe(ctl_fd, &snd_size, sizeof(snd_size)); read_safe(ctl_fd, &rcv_buf_size, sizeof(rcv_buf_size)); while (1) { /* heart beat */ read_safe(ctl_fd, &ret, sizeof(ret)); if (ret < 0) break; rcv_buf_size += ret; snd = fill_sock_buf(fd); if (snd < 0) return -1; snd_size += snd; if (rcv_buf_size / 2) { ret = clean_sk_buf(fd, rcv_buf_size / 2); if (ret <= 0) return 1; } else ret = 0; rcv_buf_size -= ret; rcv_size += ret; write_safe(ctl_fd, &snd, sizeof(snd)); } read_safe(ctl_fd, &ret, sizeof(ret)); rcv_buf_size += ret; write_safe(ctl_fd, &snd_size, sizeof(snd_size)); if (read(ctl_fd, &c, 1) != 0) { pr_perror("read"); return 1; } if (shutdown(fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } size = clean_sk_buf(fd, 0); if (size < 0) return 1; if (size != rcv_buf_size) { fail("the received buffer contains only %d bytes (%d)\n", size, rcv_buf_size); } rcv_size += size; write_safe(ctl_fd, &rcv_size, sizeof(rcv_size)); close(fd); return 0; } #ifndef ZDTM_TCP_LOCAL test_init(argc, argv); #endif if ((fd_s = tcp_init_server(ZDTM_FAMILY, &port)) < 0) { pr_perror("initializing server failed"); return 1; } close(pfd[0]); write_safe(pfd[1], &port, sizeof(port)); close(pfd[1]); /* * parent is server of TCP connection */ fd = tcp_accept_server(fd_s); if (fd < 0) { pr_perror("can't accept client connection %m"); return 1; } ctl_fd = tcp_accept_server(fd_s); if (ctl_fd < 0) { pr_perror("can't accept client connection %m"); return 1; } sk_bsize = TCP_MAX_BUF; if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sk_bsize, sizeof(sk_bsize)) == -1) { pr_perror("Can't set snd buf"); return 1; } sk_bsize = TCP_MAX_BUF; if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &sk_bsize, sizeof(sk_bsize)) == -1) { pr_perror("Can't set snd buf"); return 1; } snd_size = fill_sock_buf(fd); if (snd_size <= 0) return 1; read_safe(ctl_fd, &rcv_buf_size, sizeof(rcv_buf_size)); write_safe(ctl_fd, &snd_size, sizeof(snd_size)); test_daemon(); snd = 0; while (test_go()) { /* heart beat */ if (rcv_buf_size / 2) { ret = clean_sk_buf(fd, rcv_buf_size / 2); if (ret <= 0) return 1; } else ret = 0; rcv_size += ret; rcv_buf_size -= ret; write_safe(ctl_fd, &snd, sizeof(snd)); read_safe(ctl_fd, &ret, sizeof(ret)); rcv_buf_size += ret; snd = fill_sock_buf(fd); if (snd < 0) return -1; snd_size += snd; } ret = -1; write_safe(ctl_fd, &ret, sizeof(ret)); write_safe(ctl_fd, &snd, sizeof(ret)); read_safe(ctl_fd, &snd, sizeof(snd)); if (shutdown(ctl_fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } if (shutdown(fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } ret = clean_sk_buf(fd, 0); if (ret != rcv_buf_size) { fail("the received buffer contains only %d bytes (%d)\n", ret, rcv_buf_size); } rcv_size += ret; if (snd != rcv_size) { fail("The child sent %d bytes, but the parent received %d bytes\n", rcv_buf_size, rcv_size); return 1; } read_safe(ctl_fd, &ret, sizeof(ret)); if (ret != snd_size) { fail("The parent sent %d bytes, but the child received %d bytes\n", snd_size, ret); return 1; } pass(); return 0; }
int main(int argc, char **argv) { char *newns = getenv("ZDTM_NEWNS"); int fd, fd_s, ctl_fd; pid_t extpid; int pfd[2]; int ret = 0, snd_size = 0, rcv_size = 0; #ifndef ZDTM_TCP_LAST_ACK char buf[BUF_SIZE]; #endif if (newns) test_init(argc, argv); if (pipe(pfd)) { pr_perror("pipe() failed"); return 1; } extpid = fork(); if (extpid < 0) { pr_perror("fork() failed"); return 1; } else if (extpid == 0) { int size = 0; char c; if (!newns) test_ext_init(argc, argv); close(pfd[1]); if (read(pfd[0], &port, sizeof(port)) != sizeof(port)) { pr_perror("Can't read port\n"); return 1; } close(pfd[0]); fd = tcp_init_client(ZDTM_FAMILY, "127.0.0.1", port); if (fd < 0) return 1; ctl_fd = tcp_init_client(ZDTM_FAMILY, "127.0.0.1", port); if (ctl_fd < 0) return 1; /* == The preparation stage == */ if (read(ctl_fd, &size, sizeof(size)) != sizeof(size)) { pr_perror("read"); return 1; } if (shutdown(fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } if (write(ctl_fd, &size, sizeof(size)) != sizeof(size)) { pr_perror("write"); return 1; } /* == End of the preparation stage == */ /* Checkpoint/restore */ /* == The final stage == */ if (read(ctl_fd, &c, 1) != 0) { pr_perror("read"); return 1; } #ifdef ZDTM_TCP_LAST_ACK size = clean_sk_buf(fd); if (size < 0) return 1; #else if (read(fd, buf, sizeof(buf)) != sizeof(TEST_MSG) || strncmp(buf, TEST_MSG, sizeof(TEST_MSG))) { pr_perror("read"); return 1; } #endif if (write(ctl_fd, &size, sizeof(size)) != sizeof(size)) { pr_perror("write"); return 1; } /* == End of the final stage == */ close(ctl_fd); close(fd); return 0; } if (!newns) test_init(argc, argv); if ((fd_s = tcp_init_server(ZDTM_SRV_FAMILY, &port)) < 0) { pr_err("initializing server failed"); return 1; } close(pfd[0]); if (write(pfd[1], &port, sizeof(port)) != sizeof(port)) { pr_perror("Can't send port"); return 1; } close(pfd[1]); /* * parent is server of TCP connection */ fd = tcp_accept_server(fd_s); if (fd < 0) { pr_err("can't accept client connection"); return 1; } ctl_fd = tcp_accept_server(fd_s); if (ctl_fd < 0) { pr_err("can't accept client connection"); return 1; } /* == The preparation stage == */ #ifdef ZDTM_TCP_LAST_ACK snd_size = fill_sock_buf(fd); if (snd_size <= 0) return 1; #endif if (write(ctl_fd, &ret, sizeof(ret)) != sizeof(ret)) { pr_perror("read"); return 1; } if (read(ctl_fd, &ret, sizeof(ret)) != sizeof(ret)) { pr_perror("read"); return 1; } /* == End of the preparation stage */ #ifdef ZDTM_TCP_LAST_ACK if (shutdown(fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } #endif test_daemon(); test_waitsig(); /* == The final stage == */ if (shutdown(ctl_fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } #ifndef ZDTM_TCP_LAST_ACK if (write(fd, TEST_MSG, sizeof(TEST_MSG)) != sizeof(TEST_MSG)) { pr_perror("write"); return 1; } if (shutdown(fd, SHUT_WR) == -1) { pr_perror("shutdown"); return 1; } #endif rcv_size = clean_sk_buf(fd); if (ret != rcv_size) { fail("The child sent %d bytes, but the parent received %d bytes\n", ret, rcv_size); return 1; } if (read(ctl_fd, &ret, sizeof(ret)) != sizeof(ret)) { pr_perror("read"); return 1; } /* == End of the final stage == */ if (ret != snd_size) { fail("The parent sent %d bytes, but the child received %d bytes\n", snd_size, ret); return 1; } pass(); return 0; }
int main(int argc, char **argv) { unsigned char buf[BUF_SIZE]; int fd, fd_s; pid_t extpid; uint32_t crc; int pfd[2]; int val; socklen_t optlen; if (pipe(pfd)) { err("pipe() failed"); return 1; } extpid = fork(); if (extpid < 0) { err("fork() failed"); return 1; } else if (extpid == 0) { test_ext_init(argc, argv); close(pfd[1]); if (read(pfd[0], &port, sizeof(port)) != sizeof(port)) { err("Can't read port\n"); return 1; } fd = tcp_init_client(ZDTM_FAMILY, "localhost", port); if (fd < 0) return 1; #ifdef STREAM while (1) { if (read_data(fd, buf, BUF_SIZE)) { err("read less then have to"); return 1; } if (datachk(buf, BUF_SIZE, &crc)) return 2; datagen(buf, BUF_SIZE, &crc); if (write_data(fd, buf, BUF_SIZE)) { err("can't write"); return 1; } } #else if (read_data(fd, buf, BUF_SIZE)) { err("read less then have to"); return 1; } if (datachk(buf, BUF_SIZE, &crc)) return 2; datagen(buf, BUF_SIZE, &crc); if (write_data(fd, buf, BUF_SIZE)) { err("can't write"); return 1; } #endif return 0; } test_init(argc, argv); if ((fd_s = tcp_init_server(ZDTM_FAMILY, &port)) < 0) { err("initializing server failed"); return 1; } close(pfd[0]); if (write(pfd[1], &port, sizeof(port)) != sizeof(port)) { err("Can't send port"); return 1; } close(pfd[1]); /* * parent is server of TCP connection */ fd = tcp_accept_server(fd_s); if (fd < 0) { err("can't accept client connection %m"); return 1; } val = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) { err("setsockopt"); return 1; } test_daemon(); #ifdef STREAM while (test_go()) { datagen(buf, BUF_SIZE, &crc); if (write_data(fd, buf, BUF_SIZE)) { err("can't write"); return 1; } if (read_data(fd, buf, BUF_SIZE)) { err("read less then have to"); return 1; } if (datachk(buf, BUF_SIZE, &crc)) return 2; } kill(extpid, SIGKILL); #else test_waitsig(); datagen(buf, BUF_SIZE, &crc); if (write_data(fd, buf, BUF_SIZE)) { err("can't write"); return 1; } if (read_data(fd, buf, BUF_SIZE)) { err("read less then have to"); return 1; } if (datachk(buf, BUF_SIZE, &crc)) return 2; #endif optlen = sizeof(val); if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, &optlen)) { err("getsockopt"); return 1; } if (val != 1) { fail("SO_REUSEADDR are not set for %d\n", fd); return 1; } pass(); return 0; }
int main(int argc, char *argv[]) { struct sockaddr_un addr; unsigned int addrlen; task_waiter_t lock; char dir[] = "/tmp/zdtm.unix.sock.XXXXXX"; char *path; pid_t pid; int ret, sk; char *val; unsetenv("ZDTM_GROUPS"); val = getenv("ZDTM_GID"); if (val && (setgid(atoi(val)) == -1)) { fprintf(stderr, "Can't set gid: %m"); exit(1); } val = getenv("ZDTM_UID"); if (val && (setuid(atoi(val)) == -1)) { fprintf(stderr, "Can't set uid: %m"); exit(1); } if (mkdtemp(dir) < 0) { pr_perror("mkdtemp(%s) failed", dir); return 1; } chmod(dir, 0777); addr.sun_family = AF_UNIX; snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s", dir, "sock"); path = addr.sun_path; addrlen = sizeof(addr.sun_family) + strlen(path); task_waiter_init(&lock); pid = fork(); if (pid < 0) { pr_perror("fork() failed"); return 1; } else if (pid == 0) { char c; test_ext_init(argc, argv); sk = socket(AF_UNIX, SOCK_DGRAM, 0); if (sk < 0) { pr_perror("Can't create socket"); return 1; } ret = bind(sk, (struct sockaddr *) &addr, addrlen); if (ret < 0) { pr_perror("Can't bind socket to %s", path); return 1; } chmod(dir, 0777); chmod(path, 0777); test_msg("The external socket %s\n", path); task_waiter_complete(&lock, 1); task_waiter_fini(&lock); recv(sk, &c, sizeof(c), 0); return 0; } task_waiter_wait4(&lock, 1); task_waiter_fini(&lock); test_init(argc, argv); sk = socket(AF_UNIX, SOCK_DGRAM, 0); if (sk < 0) { pr_perror("Can't create socket"); return 1; } ret = connect(sk, (struct sockaddr *) &addr, addrlen); if (ret < 0) { pr_perror("Can't connect socket"); return 1; } test_daemon(); test_waitsig(); if (unlink(path)) { pr_perror("Unable to remove %s\n", path); return 1; } if (rmdir(dir)) { pr_perror("Unable to remove %s", dir); return 1; } ret = send(sk, "H", 1, 0); if (ret != 1) { pr_perror("Can't send a symbol"); fail(); return 1; } pass(); return 0; }