| package hcsshim |
| |
| import ( |
| "syscall" |
| |
| "github.com/Sirupsen/logrus" |
| ) |
| |
| // GetLayerMountPath will look for a mounted layer with the given id and return |
| // the path at which that layer can be accessed. This path may be a volume path |
| // if the layer is a mounted read-write layer, otherwise it is expected to be the |
| // folder path at which the layer is stored. |
| func GetLayerMountPath(info DriverInfo, id string) (string, error) { |
| title := "hcsshim::GetLayerMountPath " |
| logrus.Debugf(title+"Flavour %d ID %s", info.Flavour, id) |
| |
| // Convert info to API calling convention |
| infop, err := convertDriverInfo(info) |
| if err != nil { |
| logrus.Error(err) |
| return "", err |
| } |
| |
| var mountPathLength uintptr |
| mountPathLength = 0 |
| |
| // Call the procedure itself. |
| logrus.Debugf("Calling proc (1)") |
| err = getLayerMountPath(&infop, id, &mountPathLength, nil) |
| if err != nil { |
| err = makeErrorf(err, title, "(first call) id=%s flavour=%d", id, info.Flavour) |
| logrus.Error(err) |
| return "", err |
| } |
| |
| // Allocate a mount path of the returned length. |
| if mountPathLength == 0 { |
| return "", nil |
| } |
| mountPathp := make([]uint16, mountPathLength) |
| mountPathp[0] = 0 |
| |
| // Call the procedure again |
| logrus.Debugf("Calling proc (2)") |
| err = getLayerMountPath(&infop, id, &mountPathLength, &mountPathp[0]) |
| if err != nil { |
| err = makeErrorf(err, title, "(second call) id=%s flavour=%d", id, info.Flavour) |
| logrus.Error(err) |
| return "", err |
| } |
| |
| path := syscall.UTF16ToString(mountPathp[0:]) |
| logrus.Debugf(title+"succeeded flavour=%d id=%s path=%s", info.Flavour, id, path) |
| return path, nil |
| } |