src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c

Print this page




  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 {