| package wclayer |
| |
| import ( |
| "syscall" |
| |
| "github.com/Microsoft/hcsshim/internal/hcserror" |
| "github.com/sirupsen/logrus" |
| ) |
| |
| // GetLayerMountPath will look for a mounted layer with the given path 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(path string) (_ string, err error) { |
| title := "hcsshim::GetLayerMountPath" |
| fields := logrus.Fields{ |
| "path": path, |
| } |
| logrus.WithFields(fields).Debug(title) |
| defer func() { |
| if err != nil { |
| fields[logrus.ErrorKey] = err |
| logrus.WithFields(fields).Error(err) |
| } else { |
| logrus.WithFields(fields).Debug(title + " - succeeded") |
| } |
| }() |
| |
| var mountPathLength uintptr |
| mountPathLength = 0 |
| |
| // Call the procedure itself. |
| logrus.WithFields(fields).Debug("Calling proc (1)") |
| err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil) |
| if err != nil { |
| return "", hcserror.New(err, title+" - failed", "(first call)") |
| } |
| |
| // 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.WithFields(fields).Debug("Calling proc (2)") |
| err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0]) |
| if err != nil { |
| return "", hcserror.New(err, title+" - failed", "(second call)") |
| } |
| |
| mountPath := syscall.UTF16ToString(mountPathp[0:]) |
| fields["mountPath"] = mountPath |
| return mountPath, nil |
| } |