diff --git a/jfuse-api/src/main/java/org/cryptomator/jfuse/api/Errno.java b/jfuse-api/src/main/java/org/cryptomator/jfuse/api/Errno.java index f4a2c032..df9a03ae 100644 --- a/jfuse-api/src/main/java/org/cryptomator/jfuse/api/Errno.java +++ b/jfuse-api/src/main/java/org/cryptomator/jfuse/api/Errno.java @@ -88,6 +88,13 @@ public interface Errno { */ int enotempty(); + /** + * Operation not supported + * + * @return error constant {@code ENOTSUP} + */ + int enotsup(); + /** * Invalid argument * diff --git a/jfuse-examples/src/main/java/org/cryptomator/jfuse/examples/AbstractMirrorFileSystem.java b/jfuse-examples/src/main/java/org/cryptomator/jfuse/examples/AbstractMirrorFileSystem.java index 8da217b1..9de512b6 100644 --- a/jfuse-examples/src/main/java/org/cryptomator/jfuse/examples/AbstractMirrorFileSystem.java +++ b/jfuse-examples/src/main/java/org/cryptomator/jfuse/examples/AbstractMirrorFileSystem.java @@ -205,6 +205,9 @@ public int getxattr(String path, String name, ByteBuffer value) { Path node = resolvePath(path); try { var xattr = Files.getFileAttributeView(node, UserDefinedFileAttributeView.class, LinkOption.NOFOLLOW_LINKS); + if (xattr == null) { + return -errno.enotsup(); + } int size = xattr.size(name); if (value.capacity() == 0) { return size; @@ -226,6 +229,9 @@ public int setxattr(String path, String name, ByteBuffer value, int flags) { Path node = resolvePath(path); try { var xattr = Files.getFileAttributeView(node, UserDefinedFileAttributeView.class, LinkOption.NOFOLLOW_LINKS); + if (xattr == null) { + return -errno.enotsup(); + } xattr.write(name, value); return 0; } catch (NoSuchFileException e) { @@ -241,15 +247,21 @@ public int listxattr(String path, ByteBuffer list) { Path node = resolvePath(path); try { var xattr = Files.getFileAttributeView(node, UserDefinedFileAttributeView.class, LinkOption.NOFOLLOW_LINKS); + if (xattr == null) { + return -errno.enotsup(); + } var names = xattr.list(); if (list.capacity() == 0) { - return names.size(); - } - int startpos = list.position(); - for (var name : names) { - list.put(StandardCharsets.UTF_8.encode(name)).put((byte) 0x00); + var contentBytes = xattr.list().stream().map(StandardCharsets.UTF_8::encode).mapToInt(ByteBuffer::remaining).sum(); + var nulBytes = names.size(); + return contentBytes + nulBytes; // attr1\0aattr2\0attr3\0 + } else { + int startpos = list.position(); + for (var name : names) { + list.put(StandardCharsets.UTF_8.encode(name)).put((byte) 0x00); + } + return list.position() - startpos; } - return list.position() - startpos; } catch (BufferOverflowException e) { return -errno.erange(); } catch (NoSuchFileException e) { @@ -265,6 +277,9 @@ public int removexattr(String path, String name) { Path node = resolvePath(path); try { var xattr = Files.getFileAttributeView(node, UserDefinedFileAttributeView.class, LinkOption.NOFOLLOW_LINKS); + if (xattr == null) { + return -errno.enotsup(); + } xattr.delete(name); return 0; } catch (NoSuchFileException e) { diff --git a/jfuse-linux-aarch64/pom.xml b/jfuse-linux-aarch64/pom.xml index cac10ebb..ffbba3f2 100644 --- a/jfuse-linux-aarch64/pom.xml +++ b/jfuse-linux-aarch64/pom.xml @@ -159,6 +159,7 @@ ENOTDIR EISDIR ENOTEMPTY + ENOTSUP EINVAL ERANGE diff --git a/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxErrno.java b/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxErrno.java index aa04f3c3..2d9ce223 100644 --- a/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxErrno.java +++ b/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxErrno.java @@ -60,6 +60,11 @@ public int enotempty() { return errno_h.ENOTEMPTY(); } + @Override + public int enotsup() { + return errno_h.ENOTSUP(); + } + @Override public int einval() { return errno_h.EINVAL(); diff --git a/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/extr/errno_h.java b/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/extr/errno_h.java index 06ee00e9..61c9d8d3 100644 --- a/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/extr/errno_h.java +++ b/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/extr/errno_h.java @@ -57,6 +57,9 @@ public static int ENOSYS() { public static int ENOTEMPTY() { return (int)39L; } + public static int ENOTSUP() { + return (int)95L; + } } diff --git a/jfuse-linux-amd64/pom.xml b/jfuse-linux-amd64/pom.xml index 986ca6d4..22447568 100644 --- a/jfuse-linux-amd64/pom.xml +++ b/jfuse-linux-amd64/pom.xml @@ -159,6 +159,7 @@ ENOTDIR EISDIR ENOTEMPTY + ENOTSUP EINVAL ERANGE diff --git a/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxErrno.java b/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxErrno.java index 142e0f4e..626ab432 100644 --- a/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxErrno.java +++ b/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxErrno.java @@ -60,6 +60,11 @@ public int enotempty() { return errno_h.ENOTEMPTY(); } + @Override + public int enotsup() { + return errno_h.ENOTSUP(); + } + @Override public int einval() { return errno_h.EINVAL(); diff --git a/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/extr/errno_h.java b/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/extr/errno_h.java index 3b57338e..b8e193af 100644 --- a/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/extr/errno_h.java +++ b/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/extr/errno_h.java @@ -57,6 +57,9 @@ public static int ENOSYS() { public static int ENOTEMPTY() { return (int)39L; } + public static int ENOTSUP() { + return (int)95L; + } } diff --git a/jfuse-mac/pom.xml b/jfuse-mac/pom.xml index 66ae9773..01c2e833 100644 --- a/jfuse-mac/pom.xml +++ b/jfuse-mac/pom.xml @@ -133,6 +133,7 @@ ENOTDIR EISDIR ENOTEMPTY + ENOTSUP EINVAL ERANGE diff --git a/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacErrno.java b/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacErrno.java index 6fbb4de0..fa9c48e8 100644 --- a/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacErrno.java +++ b/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacErrno.java @@ -60,6 +60,11 @@ public int enotempty() { return errno_h.ENOTEMPTY(); } + @Override + public int enotsup() { + return errno_h.ENOTSUP(); + } + @Override public int einval() { return errno_h.EINVAL(); diff --git a/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/extr/errno_h.java b/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/extr/errno_h.java index 546afe8f..7c7ab255 100644 --- a/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/extr/errno_h.java +++ b/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/extr/errno_h.java @@ -51,6 +51,9 @@ public static int EROFS() { public static int ERANGE() { return (int)34L; } + public static int ENOTSUP() { + return (int)45L; + } public static int ENOTEMPTY() { return (int)66L; } diff --git a/jfuse-win/pom.xml b/jfuse-win/pom.xml index abcd0ae2..c3d5726f 100644 --- a/jfuse-win/pom.xml +++ b/jfuse-win/pom.xml @@ -153,6 +153,7 @@ ENOTDIR EISDIR ENOTEMPTY + ENOTSUP EINVAL ERANGE diff --git a/jfuse-win/src/main/java/org/cryptomator/jfuse/win/WinErrno.java b/jfuse-win/src/main/java/org/cryptomator/jfuse/win/WinErrno.java index 0aa035e7..bbe83f39 100644 --- a/jfuse-win/src/main/java/org/cryptomator/jfuse/win/WinErrno.java +++ b/jfuse-win/src/main/java/org/cryptomator/jfuse/win/WinErrno.java @@ -60,6 +60,11 @@ public int enotempty() { return errno_h.ENOTEMPTY(); } + @Override + public int enotsup() { + return errno_h.ENOTSUP(); + } + @Override public int einval() { return errno_h.EINVAL(); diff --git a/jfuse-win/src/main/java/org/cryptomator/jfuse/win/extr/errno_h.java b/jfuse-win/src/main/java/org/cryptomator/jfuse/win/extr/errno_h.java index 7a6047f5..367ba5ad 100644 --- a/jfuse-win/src/main/java/org/cryptomator/jfuse/win/extr/errno_h.java +++ b/jfuse-win/src/main/java/org/cryptomator/jfuse/win/extr/errno_h.java @@ -50,6 +50,9 @@ public static int ENOSYS() { public static int ENOTEMPTY() { return (int)41L; } + public static int ENOTSUP() { + return (int)129L; + } public static int EINVAL() { return (int)22L; }