123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package hcsshim
- // This file contains utility functions to support storage (graph) related
- // functionality.
- import (
- "path/filepath"
- "syscall"
- "github.com/Sirupsen/logrus"
- )
- /* To pass into syscall, we need a struct matching the following:
- enum GraphDriverType
- {
- DiffDriver,
- FilterDriver
- };
- struct DriverInfo {
- GraphDriverType Flavour;
- LPCWSTR HomeDir;
- };
- */
- type DriverInfo struct {
- Flavour int
- HomeDir string
- }
- type driverInfo struct {
- Flavour int
- HomeDirp *uint16
- }
- func convertDriverInfo(info DriverInfo) (driverInfo, error) {
- homedirp, err := syscall.UTF16PtrFromString(info.HomeDir)
- if err != nil {
- logrus.Debugf("Failed conversion of home to pointer for driver info: %s", err.Error())
- return driverInfo{}, err
- }
- return driverInfo{
- Flavour: info.Flavour,
- HomeDirp: homedirp,
- }, nil
- }
- /* To pass into syscall, we need a struct matching the following:
- typedef struct _WC_LAYER_DESCRIPTOR {
- //
- // The ID of the layer
- //
- GUID LayerId;
- //
- // Additional flags
- //
- union {
- struct {
- ULONG Reserved : 31;
- ULONG Dirty : 1; // Created from sandbox as a result of snapshot
- };
- ULONG Value;
- } Flags;
- //
- // Path to the layer root directory, null-terminated
- //
- PCWSTR Path;
- } WC_LAYER_DESCRIPTOR, *PWC_LAYER_DESCRIPTOR;
- */
- type WC_LAYER_DESCRIPTOR struct {
- LayerId GUID
- Flags uint32
- Pathp *uint16
- }
- func layerPathsToDescriptors(parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) {
- // Array of descriptors that gets constructed.
- var layers []WC_LAYER_DESCRIPTOR
- for i := 0; i < len(parentLayerPaths); i++ {
- // Create a layer descriptor, using the folder name
- // as the source for a GUID LayerId
- _, folderName := filepath.Split(parentLayerPaths[i])
- g, err := NameToGuid(folderName)
- if err != nil {
- logrus.Debugf("Failed to convert name to guid %s", err)
- return nil, err
- }
- p, err := syscall.UTF16PtrFromString(parentLayerPaths[i])
- if err != nil {
- logrus.Debugf("Failed conversion of parentLayerPath to pointer %s", err)
- return nil, err
- }
- layers = append(layers, WC_LAYER_DESCRIPTOR{
- LayerId: g,
- Flags: 0,
- Pathp: p,
- })
- }
- return layers, nil
- }
|