12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package wclayer
- // This file contains utility functions to support storage (graph) related
- // functionality.
- import (
- "syscall"
- "github.com/Microsoft/hcsshim/internal/guid"
- "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
- HomeDirp *uint16
- }
- var (
- utf16EmptyString uint16
- stdDriverInfo = driverInfo{1, &utf16EmptyString}
- )
- /* 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.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++ {
- g, err := LayerID(parentLayerPaths[i])
- if err != nil {
- logrus.WithError(err).Debug("Failed to convert name to guid")
- return nil, err
- }
- p, err := syscall.UTF16PtrFromString(parentLayerPaths[i])
- if err != nil {
- logrus.WithError(err).Debug("Failed conversion of parentLayerPath to pointer")
- return nil, err
- }
- layers = append(layers, WC_LAYER_DESCRIPTOR{
- LayerId: g,
- Flags: 0,
- Pathp: p,
- })
- }
- return layers, nil
- }
|