[Libct] [PATCH 1/7] libct: add new abstraction for processes

Andrey Vagin avagin at openvz.org
Thu Oct 30 01:55:08 PDT 2014


Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 src/Makefile             |  1 +
 src/include/process.h    | 29 +++++++++++++++++++++++++++++
 src/include/uapi/libct.h |  7 +++++++
 src/libct.c              | 11 +++++++++++
 src/process.c            | 33 +++++++++++++++++++++++++++++++++
 5 files changed, 81 insertions(+)
 create mode 100644 src/include/process.h
 create mode 100644 src/process.c

diff --git a/src/Makefile b/src/Makefile
index a83ec3d..050ef95 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -15,6 +15,7 @@ obj-y			+= async.o
 obj-y			+= util.o
 obj-y			+= devnodes.o
 obj-y			+= route.o
+obj-y			+= process.o
 
 cflags-y		+= -fPIC -Wa,--noexecstack -fno-stack-protector
 cflags-so		+= -rdynamic
diff --git a/src/include/process.h b/src/include/process.h
new file mode 100644
index 0000000..40e3afa
--- /dev/null
+++ b/src/include/process.h
@@ -0,0 +1,29 @@
+#ifndef __LIBCT_PROCESS_H__
+#define __LIBCT_PROCESS_H__
+
+#include "uapi/libct.h"
+
+#include "compiler.h"
+
+struct process_desc_ops {
+	ct_process_desc_t (*copy)(ct_process_desc_t h);
+	void (*destroy)(ct_process_desc_t p);
+};
+
+struct ct_process_desc {
+	const struct process_desc_ops *ops;
+};
+
+struct process_desc {
+	struct ct_process_desc       h;
+};
+
+static inline struct process_desc *prh2pr(ct_process_desc_t h)
+{
+	return container_of(h, struct process_desc, h);
+}
+
+extern void local_process_init(struct process_desc *p);
+extern struct process_desc *local_process_copy(struct process_desc *p);
+
+#endif //__LIBCT_PROCESS_H__
diff --git a/src/include/uapi/libct.h b/src/include/uapi/libct.h
index 29ea52e..5999712 100644
--- a/src/include/uapi/libct.h
+++ b/src/include/uapi/libct.h
@@ -26,6 +26,9 @@ extern void libct_session_close(libct_session_t s);
 struct ct_handler;
 typedef struct ct_handler *ct_handler_t;
 
+struct ct_process_desc;
+typedef struct ct_process_desc *ct_process_desc_t;
+
 enum ct_state {
 	CT_ERROR = -1,
 	CT_STOPPED,
@@ -183,4 +186,8 @@ extern int libct_container_set_console_fd(ct_handler_t ct, int tty_fd);
 
 extern int libct_fs_add_devnode(ct_handler_t ct, char *path, int mode, int major, int minor);
 
+extern ct_process_desc_t libct_process_desc_create_desc(libct_session_t ses);
+extern ct_process_desc_t libct_process_desc_copy(ct_process_desc_t p);
+extern void libct_process_desc_destroy(ct_process_desc_t p);
+
 #endif /* __UAPI_LIBCT_H__ */
diff --git a/src/libct.c b/src/libct.c
index 80a33c2..202ef55 100644
--- a/src/libct.c
+++ b/src/libct.c
@@ -6,6 +6,7 @@
 #include "uapi/libct.h"
 
 #include "linux-kernel.h"
+#include "process.h"
 #include "libct.h"
 #include "list.h"
 #include "err.h"
@@ -186,3 +187,13 @@ int libct_userns_add_gid_map(ct_handler_t ct, unsigned int first,
 {
 	return ct->ops->add_gid_map(ct, first, lower_first, count);
 }
+
+ct_process_desc_t libct_process_desc_copy(ct_process_desc_t p)
+{
+	return p->ops->copy(p);
+}
+
+void libct_process_desc_destroy(ct_process_desc_t p)
+{
+	return p->ops->destroy(p);
+}
diff --git a/src/process.c b/src/process.c
new file mode 100644
index 0000000..2107f0f
--- /dev/null
+++ b/src/process.c
@@ -0,0 +1,33 @@
+#include "process.h"
+#include "xmalloc.h"
+
+static void local_desc_destroy(ct_process_desc_t h)
+{
+	struct process_desc *p = prh2pr(h);
+
+	xfree(p);
+}
+
+ct_process_desc_t local_desc_copy(ct_process_desc_t h)
+{
+	struct process_desc *p = prh2pr(h);
+	struct process_desc *c;
+
+	c = xmalloc(sizeof(struct process_desc));
+	if (c == NULL)
+		return NULL;
+
+	memcpy(c, p, sizeof(struct process_desc));
+
+	return &c->h;
+}
+
+static const struct process_desc_ops local_process_ops = {
+	.copy		= local_desc_copy,
+	.destroy	= local_desc_destroy,
+};
+
+void local_process_init(struct process_desc *p)
+{
+	p->h.ops	= &local_process_ops;
+}
-- 
1.9.1



More information about the Libct mailing list