[CRIU] Re: [PATCH v2 1/2] namespaces: split UTS and generic code
Stanislav Kinsbursky
skinsbursky at parallels.com
Mon Jan 30 10:41:42 EST 2012
Drop this
30.01.2012 19:35, Kinsbursky Stanislav пишет:
> From: Stanislav Kinsbursky<skinsbursky at parallels.com>
>
> Generic code will be used for other namespaces.
>
> Signed-off-by: Stanislav Kinsbursky<skinsbursky at parallels.com>
>
> ---
> Makefile | 1
> cr-show.c | 1
> include/namespaces.h | 2 -
> include/uts_ns.h | 10 ++++
> namespaces.c | 134 +-------------------------------------------------
> uts_ns.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 150 insertions(+), 133 deletions(-)
> create mode 100644 include/uts_ns.h
> create mode 100644 uts_ns.c
>
> diff --git a/Makefile b/Makefile
> index 4f1e500..712a7d6 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -39,6 +39,7 @@ OBJS += libnetlink.o
> OBJS += sockets.o
> OBJS += files.o
> OBJS += namespaces.o
> +OBJS += uts_ns.o
>
> OBJS-BLOB += parasite.o
> SRCS-BLOB += $(patsubst %.o,%.c,$(OBJS-BLOB))
> diff --git a/cr-show.c b/cr-show.c
> index c012e69..68174d1 100644
> --- a/cr-show.c
> +++ b/cr-show.c
> @@ -19,6 +19,7 @@
> #include "util.h"
> #include "sockets.h"
> #include "image.h"
> +#include "uts_ns.h"
>
> #define DEF_PAGES_PER_LINE 6
>
> diff --git a/include/namespaces.h b/include/namespaces.h
> index 518855f..f7bd0fa 100644
> --- a/include/namespaces.h
> +++ b/include/namespaces.h
> @@ -3,5 +3,5 @@
> int dump_namespaces(int pid);
> int prepare_namespace(int pid, unsigned long clone_flags);
> int try_show_namespaces(int pid);
> -void show_utsns(int fd);
> +int switch_ns(int pid, int type, char *ns);
> #endif
> diff --git a/include/uts_ns.h b/include/uts_ns.h
> new file mode 100644
> index 0000000..2e51ae1
> --- /dev/null
> +++ b/include/uts_ns.h
> @@ -0,0 +1,10 @@
> +#ifndef CR_UTS_NS_H_
> +#define CR_UTS_NS_H_
> +
> +#include "crtools.h"
> +
> +int dump_uts_ns(int ns_pid, struct cr_fdset *fdset);
> +void show_utsns(int fd);
> +int prepare_utsns(int pid);
> +
> +#endif /* CR_UTS_NS_H_ */
> diff --git a/namespaces.c b/namespaces.c
> index 6370bc2..7aa6f6c 100644
> --- a/namespaces.c
> +++ b/namespaces.c
> @@ -1,13 +1,11 @@
> #include<unistd.h>
> #include<fcntl.h>
> #include<sys/wait.h>
> -#include<sys/types.h>
> -#include<sys/utsname.h>
> #include "util.h"
> -#include "crtools.h"
> #include "syscall.h"
> +#include "uts_ns.h"
>
> -static int switch_ns(int pid, int type, char *ns)
> +int switch_ns(int pid, int type, char *ns)
> {
> char buf[32];
> int nsfd, ret;
> @@ -28,43 +26,6 @@ out:
> return ret;
> }
>
> -static int dump_uts_string(int fd, char *str)
> -{
> - int ret;
> - u32 len;
> -
> - len = strlen(str);
> - ret = write_img(fd,&len);
> - if (ret == 0)
> - ret = write_img_buf(fd, str, len);
> -
> - return ret;
> -}
> -
> -static int dump_uts_ns(int ns_pid, struct cr_fdset *fdset)
> -{
> - int fd, ret;
> - struct utsname ubuf;
> -
> - ret = switch_ns(ns_pid, CLONE_NEWUTS, "uts");
> - if (ret< 0)
> - return ret;
> -
> - ret = uname(&ubuf);
> - if (ret< 0) {
> - pr_perror("Error calling uname\n");
> - return ret;
> - }
> -
> - fd = fdset->fds[CR_FD_UTSNS];
> -
> - ret = dump_uts_string(fd, ubuf.nodename);
> - if (!ret)
> - ret = dump_uts_string(fd, ubuf.domainname);
> -
> - return ret;
> -}
> -
> static int do_dump_namespaces(int ns_pid)
> {
> struct cr_fdset *fdset;
> @@ -124,67 +85,6 @@ int dump_namespaces(int ns_pid)
> return 0;
> }
>
> -static int prepare_uts_str(int fd, char *n)
> -{
> - int ret;
> - u32 len;
> - char str[65], path[128];
> -
> - ret = read_img(fd,&len);
> - if (ret> 0) {
> - if (len>= 65) {
> - pr_err("Corrupted %s\n", n);
> - return -1;
> - }
> -
> - ret = read_img_buf(fd, str, len);
> - if (ret< 0)
> - return -1;
> -
> - str[len] = '\0';
> -
> - snprintf(path, sizeof(path),
> - "/proc/sys/kernel/%s", n);
> - fd = open(path, O_WRONLY);
> - if (fd< 0) {
> - pr_perror("Can't open %s\n", path);
> - return -1;
> - }
> -
> - pr_info("Restoging %s to [%s]\n", n, str);
> -
> - ret = write(fd, str, len);
> - close(fd);
> - if (ret != len) {
> - pr_perror("Can't write %s to %s\n",
> - str, path);
> - return -1;
> - }
> -
> - ret = 0;
> - }
> -
> - return ret;
> -}
> -
> -static int prepare_utsns(int pid)
> -{
> - int fd, ret;
> - u32 len;
> - char str[65];
> -
> - fd = open_image_ro(CR_FD_UTSNS, pid);
> - if (fd< 0)
> - return -1;
> -
> - ret = prepare_uts_str(fd, "hostname");
> - if (!ret)
> - ret = prepare_uts_str(fd, "domainname");
> -
> - close(fd);
> - return ret;
> -}
> -
> int prepare_namespace(int pid, unsigned long clone_flags)
> {
> int ret = 0;
> @@ -198,36 +98,6 @@ int prepare_namespace(int pid, unsigned long clone_flags)
> return ret;
> }
>
> -static void show_uts_string(int fd, char *n)
> -{
> - int ret;
> - u32 len;
> - char str[65];
> -
> - ret = read_img(fd,&len);
> - if (ret> 0) {
> - if (len>= 65) {
> - pr_err("Corrupted hostname\n");
> - return;
> - }
> -
> - ret = read_img_buf(fd, str, len);
> - if (ret< 0)
> - return;
> -
> - str[len] = '\0';
> - pr_info("%s: [%s]\n", n, str);
> - }
> -}
> -
> -void show_utsns(int fd)
> -{
> - pr_img_head(CR_FD_UTSNS);
> - show_uts_string(fd, "hostname");
> - show_uts_string(fd, "domainname");
> - pr_img_tail(CR_FD_UTSNS);
> -}
> -
> int try_show_namespaces(int ns_pid)
> {
> struct cr_fdset *fdset;
> diff --git a/uts_ns.c b/uts_ns.c
> new file mode 100644
> index 0000000..bb4fcb4
> --- /dev/null
> +++ b/uts_ns.c
> @@ -0,0 +1,135 @@
> +#include<unistd.h>
> +#include<fcntl.h>
> +#include<sys/utsname.h>
> +#include "util.h"
> +#include "crtools.h"
> +#include "syscall.h"
> +#include "namespaces.h"
> +
> +static int dump_uts_string(int fd, char *str)
> +{
> + int ret;
> + u32 len;
> +
> + len = strlen(str);
> + ret = write_img(fd,&len);
> + if (ret == 0)
> + ret = write_img_buf(fd, str, len);
> +
> + return ret;
> +}
> +
> +int dump_uts_ns(int ns_pid, struct cr_fdset *fdset)
> +{
> + int fd, ret;
> + struct utsname ubuf;
> +
> + ret = switch_ns(ns_pid, CLONE_NEWUTS, "uts");
> + if (ret< 0)
> + return ret;
> +
> + ret = uname(&ubuf);
> + if (ret< 0) {
> + pr_perror("Error calling uname\n");
> + return ret;
> + }
> +
> + fd = fdset->fds[CR_FD_UTSNS];
> +
> + ret = dump_uts_string(fd, ubuf.nodename);
> + if (!ret)
> + ret = dump_uts_string(fd, ubuf.domainname);
> +
> + return ret;
> +}
> +
> +static int prepare_uts_str(int fd, char *n)
> +{
> + int ret;
> + u32 len;
> + char str[65], path[128];
> +
> + ret = read_img(fd,&len);
> + if (ret> 0) {
> + if (len>= 65) {
> + pr_err("Corrupted %s\n", n);
> + return -1;
> + }
> +
> + ret = read_img_buf(fd, str, len);
> + if (ret< 0)
> + return -1;
> +
> + str[len] = '\0';
> +
> + snprintf(path, sizeof(path),
> + "/proc/sys/kernel/%s", n);
> + fd = open(path, O_WRONLY);
> + if (fd< 0) {
> + pr_perror("Can't open %s\n", path);
> + return -1;
> + }
> +
> + pr_info("Restoging %s to [%s]\n", n, str);
> +
> + ret = write(fd, str, len);
> + close(fd);
> + if (ret != len) {
> + pr_perror("Can't write %s to %s\n",
> + str, path);
> + return -1;
> + }
> +
> + ret = 0;
> + }
> +
> + return ret;
> +}
> +
> +int prepare_utsns(int pid)
> +{
> + int fd, ret;
> + u32 len;
> + char str[65];
> +
> + fd = open_image_ro(CR_FD_UTSNS, pid);
> + if (fd< 0)
> + return -1;
> +
> + ret = prepare_uts_str(fd, "hostname");
> + if (!ret)
> + ret = prepare_uts_str(fd, "domainname");
> +
> + close(fd);
> + return ret;
> +}
> +
> +static void show_uts_string(int fd, char *n)
> +{
> + int ret;
> + u32 len;
> + char str[65];
> +
> + ret = read_img(fd,&len);
> + if (ret> 0) {
> + if (len>= 65) {
> + pr_err("Corrupted hostname\n");
> + return;
> + }
> +
> + ret = read_img_buf(fd, str, len);
> + if (ret< 0)
> + return;
> +
> + str[len] = '\0';
> + pr_info("%s: [%s]\n", n, str);
> + }
> +}
> +
> +void show_utsns(int fd)
> +{
> + pr_img_head(CR_FD_UTSNS);
> + show_uts_string(fd, "hostname");
> + show_uts_string(fd, "domainname");
> + pr_img_tail(CR_FD_UTSNS);
> +}
>
--
Best regards,
Stanislav Kinsbursky
More information about the CRIU
mailing list