implement some other fs operations

This commit is contained in:
2024-06-14 16:24:31 +02:00
parent 311b98c0ce
commit 6f35897f10
3 changed files with 109 additions and 1 deletions

View File

@@ -11,6 +11,10 @@ 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<Boolean> rmdir(String name);
Uni<Boolean> unlink(String name);
Uni<Boolean> rename(String from, String to);
Uni<Iterable<String>> readDir(String name);
Uni<Long> size(File f);

View File

@@ -113,6 +113,69 @@ public class DhfsFileServiceImpl implements DhfsFileService {
return Uni.createFrom().item(Optional.of(f));
}
@Override
public Uni<Optional<Directory>> mkdir(String name) {
// FIXME:
var root = getRoot().await().indefinitely();
var found = traverse(root, Path.of(name).getParent()).await().indefinitely();
if (found.isEmpty()) return Uni.createFrom().item(Optional.empty());
if (!(found.get() instanceof Directory dir)) return Uni.createFrom().item(Optional.empty());
var duuid = UUID.randomUUID();
Directory d = new Directory(duuid);
jObjectRepository.writeJObject(namespace, d).await().indefinitely();
dir.getChildren().add(Pair.of(Path.of(name).getFileName().toString(), duuid));
jObjectRepository.writeJObject(namespace, dir).await().indefinitely();
return Uni.createFrom().item(Optional.of(d));
}
private Uni<Boolean> rmdent(String name) {
// FIXME:
var root = getRoot().await().indefinitely();
var found = traverse(root, Path.of(name).getParent()).await().indefinitely();
if (found.isEmpty()) return Uni.createFrom().item(false);
if (!(found.get() instanceof Directory dir)) return Uni.createFrom().item(false);
boolean removed = dir.getChildren().removeIf(p -> p.getLeft().equals(Path.of(name).getFileName().toString()));
if (removed) jObjectRepository.writeJObject(namespace, dir).await().indefinitely();
return Uni.createFrom().item(removed);
}
@Override
public Uni<Boolean> rmdir(String name) {
return rmdent(name);
}
@Override
public Uni<Boolean> unlink(String name) {
return rmdent(name);
}
@Override
public Uni<Boolean> rename(String from, String to) {
var dent = getDirEntry(from).await().indefinitely();
if (dent.isEmpty()) return Uni.createFrom().item(false);
if (!rmdent(from).await().indefinitely()) return Uni.createFrom().item(false);
// FIXME:
var root = getRoot().await().indefinitely();
var found = traverse(root, Path.of(to).getParent()).await().indefinitely();
if (found.isEmpty()) return Uni.createFrom().item(false);
if (!(found.get() instanceof Directory dir)) return Uni.createFrom().item(false);
dir.getChildren().add(Pair.of(Path.of(to).getFileName().toString(), dent.get().getUuid()));
jObjectRepository.writeJObject(namespace, dir).await().indefinitely();
return Uni.createFrom().item(true);
}
@Override
public Uni<Iterable<String>> readDir(String name) {
var root = getRoot().await().indefinitely();

View File

@@ -18,6 +18,7 @@ import ru.serce.jnrfuse.FuseFillDir;
import ru.serce.jnrfuse.FuseStubFS;
import ru.serce.jnrfuse.struct.FileStat;
import ru.serce.jnrfuse.struct.FuseFileInfo;
import ru.serce.jnrfuse.struct.Statvfs;
import java.nio.file.Paths;
import java.util.Optional;
@@ -37,7 +38,19 @@ public class DhfsFuse extends FuseStubFS {
Paths.get(root).toFile().mkdirs();
Log.info("Mounting with root " + root);
mount(Paths.get(root));
mount(Paths.get(root), false, true);
}
@Override
public int statfs(String path, Statvfs stbuf) {
//FIXME:
if ("/".equals(path)) {
stbuf.f_blocks.set(1024 * 1024); // total data blocks in file system
stbuf.f_frsize.set(1024); // fs block size
stbuf.f_bfree.set(1024 * 1024); // free blocks in fs
stbuf.f_bavail.set(1024 * 1024); // avail blocks in fs
}
return super.statfs(path, stbuf);
}
@Override
@@ -98,6 +111,34 @@ public class DhfsFuse extends FuseStubFS {
else return 0;
}
@Override
public int mkdir(String path, long mode) {
var ret = fileService.mkdir(path).await().indefinitely();
if (ret.isEmpty()) return -ErrorCodes.ENOSPC();
else return 0;
}
@Override
public int rmdir(String path) {
var ret = fileService.rmdir(path).await().indefinitely();
if (!ret) return -ErrorCodes.ENOENT();
else return 0;
}
@Override
public int rename(String path, String newName) {
var ret = fileService.rename(path, newName).await().indefinitely();
if (!ret) return -ErrorCodes.ENOENT();
else return 0;
}
@Override
public int unlink(String path) {
var ret = fileService.unlink(path).await().indefinitely();
if (!ret) return -ErrorCodes.ENOENT();
else return 0;
}
@Override
public int truncate(String path, long size) {
var fileOpt = fileService.open(path).await().indefinitely();