github.com/nguyentm83/docker@v1.5.0/pkg/mount/flags.go (about) 1 package mount 2 3 import ( 4 "strings" 5 ) 6 7 // Parse fstab type mount options into mount() flags 8 // and device specific data 9 func parseOptions(options string) (int, string) { 10 var ( 11 flag int 12 data []string 13 ) 14 15 flags := map[string]struct { 16 clear bool 17 flag int 18 }{ 19 "defaults": {false, 0}, 20 "ro": {false, RDONLY}, 21 "rw": {true, RDONLY}, 22 "suid": {true, NOSUID}, 23 "nosuid": {false, NOSUID}, 24 "dev": {true, NODEV}, 25 "nodev": {false, NODEV}, 26 "exec": {true, NOEXEC}, 27 "noexec": {false, NOEXEC}, 28 "sync": {false, SYNCHRONOUS}, 29 "async": {true, SYNCHRONOUS}, 30 "dirsync": {false, DIRSYNC}, 31 "remount": {false, REMOUNT}, 32 "mand": {false, MANDLOCK}, 33 "nomand": {true, MANDLOCK}, 34 "atime": {true, NOATIME}, 35 "noatime": {false, NOATIME}, 36 "diratime": {true, NODIRATIME}, 37 "nodiratime": {false, NODIRATIME}, 38 "bind": {false, BIND}, 39 "rbind": {false, RBIND}, 40 "unbindable": {false, UNBINDABLE}, 41 "runbindable": {false, RUNBINDABLE}, 42 "private": {false, PRIVATE}, 43 "rprivate": {false, RPRIVATE}, 44 "shared": {false, SHARED}, 45 "rshared": {false, RSHARED}, 46 "slave": {false, SLAVE}, 47 "rslave": {false, RSLAVE}, 48 "relatime": {false, RELATIME}, 49 "norelatime": {true, RELATIME}, 50 "strictatime": {false, STRICTATIME}, 51 "nostrictatime": {true, STRICTATIME}, 52 } 53 54 for _, o := range strings.Split(options, ",") { 55 // If the option does not exist in the flags table or the flag 56 // is not supported on the platform, 57 // then it is a data value for a specific fs type 58 if f, exists := flags[o]; exists && f.flag != 0 { 59 if f.clear { 60 flag &= ^f.flag 61 } else { 62 flag |= f.flag 63 } 64 } else { 65 data = append(data, o) 66 } 67 } 68 return flag, strings.Join(data, ",") 69 }