[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