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;
}