49
50 #if defined(__linux__) || defined(_AIX)
51 #include <string.h>
52 #endif
53
54 #ifdef _ALLBSD_SOURCE
55 #include <string.h>
56
57 #define stat64 stat
58 #ifndef MACOSX
59 #define statvfs64 statvfs
60 #endif
61
62 #define open64 open
63 #define fstat64 fstat
64 #define lstat64 lstat
65 #define dirent64 dirent
66 #define readdir64_r readdir_r
67 #endif
68
69 #include "jni.h"
70 #include "jni_util.h"
71 #include "jlong.h"
72
73 #include "sun_nio_fs_UnixNativeDispatcher.h"
74
75 /**
76 * Size of password or group entry when not available via sysconf
77 */
78 #define ENT_BUF_SIZE 1024
79
80 #define RESTARTABLE(_cmd, _result) do { \
81 do { \
82 _result = _cmd; \
83 } while((_result == -1) && (errno == EINTR)); \
84 } while(0)
85
86 #define RESTARTABLE_RETURN_PTR(_cmd, _result) do { \
87 do { \
88 _result = _cmd; \
298 jbyteArray result = NULL;
299 char buf[PATH_MAX+1];
300
301 /* EINTR not listed as a possible error */
302 char* cwd = getcwd(buf, sizeof(buf));
303 if (cwd == NULL) {
304 throwUnixException(env, errno);
305 } else {
306 jsize len = (jsize)strlen(buf);
307 result = (*env)->NewByteArray(env, len);
308 if (result != NULL) {
309 (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)buf);
310 }
311 }
312 return result;
313 }
314
315 JNIEXPORT jbyteArray
316 Java_sun_nio_fs_UnixNativeDispatcher_strerror(JNIEnv* env, jclass this, jint error)
317 {
318 char* msg;
319 jsize len;
320 jbyteArray bytes;
321
322 #ifdef _AIX
323 /* strerror() is not thread-safe on AIX so we have to use strerror_r() */
324 char buffer[256];
325 msg = (strerror_r((int)error, buffer, 256) == 0) ? buffer : "Error while calling strerror_r";
326 #else
327 msg = strerror((int)error);
328 #endif
329 len = strlen(msg);
330 bytes = (*env)->NewByteArray(env, len);
331 if (bytes != NULL) {
332 (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)msg);
333 }
334 return bytes;
335 }
336
337 JNIEXPORT jint
338 Java_sun_nio_fs_UnixNativeDispatcher_dup(JNIEnv* env, jclass this, jint fd) {
339
340 int res = -1;
341
342 RESTARTABLE(dup((int)fd), res);
343 if (res == -1) {
344 throwUnixException(env, errno);
345 }
346 return (jint)res;
347 }
348
349 JNIEXPORT jlong JNICALL
350 Java_sun_nio_fs_UnixNativeDispatcher_fopen0(JNIEnv* env, jclass this,
351 jlong pathAddress, jlong modeAddress)
352 {
|
49
50 #if defined(__linux__) || defined(_AIX)
51 #include <string.h>
52 #endif
53
54 #ifdef _ALLBSD_SOURCE
55 #include <string.h>
56
57 #define stat64 stat
58 #ifndef MACOSX
59 #define statvfs64 statvfs
60 #endif
61
62 #define open64 open
63 #define fstat64 fstat
64 #define lstat64 lstat
65 #define dirent64 dirent
66 #define readdir64_r readdir_r
67 #endif
68
69 #include "jdk_strerror.h"
70 #include "jni.h"
71 #include "jni_util.h"
72 #include "jlong.h"
73
74 #include "sun_nio_fs_UnixNativeDispatcher.h"
75
76 /**
77 * Size of password or group entry when not available via sysconf
78 */
79 #define ENT_BUF_SIZE 1024
80
81 #define RESTARTABLE(_cmd, _result) do { \
82 do { \
83 _result = _cmd; \
84 } while((_result == -1) && (errno == EINTR)); \
85 } while(0)
86
87 #define RESTARTABLE_RETURN_PTR(_cmd, _result) do { \
88 do { \
89 _result = _cmd; \
299 jbyteArray result = NULL;
300 char buf[PATH_MAX+1];
301
302 /* EINTR not listed as a possible error */
303 char* cwd = getcwd(buf, sizeof(buf));
304 if (cwd == NULL) {
305 throwUnixException(env, errno);
306 } else {
307 jsize len = (jsize)strlen(buf);
308 result = (*env)->NewByteArray(env, len);
309 if (result != NULL) {
310 (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)buf);
311 }
312 }
313 return result;
314 }
315
316 JNIEXPORT jbyteArray
317 Java_sun_nio_fs_UnixNativeDispatcher_strerror(JNIEnv* env, jclass this, jint error)
318 {
319 char buf[1024];
320 jsize len;
321 jbyteArray bytes;
322
323 jdk_strerror((int)error, buf, (size_t) 1024);
324 len = strlen(buf);
325 bytes = (*env)->NewByteArray(env, len);
326 if (bytes != NULL) {
327 (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)buf);
328 }
329 return bytes;
330 }
331
332 JNIEXPORT jint
333 Java_sun_nio_fs_UnixNativeDispatcher_dup(JNIEnv* env, jclass this, jint fd) {
334
335 int res = -1;
336
337 RESTARTABLE(dup((int)fd), res);
338 if (res == -1) {
339 throwUnixException(env, errno);
340 }
341 return (jint)res;
342 }
343
344 JNIEXPORT jlong JNICALL
345 Java_sun_nio_fs_UnixNativeDispatcher_fopen0(JNIEnv* env, jclass this,
346 jlong pathAddress, jlong modeAddress)
347 {
|