[CRIU] [crtools-bot] util: move recv_fd and send_fd in a separate
file
Cyrill Gorcunov
gorcunov at openvz.org
Wed Feb 1 10:26:41 EST 2012
The commit is pushed to "master" and will appear on git://github.com/cyrillos/crtools.git
------>
commit 1465fade3b10e3329123ae474c9a00e62d3864fa
Author: Andrey Vagin <avagin at openvz.org>
Date: Wed Feb 1 13:00:49 2012 +0300
util: move recv_fd and send_fd in a separate file
It will be used in the parasite
Signed-off-by: Andrey Vagin <avagin at openvz.org>
Acked-by: Pavel Emelyanov <xemul at parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
Makefile | 1 +
files.c | 78 ++++-----------------------------------------------
include/util-net.h | 9 ++++++
util-net.c | 68 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 85 insertions(+), 71 deletions(-)
diff --git a/Makefile b/Makefile
index 9d92cf6..ab67166 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,7 @@ OBJS += proc_parse.o
OBJS += cr-dump.o
OBJS += cr-show.o
OBJS += util.o
+OBJS += util-net.o
OBJS += ptrace.o
OBJS += log.o
OBJS += libnetlink.o
diff --git a/files.c b/files.c
index abcf882..7cafa69 100644
--- a/files.c
+++ b/files.c
@@ -16,11 +16,9 @@
#include "image.h"
#include "list.h"
#include "util.h"
+#include "util-net.h"
#include "lock.h"
-#define UNIX_PATH_MAX (sizeof(struct sockaddr_un) - \
- (size_t)((struct sockaddr_un *) 0)->sun_path)
-
enum fdinfo_states {
FD_STATE_PREP, /* Create unix sockets */
FD_STATE_CREATE, /* Create and send fd */
@@ -326,13 +324,7 @@ static int open_fd(int pid, struct fdinfo_entry *fe,
(unsigned long)fe->addr, fe->type, fe->len, fi->users);
list_for_each_entry(fle, &fi->list, list) {
- struct msghdr hdr;
- struct iovec data;
- char cmsgbuf[CMSG_SPACE(sizeof(int))];
- struct cmsghdr *cmsg;
- int *cmsg_data;
-
- char dummy = '*';
+ int len;
fi->users--;
@@ -342,35 +334,15 @@ static int open_fd(int pid, struct fdinfo_entry *fe,
pr_info("Wait fdinfo pid=%d fd=%d\n", fle->pid, fle->fd);
cr_wait_while(&fle->real_pid, 0);
+ pr_info("Send fd %d to %s\n", (int)fe->addr, saddr.sun_path + 1);
+
saddr.sun_family = AF_UNIX;
snprintf(saddr.sun_path, UNIX_PATH_MAX,
"X/crtools-fd-%d-%d", fle->real_pid, fle->fd);
-
- pr_info("Send fd %ld to %s\n", fe->addr, saddr.sun_path + 1);
-
- data.iov_base = &dummy;
- data.iov_len = sizeof(dummy);
-
- hdr.msg_name = (struct sockaddr *)&saddr;
- hdr.msg_namelen = SUN_LEN(&saddr);
+ len = SUN_LEN(&saddr);
*saddr.sun_path = '\0';
- hdr.msg_iov = &data;
- hdr.msg_iovlen = 1;
- hdr.msg_flags = 0;
- hdr.msg_control = &cmsgbuf;
- hdr.msg_controllen = CMSG_LEN(sizeof(int));
-
- cmsg = CMSG_FIRSTHDR(&hdr);
- cmsg->cmsg_len = hdr.msg_controllen;
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
-
- cmsg_data = (int *)CMSG_DATA(cmsg);
- *cmsg_data = fe->addr;
-
- tmp = sendmsg(sock, &hdr, 0);
- if (tmp < 0) {
+ if (send_fd(sock, &saddr, len, fe->addr) < 0) {
pr_perror("Can't send file descriptor");
return -1;
}
@@ -382,42 +354,6 @@ out:
return 0;
}
-static int recv_fd(int sock)
-{
- struct msghdr msg;
- struct iovec iov;
- char buf[1];
- char ccmsg[CMSG_SPACE(sizeof(int))];
- struct cmsghdr *cmsg;
- int *cmsg_data;
- iov.iov_base = buf;
- iov.iov_len = 1;
- int ret;
-
- msg.msg_name = 0;
- msg.msg_namelen = 0;
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
- msg.msg_control = ccmsg;
- msg.msg_controllen = sizeof(ccmsg);
-
- ret = recvmsg(sock, &msg, 0);
- if (ret == -1) {
- pr_perror("recvmsg");
- return -1;
- }
-
- cmsg = CMSG_FIRSTHDR(&msg);
- if (!cmsg->cmsg_type == SCM_RIGHTS) {
- pr_perror("got control message of unknown type %d",
- cmsg->cmsg_type);
- return -1;
- }
-
- cmsg_data = (int *)CMSG_DATA(cmsg);
- return *cmsg_data;
-}
-
static int receive_fd(int pid, struct fdinfo_entry *fe, struct fdinfo_desc *fi)
{
int tmp;
@@ -440,7 +376,7 @@ static int receive_fd(int pid, struct fdinfo_entry *fe, struct fdinfo_desc *fi)
tmp = recv_fd(fe->addr);
if (tmp < 0) {
- pr_err("Can't get fd");
+ pr_err("Can't get fd %d\n", tmp);
return -1;
}
close(fe->addr);
diff --git a/include/util-net.h b/include/util-net.h
new file mode 100644
index 0000000..dbcad61
--- /dev/null
+++ b/include/util-net.h
@@ -0,0 +1,9 @@
+#ifndef UTIL_NET_H_
+#define UTIL_NET_H_
+
+#define UNIX_PATH_MAX (sizeof(struct sockaddr_un) - \
+ (size_t)((struct sockaddr_un *) 0)->sun_path)
+
+extern int send_fd(int sock, struct sockaddr_un *saddr, int len, int fd);
+extern int recv_fd(int sock);
+#endif
diff --git a/util-net.c b/util-net.c
new file mode 100644
index 0000000..0bc6490
--- /dev/null
+++ b/util-net.c
@@ -0,0 +1,68 @@
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include "syscall.h"
+
+int send_fd(int sock, struct sockaddr_un *saddr, int len, int fd)
+{
+ struct msghdr hdr;
+ struct iovec data;
+ char cmsgbuf[CMSG_SPACE(sizeof(int))];
+ struct cmsghdr* cmsg;
+ int *cmsg_data;
+ char dummy = '*';
+
+ data.iov_base = &dummy;
+ data.iov_len = sizeof(dummy);
+
+ hdr.msg_name = (struct sockaddr *)saddr;
+ hdr.msg_namelen = len;
+ hdr.msg_iov = &data;
+ hdr.msg_iovlen = 1;
+ hdr.msg_flags = 0;
+
+ hdr.msg_control = &cmsgbuf;
+ hdr.msg_controllen = CMSG_LEN(sizeof(int));
+
+ cmsg = CMSG_FIRSTHDR(&hdr);
+ cmsg->cmsg_len = hdr.msg_controllen;
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+
+ cmsg_data = (int *)CMSG_DATA(cmsg);
+ *cmsg_data = fd;
+
+ return sys_sendmsg(sock, &hdr, 0);
+}
+
+int recv_fd(int sock)
+{
+ struct msghdr msg;
+ struct iovec iov;
+ char buf[1];
+ char ccmsg[CMSG_SPACE(sizeof(int))];
+ struct cmsghdr *cmsg;
+ int *cmsg_data;
+ iov.iov_base = buf;
+ iov.iov_len = 1;
+ int ret;
+
+ msg.msg_name = 0;
+ msg.msg_namelen = 0;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = ccmsg;
+ msg.msg_controllen = sizeof(ccmsg);
+
+ ret = sys_recvmsg(sock, &msg, 0);
+ if (ret < 0)
+ return ret;
+
+ cmsg = CMSG_FIRSTHDR(&msg);
+ if (!cmsg->cmsg_type == SCM_RIGHTS)
+ return -2;
+
+ cmsg_data = (int *)CMSG_DATA(cmsg);
+ return *cmsg_data;
+}
+
More information about the CRIU
mailing list