summaryrefslogtreecommitdiffstats
path: root/jail.go
diff options
context:
space:
mode:
Diffstat (limited to 'jail.go')
-rw-r--r--jail.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/jail.go b/jail.go
index 46aa5c1..49d3bc0 100644
--- a/jail.go
+++ b/jail.go
@@ -74,6 +74,86 @@ var ENoent = errors.New(C.GoString(C.strerror(C.ENOENT)))
var EExist = errors.New(C.GoString(C.strerror(C.EEXIST)))
var ENameTooLong = errors.New(C.GoString(C.strerror(C.ENAMETOOLONG)))
+type Jail struct {
+ Version int32
+ Path string
+ Hostname string
+ Jailname string
+ Ip4s []string
+ Ip6s []string
+}
+
+func (j Jail) Jail() (int, error) {
+ var jid int = 0
+ var err error = nil
+
+ c_jail := (*C.struct_jail)(C.malloc(C.sizeof_struct_jail))
+
+ c_jail.version = C.uint32_t(j.Version)
+ c_jail.path = C.CString(j.Path)
+ c_jail.hostname = C.CString(j.Hostname)
+ c_jail.jailname = C.CString(j.Jailname)
+
+ c_jail.ip4s = C.uint32_t(len(j.Ip4s))
+ c_jail.ip6s = C.uint32_t(len(j.Ip6s))
+
+ if c_jail.ip4s > 0 {
+ ip4 := (*C.struct_in_addr)(C.malloc(C.ulong(C.sizeof_struct_in_addr * c_jail.ip4s)))
+
+ for i, ip := range j.Ip4s {
+ c_str := C.CString(ip)
+ ptr := C.get_in_addr_ptr((*C.struct_in_addr)(ip4), C.int(i))
+
+ if C.inet_pton(C.AF_INET, c_str, unsafe.Pointer(ptr)) == -1 {
+ panic("Invalid IPv4 address")
+ }
+
+ C.free(unsafe.Pointer(c_str))
+ }
+
+ c_jail.ip4 = ip4
+ } else {
+ c_jail.ip4 = (*C.struct_in_addr)(C.NULL)
+ }
+
+ if c_jail.ip6s > 0 {
+ ip6 := (*C.struct_in6_addr)(C.malloc(C.ulong(C.sizeof_struct_in6_addr * c_jail.ip6s)))
+
+ for i, ip := range j.Ip6s {
+ c_str := C.CString(ip)
+ ptr := C.get_in6_addr_ptr((*C.struct_in6_addr)(ip6), C.int(i))
+
+ if C.inet_pton(C.AF_INET6, c_str, unsafe.Pointer(ptr)) == -1 {
+ panic("Invalid IPv6 address")
+ }
+
+ C.free(unsafe.Pointer(c_str))
+ }
+
+ c_jail.ip6 = ip6
+ } else {
+ c_jail.ip6 = (*C.struct_in6_addr)(C.NULL)
+ }
+
+ ret := C.jail(c_jail)
+ if ret == -1 {
+ err = errnoToError()
+ goto do_free
+ }
+
+ jid = int(ret)
+
+do_free:
+ C.free(unsafe.Pointer(c_jail.path))
+ C.free(unsafe.Pointer(c_jail.hostname))
+ C.free(unsafe.Pointer(c_jail.jailname))
+ C.free(unsafe.Pointer(c_jail.ip4))
+ C.free(unsafe.Pointer(c_jail.ip6))
+ C.free(unsafe.Pointer(c_jail))
+
+ return jid, err
+}
+
func mapToIov(params map[string]interface{}) (unsafe.Pointer, int, []unsafe.Pointer) {
var freeList []unsafe.Pointer
var i = 0