diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-08-25 21:31:45 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-08-25 21:57:38 +0900 |
| commit | 26cafe3e8066d9ae65230ff0aa17a5533cfa92f8 (patch) | |
| tree | 59d19335710976b7246b8ea3b1ff484a3de08f45 /hst/fslink.go | |
| parent | 125f150784f78db8c3323167c3a638cc1bad086e (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.go | 58 |
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 +} |
