mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-28 20:47:49 +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<DirEntry>> getDirEntry(String name);
|
||||||
Uni<Optional<File>> open(String name);
|
Uni<Optional<File>> open(String name);
|
||||||
Uni<Optional<File>> create(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<Iterable<String>> readDir(String name);
|
||||||
|
|
||||||
Uni<Long> size(File f);
|
Uni<Long> size(File f);
|
||||||
|
|||||||
@@ -113,6 +113,69 @@ public class DhfsFileServiceImpl implements DhfsFileService {
|
|||||||
return Uni.createFrom().item(Optional.of(f));
|
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
|
@Override
|
||||||
public Uni<Iterable<String>> readDir(String name) {
|
public Uni<Iterable<String>> readDir(String name) {
|
||||||
var root = getRoot().await().indefinitely();
|
var root = getRoot().await().indefinitely();
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import ru.serce.jnrfuse.FuseFillDir;
|
|||||||
import ru.serce.jnrfuse.FuseStubFS;
|
import ru.serce.jnrfuse.FuseStubFS;
|
||||||
import ru.serce.jnrfuse.struct.FileStat;
|
import ru.serce.jnrfuse.struct.FileStat;
|
||||||
import ru.serce.jnrfuse.struct.FuseFileInfo;
|
import ru.serce.jnrfuse.struct.FuseFileInfo;
|
||||||
|
import ru.serce.jnrfuse.struct.Statvfs;
|
||||||
|
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -37,7 +38,19 @@ public class DhfsFuse extends FuseStubFS {
|
|||||||
Paths.get(root).toFile().mkdirs();
|
Paths.get(root).toFile().mkdirs();
|
||||||
Log.info("Mounting with root " + root);
|
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
|
@Override
|
||||||
@@ -98,6 +111,34 @@ public class DhfsFuse extends FuseStubFS {
|
|||||||
else return 0;
|
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
|
@Override
|
||||||
public int truncate(String path, long size) {
|
public int truncate(String path, long size) {
|
||||||
var fileOpt = fileService.open(path).await().indefinitely();
|
var fileOpt = fileService.open(path).await().indefinitely();
|
||||||
|
|||||||
Reference in New Issue
Block a user