mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-28 20:47:49 +01:00
add mode to dentries
This commit is contained in:
@@ -21,4 +21,6 @@ public abstract class DirEntry extends JObject {
|
||||
public String getName() {
|
||||
return uuid.toString();
|
||||
}
|
||||
|
||||
long mode;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user