284 { |
284 { |
285 if (parr != NULL) |
285 if (parr != NULL) |
286 (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); |
286 (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); |
287 } |
287 } |
288 |
288 |
|
289 #define IOE_FORMAT "error=%d, %s" |
|
290 |
289 static void |
291 static void |
290 throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) |
292 throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) |
291 { |
293 { |
292 static const char * const format = "error=%d, %s"; |
|
293 const char *detail = defaultDetail; |
294 const char *detail = defaultDetail; |
294 char *errmsg; |
295 char *errmsg; |
|
296 size_t fmtsize; |
295 jstring s; |
297 jstring s; |
296 |
298 |
297 if (errnum != 0) { |
299 if (errnum != 0) { |
298 const char *s = strerror(errnum); |
300 const char *s = strerror(errnum); |
299 if (strcmp(s, "Unknown error") != 0) |
301 if (strcmp(s, "Unknown error") != 0) |
300 detail = s; |
302 detail = s; |
301 } |
303 } |
302 /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ |
304 /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ |
303 errmsg = NEW(char, strlen(format) + strlen(detail) + 3 * sizeof(errnum)); |
305 fmtsize = sizeof(IOE_FORMAT) + strlen(detail) + 3 * sizeof(errnum); |
|
306 errmsg = NEW(char, fmtsize); |
304 if (errmsg == NULL) |
307 if (errmsg == NULL) |
305 return; |
308 return; |
306 |
309 |
307 sprintf(errmsg, format, errnum, detail); |
310 snprintf(errmsg, fmtsize, IOE_FORMAT, errnum, detail); |
308 s = JNU_NewStringPlatform(env, errmsg); |
311 s = JNU_NewStringPlatform(env, errmsg); |
309 if (s != NULL) { |
312 if (s != NULL) { |
310 jobject x = JNU_NewObjectByName(env, "java/io/IOException", |
313 jobject x = JNU_NewObjectByName(env, "java/io/IOException", |
311 "(Ljava/lang/String;)V", s); |
314 "(Ljava/lang/String;)V", s); |
312 if (x != NULL) |
315 if (x != NULL) |