// Create creates a node at the given path with the given data. The // provided flags may determine features such as whether the node is // ephemeral or not, or whether it should have a sequence number // attached to it, and the provided ACLs will determine who can access // the node and under which circumstances. // // The returned path is useful in cases where the created path may differ // from the requested one, such as when a sequence number is appended // to it due to the use of the gozk.SEQUENCE flag. func (conn *Conn) Create(path, value string, flags int, aclv []ACL) (pathCreated string, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return "", closingError("close", path) } cpath := C.CString(path) cvalue := C.CString(value) defer C.free(unsafe.Pointer(cpath)) defer C.free(unsafe.Pointer(cvalue)) caclv := buildACLVector(aclv) defer C.deallocate_ACL_vector(caclv) // Allocate additional space for the sequence (10 bytes should be enough). cpathLen := C.size_t(len(path) + 32) cpathCreated := (*C.char)(C.malloc(cpathLen)) defer C.free(unsafe.Pointer(cpathCreated)) rc, cerr := C.zoo_create(conn.handle, cpath, cvalue, C.int(len(value)), caclv, C.int(flags), cpathCreated, C.int(cpathLen)) if rc == C.ZOK { pathCreated = C.GoString(cpathCreated) } else { err = zkError(rc, cerr, "create", path) } return }
// SetACL changes the access control list for path. func (conn *Conn) SetACL(path string, aclv []ACL, version int) error { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return closingError("setacl", path) } cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) caclv := buildACLVector(aclv) defer C.deallocate_ACL_vector(caclv) rc, cerr := C.zoo_set_acl(conn.handle, cpath, C.int(version), caclv) return zkError(rc, cerr, "setacl", path) }
func parseACLVector(caclv *C.struct_ACL_vector) []ACL { structACLSize := unsafe.Sizeof(C.struct_ACL{}) aclv := make([]ACL, caclv.count) dataStart := uintptr(unsafe.Pointer(caclv.data)) for i := 0; i != int(caclv.count); i++ { caclPos := dataStart + uintptr(i)*structACLSize cacl := (*C.struct_ACL)(unsafe.Pointer(caclPos)) acl := &aclv[i] acl.Perms = uint32(cacl.perms) acl.Scheme = C.GoString(cacl.id.scheme) acl.Id = C.GoString(cacl.id.id) } C.deallocate_ACL_vector(caclv) return aclv }