diff options
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 +} |
