]> Cypherpunks.ru repositories - gostls13.git/blob - misc/cgo/testcshared/testdata/main1.c
420dd1ea97459aa7cf26dd2a1d56e892a6d279f6
[gostls13.git] / misc / cgo / testcshared / testdata / main1.c
1 // Copyright 2015 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <dlfcn.h>
8
9 int check_int8(void* handle, const char* fname, int8_t want) {
10   int8_t (*fn)();
11   fn = (int8_t (*)())dlsym(handle, fname);
12   if (!fn) {
13     fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
14     return 1;
15   }
16   signed char ret = fn();
17   if (ret != want) {
18     fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
19     return 1;
20   }
21   return 0;
22 }
23
24 int check_int32(void* handle, const char* fname, int32_t want) {
25   int32_t (*fn)();
26   fn = (int32_t (*)())dlsym(handle, fname);
27   if (!fn) {
28     fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
29     return 1;
30   }
31   int32_t ret = fn();
32   if (ret != want) {
33     fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
34     return 1;
35   }
36   return 0;
37 }
38
39 // Tests libgo.so to export the following functions.
40 //   int8_t DidInitRun() // returns true
41 //   int8_t DidMainRun() // returns true
42 //   int32_t FromPkg() // returns 1024
43 int main(int argc, char** argv) {
44   void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
45   if (!handle) {
46     fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
47                     dlerror());
48     return 2;
49   }
50
51   int ret = 0;
52   ret = check_int8(handle, "DidInitRun", 1);
53   if (ret != 0) {
54     return ret;
55   }
56
57   ret = check_int8(handle, "DidMainRun", 0);
58   if (ret != 0) {
59     return ret;
60   }
61
62   ret = check_int32(handle, "FromPkg", 1024);
63   if (ret != 0) {
64    return ret;
65   }
66   // test.bash looks for "PASS" to ensure this program has reached the end. 
67   printf("PASS\n");
68   return 0;
69 }