mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-28 12:37:48 +01:00
implement some other fs operations
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user