Commit 0acc2624 authored by Pavel Emelyanov's avatar Pavel Emelyanov

service: Remove sk fd from service state struct

This fd is an internal thing of the service. Remove it from
externally available structure.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 0521367f
...@@ -75,22 +75,21 @@ int send_criu_dump_resp(int socket_fd, bool success, bool restored) ...@@ -75,22 +75,21 @@ int send_criu_dump_resp(int socket_fd, bool success, bool restored)
return send_criu_msg(socket_fd, &msg); return send_criu_msg(socket_fd, &msg);
} }
static int setup_dump_from_req(CriuDumpReq *req) static int setup_dump_from_req(int sk, CriuDumpReq *req)
{ {
struct ucred ids; struct ucred ids;
struct stat st; struct stat st;
socklen_t ids_len = sizeof(struct ucred); socklen_t ids_len = sizeof(struct ucred);
char images_dir_path[PATH_MAX]; char images_dir_path[PATH_MAX];
if (getsockopt(cr_service_client->sk_fd, SOL_SOCKET, SO_PEERCRED, if (getsockopt(sk, SOL_SOCKET, SO_PEERCRED, &ids, &ids_len)) {
&ids, &ids_len)) {
pr_perror("Can't get socket options."); pr_perror("Can't get socket options.");
return -1; return -1;
} }
cr_service_client->uid = ids.uid; cr_service_client->uid = ids.uid;
if (fstat(cr_service_client->sk_fd, &st)) { if (fstat(sk, &st)) {
pr_perror("Can't get socket stat"); pr_perror("Can't get socket stat");
return -1; return -1;
} }
...@@ -146,11 +145,11 @@ static int setup_dump_from_req(CriuDumpReq *req) ...@@ -146,11 +145,11 @@ static int setup_dump_from_req(CriuDumpReq *req)
return 0; return 0;
} }
static int dump_using_req(CriuDumpReq *req) static int dump_using_req(int sk, CriuDumpReq *req)
{ {
bool success = false; bool success = false;
if (setup_dump_from_req(req) == -1) { if (setup_dump_from_req(sk, req) == -1) {
pr_perror("Arguments treating fail"); pr_perror("Arguments treating fail");
goto exit; goto exit;
} }
...@@ -163,30 +162,28 @@ static int dump_using_req(CriuDumpReq *req) ...@@ -163,30 +162,28 @@ static int dump_using_req(CriuDumpReq *req)
if (req->has_leave_running && req->leave_running) { if (req->has_leave_running && req->leave_running) {
success = true; success = true;
exit: exit:
if (send_criu_dump_resp(cr_service_client->sk_fd, if (send_criu_dump_resp(sk, success, false) == -1) {
success, false) == -1) {
pr_perror("Can't send response"); pr_perror("Can't send response");
success = false; success = false;
} }
} }
close(cr_service_client->sk_fd); close(sk);
return success ? 0 : 1; return success ? 0 : 1;
} }
static int cr_service_work(void) static int cr_service_work(int sk)
{ {
CriuReq *msg = 0; CriuReq *msg = 0;
if (recv_criu_msg(cr_service_client->sk_fd, if (recv_criu_msg(sk, &msg) == -1) {
&msg) == -1) {
pr_perror("Can't recv request"); pr_perror("Can't recv request");
goto err; goto err;
} }
switch (msg->type) { switch (msg->type) {
case CRIU_REQ_TYPE__DUMP: case CRIU_REQ_TYPE__DUMP:
return dump_using_req(msg->dump); return dump_using_req(sk, msg->dump);
default: { default: {
CriuResp resp = CRIU_RESP__INIT; CriuResp resp = CRIU_RESP__INIT;
...@@ -196,14 +193,14 @@ static int cr_service_work(void) ...@@ -196,14 +193,14 @@ static int cr_service_work(void)
/* XXX -- add optional error code to CriuResp */ /* XXX -- add optional error code to CriuResp */
pr_perror("Invalid request"); pr_perror("Invalid request");
send_criu_msg(cr_service_client->sk_fd, &resp); send_criu_msg(sk, &resp);
goto err; goto err;
} }
} }
err: err:
close(cr_service_client->sk_fd); close(sk);
return -1; return -1;
} }
...@@ -280,12 +277,12 @@ int cr_service(bool daemon_mode) ...@@ -280,12 +277,12 @@ int cr_service(bool daemon_mode)
signal(SIGCHLD, SIG_IGN); signal(SIGCHLD, SIG_IGN);
while (1) { while (1) {
int sk;
pr_info("Waiting for connection...\n"); pr_info("Waiting for connection...\n");
cr_service_client->sk_fd = accept(server_fd, sk = accept(server_fd, &client_addr, &client_addr_len);
&client_addr, if (sk == -1) {
&client_addr_len);
if (cr_service_client->sk_fd == -1) {
pr_perror("Can't accept connection."); pr_perror("Can't accept connection.");
goto err; goto err;
} }
...@@ -294,12 +291,12 @@ int cr_service(bool daemon_mode) ...@@ -294,12 +291,12 @@ int cr_service(bool daemon_mode)
switch (child_pid = fork()) { switch (child_pid = fork()) {
case 0: case 0:
exit(cr_service_work()); exit(cr_service_work(sk));
case -1: case -1:
pr_perror("Can't fork a child."); pr_perror("Can't fork a child.");
/* fall through */ /* fall through */
default: default:
close(cr_service_client->sk_fd); close(sk);
} }
} }
......
...@@ -13,7 +13,6 @@ int send_criu_dump_resp(int socket_fd, bool success, bool restored); ...@@ -13,7 +13,6 @@ int send_criu_dump_resp(int socket_fd, bool success, bool restored);
struct _cr_service_client { struct _cr_service_client {
int sk_ino; int sk_ino;
int uid; int uid;
int sk_fd;
}; };
extern struct _cr_service_client *cr_service_client; extern struct _cr_service_client *cr_service_client;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment