231 { 232 return arr == NULL ? NULL : 233 (const char*) (*env)->GetByteArrayElements(env, arr, NULL); 234 } 235 236 static void 237 releaseBytes(JNIEnv *env, jbyteArray arr, const char* parr) 238 { 239 if (parr != NULL) 240 (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); 241 } 242 243 #define IOE_FORMAT "error=%d, %s" 244 245 static void 246 throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) 247 { 248 const char *detail = defaultDetail; 249 char *errmsg; 250 size_t fmtsize; 251 jstring s; 252 253 if (errnum != 0) { 254 const char *s = strerror(errnum); 255 if (strcmp(s, "Unknown error") != 0) 256 detail = s; 257 } 258 /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ 259 fmtsize = sizeof(IOE_FORMAT) + strlen(detail) + 3 * sizeof(errnum); 260 errmsg = NEW(char, fmtsize); 261 if (errmsg == NULL) 262 return; 263 264 snprintf(errmsg, fmtsize, IOE_FORMAT, errnum, detail); 265 s = JNU_NewStringPlatform(env, errmsg); 266 if (s != NULL) { 267 jobject x = JNU_NewObjectByName(env, "java/io/IOException", 268 "(Ljava/lang/String;)V", s); 269 if (x != NULL) 270 (*env)->Throw(env, x); 271 } 272 free(errmsg); 273 } 274 275 #ifdef DEBUG_PROCESS 276 /* Debugging process code is difficult; where to write debug output? */ | 231 { 232 return arr == NULL ? NULL : 233 (const char*) (*env)->GetByteArrayElements(env, arr, NULL); 234 } 235 236 static void 237 releaseBytes(JNIEnv *env, jbyteArray arr, const char* parr) 238 { 239 if (parr != NULL) 240 (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); 241 } 242 243 #define IOE_FORMAT "error=%d, %s" 244 245 static void 246 throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) 247 { 248 const char *detail = defaultDetail; 249 char *errmsg; 250 size_t fmtsize; 251 char tmpbuf[1024]; 252 jstring s; 253 254 if (errnum != 0) { 255 int ret = getErrorString(errnum, tmpbuf, sizeof(tmpbuf)); 256 if (ret != EINVAL) 257 detail = tmpbuf; 258 } 259 /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ 260 fmtsize = sizeof(IOE_FORMAT) + strlen(detail) + 3 * sizeof(errnum); 261 errmsg = NEW(char, fmtsize); 262 if (errmsg == NULL) 263 return; 264 265 snprintf(errmsg, fmtsize, IOE_FORMAT, errnum, detail); 266 s = JNU_NewStringPlatform(env, errmsg); 267 if (s != NULL) { 268 jobject x = JNU_NewObjectByName(env, "java/io/IOException", 269 "(Ljava/lang/String;)V", s); 270 if (x != NULL) 271 (*env)->Throw(env, x); 272 } 273 free(errmsg); 274 } 275 276 #ifdef DEBUG_PROCESS 277 /* Debugging process code is difficult; where to write debug output? */ |