int init_connection(struct srv_connection *conn, int cli_ct){ int i; conn->cli_ct = cli_ct; conn->cli = (struct client*) malloc(conn->cli_ct*sizeof(struct client)); conn->srv_sfd = get_srv_socket(); connect_clients(conn); conn->active_ct = conn->cli_ct; for(i=0; i<conn->cli_ct; i++) { conn->cli[i].last_hdr.code=MSG_NULL; } }
int cr_plugin_dump_unix_sk(int sk, int sk_id) { struct sockaddr_un addr; socklen_t addr_len = sizeof(addr); char buf[4096]; int skd, id, ret, fd, len; UnixTest e = UNIX_TEST__INIT; if (getpeername(sk, (struct sockaddr *) &addr, &addr_len)) { pr_perror("getpeername"); return -1; } len = addr_len - sizeof(addr.sun_family); if (addr.sun_path[len - 1] == 0) len--; if (len != strlen(SK_NAME) || strncmp(addr.sun_path, SK_NAME, strlen(SK_NAME))) return -ENOTSUP; pr_info("Dump the socket %x\n", sk_id); skd = get_srv_socket(); if (skd < 0) return -1; addr_len = sizeof(struct sockaddr_un); if (getsockname(sk, (struct sockaddr *) &addr, &addr_len) < 0) return -1; id = atoi(addr.sun_path + strlen(SK_NAME)); ret = sprintf(buf, "d%d", id) + 1; if (send(skd, buf, ret, 0) < 0) { pr_perror("send"); return -1; } if (recv(skd, buf, sizeof(buf), 0) <= 0) return -1; close(skd); e.val = atoi(buf); pr_err("%x: val %d\n", sk_id, e.val); e.name.data = (void *)addr.sun_path; e.name.len = addr_len - sizeof(addr.sun_family); snprintf(buf, sizeof(buf), "unix-test-%x.img", sk_id); fd = openat(criu_get_image_dir(), buf, O_WRONLY | O_CREAT, 0600); if (fd < 0) return -1; if (unix_test__get_packed_size(&e) > sizeof(buf)) { pr_err("%ld\n", unix_test__get_packed_size(&e)); return -1; } ret = unix_test__pack(&e, (uint8_t *) buf); if (write(fd, buf, ret) != ret) return -1; close(fd); return 0; }