275 static const char * 276 getBytes(JNIEnv *env, jbyteArray arr) 277 { 278 return arr == NULL ? NULL : 279 (const char*) (*env)->GetByteArrayElements(env, arr, NULL); 280 } 281 282 static void 283 releaseBytes(JNIEnv *env, jbyteArray arr, const char* parr) 284 { 285 if (parr != NULL) 286 (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); 287 } 288 289 static void 290 throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) 291 { 292 static const char * const format = "error=%d, %s"; 293 const char *detail = defaultDetail; 294 char *errmsg; 295 jstring s; 296 297 if (errnum != 0) { 298 const char *s = strerror(errnum); 299 if (strcmp(s, "Unknown error") != 0) 300 detail = s; 301 } 302 /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ 303 errmsg = NEW(char, strlen(format) + strlen(detail) + 3 * sizeof(errnum)); 304 if (errmsg == NULL) 305 return; 306 307 sprintf(errmsg, format, errnum, detail); 308 s = JNU_NewStringPlatform(env, errmsg); 309 if (s != NULL) { 310 jobject x = JNU_NewObjectByName(env, "java/io/IOException", 311 "(Ljava/lang/String;)V", s); 312 if (x != NULL) 313 (*env)->Throw(env, x); 314 } 315 free(errmsg); 316 } 317 318 #ifdef DEBUG_PROCESS 319 /* Debugging process code is difficult; where to write debug output? */ 320 static void | 275 static const char * 276 getBytes(JNIEnv *env, jbyteArray arr) 277 { 278 return arr == NULL ? NULL : 279 (const char*) (*env)->GetByteArrayElements(env, arr, NULL); 280 } 281 282 static void 283 releaseBytes(JNIEnv *env, jbyteArray arr, const char* parr) 284 { 285 if (parr != NULL) 286 (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); 287 } 288 289 static void 290 throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) 291 { 292 static const char * const format = "error=%d, %s"; 293 const char *detail = defaultDetail; 294 char *errmsg; 295 char tmpbuf[1024]; 296 jstring s; 297 298 if (errnum != 0) { 299 int ret = getErrorString(errnum, tmpbuf, sizeof(tmpbuf)); 300 if (ret != EINVAL) 301 detail = tmpbuf; 302 } 303 /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ 304 errmsg = NEW(char, strlen(format) + strlen(detail) + 3 * sizeof(errnum)); 305 if (errmsg == NULL) 306 return; 307 308 sprintf(errmsg, format, errnum, detail); 309 s = JNU_NewStringPlatform(env, errmsg); 310 if (s != NULL) { 311 jobject x = JNU_NewObjectByName(env, "java/io/IOException", 312 "(Ljava/lang/String;)V", s); 313 if (x != NULL) 314 (*env)->Throw(env, x); 315 } 316 free(errmsg); 317 } 318 319 #ifdef DEBUG_PROCESS 320 /* Debugging process code is difficult; where to write debug output? */ 321 static void |