github.com/ggreg80/ketos@v0.0.0-20171109040536-049616f51ddb/libcfs/open.go (about) 1 package main 2 3 import ( 4 "github.com/rainycape/dl" 5 "os" 6 ) 7 8 import "C" 9 10 //export open 11 func open(cPath *C.char, cFlags C.uint, cMode C.int) C.int { 12 13 path := C.GoString(cPath) 14 ro := cFlags&C.uint(os.O_WRONLY|os.O_RDWR|os.O_APPEND|os.O_CREATE) == 0 15 16 expand := RootLayers.ExpandPath 17 if !ro { 18 expand = RootLayers.CopyForWriting 19 } 20 21 expanded, err := expand(path) 22 if err != nil { 23 setErrno(err) 24 return -1 25 } 26 27 libc, err := dl.Open("libc", 0) 28 if err != nil { 29 setErrno(err) 30 return -1 31 } 32 defer libc.Close() 33 34 var libc_open func(string, uint, int) C.int 35 err = libc.Sym("open", &libc_open) 36 if err != nil { 37 setErrno(err) 38 return -1 39 } 40 41 return libc_open(expanded, uint(cFlags), int(cMode)) 42 }