mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-11 14:11:36 +00:00
8001334: Remove use of JVM_* functions from java.io code
Replace JVM_* functions with direct system calls in java io area Reviewed-by: alanb, uta, martin
This commit is contained in:
parent
709f67b8f9
commit
f3e45cd062
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -384,9 +384,7 @@ OTHER_INCLUDES += \
|
||||
ifeq ($(PLATFORM),windows)
|
||||
OTHER_LDLIBS += $(JVMLIB) ws2_32.lib \
|
||||
-libpath:$(LIBDIR) java.lib \
|
||||
$(OBJDIR)/../../../../sun/java.net/net/$(OBJDIRNAME)/net.lib \
|
||||
$(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/io_util.obj \
|
||||
$(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/FileDescriptor_md.obj
|
||||
$(OBJDIR)/../../../../sun/java.net/net/$(OBJDIRNAME)/net.lib
|
||||
endif
|
||||
ifeq ($(PLATFORM), linux)
|
||||
OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread $(LIBDL)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -1957,8 +1957,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNIO,\
|
||||
-lsendfile -ljava -lnet -lc,\
|
||||
LDFLAGS_SUFFIX_windows:=jvm.lib ws2_32.lib $(WIN_JAVA_LIB) \
|
||||
$(JDK_OUTPUTDIR)/objs/libnet/net.lib \
|
||||
$(JDK_OUTPUTDIR)/objs/libjava/io_util.obj \
|
||||
$(JDK_OUTPUTDIR)/objs/libjava/FileDescriptor_md.obj \
|
||||
advapi32.lib,\
|
||||
LDFLAGS_SUFFIX_macosx:=-ljava -lnet -pthread -framework CoreFoundation,\
|
||||
LDFLAGS_SUFFIX:=,\
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,10 +23,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
#include "jni.h"
|
||||
#include "jvm.h"
|
||||
#include "jni_util.h"
|
||||
#include "jlong.h"
|
||||
#include "jdk_util.h"
|
||||
|
||||
#include "java_lang_Float.h"
|
||||
#include "java_lang_Double.h"
|
||||
@ -88,7 +86,7 @@ Java_java_io_ObjectOutputStream_floatsToBytes(JNIEnv *env,
|
||||
srcend = srcpos + nfloats;
|
||||
for ( ; srcpos < srcend; srcpos++) {
|
||||
fval = (float) floats[srcpos];
|
||||
if (JVM_IsNaN(fval)) { /* collapse NaNs */
|
||||
if (ISNANF(fval)) { /* collapse NaNs */
|
||||
ival = 0x7fc00000;
|
||||
} else {
|
||||
u.f = fval;
|
||||
@ -160,7 +158,7 @@ Java_java_io_ObjectOutputStream_doublesToBytes(JNIEnv *env,
|
||||
srcend = srcpos + ndoubles;
|
||||
for ( ; srcpos < srcend; srcpos++) {
|
||||
dval = doubles[srcpos];
|
||||
if (JVM_IsNaN((double) dval)) { /* collapse NaNs */
|
||||
if (ISNAND((double) dval)) { /* collapse NaNs */
|
||||
lval = jint_to_jlong(0x7ff80000);
|
||||
lval = jlong_shl(lval, 32);
|
||||
} else {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -47,10 +47,8 @@ readSingle(JNIEnv *env, jobject this, jfieldID fid) {
|
||||
nread = IO_Read(fd, &ret, 1);
|
||||
if (nread == 0) { /* EOF */
|
||||
return -1;
|
||||
} else if (nread == JVM_IO_ERR) { /* error */
|
||||
} else if (nread == -1) { /* error */
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Read error");
|
||||
} else if (nread == JVM_IO_INTR) {
|
||||
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
|
||||
}
|
||||
return ret & 0xFF;
|
||||
}
|
||||
@ -111,10 +109,8 @@ readBytes(JNIEnv *env, jobject this, jbyteArray bytes,
|
||||
nread = IO_Read(fd, buf, len);
|
||||
if (nread > 0) {
|
||||
(*env)->SetByteArrayRegion(env, bytes, off, nread, (jbyte *)buf);
|
||||
} else if (nread == JVM_IO_ERR) {
|
||||
} else if (nread == -1) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Read error");
|
||||
} else if (nread == JVM_IO_INTR) {
|
||||
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
|
||||
} else { /* EOF */
|
||||
nread = -1;
|
||||
}
|
||||
@ -141,10 +137,8 @@ writeSingle(JNIEnv *env, jobject this, jint byte, jboolean append, jfieldID fid)
|
||||
} else {
|
||||
n = IO_Write(fd, &c, 1);
|
||||
}
|
||||
if (n == JVM_IO_ERR) {
|
||||
if (n == -1) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Write error");
|
||||
} else if (n == JVM_IO_INTR) {
|
||||
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -194,12 +188,9 @@ writeBytes(JNIEnv *env, jobject this, jbyteArray bytes,
|
||||
} else {
|
||||
n = IO_Write(fd, buf+off, len);
|
||||
}
|
||||
if (n == JVM_IO_ERR) {
|
||||
if (n == -1) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Write error");
|
||||
break;
|
||||
} else if (n == JVM_IO_INTR) {
|
||||
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
|
||||
break;
|
||||
}
|
||||
off += n;
|
||||
len -= n;
|
||||
@ -214,11 +205,11 @@ void
|
||||
throwFileNotFoundException(JNIEnv *env, jstring path)
|
||||
{
|
||||
char buf[256];
|
||||
jint n;
|
||||
size_t n;
|
||||
jobject x;
|
||||
jstring why = NULL;
|
||||
|
||||
n = JVM_GetLastErrorString(buf, sizeof(buf));
|
||||
n = getLastErrorString(buf, sizeof(buf));
|
||||
if (n > 0) {
|
||||
why = JNU_NewStringPlatform(env, buf);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -54,7 +54,7 @@ void writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off,
|
||||
jint len, jboolean append, jfieldID fid);
|
||||
void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags);
|
||||
void throwFileNotFoundException(JNIEnv *env, jstring path);
|
||||
|
||||
size_t getLastErrorString(char *buf, size_t len);
|
||||
|
||||
/*
|
||||
* Macros for managing platform strings. The typical usage pattern is:
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,4 +23,24 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
// Currently, there are no unix specific functions defined.
|
||||
#ifndef JDK_UTIL_MD_H
|
||||
#define JDK_UTIL_MD_H
|
||||
|
||||
// checking for nanness
|
||||
#ifdef __solaris__
|
||||
#include <ieeefp.h>
|
||||
#define ISNANF(f) isnanf(f)
|
||||
#define ISNAND(d) isnand(d)
|
||||
#elif defined(MACOSX)
|
||||
#include <math.h>
|
||||
#define ISNANF(f) isnan(f)
|
||||
#define ISNAND(d) isnan(d)
|
||||
#elif defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
#include <math.h>
|
||||
#define ISNANF(f) isnanf(f)
|
||||
#define ISNAND(d) isnan(d)
|
||||
#else
|
||||
#error "missing platform-specific definition here"
|
||||
#endif
|
||||
|
||||
#endif /* JDK_UTIL_MD_H */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,9 +23,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
#include "jni.h"
|
||||
#include "jni_util.h"
|
||||
#include "jvm.h"
|
||||
#include "io_util_md.h"
|
||||
|
||||
#include "java_io_FileDescriptor.h"
|
||||
|
||||
@ -51,8 +50,8 @@ Java_java_io_FileDescriptor_initIDs(JNIEnv *env, jclass fdClass) {
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_io_FileDescriptor_sync(JNIEnv *env, jobject this) {
|
||||
int fd = (*env)->GetIntField(env, this, IO_fd_fdID);
|
||||
if (JVM_Sync(fd) == -1) {
|
||||
FD fd = THIS_FD(this);
|
||||
if (IO_Sync(fd) == -1) {
|
||||
JNU_ThrowByName(env, "java/io/SyncFailedException", "sync failed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -77,7 +77,7 @@ Java_java_io_UnixFileSystem_canonicalize0(JNIEnv *env, jobject this,
|
||||
|
||||
WITH_PLATFORM_STRING(env, pathname, path) {
|
||||
char canonicalPath[JVM_MAXPATHLEN];
|
||||
if (canonicalize(JVM_NativePath((char *)path),
|
||||
if (canonicalize((char *)path,
|
||||
canonicalPath, JVM_MAXPATHLEN) < 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Bad pathname");
|
||||
} else {
|
||||
@ -241,19 +241,18 @@ Java_java_io_UnixFileSystem_createFileExclusively(JNIEnv *env, jclass cls,
|
||||
jboolean rv = JNI_FALSE;
|
||||
|
||||
WITH_PLATFORM_STRING(env, pathname, path) {
|
||||
int fd;
|
||||
if (!strcmp (path, "/")) {
|
||||
fd = JVM_EEXIST; /* The root directory always exists */
|
||||
} else {
|
||||
fd = JVM_Open(path, JVM_O_RDWR | JVM_O_CREAT | JVM_O_EXCL, 0666);
|
||||
}
|
||||
if (fd < 0) {
|
||||
if (fd != JVM_EEXIST) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, path);
|
||||
FD fd;
|
||||
/* The root directory always exists */
|
||||
if (strcmp (path, "/")) {
|
||||
fd = handleOpen(path, O_RDWR | O_CREAT | O_EXCL, 0666);
|
||||
if (fd < 0) {
|
||||
if (errno != EEXIST)
|
||||
JNU_ThrowIOExceptionWithLastError(env, path);
|
||||
} else {
|
||||
if (close(fd) == -1)
|
||||
JNU_ThrowIOExceptionWithLastError(env, path);
|
||||
rv = JNI_TRUE;
|
||||
}
|
||||
} else {
|
||||
JVM_Close(fd);
|
||||
rv = JNI_TRUE;
|
||||
}
|
||||
} END_PLATFORM_STRING(env, path);
|
||||
return rv;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -29,6 +29,15 @@
|
||||
#include "io_util.h"
|
||||
#include "io_util_md.h"
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __solaris__
|
||||
#include <sys/filio.h>
|
||||
#endif
|
||||
|
||||
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
#ifdef MACOSX
|
||||
|
||||
@ -62,6 +71,28 @@ jstring newStringPlatform(JNIEnv *env, const char* str)
|
||||
}
|
||||
#endif
|
||||
|
||||
FD
|
||||
handleOpen(const char *path, int oflag, int mode) {
|
||||
FD fd;
|
||||
RESTARTABLE(open64(path, oflag, mode), fd);
|
||||
if (fd != -1) {
|
||||
struct stat64 buf64;
|
||||
int result;
|
||||
RESTARTABLE(fstat64(fd, &buf64), result);
|
||||
if (result != -1) {
|
||||
if (S_ISDIR(buf64.st_mode)) {
|
||||
close(fd);
|
||||
errno = EISDIR;
|
||||
fd = -1;
|
||||
}
|
||||
} else {
|
||||
close(fd);
|
||||
fd = -1;
|
||||
}
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
void
|
||||
fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
|
||||
{
|
||||
@ -74,8 +105,8 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
|
||||
while ((p > ps) && (*p == '/'))
|
||||
*p-- = '\0';
|
||||
#endif
|
||||
fd = JVM_Open(ps, flags, 0666);
|
||||
if (fd >= 0) {
|
||||
fd = handleOpen(ps, flags, 0666);
|
||||
if (fd != -1) {
|
||||
SET_FD(this, fd, fid);
|
||||
} else {
|
||||
throwFileNotFoundException(env, path);
|
||||
@ -83,7 +114,6 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
|
||||
} END_PLATFORM_STRING(env, ps);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
fileClose(JNIEnv *env, jobject this, jfieldID fid)
|
||||
{
|
||||
@ -114,7 +144,89 @@ fileClose(JNIEnv *env, jobject this, jfieldID fid)
|
||||
dup2(devnull, fd);
|
||||
close(devnull);
|
||||
}
|
||||
} else if (JVM_Close(fd) == -1) {
|
||||
} else if (close(fd) == -1) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "close failed");
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t
|
||||
handleRead(FD fd, void *buf, jint len)
|
||||
{
|
||||
ssize_t result;
|
||||
RESTARTABLE(read(fd, buf, len), result);
|
||||
return result;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
handleWrite(FD fd, const void *buf, jint len)
|
||||
{
|
||||
ssize_t result;
|
||||
RESTARTABLE(write(fd, buf, len), result);
|
||||
return result;
|
||||
}
|
||||
|
||||
jint
|
||||
handleAvailable(FD fd, jlong *pbytes)
|
||||
{
|
||||
int mode;
|
||||
struct stat64 buf64;
|
||||
jlong size = -1, current = -1;
|
||||
|
||||
int result;
|
||||
RESTARTABLE(fstat64(fd, &buf64), result);
|
||||
if (result != -1) {
|
||||
mode = buf64.st_mode;
|
||||
if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
|
||||
int n;
|
||||
int result;
|
||||
RESTARTABLE(ioctl(fd, FIONREAD, &n), result);
|
||||
if (result >= 0) {
|
||||
*pbytes = n;
|
||||
return 1;
|
||||
}
|
||||
} else if (S_ISREG(mode)) {
|
||||
size = buf64.st_size;
|
||||
}
|
||||
}
|
||||
|
||||
if ((current = lseek64(fd, 0, SEEK_CUR)) == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (size < current) {
|
||||
if ((size = lseek64(fd, 0, SEEK_END)) == -1)
|
||||
return 0;
|
||||
else if (lseek64(fd, current, SEEK_SET) == -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (size >= current) {
|
||||
*pbytes = size - current;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
jint
|
||||
handleSetLength(FD fd, jlong length)
|
||||
{
|
||||
int result;
|
||||
RESTARTABLE(ftruncate64(fd, length), result);
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t
|
||||
getLastErrorString(char *buf, size_t len)
|
||||
{
|
||||
if (errno == 0 || len < 1) return 0;
|
||||
|
||||
const char *err = strerror(errno);
|
||||
size_t n = strlen(err);
|
||||
if (n >= len)
|
||||
n = len - 1;
|
||||
|
||||
strncpy(buf, err, n);
|
||||
buf[n] = '\0';
|
||||
return n;
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,6 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
#include "jni.h"
|
||||
#include "jni_util.h"
|
||||
|
||||
/*
|
||||
@ -31,6 +30,18 @@
|
||||
*/
|
||||
#define FD jint
|
||||
|
||||
/*
|
||||
* Prototypes for functions in io_util_md.c called from io_util.c,
|
||||
* FileDescriptor.c, FileInputStream.c, FileOutputStream.c,
|
||||
* UnixFileSystem_md.c
|
||||
*/
|
||||
ssize_t handleWrite(FD fd, const void *buf, jint len);
|
||||
ssize_t handleRead(FD fd, void *buf, jint len);
|
||||
jint handleAvailable(FD fd, jlong *pbytes);
|
||||
jint handleSetLength(FD fd, jlong length);
|
||||
|
||||
FD handleOpen(const char *path, int oflag, int mode);
|
||||
|
||||
/*
|
||||
* Macros to set/get fd from the java.io.FileDescriptor. These
|
||||
* macros rely on having an appropriately defined 'this' object
|
||||
@ -53,21 +64,40 @@
|
||||
#define THIS_FD(obj) (*env)->GetIntField(env, obj, IO_fd_fdID)
|
||||
|
||||
/*
|
||||
* Route the routines through VM
|
||||
* Route the routines
|
||||
*/
|
||||
#define IO_Append JVM_Write
|
||||
#define IO_Write JVM_Write
|
||||
#define IO_Sync JVM_Sync
|
||||
#define IO_Read JVM_Read
|
||||
#define IO_Lseek JVM_Lseek
|
||||
#define IO_Available JVM_Available
|
||||
#define IO_SetLength JVM_SetLength
|
||||
#define IO_Sync fsync
|
||||
#define IO_Read handleRead
|
||||
#define IO_Write handleWrite
|
||||
#define IO_Append handleWrite
|
||||
#define IO_Available handleAvailable
|
||||
#define IO_SetLength handleSetLength
|
||||
|
||||
#ifdef _ALLBSD_SOURCE
|
||||
#define open64 open
|
||||
#define fstat64 fstat
|
||||
#define stat64 stat
|
||||
#define lseek64 lseek
|
||||
#define ftruncate64 ftruncate
|
||||
#define IO_Lseek lseek
|
||||
#else
|
||||
#define IO_Lseek lseek64
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On Solaris, the handle field is unused
|
||||
*/
|
||||
#define SET_HANDLE(fd) return (jlong)-1
|
||||
|
||||
/*
|
||||
* Retry the operation if it is interrupted
|
||||
*/
|
||||
#define RESTARTABLE(_cmd, _result) do { \
|
||||
do { \
|
||||
_result = _cmd; \
|
||||
} while((_result == -1) && (errno == EINTR)); \
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* IO helper function(s)
|
||||
*/
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -28,6 +28,11 @@
|
||||
#define JDK_UTIL_MD_H
|
||||
|
||||
#include "jni.h"
|
||||
#include <float.h>
|
||||
|
||||
// checking for nanness
|
||||
#define ISNANF(f) _isnan(f)
|
||||
#define ISNAND(d) _isnan(d)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -208,7 +208,7 @@ pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE) {
|
||||
return pathbuf;
|
||||
}
|
||||
|
||||
jlong
|
||||
FD
|
||||
winFileHandleOpen(JNIEnv *env, jstring path, int flags)
|
||||
{
|
||||
const DWORD access =
|
||||
@ -264,7 +264,7 @@ winFileHandleOpen(JNIEnv *env, jstring path, int flags)
|
||||
void
|
||||
fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
|
||||
{
|
||||
jlong h = winFileHandleOpen(env, path, flags);
|
||||
FD h = winFileHandleOpen(env, path, flags);
|
||||
if (h >= 0) {
|
||||
SET_FD(this, h, fid);
|
||||
}
|
||||
@ -274,12 +274,12 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
|
||||
old C style int fd as is used in HPI layer */
|
||||
|
||||
static int
|
||||
handleNonSeekAvailable(jlong, long *);
|
||||
handleNonSeekAvailable(FD, long *);
|
||||
static int
|
||||
handleStdinAvailable(jlong, long *);
|
||||
handleStdinAvailable(FD, long *);
|
||||
|
||||
int
|
||||
handleAvailable(jlong fd, jlong *pbytes) {
|
||||
handleAvailable(FD fd, jlong *pbytes) {
|
||||
HANDLE h = (HANDLE)fd;
|
||||
DWORD type = 0;
|
||||
|
||||
@ -317,7 +317,7 @@ handleAvailable(jlong fd, jlong *pbytes) {
|
||||
}
|
||||
|
||||
static int
|
||||
handleNonSeekAvailable(jlong fd, long *pbytes) {
|
||||
handleNonSeekAvailable(FD fd, long *pbytes) {
|
||||
/* This is used for available on non-seekable devices
|
||||
* (like both named and anonymous pipes, such as pipes
|
||||
* connected to an exec'd process).
|
||||
@ -346,7 +346,7 @@ handleNonSeekAvailable(jlong fd, long *pbytes) {
|
||||
}
|
||||
|
||||
static int
|
||||
handleStdinAvailable(jlong fd, long *pbytes) {
|
||||
handleStdinAvailable(FD fd, long *pbytes) {
|
||||
HANDLE han;
|
||||
DWORD numEventsRead = 0; /* Number of events read from buffer */
|
||||
DWORD numEvents = 0; /* Number of events in buffer */
|
||||
@ -412,8 +412,8 @@ handleStdinAvailable(jlong fd, long *pbytes) {
|
||||
* denied".
|
||||
*/
|
||||
|
||||
JNIEXPORT int
|
||||
handleSync(jlong fd) {
|
||||
int
|
||||
handleSync(FD fd) {
|
||||
/*
|
||||
* From the documentation:
|
||||
*
|
||||
@ -443,7 +443,7 @@ handleSync(jlong fd) {
|
||||
|
||||
|
||||
int
|
||||
handleSetLength(jlong fd, jlong length) {
|
||||
handleSetLength(FD fd, jlong length) {
|
||||
HANDLE h = (HANDLE)fd;
|
||||
long high = (long)(length >> 32);
|
||||
DWORD ret;
|
||||
@ -459,7 +459,7 @@ handleSetLength(jlong fd, jlong length) {
|
||||
|
||||
JNIEXPORT
|
||||
jint
|
||||
handleRead(jlong fd, void *buf, jint len)
|
||||
handleRead(FD fd, void *buf, jint len)
|
||||
{
|
||||
DWORD read = 0;
|
||||
BOOL result = 0;
|
||||
@ -482,7 +482,7 @@ handleRead(jlong fd, void *buf, jint len)
|
||||
return (jint)read;
|
||||
}
|
||||
|
||||
static jint writeInternal(jlong fd, const void *buf, jint len, jboolean append)
|
||||
static jint writeInternal(FD fd, const void *buf, jint len, jboolean append)
|
||||
{
|
||||
BOOL result = 0;
|
||||
DWORD written = 0;
|
||||
@ -510,13 +510,11 @@ static jint writeInternal(jlong fd, const void *buf, jint len, jboolean append)
|
||||
return (jint)written;
|
||||
}
|
||||
|
||||
JNIEXPORT
|
||||
jint handleWrite(jlong fd, const void *buf, jint len) {
|
||||
jint handleWrite(FD fd, const void *buf, jint len) {
|
||||
return writeInternal(fd, buf, len, JNI_FALSE);
|
||||
}
|
||||
|
||||
JNIEXPORT
|
||||
jint handleAppend(jlong fd, const void *buf, jint len) {
|
||||
jint handleAppend(FD fd, const void *buf, jint len) {
|
||||
return writeInternal(fd, buf, len, JNI_TRUE);
|
||||
}
|
||||
|
||||
@ -545,7 +543,7 @@ handleClose(JNIEnv *env, jobject this, jfieldID fid)
|
||||
}
|
||||
|
||||
jlong
|
||||
handleLseek(jlong fd, jlong offset, jint whence)
|
||||
handleLseek(FD fd, jlong offset, jint whence)
|
||||
{
|
||||
LARGE_INTEGER pos, distance;
|
||||
DWORD lowPos = 0;
|
||||
@ -569,3 +567,44 @@ handleLseek(jlong fd, jlong offset, jint whence)
|
||||
}
|
||||
return long_to_jlong(pos.QuadPart);
|
||||
}
|
||||
|
||||
size_t
|
||||
getLastErrorString(char *buf, size_t len)
|
||||
{
|
||||
DWORD errval;
|
||||
if (len > 0) {
|
||||
if ((errval = GetLastError()) != 0) {
|
||||
// DOS error
|
||||
size_t n = (size_t)FormatMessage(
|
||||
FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
errval,
|
||||
0,
|
||||
buf,
|
||||
(DWORD)len,
|
||||
NULL);
|
||||
if (n > 3) {
|
||||
// Drop final '.', CR, LF
|
||||
if (buf[n - 1] == '\n') n--;
|
||||
if (buf[n - 1] == '\r') n--;
|
||||
if (buf[n - 1] == '.') n--;
|
||||
buf[n] = '\0';
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
if (errno != 0) {
|
||||
// C runtime error that has no corresponding DOS error code
|
||||
const char *err = strerror(errno);
|
||||
size_t n = strlen(err);
|
||||
if (n >= len)
|
||||
n = len - 1;
|
||||
|
||||
strncpy(buf, err, n);
|
||||
buf[n] = '\0';
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,7 +27,12 @@
|
||||
#include "jni_util.h"
|
||||
|
||||
/*
|
||||
* Prototypes for functions in io_util_md.c called from io_util,
|
||||
* Macros to use the right data type for file descriptors
|
||||
*/
|
||||
#define FD jlong
|
||||
|
||||
/*
|
||||
* Prototypes for functions in io_util_md.c called from io_util.c,
|
||||
* FileDescriptor.c, FileInputStream.c, FileOutputStream.c
|
||||
*/
|
||||
WCHAR* pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE);
|
||||
@ -35,26 +40,20 @@ WCHAR* fileToNTPath(JNIEnv *env, jobject file, jfieldID id);
|
||||
WCHAR* getPrefixed(const WCHAR* path, int pathlen);
|
||||
WCHAR* currentDir(int di);
|
||||
int currentDirLength(const WCHAR* path, int pathlen);
|
||||
void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags);
|
||||
int handleAvailable(jlong fd, jlong *pbytes);
|
||||
JNIEXPORT int handleSync(jlong fd);
|
||||
int handleSetLength(jlong fd, jlong length);
|
||||
JNIEXPORT jint handleRead(jlong fd, void *buf, jint len);
|
||||
JNIEXPORT jint handleWrite(jlong fd, const void *buf, jint len);
|
||||
JNIEXPORT jint handleAppend(jlong fd, const void *buf, jint len);
|
||||
int handleAvailable(FD fd, jlong *pbytes);
|
||||
int handleSync(FD fd);
|
||||
int handleSetLength(FD fd, jlong length);
|
||||
JNIEXPORT jint handleRead(FD fd, void *buf, jint len);
|
||||
jint handleWrite(FD fd, const void *buf, jint len);
|
||||
jint handleAppend(FD fd, const void *buf, jint len);
|
||||
jint handleClose(JNIEnv *env, jobject this, jfieldID fid);
|
||||
jlong handleLseek(jlong fd, jlong offset, jint whence);
|
||||
jlong handleLseek(FD fd, jlong offset, jint whence);
|
||||
|
||||
/*
|
||||
* Returns an opaque handle to file named by "path". If an error occurs,
|
||||
* returns -1 and an exception is pending.
|
||||
*/
|
||||
jlong winFileHandleOpen(JNIEnv *env, jstring path, int flags);
|
||||
|
||||
/*
|
||||
* Macros to use the right data type for file descriptors
|
||||
*/
|
||||
#define FD jlong
|
||||
FD winFileHandleOpen(JNIEnv *env, jstring path, int flags);
|
||||
|
||||
/*
|
||||
* Macros to set/get fd from the java.io.FileDescriptor.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user