From 26cafe3e8066d9ae65230ff0aa17a5533cfa92f8 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Mon, 25 Aug 2025 21:31:45 +0900 Subject: hst/fs: implement link fstype Symlinks do not require special treatment, and doing this allows placing links in order. Signed-off-by: Ophestra --- hst/fslink.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 hst/fslink.go (limited to 'hst/fslink.go') 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 "" + } + + dereference := "" + if l.Dereference { + dereference = "*" + } + return "&" + l.Target.String() + ":" + dereference + l.Linkname +} -- cgit v1.3.1