summaryrefslogtreecommitdiff
path: root/exports/disco.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-16 10:46:28 +0200
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-16 10:46:28 +0200
commit4bf1273c3f446ac3195fb700ec41c7cae7d20ac9 (patch)
treecec8d9e405b7d6786023ca9b921a6f0473d28a71 /exports/disco.go
parent02db081c85e56e6472c2f39e6a623fa4cdf359c4 (diff)
Discovery: Expose c types
Diffstat (limited to 'exports/disco.go')
-rw-r--r--exports/disco.go98
1 files changed, 95 insertions, 3 deletions
diff --git a/exports/disco.go b/exports/disco.go
index 9ee2af9..a08f8ba 100644
--- a/exports/disco.go
+++ b/exports/disco.go
@@ -33,9 +33,8 @@ func getCPtrDiscoOrganizations(
organizations *types.DiscoveryOrganizations,
) (C.size_t, **C.discoveryOrganization) {
totalOrganizations := C.size_t(len(organizations.List))
- var organizationsPtr **C.discoveryOrganization
if totalOrganizations > 0 {
- organizationsPtr = (**C.discoveryOrganization)(
+ organizationsPtr := (**C.discoveryOrganization)(
C.malloc(totalOrganizations * C.size_t(unsafe.Sizeof(uintptr(0)))),
)
cOrganizations := (*[1<<30 - 1]*C.discoveryOrganization)(unsafe.Pointer(organizationsPtr))[:totalOrganizations:totalOrganizations]
@@ -45,8 +44,52 @@ func getCPtrDiscoOrganizations(
cOrganizations[index] = cOrganization
index += 1
}
+ return totalOrganizations, organizationsPtr
}
- return totalOrganizations, organizationsPtr
+ return 0, nil
+}
+
+func getCPtrDiscoServer(
+ state *eduvpn.VPNState,
+ server *types.DiscoveryServer,
+) *C.discoveryServer {
+ returnedStruct := (*C.discoveryServer)(
+ C.malloc(C.size_t(unsafe.Sizeof(C.discoveryServer{}))),
+ )
+ returnedStruct.authentication_url_template = C.CString(server.AuthenticationURLTemplate)
+ returnedStruct.base_url = C.CString(server.BaseURL)
+ returnedStruct.country_code = C.CString(server.CountryCode)
+ returnedStruct.display_name = C.CString(state.GetTranslated(server.DisplayName))
+ returnedStruct.keyword_list = C.CString(state.GetTranslated(server.KeywordList))
+ returnedStruct.total_public_keys, returnedStruct.public_key_list = getCPtrListStrings(
+ server.PublicKeyList,
+ )
+ returnedStruct.server_type = C.CString(server.Type)
+ returnedStruct.total_support_contact, returnedStruct.support_contact = getCPtrListStrings(
+ server.SupportContact,
+ )
+ return returnedStruct
+}
+
+func getCPtrDiscoServers(
+ state *eduvpn.VPNState,
+ servers *types.DiscoveryServers,
+) (C.size_t, **C.discoveryServer) {
+ totalServers := C.size_t(len(servers.List))
+ if totalServers > 0 {
+ serversPtr := (**C.discoveryServer)(
+ C.malloc(totalServers * C.size_t(unsafe.Sizeof(uintptr(0)))),
+ )
+ cServers := (*[1<<30 - 1]*C.discoveryServer)(unsafe.Pointer(serversPtr))
+ index := 0
+ for _, server := range servers.List {
+ cServer := getCPtrDiscoServer(state, &server)
+ cServers[index] = cServer
+ index += 1
+ }
+ return totalServers, serversPtr
+ }
+ return 0, nil
}
func freeDiscoOrganization(cOrganization *C.discoveryOrganization) {
@@ -57,6 +100,30 @@ func freeDiscoOrganization(cOrganization *C.discoveryOrganization) {
C.free(unsafe.Pointer(cOrganization))
}
+func freeDiscoServer(cServer *C.discoveryServer) {
+ C.free(unsafe.Pointer(cServer.authentication_url_template))
+ C.free(unsafe.Pointer(cServer.base_url))
+ C.free(unsafe.Pointer(cServer.country_code))
+ C.free(unsafe.Pointer(cServer.display_name))
+ C.free(unsafe.Pointer(cServer.keyword_list))
+ freeCListStrings(cServer.public_key_list, cServer.total_public_keys)
+ C.free(unsafe.Pointer(cServer.server_type))
+ freeCListStrings(cServer.support_contact, cServer.total_support_contact)
+ C.free(unsafe.Pointer(cServer))
+}
+
+//export FreeDiscoServers
+func FreeDiscoServers(cServers *C.discoveryServers) {
+ if cServers.total_servers > 0 {
+ servers := (*[1<<30 - 1]*C.discoveryServer)(unsafe.Pointer(cServers.servers))[:cServers.total_servers:cServers.total_servers]
+ for i := C.size_t(0); i < cServers.total_servers; i++ {
+ freeDiscoServer(servers[i])
+ }
+ C.free(unsafe.Pointer(cServers.servers))
+ }
+ C.free(unsafe.Pointer(cServers))
+}
+
//export FreeDiscoOrganizations
func FreeDiscoOrganizations(cOrganizations *C.discoveryOrganizations) {
if cOrganizations.total_organizations > 0 {
@@ -69,6 +136,31 @@ func FreeDiscoOrganizations(cOrganizations *C.discoveryOrganizations) {
C.free(unsafe.Pointer(cOrganizations))
}
+//export GetDiscoServers
+func GetDiscoServers(name *C.char) *C.discoveryServers {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ // TODO
+ if stateErr != nil {
+ panic(stateErr)
+ }
+ servers, serversErr := state.GetDiscoServers()
+ // TODO
+ if serversErr != nil {
+ panic(serversErr)
+ }
+
+ returnedStruct := (*C.discoveryServers)(
+ C.malloc(C.size_t(unsafe.Sizeof(C.discoveryServers{}))),
+ )
+ returnedStruct.version = C.ulonglong(servers.Version)
+ returnedStruct.total_servers, returnedStruct.servers = getCPtrDiscoServers(
+ state,
+ servers,
+ )
+ return returnedStruct
+}
+
//export GetDiscoOrganizations
func GetDiscoOrganizations(name *C.char) *C.discoveryOrganizations {
nameStr := C.GoString(name)