[CRIU] [PATCH 3/7] namespace: Add parse_ns_proc helper

Pavel Emelyanov xemul at parallels.com
Thu May 9 13:53:46 EDT 2013


On 05/08/2013 05:00 PM, Cyrill Gorcunov wrote:
> It will help to parse procfs/ns links. Among other
> things we do check for ns names being known when
> we parse it.
> 
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  include/namespaces.h | 25 +++++++++++++++++++++++++
>  namespaces.c         | 35 +++++++++++++++++++++++++++++++++++
>  2 files changed, 60 insertions(+)
> 
> diff --git a/include/namespaces.h b/include/namespaces.h
> index c0a1ff7..bfe875c 100644
> --- a/include/namespaces.h
> +++ b/include/namespaces.h
> @@ -4,6 +4,31 @@
>  #include "crtools.h"
>  #include "pstree.h"
>  
> +enum {
> +	PROC_NS_NET,
> +	PROC_NS_UTS,
> +	PROC_NS_IPC,
> +	PROC_NS_PID,
> +	PROC_NS_USER,
> +	PROC_NS_MNT,
> +
> +	PROC_NS_MAX
> +};
> +
> +struct ns_proc_entry {
> +	char		*name;
> +	size_t		name_len;
> +	unsigned long	i_ino;
> +};
> +
> +#define NS_PROC_ENTRY(_index, _name)			\
> +	[_index] = {					\
> +		.name		= _name,		\
> +		.name_len	= sizeof(_name) - 1,	\

_index unused here. I see it in next patch and this makes me think that
the series is badly splitted.

> +	}
> +
> +extern int parse_ns_proc(char *link, size_t len, struct ns_proc_entry *found);
> +
>  int dump_namespaces(struct pid *pid, unsigned int ns_flags);
>  int prepare_namespace(int pid, unsigned long clone_flags);
>  struct cr_options;
> diff --git a/namespaces.c b/namespaces.c
> index a182d40..f95928c 100644
> --- a/namespaces.c
> +++ b/namespaces.c
> @@ -10,6 +10,41 @@
>  #include "namespaces.h"
>  #include "net.h"
>  
> +static struct ns_proc_entry ns_proc_entries[PROC_NS_MAX] = {
> +	NS_PROC_ENTRY(PROC_NS_NET,	"net"),
> +	NS_PROC_ENTRY(PROC_NS_UTS,	"uts"),
> +	NS_PROC_ENTRY(PROC_NS_IPC,	"ipc"),
> +	NS_PROC_ENTRY(PROC_NS_PID,	"pid"),
> +	NS_PROC_ENTRY(PROC_NS_USER,	"user"),
> +	NS_PROC_ENTRY(PROC_NS_MNT,	"mnt"),

We already have int <-> char * mapping for namespaces, no need in another int-s.

> +};
> +
> +int parse_ns_proc(char *link, size_t len, struct ns_proc_entry *found)
> +{
> +	unsigned int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(ns_proc_entries); i++) {
> +		size_t sz = ns_proc_entries[i].name_len;
> +		char *end = NULL;
> +
> +		if (len < sz + 2)
> +			continue;
> +
> +		if (link[sz] == ':' && !memcmp(link, ns_proc_entries[i].name, sz)) {
> +			found->i_ino	= strtoul(&link[sz + 2], &end, 10);
> +			found->name	= ns_proc_entries[i].name;
> +			found->name_len	= sz;
> +
> +			if (end && *end == ']')
> +				return 0;
> +			else
> +				return -EINVAL;
> +		}
> +	}
> +
> +	return -ENOENT;
> +}
> +
>  int switch_ns(int pid, struct ns_desc *nd, int *rst)
>  {
>  	char buf[32];
> 




More information about the CRIU mailing list