[Libct] [PATCH 7/7] go: add support of process descriptors

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


Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 go/libct.go      | 25 +++++++++++++++++++------
 go/libct_test.go |  7 ++++++-
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/go/libct.go b/go/libct.go
index edd343f..5a74b55 100644
--- a/go/libct.go
+++ b/go/libct.go
@@ -25,6 +25,10 @@ type Container struct {
 	ct C.ct_handler_t
 }
 
+type ProcessDesc struct {
+	p C.ct_process_desc_t
+}
+
 type NetDev struct {
 	dev C.ct_net_t
 }
@@ -65,6 +69,15 @@ func (s *Session) ContainerCreate(name string) (*Container, error) {
 	return &Container{ct}, nil
 }
 
+func (s *Session) ProcessCreateDesc() (*ProcessDesc, error) {
+	p := C.libct_process_desc_create_desc(s.s)
+	if p == nil {
+		return nil, LibctError{-1}
+	}
+
+	return &ProcessDesc{p}, nil
+}
+
 func (ct *Container) SetNsMask(nsmask uint64) error {
 	ret := C.libct_container_set_nsmask(ct.ct, C.ulong(nsmask))
 
@@ -95,7 +108,7 @@ func (ct *Container) SetConsoleFd(f *os.File) error {
 	return nil
 }
 
-func (ct *Container) SpawnExecve(path string, argv []string, env []string, fds *[3]uintptr) (int, error) {
+func (ct *Container) SpawnExecve(p *ProcessDesc, path string, argv []string, env []string, fds *[3]uintptr) (int, error) {
 	var cfdsp *C.int
 
 	cargv := make([]*C.char, len(argv)+1)
@@ -116,7 +129,7 @@ func (ct *Container) SpawnExecve(path string, argv []string, env []string, fds *
 		cfdsp = &cfds[0]
 	}
 
-	ret := int(C.libct_container_spawn_execvefds(ct.ct, C.CString(path), &cargv[0], &cenv[0], cfdsp))
+	ret := int(C.libct_container_spawn_execvefds(ct.ct, p.p, C.CString(path), &cargv[0], &cenv[0], cfdsp))
 	if ret < 0 {
 		return -1, LibctError{int(ret)}
 	}
@@ -199,8 +212,8 @@ func (ct *Container) SetOption(opt int32) error {
 	return nil
 }
 
-func (ct *Container) SetCaps(mask uint64, apply_to int) error {
-	ret := C.libct_container_set_caps(ct.ct, C.ulong(mask), C.uint(apply_to))
+func (p *ProcessDesc) SetCaps(mask uint64, apply_to int) error {
+	ret := C.libct_process_desc_set_caps(p.p, C.ulong(mask), C.uint(apply_to))
 	if ret != 0 {
 		return LibctError{int(ret)}
 	}
@@ -208,8 +221,8 @@ func (ct *Container) SetCaps(mask uint64, apply_to int) error {
 	return nil
 }
 
-func (ct *Container) SetParentDeathSignal(sig syscall.Signal) error {
-	if ret := C.libct_container_set_pdeathsig(ct.ct, C.int(sig)); ret != 0 {
+func (p *ProcessDesc) SetParentDeathSignal(sig syscall.Signal) error {
+	if ret := C.libct_process_desc_set_pdeathsig(p.p, C.int(sig)); ret != 0 {
 		return LibctError{int(ret)}
 	}
 
diff --git a/go/libct_test.go b/go/libct_test.go
index c6b40b4..3047386 100644
--- a/go/libct_test.go
+++ b/go/libct_test.go
@@ -11,6 +11,11 @@ func TestSpawnExecv(t *testing.T) {
 		t.Fail()
 	}
 
+	p, err :=s.ProcessCreateDesc();
+	if err != nil {
+		t.Fail()
+	}
+
 	ct, err := s.ContainerCreate("test")
 	if err != nil {
 		t.Fail()
@@ -18,7 +23,7 @@ func TestSpawnExecv(t *testing.T) {
 
 	ct.SetNsMask(syscall.CLONE_NEWNS | syscall.CLONE_NEWPID)
 
-	_, err = ct.SpawnExecve("sleep",
+	_, err = ct.SpawnExecve(p, "sleep",
 		[]string{"sleep", "1"},
 		[]string{"PATH=/bin:/usr/bin"}, nil)
 	if err != nil {
-- 
1.9.1



More information about the Libct mailing list