1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
// Copyright (c) 2018-2023, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.
package rpc
import (
"encoding/gob"
"io/fs"
"os"
"syscall"
"time"
"golang.org/x/sys/unix"
)
// MkdirArgs defines the arguments to mkdir.
type MkdirArgs struct {
Path string
Perm os.FileMode
}
// LoopArgs defines the arguments to create a loop device.
type LoopArgs struct {
Image string
Mode int
Info unix.LoopInfo64
MaxDevices int
Shared bool
}
// MountArgs defines the arguments to mount.
type MountArgs struct {
Source string
Target string
Filesystem string
Mountflags uintptr
Data string
}
// CryptArgs defines the arguments to mount.
type CryptArgs struct {
Offset uint64
Loopdev string
Key []byte
MasterPid int
}
// ChrootArgs defines the arguments to chroot.
type ChrootArgs struct {
Root string
Method string
}
// HostnameArgs defines the arguments to sethostname.
type HostnameArgs struct {
Hostname string
}
// ChdirArgs defines the arguments to chdir.
type ChdirArgs struct {
Dir string
}
// StatReply defines the reply for stat.
type StatReply struct {
Fi os.FileInfo
Err error
}
// StatArgs defines the arguments to stat.
type StatArgs struct {
Path string
}
// SendFuseFdArgs defines the arguments to send fuse file descriptor.
type SendFuseFdArgs struct {
Socket int
Fds []int
}
// SymlinkArgs defines the arguments to symlink.
type SymlinkArgs struct {
Old string
New string
}
// ReadDirArgs defines the arguments to readdir.
type ReadDirArgs struct {
Dir string
}
// ReadDirReply defines the reply for readdir.
type ReadDirReply struct {
Files []fs.DirEntry
}
// ChownArgs defines the arguments to chown/lchown.
type ChownArgs struct {
Name string
UID int
GID int
}
// EvalRelativeArgs defines the arguments to evalrelative.
type EvalRelativeArgs struct {
Name string
Root string
}
// ReadlinkArgs defines the arguments to readlink.
type ReadlinkArgs struct {
Name string
}
// UmaskArgs defines the arguments to umask.
type UmaskArgs struct {
Mask int
}
// WriteFileArgs defines the arguments to writefile.
type WriteFileArgs struct {
Filename string
Data []byte
Perm os.FileMode
}
// NvCCLIArgs defines the arguments to NvCCLI.
type NvCCLIArgs struct {
Flags []string
RootFsPath string
UserNS bool
}
// FileInfo returns FileInfo interface to be passed as RPC argument.
func FileInfo(fi os.FileInfo) os.FileInfo {
return &fileInfo{
N: fi.Name(),
S: fi.Size(),
M: fi.Mode(),
T: fi.ModTime(),
Sy: fi.Sys(),
}
}
// fileInfo internal interface with exported fields.
type fileInfo struct {
N string
S int64
M os.FileMode
T time.Time
Sy interface{}
}
func (fi fileInfo) Name() string {
return fi.N
}
func (fi fileInfo) Size() int64 {
return fi.S
}
func (fi fileInfo) Mode() os.FileMode {
return fi.M
}
func (fi fileInfo) ModTime() time.Time {
if fi.T.IsZero() {
return time.Now()
}
return fi.T
}
func (fi fileInfo) IsDir() bool {
return fi.M.IsDir()
}
func (fi fileInfo) Sys() interface{} {
return fi.Sy
}
// DirEntry returns DirEntry interface to be passed as RPC argument.
func DirEntry(en fs.DirEntry) (fs.DirEntry, error) {
fi, err := en.Info()
if err != nil {
return nil, err
}
return &dirEntry{
name: en.Name(),
mode: en.Type(),
info: FileInfo(fi),
}, nil
}
type dirEntry struct {
name string
mode fs.FileMode
info fs.FileInfo
}
func (en dirEntry) Name() string { return en.name }
func (en dirEntry) IsDir() bool { return en.mode.IsDir() }
func (en dirEntry) Type() fs.FileMode { return en.mode }
func (en dirEntry) Info() (fs.FileInfo, error) { return en.info, nil }
func init() {
gob.Register(syscall.Errno(0))
gob.Register((*fileInfo)(nil))
gob.Register((*dirEntry)(nil))
gob.Register((*syscall.Stat_t)(nil))
gob.Register((*os.PathError)(nil))
gob.Register((*os.SyscallError)(nil))
gob.Register((*os.LinkError)(nil))
}
|