Add a new generic container registry client via a new `container` package. Use this to create a command line utility as well as a new upload target for container registries. The code uses the github.com/containers/* project and packages to interact with container registires that is also used by skopeo, podman et al. One if the dependencies is `proglottis/gpgme` that is using cgo to bind libgpgme, so we have to add the corresponding devel package to the BuildRequires as well as installing it on CI. Checks will follow later via an integration test.
73 lines
2.6 KiB
Go
73 lines
2.6 KiB
Go
// +build windows
|
|
|
|
package winio
|
|
|
|
import (
|
|
"os"
|
|
"runtime"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
// FileBasicInfo contains file access time and file attributes information.
|
|
type FileBasicInfo struct {
|
|
CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime
|
|
FileAttributes uint32
|
|
pad uint32 // padding
|
|
}
|
|
|
|
// GetFileBasicInfo retrieves times and attributes for a file.
|
|
func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
|
|
bi := &FileBasicInfo{}
|
|
if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
|
|
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
|
|
}
|
|
runtime.KeepAlive(f)
|
|
return bi, nil
|
|
}
|
|
|
|
// SetFileBasicInfo sets times and attributes for a file.
|
|
func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {
|
|
if err := windows.SetFileInformationByHandle(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
|
|
return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err}
|
|
}
|
|
runtime.KeepAlive(f)
|
|
return nil
|
|
}
|
|
|
|
// FileStandardInfo contains extended information for the file.
|
|
// FILE_STANDARD_INFO in WinBase.h
|
|
// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_standard_info
|
|
type FileStandardInfo struct {
|
|
AllocationSize, EndOfFile int64
|
|
NumberOfLinks uint32
|
|
DeletePending, Directory bool
|
|
}
|
|
|
|
// GetFileStandardInfo retrieves ended information for the file.
|
|
func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) {
|
|
si := &FileStandardInfo{}
|
|
if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileStandardInfo, (*byte)(unsafe.Pointer(si)), uint32(unsafe.Sizeof(*si))); err != nil {
|
|
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
|
|
}
|
|
runtime.KeepAlive(f)
|
|
return si, nil
|
|
}
|
|
|
|
// FileIDInfo contains the volume serial number and file ID for a file. This pair should be
|
|
// unique on a system.
|
|
type FileIDInfo struct {
|
|
VolumeSerialNumber uint64
|
|
FileID [16]byte
|
|
}
|
|
|
|
// GetFileID retrieves the unique (volume, file ID) pair for a file.
|
|
func GetFileID(f *os.File) (*FileIDInfo, error) {
|
|
fileID := &FileIDInfo{}
|
|
if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileIdInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil {
|
|
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
|
|
}
|
|
runtime.KeepAlive(f)
|
|
return fileID, nil
|
|
}
|