Bump to jdk 13.
[nativez] / src / notzed.nativez / jni / nativez-linux.c
1 /*
2  * Copyright (C) 2019 Michael Zucchi
3  *
4  * This file is part of nativez <https://www.zedzone.space/software/nativez.html>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *     (1) Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer. 
12  *
13  *     (2) Redistributions in binary form must reproduce the above copyright
14  *     notice, this list of conditions and the following disclaimer in
15  *     the documentation and/or other materials provided with the
16  *     distribution.  
17  *     
18  *     (3)The name of the author may not be used to
19  *     endorse or promote products derived from this software without
20  *     specific prior written permission.
21  * 
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
26  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE. 
33  * 
34  */
35
36 #include <string.h>
37 #include <stdio.h>
38 #include <dlfcn.h>
39
40 #include "nativez.h"
41
42 static int fail(const char *ctx, const char *what) {
43         fprintf(stderr, "%s: %s\n", ctx, what);
44         perror(ctx);
45         fflush(stderr);
46         return -1;
47 }
48
49 int nativez_ResolveLibraries(JNIEnv *env, NZLibTable *table) {
50         for (int i=0;table[i].name;i++) {
51                 table[i].lib = dlopen(table[i].path, RTLD_LAZY | RTLD_GLOBAL);
52                 if (!table[i].lib && (table[i].flags & NZSO_NONCORE) == 0)
53                         return fail("open library", table[i].path);
54         }
55         return 0;
56 }
57
58 int nativez_ResolveFunctions(JNIEnv *env, const NZLibTable *table, const char *fn_names, void *fnp) {
59         void *lib = NULL;
60         const char *name = fn_names;
61         int index = 0;
62         const char *lib_name = "";
63         void **fn = fnp;
64         int lib_flags = 0;
65         
66         while (*name) {
67                 const char *next = name + strlen(name) + 1;
68
69                 if (*name == '#') {
70                         lib = NULL;
71                         lib_flags = 0;
72                         lib_name = name+1;
73                         for (int i=0;table[i].name;i++) {
74                                 if (strcmp(table[i].name, lib_name) == 0) {
75                                         lib = table[i].lib;
76                                         lib_flags = table[i].flags;
77                                         break;
78                                 }
79                         }
80                 } else if (lib) {
81                         void *entry = dlsym(lib, name);
82
83                         fn[index++] = entry;
84                         if (!entry)
85                                 return fail("resolve function", name);
86                 } else if ((lib_flags & NZSO_NONCORE) == 0) {
87                         return fail(lib_name, name);
88                 }
89
90                 name = next;
91         }
92
93         return 0;
94 }