提交 8e5dbd44 编写于 作者: B bpb

8230085: (fs) FileStore::isReadOnly is always true on macOS Catalina

Reviewed-by: alanb
上级 126d603b
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
......@@ -62,22 +62,14 @@ class BsdFileStore
}
// step 2: find mount point
UnixPath parent = path.getParent();
while (parent != null) {
UnixFileAttributes attrs = null;
try {
attrs = UnixFileAttributes.get(parent, true);
} catch (UnixException x) {
x.rethrowAsIOException(parent);
}
if (attrs.dev() != dev())
break;
path = parent;
parent = parent.getParent();
byte[] dir = null;
try {
dir = BsdNativeDispatcher.getmntonname(path);
} catch (UnixException x) {
x.rethrowAsIOException(path);
}
// step 3: lookup mounted file systems
byte[] dir = path.asByteArray();
for (UnixMountEntry entry: fs.getMountEntries()) {
if (Arrays.equals(dir, entry.dir()))
return entry;
......
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
......@@ -51,6 +51,20 @@ class BsdNativeDispatcher extends UnixNativeDispatcher {
*/
static native void endfsstat(long iter) throws UnixException;
/**
* int statfs(const char *path, struct statfs *buf);
* returns buf->f_mntonname (directory on which mounted)
*/
static byte[] getmntonname(UnixPath path) throws UnixException {
NativeBuffer pathBuffer = copyToNativeBuffer(path);
try {
return getmntonname0(pathBuffer.address());
} finally {
pathBuffer.release();
}
}
static native byte[] getmntonname0(long pathAddress) throws UnixException;
// initialize field IDs
private static native void initIDs();
......
......@@ -36,7 +36,7 @@ class UnixNativeDispatcher {
protected UnixNativeDispatcher() { }
// returns a NativeBuffer containing the given path
private static NativeBuffer copyToNativeBuffer(UnixPath path) {
static NativeBuffer copyToNativeBuffer(UnixPath path) {
byte[] cstr = path.getByteArrayForSysCalls();
int size = cstr.length + 1;
NativeBuffer buffer = NativeBuffers.getNativeBufferFromCache(size);
......
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
......@@ -203,3 +203,24 @@ Java_sun_nio_fs_BsdNativeDispatcher_endfsstat(JNIEnv* env, jclass this, jlong va
free(iter);
}
}
JNIEXPORT jbyteArray JNICALL
Java_sun_nio_fs_BsdNativeDispatcher_getmntonname0(JNIEnv *env, jclass this,
jlong pathAddress)
{
struct statfs buf;
const char* path = (const char*)jlong_to_ptr(pathAddress);
if (statfs(path, &buf) != 0) {
throwUnixException(env, errno);
}
jsize len = strlen(buf.f_mntonname);
jbyteArray mntonname = (*env)->NewByteArray(env, len);
if (mntonname != NULL) {
(*env)->SetByteArrayRegion(env, mntonname, 0, len,
(jbyte*)buf.f_mntonname);
}
return mntonname;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册