mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-07 00:48:38 +00:00
8365807: (fs) Two-arg UnixFileAttributes.getIfExists should not use exception for control flow
Reviewed-by: alanb
This commit is contained in:
parent
6a480ad07a
commit
2b44ed7070
@ -83,18 +83,8 @@ class UnixFileAttributes
|
||||
|
||||
// get the UnixFileAttributes for a given file.
|
||||
// Returns null if the file does not exist.
|
||||
static UnixFileAttributes getIfExists(UnixPath path)
|
||||
throws UnixException
|
||||
{
|
||||
UnixFileAttributes attrs = new UnixFileAttributes();
|
||||
int errno = UnixNativeDispatcher.stat2(path, attrs);
|
||||
if (errno == 0) {
|
||||
return attrs;
|
||||
} else if (errno == UnixConstants.ENOENT) {
|
||||
return null;
|
||||
} else {
|
||||
throw new UnixException(errno);
|
||||
}
|
||||
static UnixFileAttributes getIfExists(UnixPath path) throws UnixException {
|
||||
return getIfExists(path, true);
|
||||
}
|
||||
|
||||
// get the UnixFileAttributes for a given file, optionally following links.
|
||||
@ -104,17 +94,14 @@ class UnixFileAttributes
|
||||
{
|
||||
UnixFileAttributes attrs = new UnixFileAttributes();
|
||||
int flag = (followLinks) ? 0 : UnixConstants.AT_SYMLINK_NOFOLLOW;
|
||||
try {
|
||||
UnixNativeDispatcher.fstatat(UnixConstants.AT_FDCWD,
|
||||
path.asByteArray(), flag, attrs);
|
||||
} catch (UnixException x) {
|
||||
if (x.errno() == UnixConstants.ENOENT)
|
||||
return null;
|
||||
|
||||
throw x;
|
||||
}
|
||||
|
||||
return attrs;
|
||||
int errno = UnixNativeDispatcher.fstatat2(UnixConstants.AT_FDCWD,
|
||||
path, flag, attrs);
|
||||
if (errno == 0)
|
||||
return attrs;
|
||||
else if (errno == UnixConstants.ENOENT)
|
||||
return null;
|
||||
else
|
||||
throw new UnixException(errno);
|
||||
}
|
||||
|
||||
// get the UnixFileAttributes for an open file
|
||||
@ -130,7 +117,7 @@ class UnixFileAttributes
|
||||
{
|
||||
UnixFileAttributes attrs = new UnixFileAttributes();
|
||||
int flag = (followLinks) ? 0 : UnixConstants.AT_SYMLINK_NOFOLLOW;
|
||||
UnixNativeDispatcher.fstatat(dfd, path.asByteArray(), flag, attrs);
|
||||
UnixNativeDispatcher.fstatat(dfd, path, flag, attrs);
|
||||
return attrs;
|
||||
}
|
||||
|
||||
|
||||
@ -256,15 +256,15 @@ class UnixNativeDispatcher {
|
||||
}
|
||||
}
|
||||
}
|
||||
private static native int stat0(long pathAddress, UnixFileAttributes attrs);
|
||||
|
||||
// Variant of stat() returning errno instead of throwing UnixException
|
||||
static int stat2(UnixPath path, UnixFileAttributes attrs) {
|
||||
try (NativeBuffer buffer = copyToNativeBuffer(path)) {
|
||||
return stat0(buffer.address(), attrs);
|
||||
}
|
||||
}
|
||||
|
||||
private static native int stat0(long pathAddress, UnixFileAttributes attrs);
|
||||
|
||||
/**
|
||||
* lstat(const char* path, struct stat* buf)
|
||||
*/
|
||||
@ -288,15 +288,25 @@ class UnixNativeDispatcher {
|
||||
/**
|
||||
* fstatat(int filedes,const char* path, struct stat* buf, int flag)
|
||||
*/
|
||||
static void fstatat(int dfd, byte[] path, int flag, UnixFileAttributes attrs)
|
||||
static void fstatat(int dfd, UnixPath path, int flag, UnixFileAttributes attrs)
|
||||
throws UnixException
|
||||
{
|
||||
try (NativeBuffer buffer = NativeBuffers.asNativeBuffer(path)) {
|
||||
fstatat0(dfd, buffer.address(), flag, attrs);
|
||||
try (NativeBuffer buffer = copyToNativeBuffer(path)) {
|
||||
int errno = fstatat0(dfd, buffer.address(), flag, attrs);
|
||||
if (errno != 0) {
|
||||
throw new UnixException(errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
private static native int fstatat0(int dfd, long pathAddress, int flag,
|
||||
UnixFileAttributes attrs);
|
||||
|
||||
// Variant of fstatat() returning errno instead of throwing UnixException
|
||||
static int fstatat2(int dfd, UnixPath path, int flag, UnixFileAttributes attrs) {
|
||||
try (NativeBuffer buffer = copyToNativeBuffer(path)) {
|
||||
return fstatat0(dfd, buffer.address(), flag, attrs);
|
||||
}
|
||||
}
|
||||
private static native void fstatat0(int dfd, long pathAddress, int flag,
|
||||
UnixFileAttributes attrs) throws UnixException;
|
||||
|
||||
/**
|
||||
* chown(const char* path, uid_t owner, gid_t group)
|
||||
|
||||
@ -741,7 +741,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_fstat0(JNIEnv* env, jclass this, jint fd,
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_sun_nio_fs_UnixNativeDispatcher_fstatat0(JNIEnv* env, jclass this, jint dfd,
|
||||
jlong pathAddress, jint flag, jobject attrs)
|
||||
{
|
||||
@ -761,23 +761,23 @@ Java_sun_nio_fs_UnixNativeDispatcher_fstatat0(JNIEnv* env, jclass this, jint dfd
|
||||
RESTARTABLE(statx_wrapper((int)dfd, path, flags, mask, &statx_buf), err);
|
||||
if (err == 0) {
|
||||
copy_statx_attributes(env, &statx_buf, attrs);
|
||||
return 0;
|
||||
} else {
|
||||
throwUnixException(env, errno);
|
||||
return errno;
|
||||
}
|
||||
// statx was available, so return now
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (my_fstatat_func == NULL) {
|
||||
JNU_ThrowInternalError(env, "should not reach here");
|
||||
return;
|
||||
return ENOTSUP;
|
||||
}
|
||||
RESTARTABLE((*my_fstatat_func)((int)dfd, path, &buf, (int)flag), err);
|
||||
if (err == -1) {
|
||||
throwUnixException(env, errno);
|
||||
} else {
|
||||
if (err == 0) {
|
||||
copy_stat_attributes(env, &buf, attrs);
|
||||
return 0;
|
||||
} else {
|
||||
return errno;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user