[CRIU] [PATCH 3/4] test: rpc: test.c
Ruslan Kuprieiev
kupruser at gmail.com
Fri Sep 20 18:20:24 EDT 2013
Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
-------------- next part --------------
diff --git a/test/rpc/test.c b/test/rpc/test.c
new file mode 100644
index 0000000..e52bdde
--- /dev/null
+++ b/test/rpc/test.c
@@ -0,0 +1,171 @@
+#include "rpc.pb-c.h"
+#include <stdbool.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/fcntl.h>
+#include <stdio.h>
+#include <dirent.h>
+
+#define MAX_MSG_SIZE 1024
+
+static CriuResp *recv_resp(int socket_fd)
+{
+ unsigned char buf[MAX_MSG_SIZE];
+ int len;
+ CriuResp *msg = 0;
+
+ len = read(socket_fd, buf, MAX_MSG_SIZE);
+ if (len == -1) {
+ perror("Can't read response");
+ return NULL;
+ }
+
+ msg = criu_resp__unpack(NULL, len, buf);
+ if (!msg) {
+ perror("Failed unpacking response");
+ return NULL;
+ }
+
+ return msg;
+}
+
+static int send_req(int socket_fd, CriuReq *req)
+{
+ unsigned char buf[MAX_MSG_SIZE];
+ int len;
+
+ len = criu_req__get_packed_size(req);
+
+ if (criu_req__pack(req, buf) != len) {
+ perror("Failed packing request");
+ return -1;
+ }
+
+ if (write(socket_fd, buf, len) == -1) {
+ perror("Can't send request");
+ return -1;
+ }
+
+ return 0;
+}
+
+int main()
+{
+ CriuReq req = CRIU_REQ__INIT;
+ CriuResp *resp = NULL;
+ int fd, dir_fd;
+ int ret = 0;
+ struct sockaddr_un addr;
+ socklen_t addr_len;
+ struct stat st = {0};
+
+ /*
+ * Open a directory, in which criu will
+ * put images
+ */
+ umask(0);
+
+ if (stat("imgs_c", &st)) {
+ if (mkdir("imgs_c", 0666)) {
+ perror("Can't create dir");
+ return -1;
+ }
+ }
+
+ dir_fd = open("imgs_c", O_DIRECTORY);
+ if (dir_fd == -1) {
+ perror("Can't open dir");
+ return -1;
+ }
+
+ /*
+ * Set "DUMP" type of request.
+ * Allocate CriuDumpReq.
+ */
+ req.type = CRIU_REQ_TYPE__DUMP;
+ req.dump = malloc(sizeof(CriuDumpReq));
+ if (!req.dump) {
+ perror("Can't allocate memory for dump request");
+ return -1;
+ }
+
+ criu_dump_req__init(req.dump);
+
+ /*
+ * Set dump options.
+ * Checkout more in protobuf/rpc.proto.
+ */
+ req.dump->has_leave_running = true;
+ req.dump->leave_running = true;
+ req.dump->images_dir_fd = dir_fd;
+ req.dump->has_shell_job = true;
+ req.dump->shell_job = true;
+ req.dump->log_level = 4;
+
+ /*
+ * Connect to service socket
+ */
+ fd = socket(AF_LOCAL, SOCK_SEQPACKET, 0);
+ if (fd == -1) {
+ perror("Can't create socket");
+ return -1;
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_LOCAL;
+
+ strcpy(addr.sun_path, "criu_service.socket");
+
+ addr_len = strlen(addr.sun_path) + sizeof(addr.sun_family);
+
+ ret = connect(fd, (struct sockaddr *) &addr, addr_len);
+ if (ret == -1) {
+ perror("Cant connect to socket");
+ goto exit;
+ }
+
+ /*
+ * Send request
+ */
+ ret = send_req(fd, &req);
+ if (ret == -1) {
+ perror("Can't send request");
+ goto exit;
+ }
+
+ /*
+ * Recv response
+ */
+ resp = recv_resp(fd);
+ if (!resp) {
+ perror("Can't recv response");
+ ret = -1;
+ goto exit;
+ }
+
+ if (resp->type != CRIU_REQ_TYPE__DUMP) {
+ perror("Unexpected response type");
+ ret = -1;
+ goto exit;
+ }
+
+ /*
+ * Check response.
+ */
+ if (resp->success)
+ puts("Success");
+ else {
+ puts("Fail");
+ ret = -1;
+ goto exit;
+ }
+
+ if (resp->dump->has_restored && resp->dump->restored)
+ puts("Restored");
+
+exit:
+ close(fd);
+ close(dir_fd);
+ criu_resp__free_unpacked(resp, NULL);
+ return ret;
+}
More information about the CRIU
mailing list