aboutsummaryrefslogtreecommitdiffhomepage
path: root/helper/bwrap/arg.go
diff options
context:
space:
mode:
Diffstat (limited to 'helper/bwrap/arg.go')
-rw-r--r--helper/bwrap/arg.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/helper/bwrap/arg.go b/helper/bwrap/arg.go
new file mode 100644
index 00000000..efdab823
--- /dev/null
+++ b/helper/bwrap/arg.go
@@ -0,0 +1,77 @@
+package bwrap
+
+import "encoding/gob"
+
+type Builder interface {
+ Len() int
+ Append(args *[]string)
+}
+
+type FSBuilder interface {
+ Path() string
+ Builder
+}
+
+func init() {
+ gob.Register(new(pairF))
+ gob.Register(new(stringF))
+}
+
+type pairF [3]string
+
+func (p *pairF) Path() string {
+ return p[2]
+}
+
+func (p *pairF) Len() int {
+ return len(p) // compiler replaces this with 3
+}
+
+func (p *pairF) Append(args *[]string) {
+ *args = append(*args, p[0], p[1], p[2])
+}
+
+type stringF [2]string
+
+func (s stringF) Path() string {
+ return s[1]
+}
+
+func (s stringF) Len() int {
+ return len(s) // compiler replaces this with 2
+}
+
+func (s stringF) Append(args *[]string) {
+ *args = append(*args, s[0], s[1])
+}
+
+// Args returns a slice of bwrap args corresponding to c.
+func (c *Config) Args() (args []string) {
+ builders := []Builder{
+ c.boolArgs(),
+ c.intArgs(),
+ c.stringArgs(),
+ c.pairArgs(),
+ }
+
+ // copy FSBuilder slice to builder slice
+ fb := make([]Builder, len(c.Filesystem)+1)
+ for i, f := range c.Filesystem {
+ fb[i] = f
+ }
+ fb[len(fb)-1] = c.Chmod
+ builders = append(builders, fb...)
+
+ // accumulate arg count
+ argc := 0
+ for _, b := range builders {
+ argc += b.Len()
+ }
+
+ args = make([]string, 0, argc)
+ for _, b := range builders {
+ b.Append(&args)
+ }
+
+ return
+}