aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/fslink.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-25 21:31:45 +0900
committerOphestra <cat@gensokyo.uk>2025-08-25 21:57:38 +0900
commit26cafe3e8066d9ae65230ff0aa17a5533cfa92f8 (patch)
tree59d19335710976b7246b8ea3b1ff484a3de08f45 /hst/fslink.go
parent125f150784f78db8c3323167c3a638cc1bad086e (diff)
hst/fs: implement link fstype
Symlinks do not require special treatment, and doing this allows placing links in order. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'hst/fslink.go')
-rw-r--r--hst/fslink.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/hst/fslink.go b/hst/fslink.go
new file mode 100644
index 00000000..8bba9b49
--- /dev/null
+++ b/hst/fslink.go
@@ -0,0 +1,58 @@
+package hst
+
+import (
+ "encoding/gob"
+ "path"
+
+ "hakurei.app/container"
+)
+
+func init() { gob.Register(new(FSLink)) }
+
+// FilesystemLink is the type string of a symbolic link.
+const FilesystemLink = "link"
+
+// FSLink represents a symlink in the container filesystem.
+type FSLink struct {
+ // link path in container
+ Target *container.Absolute `json:"dst"`
+ // linkname the symlink points to
+ Linkname string `json:"linkname"`
+ // whether to dereference linkname before creating the link
+ Dereference bool `json:"dereference,omitempty"`
+}
+
+func (l *FSLink) Valid() bool {
+ if l == nil || l.Target == nil || l.Linkname == "" {
+ return false
+ }
+ return !l.Dereference || path.IsAbs(l.Linkname)
+}
+
+func (l *FSLink) Path() *container.Absolute {
+ if !l.Valid() {
+ return nil
+ }
+ return l.Target
+}
+
+func (l *FSLink) Host() []*container.Absolute { return nil }
+
+func (l *FSLink) Apply(z *ApplyState) {
+ if !l.Valid() {
+ return
+ }
+ z.Link(l.Target, l.Linkname, l.Dereference)
+}
+
+func (l *FSLink) String() string {
+ if !l.Valid() {
+ return "<invalid>"
+ }
+
+ dereference := ""
+ if l.Dereference {
+ dereference = "*"
+ }
+ return "&" + l.Target.String() + ":" + dereference + l.Linkname
+}