src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c

Print this page
rev 8725 : 8024854: Basic changes and files to build the class library on AIX
Contributed-by: luchsh@linux.vnet.ibm.com, spoole@linux.vnet.ibm.com, thomas.stuefe@sap.com
Reviewed-by: alanb, prr, sla, chegar, michaelm, mullan

*** 40,50 **** #ifdef __solaris__ #include <strings.h> #endif ! #ifdef __linux__ #include <string.h> #endif #ifdef _ALLBSD_SOURCE #include <string.h> --- 40,50 ---- #ifdef __solaris__ #include <strings.h> #endif ! #if defined(__linux__) || defined(_AIX) #include <string.h> #endif #ifdef _ALLBSD_SOURCE #include <string.h>
*** 292,302 **** --- 292,308 ---- { char* msg; jsize len; jbyteArray bytes; + #ifdef _AIX + /* strerror() is not thread-safe on AIX so we have to use strerror_r() */ + char buffer[256]; + msg = (strerror_r((int)error, buffer, 256) == 0) ? buffer : "Error while calling strerror_r"; + #else msg = strerror((int)error); + #endif len = strlen(msg); bytes = (*env)->NewByteArray(env, len); if (bytes != NULL) { (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)msg); }
*** 672,681 **** --- 678,696 ---- DIR* dirp = jlong_to_ptr(value); /* EINTR not listed as a possible error */ /* TDB: reentrant version probably not required here */ res = readdir64_r(dirp, ptr, &result); + + #ifdef _AIX + /* On AIX, readdir_r() returns EBADF (i.e. '9') and sets 'result' to NULL for the */ + /* directory stream end. Otherwise, 'errno' will contain the error code. */ + if (res != 0) { + res = (result == NULL && res == EBADF) ? 0 : errno; + } + #endif + if (res != 0) { throwUnixException(env, res); return NULL; } else { if (result == NULL) {
*** 875,884 **** --- 890,911 ---- RESTARTABLE(statvfs64(path, &buf), err); if (err == -1) { throwUnixException(env, errno); } else { + #ifdef _AIX + /* AIX returns ULONG_MAX in buf.f_blocks for the /proc file system. */ + /* This is too big for a Java signed long and fools various tests. */ + if (buf.f_blocks == ULONG_MAX) { + buf.f_blocks = 0; + } + /* The number of free or available blocks can never exceed the total number of blocks */ + if (buf.f_blocks == 0) { + buf.f_bfree = 0; + buf.f_bavail = 0; + } + #endif (*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_frsize)); (*env)->SetLongField(env, attrs, attrs_f_blocks, long_to_jlong(buf.f_blocks)); (*env)->SetLongField(env, attrs, attrs_f_bfree, long_to_jlong(buf.f_bfree)); (*env)->SetLongField(env, attrs, attrs_f_bavail, long_to_jlong(buf.f_bavail)); }
*** 951,961 **** --- 978,993 ---- #endif if (res != 0 || p == NULL || p->pw_name == NULL || *(p->pw_name) == '\0') { /* not found or error */ if (errno == 0) + #ifdef _AIX + /* On AIX, getpwuid_r returns ESRCH if user does not exist. */ + errno = ESRCH; + #else errno = ENOENT; + #endif throwUnixException(env, errno); } else { jsize len = strlen(p->pw_name); result = (*env)->NewByteArray(env, len); if (result != NULL) {
*** 1006,1016 **** --- 1038,1053 ---- /* insufficient buffer size so need larger buffer */ buflen += ENT_BUF_SIZE; retry = 1; } else { if (errno == 0) + #ifdef _AIX + /* On AIX, getgrgid_r returns ESRCH if group does not exist. */ + errno = ESRCH; + #else errno = ENOENT; + #endif throwUnixException(env, errno); } } else { jsize len = strlen(g->gr_name); result = (*env)->NewByteArray(env, len);