diff --git a/Makefile b/Makefile index 6ebb163..2a806ec 100644 --- a/Makefile +++ b/Makefile @@ -16,10 +16,20 @@ server: go build -ldflags "-X main.version=${version}" ./cmd/ck-server mv ck-server* ./build +client-dynlib: + mkdir -p build + go build -ldflags "-X main.version=${version}" -buildmode=c-shared -o libck-client.so ./cmd/ck-client + mv libck-client* ./build + +server-dynlib: + mkdir -p build + go build -ldflags "-X main.version=${version}" -buildmode=c-shared -o libck-server.so ./cmd/ck-server + mv libck-server* ./build + install: mv build/ck-* /usr/local/bin -all: client server +all: client server client-dynlib server-dynlib clean: rm -rf ./build/ck-* diff --git a/cmd/ck-client/ck-client.go b/cmd/ck-client/ck-client.go index 1a43651..abe2d87 100644 --- a/cmd/ck-client/ck-client.go +++ b/cmd/ck-client/ck-client.go @@ -10,6 +10,8 @@ import ( "fmt" "net" "os" + "C" + "unsafe" "github.com/cbeuw/Cloak/internal/common" @@ -18,6 +20,19 @@ import ( log "github.com/sirupsen/logrus" ) +//export external_main +func external_main(argc C.int, argv **C.char) { + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } + + os.Args = go_argv + main() +} + var version string func main() { diff --git a/cmd/ck-server/ck-server.go b/cmd/ck-server/ck-server.go index b1c0bb0..c5645ba 100644 --- a/cmd/ck-server/ck-server.go +++ b/cmd/ck-server/ck-server.go @@ -9,6 +9,8 @@ import ( "os" "runtime" "strings" + "C" + "unsafe" "github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/server" @@ -68,6 +70,19 @@ func parseSSBindAddr(ssRemoteHost string, ssRemotePort string, ckBindAddr *[]net return nil } +//export external_main +func external_main(argc C.int, argv **C.char) { + var offset = unsafe.Sizeof(uintptr(0)) + var go_argv []string + for i := 0; i < int(argc); i++ { + go_argv = append(go_argv, C.GoString(*argv)) + argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset)) + } + + os.Args = go_argv + main() +} + func main() { var config string