add mode to dentries

This commit is contained in:
2024-06-14 18:58:38 +02:00
parent 95dddb22e7
commit 36c8fdbc7c
4 changed files with 40 additions and 11 deletions

View File

@@ -21,4 +21,6 @@ public abstract class DirEntry extends JObject {
public String getName() {
return uuid.toString();
}
long mode;
}

View File

@@ -10,8 +10,9 @@ import java.util.Optional;
public interface DhfsFileService {
Uni<Optional<DirEntry>> getDirEntry(String name);
Uni<Optional<File>> open(String name);
Uni<Optional<File>> create(String name);
Uni<Optional<Directory>> mkdir(String name);
Uni<Optional<File>> create(String name, long mode);
Uni<Optional<Directory>> mkdir(String name, long mode);
Uni<Boolean> chmod(String name, long mode);
Uni<Boolean> rmdir(String name);
Uni<Boolean> unlink(String name);
Uni<Boolean> rename(String from, String to);

View File

@@ -39,7 +39,7 @@ public class DhfsFileServiceImpl implements DhfsFileService {
Log.info("Initializing file service");
if (!objectRepository.existsObject(namespace, new UUID(0, 0).toString()).await().indefinitely()) {
objectRepository.createNamespace(namespace).await().indefinitely();
jObjectRepository.writeJObject(namespace, new Directory(new UUID(0, 0))).await().indefinitely();
jObjectRepository.writeJObject(namespace, new Directory(new UUID(0, 0)).setMode(0755)).await().indefinitely();
}
getRoot().await().indefinitely();
}
@@ -97,7 +97,7 @@ public class DhfsFileServiceImpl implements DhfsFileService {
}
@Override
public Uni<Optional<File>> create(String name) {
public Uni<Optional<File>> create(String name, long mode) {
// FIXME:
var root = getRoot().await().indefinitely();
var found = traverse(root, Path.of(name).getParent()).await().indefinitely();
@@ -107,6 +107,7 @@ public class DhfsFileServiceImpl implements DhfsFileService {
var fuuid = UUID.randomUUID();
File f = new File(fuuid);
f.setMode(mode);
jObjectRepository.writeJObject(namespace, f).await().indefinitely();
dir.getChildren().put(Path.of(name).getFileName().toString(), fuuid);
@@ -116,7 +117,7 @@ public class DhfsFileServiceImpl implements DhfsFileService {
}
@Override
public Uni<Optional<Directory>> mkdir(String name) {
public Uni<Optional<Directory>> mkdir(String name, long mode) {
// FIXME:
var root = getRoot().await().indefinitely();
var found = traverse(root, Path.of(name).getParent()).await().indefinitely();
@@ -126,6 +127,7 @@ public class DhfsFileServiceImpl implements DhfsFileService {
var duuid = UUID.randomUUID();
Directory d = new Directory(duuid);
d.setMode(mode);
jObjectRepository.writeJObject(namespace, d).await().indefinitely();
dir.getChildren().put(Path.of(name).getFileName().toString(), duuid);
@@ -178,6 +180,18 @@ public class DhfsFileServiceImpl implements DhfsFileService {
return Uni.createFrom().item(true);
}
@Override
public Uni<Boolean> chmod(String name, long mode) {
var dent = getDirEntry(name).await().indefinitely();
if (dent.isEmpty()) return Uni.createFrom().item(false);
dent.get().setMode(mode);
jObjectRepository.writeJObject(namespace, dent.get()).await().indefinitely();
return Uni.createFrom().item(true);
}
@Override
public Uni<Iterable<String>> readDir(String name) {
var root = getRoot().await().indefinitely();

View File

@@ -1,5 +1,6 @@
package com.usatiuk.dhfs.storage.fuse;
import com.sun.security.auth.module.UnixSystem;
import com.usatiuk.dhfs.storage.files.objects.DirEntry;
import com.usatiuk.dhfs.storage.files.objects.Directory;
import com.usatiuk.dhfs.storage.files.objects.File;
@@ -38,7 +39,11 @@ public class DhfsFuse extends FuseStubFS {
Paths.get(root).toFile().mkdirs();
Log.info("Mounting with root " + root);
mount(Paths.get(root), false, true, new String[]{"-o", "direct_io"});
var uid = new UnixSystem().getUid();
var gid = new UnixSystem().getGid();
mount(Paths.get(root), false, true,
new String[]{"-o", "direct_io", "-o", "uid=" + String.valueOf(uid), "-o", "gid=" + String.valueOf(gid)});
}
@Override
@@ -66,11 +71,11 @@ public class DhfsFuse extends FuseStubFS {
return -ErrorCodes.ENOENT();
}
if (found.get() instanceof File f) {
stat.st_mode.set(S_IFREG | 0777);
stat.st_mode.set(S_IFREG | f.getMode());
stat.st_nlink.set(1);
stat.st_size.set(fileService.size(f).await().indefinitely());
} else if (found.get() instanceof Directory) {
stat.st_mode.set(S_IFDIR | 0777);
} else if (found.get() instanceof Directory d) {
stat.st_mode.set(S_IFDIR | d.getMode());
stat.st_nlink.set(2);
}
return 0;
@@ -106,14 +111,14 @@ public class DhfsFuse extends FuseStubFS {
@Override
public int create(String path, long mode, FuseFileInfo fi) {
var ret = fileService.create(path).await().indefinitely();
var ret = fileService.create(path, mode).await().indefinitely();
if (ret.isEmpty()) return -ErrorCodes.ENOSPC();
else return 0;
}
@Override
public int mkdir(String path, long mode) {
var ret = fileService.mkdir(path).await().indefinitely();
var ret = fileService.mkdir(path, mode).await().indefinitely();
if (ret.isEmpty()) return -ErrorCodes.ENOSPC();
else return 0;
}
@@ -151,6 +156,13 @@ public class DhfsFuse extends FuseStubFS {
return -ErrorCodes.ENOSPC();
}
@Override
public int chmod(String path, long mode) {
var ret = fileService.chmod(path, mode).await().indefinitely();
if (ret) return 0;
else return -ErrorCodes.EINVAL();
}
@Override
public int readdir(String path, Pointer buf, FuseFillDir filler, long offset, FuseFileInfo fi) {
Iterable<String> found;