@@ -2,11 +2,9 @@ package devices
22
33import (
44 "errors"
5- "fmt"
65 "io/ioutil"
76 "os"
87 "path/filepath"
9- "syscall" //only for Stat_t
108
119 "github.com/opencontainers/runc/libcontainer/configs"
1210
@@ -19,45 +17,41 @@ var (
1917
2018// Testing dependencies
2119var (
22- osLstat = os .Lstat
20+ unixLstat = unix .Lstat
2321 ioutilReadDir = ioutil .ReadDir
2422)
2523
2624// Given the path to a device and its cgroup_permissions(which cannot be easily queried) look up the information about a linux device and return that information as a Device struct.
2725func DeviceFromPath (path , permissions string ) (* configs.Device , error ) {
28- fileInfo , err := osLstat (path )
26+ var stat unix.Stat_t
27+ err := unixLstat (path , & stat )
2928 if err != nil {
3029 return nil , err
3130 }
3231 var (
33- devType rune
34- mode = fileInfo .Mode ()
35- fileModePermissionBits = os .FileMode .Perm (mode )
32+ devType rune
33+ mode = stat .Mode
3634 )
3735 switch {
38- case mode & os .ModeDevice == 0 :
39- return nil , ErrNotADevice
40- case mode & os .ModeCharDevice != 0 :
41- fileModePermissionBits |= unix .S_IFCHR
36+ case mode & unix .S_IFBLK != 0 :
37+ devType = 'b'
38+ case mode & unix .S_IFCHR != 0 :
4239 devType = 'c'
4340 default :
44- fileModePermissionBits |= unix .S_IFBLK
45- devType = 'b'
46- }
47- stat_t , ok := fileInfo .Sys ().(* syscall.Stat_t )
48- if ! ok {
49- return nil , fmt .Errorf ("cannot determine the device number for device %s" , path )
41+ return nil , ErrNotADevice
5042 }
51- devNumber := int (stat_t .Rdev )
43+ devNumber := int (stat .Rdev )
44+ uid := stat .Uid
45+ gid := stat .Gid
5246 return & configs.Device {
5347 Type : devType ,
5448 Path : path ,
5549 Major : Major (devNumber ),
5650 Minor : Minor (devNumber ),
5751 Permissions : permissions ,
58- FileMode : fileModePermissionBits ,
59- Uid : stat_t . Uid ,
60- Gid : stat_t . Gid ,
52+ FileMode : os . FileMode ( mode ) ,
53+ Uid : uid ,
54+ Gid : gid ,
6155 }, nil
6256}
6357
0 commit comments