提交 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -62,22 +62,14 @@ class BsdFileStore ...@@ -62,22 +62,14 @@ class BsdFileStore
} }
// step 2: find mount point // step 2: find mount point
UnixPath parent = path.getParent(); byte[] dir = null;
while (parent != null) { try {
UnixFileAttributes attrs = null; dir = BsdNativeDispatcher.getmntonname(path);
try { } catch (UnixException x) {
attrs = UnixFileAttributes.get(parent, true); x.rethrowAsIOException(path);
} catch (UnixException x) {
x.rethrowAsIOException(parent);
}
if (attrs.dev() != dev())
break;
path = parent;
parent = parent.getParent();
} }
// step 3: lookup mounted file systems // step 3: lookup mounted file systems
byte[] dir = path.asByteArray();
for (UnixMountEntry entry: fs.getMountEntries()) { for (UnixMountEntry entry: fs.getMountEntries()) {
if (Arrays.equals(dir, entry.dir())) if (Arrays.equals(dir, entry.dir()))
return entry; 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -51,6 +51,20 @@ class BsdNativeDispatcher extends UnixNativeDispatcher { ...@@ -51,6 +51,20 @@ class BsdNativeDispatcher extends UnixNativeDispatcher {
*/ */
static native void endfsstat(long iter) throws UnixException; 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 // initialize field IDs
private static native void initIDs(); private static native void initIDs();
......
...@@ -36,7 +36,7 @@ class UnixNativeDispatcher { ...@@ -36,7 +36,7 @@ class UnixNativeDispatcher {
protected UnixNativeDispatcher() { } protected UnixNativeDispatcher() { }
// returns a NativeBuffer containing the given path // returns a NativeBuffer containing the given path
private static NativeBuffer copyToNativeBuffer(UnixPath path) { static NativeBuffer copyToNativeBuffer(UnixPath path) {
byte[] cstr = path.getByteArrayForSysCalls(); byte[] cstr = path.getByteArrayForSysCalls();
int size = cstr.length + 1; int size = cstr.length + 1;
NativeBuffer buffer = NativeBuffers.getNativeBufferFromCache(size); 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 ...@@ -203,3 +203,24 @@ Java_sun_nio_fs_BsdNativeDispatcher_endfsstat(JNIEnv* env, jclass this, jlong va
free(iter); 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.
先完成此消息的编辑!
想要评论请 注册