Просмотр исходного кода

ClientLibrary: make the API also ABI stable

Always pass either pointers or int64_t values. This provides for
a stable ABI that can easily be used from any platform.

In fact, pointers are always the "word" size and int64_t is
always a 64 bit value on any platform.
Simone Basso 7 лет назад
Родитель
Сommit
c282aafd2f
2 измененных файлов с 12 добавлено и 11 удалено
  1. 6 1
      ClientLibrary/PsiphonTunnel.go
  2. 6 10
      ClientLibrary/example/main.c

+ 6 - 1
ClientLibrary/PsiphonTunnel.go

@@ -110,10 +110,15 @@ var managedStartResult *C.char
 //     - https://github.com/Psiphon-Labs/psiphon-tunnel-core/blob/3d344194d21b250e0f18ededa4b4459a373b0690/MobileLibrary/Android/PsiphonTunnel/PsiphonTunnel.java#L371
 //   iOS:
 //     - https://github.com/Psiphon-Labs/psiphon-tunnel-core/blob/3d344194d21b250e0f18ededa4b4459a373b0690/MobileLibrary/iOS/PsiphonTunnel/PsiphonTunnel/PsiphonTunnel.m#L1105
-func psiphon_tunnel_start(configJSON, embeddedServerEntryList, clientPlatform, networkID string, timeout int64) *C.char {
+func psiphon_tunnel_start(cConfigJSON, cEmbeddedServerEntryList, cClientPlatform, cNetworkID *C.char, timeout int64) *C.char {
 	// NOTE: all arguments which are still referenced once Start returns should be copied onto the Go heap
 	//       to ensure that they don't disappear later on and cause Go to crash.
 
+	configJSON := C.GoString(cConfigJSON)
+	embeddedServerEntryList := C.GoString(cEmbeddedServerEntryList)
+	clientPlatform := C.GoString(cClientPlatform)
+	networkID := C.GoString(cNetworkID)
+
 	// Load provided config
 
 	config, err := psiphon.LoadConfig([]byte(configJSON))

+ 6 - 10
ClientLibrary/example/main.c

@@ -37,29 +37,25 @@ int main(int argc, char *argv[]) {
         printf("Using default config file: %s\n", default_config);
     }
 
-    char *file_contents = read_file(config);
-    if (!file_contents) {
+    char *psiphon_config = read_file(config);
+    if (!psiphon_config) {
         printf("Could not find config file: %s\n", config);
         return 1;
     }
 
-    GoString psiphon_config = {file_contents, strlen(file_contents)};
-
     // set server list
-    GoString serverList = {};
+    char *serverList = "";
 
     // set client platform
     char * const os = "OSName"; // "Android", "iOS", "Windows", etc.
     char * const os_version = "OSVersion"; // "4.0.4", "10.3", "10.0.10240", etc.
     char * const bundle_identifier = "com.example.exampleClientLibraryApp";
-    char * test_client_platform = (char *)malloc(sizeof(char) * (strlen(os) + strlen(os_version) + strlen(bundle_identifier) + 4)); // 4 for 3 underscores and null terminating character
+    char * client_platform = (char *)malloc(sizeof(char) * (strlen(os) + strlen(os_version) + strlen(bundle_identifier) + 4)); // 4 for 3 underscores and null terminating character
 
-    int n = sprintf(test_client_platform, "%s_%s_%s", os, os_version, bundle_identifier);
-    GoString client_platform = {test_client_platform, n};
+    int n = sprintf(client_platform, "%s_%s_%s", os, os_version, bundle_identifier);
 
     // set network ID
-    char * const test_network_id = "TEST";
-    GoString network_id = {test_network_id, strlen(test_network_id)};
+    char * const network_id = "TEST";
 
     // set timout
     long long timeout = 60;