Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Side by Side Diff: c/jnilib.c

Issue 2842333002: Updated netty-tcnative to version 2.0.0.Final (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « c/info.c ('k') | c/lock.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /*
2 * Copyright 2016 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
1 /* Licensed to the Apache Software Foundation (ASF) under one or more 16 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with 17 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership. 18 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0 19 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with 20 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at 21 * the License. You may obtain a copy of the License at
7 * 22 *
8 * http://www.apache.org/licenses/LICENSE-2.0 23 * http://www.apache.org/licenses/LICENSE-2.0
9 * 24 *
10 * Unless required by applicable law or agreed to in writing, software 25 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, 26 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 27 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and 28 * See the License for the specific language governing permissions and
14 * limitations under the License. 29 * limitations under the License.
15 */ 30 */
16 31
17 /*
18 *
19 * @author Mladen Turk
20 * @version $Id: jnilib.c 1666217 2015-03-12 15:03:31Z rjung $
21 */
22
23 #include "tcn.h" 32 #include "tcn.h"
24 #include "apr_version.h" 33 #include "apr_version.h"
25 #include "apr_file_io.h"
26 #include "apr_mmap.h"
27 #include "apr_atomic.h" 34 #include "apr_atomic.h"
35 #include "apr_strings.h"
28 36
29 #include "tcn_version.h" 37 #ifndef TCN_JNI_VERSION
30 38 #define TCN_JNI_VERSION JNI_VERSION_1_4
31 #ifdef TCN_DO_STATISTICS
32 extern void sp_poll_dump_statistics();
33 extern void sp_network_dump_statistics();
34 extern void ssl_network_dump_statistics();
35 #endif 39 #endif
36 40
37 apr_pool_t *tcn_global_pool = NULL; 41 apr_pool_t *tcn_global_pool = NULL;
38 static JavaVM *tcn_global_vm = NULL; 42 static JavaVM *tcn_global_vm = NULL;
39 43
40 static jclass jString_class; 44 static jclass jString_class;
41 static jclass jFinfo_class;
42 static jclass jAinfo_class;
43 static jmethodID jString_init; 45 static jmethodID jString_init;
44 static jmethodID jString_getBytes; 46 static jmethodID jString_getBytes;
45 47 static jclass byteArrayClass;
46 int tcn_parent_pid = 0; 48 static jclass keyMaterialClass;
49 static jfieldID keyMaterialCertificateChainFieldId;
50 static jfieldID keyMaterialPrivateKeyFieldId;
47 51
48 /* Called by the JVM when APR_JAVA is loaded */ 52 /* Called by the JVM when APR_JAVA is loaded */
49 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) 53 JNIEXPORT jint JNICALL JNI_OnLoad_netty_tcnative(JavaVM *vm, void *reserved)
50 { 54 {
51 JNIEnv *env; 55 JNIEnv *env;
52 apr_version_t apv; 56 apr_version_t apv;
53 int apvn; 57 int apvn;
54 58
55 UNREFERENCED(reserved); 59 UNREFERENCED(reserved);
56 if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4)) { 60 if ((*vm)->GetEnv(vm, (void **)&env, TCN_JNI_VERSION)) {
57 return JNI_ERR; 61 return JNI_ERR;
58 } 62 }
59 tcn_global_vm = vm; 63 tcn_global_vm = vm;
60 64
61 /* Before doing anything else check if we have a valid 65 /* Before doing anything else check if we have a valid
62 * APR version. 66 * APR version.
63 */ 67 */
64 apr_version(&apv); 68 apr_version(&apv);
65 apvn = apv.major * 1000 + apv.minor * 100 + apv.patch; 69 apvn = apv.major * 1000 + apv.minor * 100 + apv.patch;
66 if (apvn < 1201) { 70 if (apvn < 1201) {
67 tcn_Throw(env, "Unupported APR version (%s)", 71 tcn_Throw(env, "Unsupported APR version (%s)",
68 apr_version_string()); 72 apr_version_string());
69 return JNI_ERR; 73 return JNI_ERR;
70 } 74 }
71 75
72 76
73 /* Initialize global java.lang.String class */ 77 /* Initialize global java.lang.String class */
74 TCN_LOAD_CLASS(env, jString_class, "java/lang/String", JNI_ERR); 78 TCN_LOAD_CLASS(env, jString_class, "java/lang/String", JNI_ERR);
75 TCN_LOAD_CLASS(env, jFinfo_class, TCN_FINFO_CLASS, JNI_ERR);
76 TCN_LOAD_CLASS(env, jAinfo_class, TCN_AINFO_CLASS, JNI_ERR);
77 79
78 TCN_GET_METHOD(env, jString_class, jString_init, 80 TCN_GET_METHOD(env, jString_class, jString_init,
79 "<init>", "([B)V", JNI_ERR); 81 "<init>", "([B)V", JNI_ERR);
80 TCN_GET_METHOD(env, jString_class, jString_getBytes, 82 TCN_GET_METHOD(env, jString_class, jString_getBytes,
81 "getBytes", "()[B", JNI_ERR); 83 "getBytes", "()[B", JNI_ERR);
82 84
83 if(tcn_load_finfo_class(env, jFinfo_class) != APR_SUCCESS) 85 // Load the class which makes JNI references available in a static scope bef ore loading any other classes.
86 if ((*env)->FindClass(env, "io/netty/internal/tcnative/NativeStaticallyRefer encedJniMethods") == NULL) {
84 return JNI_ERR; 87 return JNI_ERR;
85 if(tcn_load_ainfo_class(env, jAinfo_class) != APR_SUCCESS)
86 return JNI_ERR;
87 #ifdef WIN32
88 {
89 char *ppid = getenv(TCN_PARENT_IDE);
90 if (ppid)
91 tcn_parent_pid = atoi(ppid);
92 } 88 }
93 #else
94 tcn_parent_pid = getppid();
95 #endif
96 89
97 return JNI_VERSION_1_4; 90 TCN_LOAD_CLASS(env, byteArrayClass, "[B", JNI_ERR);
91 TCN_LOAD_CLASS(env, keyMaterialClass, "io/netty/internal/tcnative/Certificat eRequestedCallback$KeyMaterial", JNI_ERR);
92
93 TCN_GET_FIELD(env, keyMaterialClass, keyMaterialCertificateChainFieldId,
94 "certificateChain", "J", JNI_ERR);
95 TCN_GET_FIELD(env, keyMaterialClass, keyMaterialPrivateKeyFieldId,
96 "privateKey", "J", JNI_ERR);
97
98 return TCN_JNI_VERSION;
98 } 99 }
99 100
101 /* Called by the JVM when APR_JAVA is loaded */
102 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
103 {
104 return JNI_OnLoad_netty_tcnative(vm, reserved);
105 }
100 106
101 /* Called by the JVM before the APR_JAVA is unloaded */ 107 /* Called by the JVM before the APR_JAVA is unloaded */
102 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) 108 JNIEXPORT void JNICALL JNI_OnUnload_netty_tcnative(JavaVM *vm, void *reserved)
103 { 109 {
104 JNIEnv *env; 110 JNIEnv *env;
105 111
106 UNREFERENCED(reserved); 112 UNREFERENCED(reserved);
107 113
108 if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2)) { 114 if ((*vm)->GetEnv(vm, (void **)&env, TCN_JNI_VERSION)) {
109 return; 115 return;
110 } 116 }
111 if (tcn_global_pool) { 117 if (tcn_global_pool) {
112 TCN_UNLOAD_CLASS(env, jString_class); 118 TCN_UNLOAD_CLASS(env, jString_class);
113 TCN_UNLOAD_CLASS(env, jFinfo_class);
114 TCN_UNLOAD_CLASS(env, jAinfo_class);
115 apr_terminate(); 119 apr_terminate();
116 } 120 }
121
122 TCN_UNLOAD_CLASS(env, byteArrayClass);
123 TCN_UNLOAD_CLASS(env, keyMaterialClass);
124 }
125
126 /* Called by the JVM before the APR_JAVA is unloaded */
127 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
128 {
129 JNI_OnUnload_netty_tcnative(vm, reserved);
117 } 130 }
118 131
119 jstring tcn_new_stringn(JNIEnv *env, const char *str, size_t l) 132 jstring tcn_new_stringn(JNIEnv *env, const char *str, size_t l)
120 { 133 {
121 jstring result; 134 jstring result;
122 jbyteArray bytes = 0; 135 jbyteArray bytes = 0;
123 136
124 if (!str) 137 if (!str)
125 return NULL; 138 return NULL;
126 if ((*env)->EnsureLocalCapacity(env, 2) < 0) { 139 if ((*env)->EnsureLocalCapacity(env, 2) < 0) {
127 return NULL; /* out of memory error */ 140 return NULL; /* out of memory error */
128 } 141 }
129 bytes = (*env)->NewByteArray(env, l); 142 bytes = (*env)->NewByteArray(env, l);
130 if (bytes != NULL) { 143 if (bytes != NULL) {
131 (*env)->SetByteArrayRegion(env, bytes, 0, l, (jbyte *)str); 144 (*env)->SetByteArrayRegion(env, bytes, 0, l, (jbyte *)str);
132 result = (*env)->NewObject(env, jString_class, jString_init, bytes); 145 result = (*env)->NewObject(env, jString_class, jString_init, bytes);
133 (*env)->DeleteLocalRef(env, bytes); 146 (*env)->DeleteLocalRef(env, bytes);
134 return result; 147 return result;
135 } /* else fall through */ 148 } /* else fall through */
136 return NULL; 149 return NULL;
137 } 150 }
138 151
139 jbyteArray tcn_new_arrayb(JNIEnv *env, const unsigned char *data, size_t len)
140 {
141 jbyteArray bytes = (*env)->NewByteArray(env, (jsize)len);
142 if (bytes != NULL) {
143 (*env)->SetByteArrayRegion(env, bytes, 0, (jint)len, (jbyte *)data);
144 }
145 return bytes;
146 }
147
148 jobjectArray tcn_new_arrays(JNIEnv *env, size_t len)
149 {
150 return (*env)->NewObjectArray(env, (jsize)len, jString_class, NULL);
151 }
152
153 jstring tcn_new_string(JNIEnv *env, const char *str) 152 jstring tcn_new_string(JNIEnv *env, const char *str)
154 { 153 {
155 if (!str) 154 if (!str)
156 return NULL; 155 return NULL;
157 else 156 else
158 return (*env)->NewStringUTF(env, str); 157 return (*env)->NewStringUTF(env, str);
159 } 158 }
160 159
161 char *tcn_get_string(JNIEnv *env, jstring jstr) 160 TCN_IMPLEMENT_CALL(jboolean, Library, initialize0)(TCN_STDARGS)
162 {
163 jbyteArray bytes = NULL;
164 jthrowable exc;
165 char *result = NULL;
166
167 if ((*env)->EnsureLocalCapacity(env, 2) < 0) {
168 return NULL; /* out of memory error */
169 }
170 bytes = (*env)->CallObjectMethod(env, jstr, jString_getBytes);
171 exc = (*env)->ExceptionOccurred(env);
172 if (!exc) {
173 jint len = (*env)->GetArrayLength(env, bytes);
174 result = (char *)malloc(len + 1);
175 if (result == NULL) {
176 TCN_THROW_OS_ERROR(env);
177 (*env)->DeleteLocalRef(env, bytes);
178 return 0;
179 }
180 (*env)->GetByteArrayRegion(env, bytes, 0, len, (jbyte *)result);
181 result[len] = '\0'; /* NULL-terminate */
182 }
183 else {
184 (*env)->DeleteLocalRef(env, exc);
185 }
186 (*env)->DeleteLocalRef(env, bytes);
187
188 return result;
189 }
190
191 char *tcn_strdup(JNIEnv *env, jstring jstr)
192 {
193 char *result = NULL;
194 const char *cjstr;
195
196 cjstr = (const char *)((*env)->GetStringUTFChars(env, jstr, 0));
197 if (cjstr) {
198 result = strdup(cjstr);
199 (*env)->ReleaseStringUTFChars(env, jstr, cjstr);
200 }
201 return result;
202 }
203
204 char *tcn_pstrdup(JNIEnv *env, jstring jstr, apr_pool_t *pool)
205 {
206 char *result = NULL;
207 const char *cjstr;
208
209 cjstr = (const char *)((*env)->GetStringUTFChars(env, jstr, 0));
210 if (cjstr) {
211 result = apr_pstrdup(pool, cjstr);
212 (*env)->ReleaseStringUTFChars(env, jstr, cjstr);
213 }
214 return result;
215 }
216
217 TCN_IMPLEMENT_CALL(jboolean, Library, initialize)(TCN_STDARGS)
218 { 161 {
219 162
220 UNREFERENCED_STDARGS; 163 UNREFERENCED_STDARGS;
221 if (!tcn_global_pool) { 164 if (!tcn_global_pool) {
222 apr_initialize(); 165 apr_initialize();
223 if (apr_pool_create(&tcn_global_pool, NULL) != APR_SUCCESS) { 166 if (apr_pool_create(&tcn_global_pool, NULL) != APR_SUCCESS) {
224 return JNI_FALSE; 167 return JNI_FALSE;
225 } 168 }
226 apr_atomic_init(tcn_global_pool); 169 apr_atomic_init(tcn_global_pool);
227 } 170 }
228 return JNI_TRUE; 171 return JNI_TRUE;
229 } 172 }
230 173
231 TCN_IMPLEMENT_CALL(void, Library, terminate)(TCN_STDARGS)
232 {
233
234 UNREFERENCED_STDARGS;
235 if (tcn_global_pool) {
236 apr_pool_t *p = tcn_global_pool;
237 tcn_global_pool = NULL;
238 #ifdef TCN_DO_STATISTICS
239 fprintf(stderr, "APR Statistical data ....\n");
240 #endif
241 apr_pool_destroy(p);
242 #ifdef TCN_DO_STATISTICS
243 sp_poll_dump_statistics();
244 sp_network_dump_statistics();
245 ssl_network_dump_statistics();
246 fprintf(stderr, "APR Terminated\n");
247 #endif
248 apr_terminate();
249 }
250 }
251
252 TCN_IMPLEMENT_CALL(jlong, Library, globalPool)(TCN_STDARGS)
253 {
254 UNREFERENCED_STDARGS;
255 return P2J(tcn_global_pool);
256 }
257
258 TCN_IMPLEMENT_CALL(jint, Library, version)(TCN_STDARGS, jint what) 174 TCN_IMPLEMENT_CALL(jint, Library, version)(TCN_STDARGS, jint what)
259 { 175 {
260 apr_version_t apv; 176 apr_version_t apv;
261 177
262 UNREFERENCED_STDARGS; 178 UNREFERENCED_STDARGS;
263 apr_version(&apv); 179 apr_version(&apv);
264 180
265 switch (what) { 181 switch (what) {
266 case 0x01:
267 return TCN_MAJOR_VERSION;
268 break;
269 case 0x02:
270 return TCN_MINOR_VERSION;
271 break;
272 case 0x03:
273 return TCN_PATCH_VERSION;
274 break;
275 case 0x04:
276 return TCN_IS_DEV_VERSION;
277 break;
278 case 0x11: 182 case 0x11:
279 return apv.major; 183 return apv.major;
280 break; 184 break;
281 case 0x12: 185 case 0x12:
282 return apv.minor; 186 return apv.minor;
283 break; 187 break;
284 case 0x13: 188 case 0x13:
285 return apv.patch; 189 return apv.patch;
286 break; 190 break;
287 case 0x14: 191 case 0x14:
288 return apv.is_dev; 192 return apv.is_dev;
289 break; 193 break;
290 } 194 }
291 return 0; 195 return 0;
292 } 196 }
293 197
294 TCN_IMPLEMENT_CALL(jstring, Library, versionString)(TCN_STDARGS)
295 {
296 UNREFERENCED(o);
297 return AJP_TO_JSTRING(TCN_VERSION_STRING);
298 }
299
300 TCN_IMPLEMENT_CALL(jstring, Library, aprVersionString)(TCN_STDARGS) 198 TCN_IMPLEMENT_CALL(jstring, Library, aprVersionString)(TCN_STDARGS)
301 { 199 {
302 UNREFERENCED(o); 200 UNREFERENCED(o);
303 return AJP_TO_JSTRING(apr_version_string()); 201 return AJP_TO_JSTRING(apr_version_string());
304 } 202 }
305 203
306 TCN_IMPLEMENT_CALL(jboolean, Library, has)(TCN_STDARGS, jint what) 204 TCN_IMPLEMENT_CALL(jboolean, Library, has)(TCN_STDARGS, jint what)
307 { 205 {
308 jboolean rv = JNI_FALSE; 206 jboolean rv = JNI_FALSE;
309 UNREFERENCED_STDARGS; 207 UNREFERENCED_STDARGS;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 break; 309 break;
412 case 20: 310 case 20:
413 #if APR_O_NONBLOCK_INHERITED 311 #if APR_O_NONBLOCK_INHERITED
414 rv = JNI_TRUE; 312 rv = JNI_TRUE;
415 #endif 313 #endif
416 break; 314 break;
417 } 315 }
418 return rv; 316 return rv;
419 } 317 }
420 318
421 TCN_IMPLEMENT_CALL(jint, Library, size)(TCN_STDARGS, jint what)
422 {
423
424 UNREFERENCED_STDARGS;
425
426 switch (what) {
427 case 1:
428 return APR_SIZEOF_VOIDP;
429 break;
430 case 2:
431 return APR_PATH_MAX;
432 break;
433 case 3:
434 return APRMAXHOSTLEN;
435 break;
436 case 4:
437 return APR_MAX_IOVEC_SIZE;
438 break;
439 case 5:
440 return APR_MAX_SECS_TO_LINGER;
441 break;
442 case 6:
443 return APR_MMAP_THRESHOLD;
444 break;
445 case 7:
446 return APR_MMAP_LIMIT;
447 break;
448
449 }
450 return 0;
451 }
452
453 apr_pool_t *tcn_get_global_pool()
454 {
455 if (!tcn_global_pool) {
456 if (apr_pool_create(&tcn_global_pool, NULL) != APR_SUCCESS) {
457 return NULL;
458 }
459 apr_atomic_init(tcn_global_pool);
460 }
461 return tcn_global_pool;
462 }
463
464 jclass tcn_get_string_class() 319 jclass tcn_get_string_class()
465 { 320 {
466 return jString_class; 321 return jString_class;
467 } 322 }
468 323
469 JavaVM * tcn_get_java_vm() 324 jclass tcn_get_byte_array_class()
470 { 325 {
471 return tcn_global_vm; 326 return byteArrayClass;
327 }
328
329 jfieldID tcn_get_key_material_certificate_chain_field()
330 {
331 return keyMaterialCertificateChainFieldId;
332 }
333
334 jfieldID tcn_get_key_material_private_key_field()
335 {
336 return keyMaterialPrivateKeyFieldId;
472 } 337 }
473 338
474 jint tcn_get_java_env(JNIEnv **env) 339 jint tcn_get_java_env(JNIEnv **env)
475 { 340 {
476 if ((*tcn_global_vm)->GetEnv(tcn_global_vm, (void **)env, 341 if ((*tcn_global_vm)->GetEnv(tcn_global_vm, (void **)env,
477 JNI_VERSION_1_4)) { 342 TCN_JNI_VERSION)) {
478 return JNI_ERR; 343 return JNI_ERR;
479 } 344 }
480 return JNI_OK; 345 return JNI_OK;
481 } 346 }
OLDNEW
« no previous file with comments | « c/info.c ('k') | c/lock.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698