interfaces/mount: add function for parsing fstab-like file #3103

Merged
merged 3 commits into from Mar 31, 2017
@@ -20,7 +20,9 @@
package mount
import (
+ "bufio"
"fmt"
+ "io"
"strconv"
"strings"
)
@@ -141,3 +143,30 @@ func ParseEntry(s string) (Entry, error) {
e.CheckPassNumber = cpn
return e, nil
}
+
+// LoadFSTab reads and parses an fstab-like file.
+//
+// The supported format is described by fstab(5).
+func LoadFSTab(reader io.Reader) ([]Entry, error) {
+ var entries []Entry
+ scanner := bufio.NewScanner(reader)
+ for scanner.Scan() {
+ s := scanner.Text()
+ if i := strings.IndexByte(s, '#'); i != -1 {
+ s = s[0:i]
+ }
+ s = strings.TrimSpace(s)
+ if s == "" {
+ continue
+ }
+ entry, err := ParseEntry(s)
+ if err != nil {
+ return nil, err
+ }
+ entries = append(entries, entry)
+ }
+ if err := scanner.Err(); err != nil {
+ return nil, err
+ }
+ return entries, nil
+}
@@ -20,6 +20,8 @@
package mount_test
import (
+ "strings"
+
. "gopkg.in/check.v1"
"github.com/snapcore/snapd/interfaces/mount"
@@ -148,3 +150,30 @@ func (s *entrySuite) TestParseEntry6(c *C) {
c.Assert(e.DumpFrequency, Equals, 5)
c.Assert(e.CheckPassNumber, Equals, 7)
}
+
+// Test that empty fstab is parsed without errors
+func (s *entrySuite) TestLoadFSTab1(c *C) {
+ entries, err := mount.LoadFSTab(strings.NewReader(""))
+ c.Assert(err, IsNil)
+ c.Assert(entries, HasLen, 0)
+}
+
+// Test that '#'-comments are skipped
+func (s *entrySuite) TestLoadFSTab2(c *C) {
+ entries, err := mount.LoadFSTab(strings.NewReader("# comment"))
+ c.Assert(err, IsNil)
+ c.Assert(entries, HasLen, 0)
+}
+
+// Test that simple profile can be loaded correctly.
+func (s *entrySuite) TestLoadFSTab3(c *C) {
+ entries, err := mount.LoadFSTab(strings.NewReader(`
+ name-1 dir-1 type-1 options-1 1 1 # 1st entry
+ name-2 dir-2 type-2 options-2 2 2 # 2nd entry`))
+ c.Assert(err, IsNil)
+ c.Assert(entries, HasLen, 2)
+ c.Assert(entries, DeepEquals, []mount.Entry{
+ {"name-1", "dir-1", "type-1", []string{"options-1"}, 1, 1},
+ {"name-2", "dir-2", "type-2", []string{"options-2"}, 2, 2},
+ })
+}