-
Notifications
You must be signed in to change notification settings - Fork 91
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add mount functionality to 'Directory' (#177)
This is needed for 'chroot' runners that must mount the special filesystems '/proc' and '/sys' in the input root. The necessary syscalls are not yet merged into the 'sys' package, so this includes a patch while we work to upstream the code. Co-authored-by: Nils Wireklint <nils@meroton.com>
- Loading branch information
1 parent
b14f4ae
commit 18fd05d
Showing
9 changed files
with
241 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
From 9313951415ca77dcf5e84ba5fa41483b5c16d121 Mon Sep 17 00:00:00 2001 | ||
From: Ilya Hanov <ilya.hanov@huawei-partners.com> | ||
Date: Sat, 30 Sep 2023 12:02:48 +0300 | ||
Subject: [PATCH] unix: add API for fsconfig system call | ||
|
||
Fixes golang/go#59537 | ||
|
||
Change-Id: I8d806ace3adad423c633813455d8f758706cee1d | ||
--- | ||
|
||
diff --git unix/linux/types.go unix/linux/types.go | ||
index 25b9279..b9419f3 100644 | ||
--- unix/linux/types.go | ||
+++ unix/linux/types.go | ||
@@ -972,6 +972,15 @@ | ||
FSPICK_EMPTY_PATH = C.FSPICK_EMPTY_PATH | ||
|
||
FSMOUNT_CLOEXEC = C.FSMOUNT_CLOEXEC | ||
+ | ||
+ FSCONFIG_SET_FLAG = C.FSCONFIG_SET_FLAG | ||
+ FSCONFIG_SET_STRING = C.FSCONFIG_SET_STRING | ||
+ FSCONFIG_SET_BINARY = C.FSCONFIG_SET_BINARY | ||
+ FSCONFIG_SET_PATH = C.FSCONFIG_SET_PATH | ||
+ FSCONFIG_SET_PATH_EMPTY = C.FSCONFIG_SET_PATH_EMPTY | ||
+ FSCONFIG_SET_FD = C.FSCONFIG_SET_FD | ||
+ FSCONFIG_CMD_CREATE = C.FSCONFIG_CMD_CREATE | ||
+ FSCONFIG_CMD_RECONFIGURE = C.FSCONFIG_CMD_RECONFIGURE | ||
) | ||
|
||
type OpenHow C.struct_open_how | ||
diff --git unix/syscall_linux.go unix/syscall_linux.go | ||
index d844b16..80aadf2 100644 | ||
--- unix/syscall_linux.go | ||
+++ unix/syscall_linux.go | ||
@@ -1840,6 +1840,105 @@ | ||
//sys Fsmount(fd int, flags int, mountAttrs int) (fsfd int, err error) | ||
//sys Fsopen(fsName string, flags int) (fd int, err error) | ||
//sys Fspick(dirfd int, pathName string, flags int) (fd int, err error) | ||
+ | ||
+//sys fsconfig(fd int, cmd uint, key *byte, value *byte, aux int) (err error) | ||
+ | ||
+func fsconfigCommon(fd int, cmd uint, key string, value *byte, aux int) (err error) { | ||
+ var keyp *byte | ||
+ if keyp, err = BytePtrFromString(key); err != nil { | ||
+ return | ||
+ } | ||
+ return fsconfig(fd, cmd, keyp, value, aux) | ||
+} | ||
+ | ||
+// FsconfigSetFlag is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_SET_FLAG. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+// key the parameter key to set. | ||
+func FsconfigSetFlag(fd int, key string) (err error) { | ||
+ return fsconfigCommon(fd, FSCONFIG_SET_FLAG, key, nil, 0) | ||
+} | ||
+ | ||
+// FsconfigSetString is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_SET_STRING. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+// key the parameter key to set. | ||
+// value is the parameter value to set. | ||
+func FsconfigSetString(fd int, key string, value string) (err error) { | ||
+ var valuep *byte | ||
+ if valuep, err = BytePtrFromString(value); err != nil { | ||
+ return | ||
+ } | ||
+ return fsconfigCommon(fd, FSCONFIG_SET_STRING, key, valuep, 0) | ||
+} | ||
+ | ||
+// FsconfigSetBinary is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_SET_BINARY. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+// key the parameter key to set. | ||
+// value is the parameter value to set. | ||
+func FsconfigSetBinary(fd int, key string, value []byte) (err error) { | ||
+ if len(value) == 0 { | ||
+ return EINVAL | ||
+ } | ||
+ return fsconfigCommon(fd, FSCONFIG_SET_BINARY, key, &value[0], len(value)) | ||
+} | ||
+ | ||
+// FsconfigSetPath is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_SET_PATH. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+// key the parameter key to set. | ||
+// path is a non-empty path for specified key. | ||
+// atfd is a file descriptor at which to start lookup from or AT_FDCWD. | ||
+func FsconfigSetPath(fd int, key string, path string, atfd int) (err error) { | ||
+ var valuep *byte | ||
+ if valuep, err = BytePtrFromString(path); err != nil { | ||
+ return | ||
+ } | ||
+ return fsconfigCommon(fd, FSCONFIG_SET_PATH, key, valuep, atfd) | ||
+} | ||
+ | ||
+// FsconfigSetPathEmpty is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_SET_PATH_EMPTY. The same as | ||
+// FconfigSetPath but with AT_PATH_EMPTY implied. | ||
+func FsconfigSetPathEmpty(fd int, key string, path string, atfd int) (err error) { | ||
+ var valuep *byte | ||
+ if valuep, err = BytePtrFromString(path); err != nil { | ||
+ return | ||
+ } | ||
+ return fsconfigCommon(fd, FSCONFIG_SET_PATH_EMPTY, key, valuep, atfd) | ||
+} | ||
+ | ||
+// FsconfigSetFd is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_SET_FD. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+// key the parameter key to set. | ||
+// value is a file descriptor to be assigned to specified key. | ||
+func FsconfigSetFd(fd int, key string, value int) (err error) { | ||
+ return fsconfigCommon(fd, FSCONFIG_SET_FD, key, nil, value) | ||
+} | ||
+ | ||
+// FsconfigCreate is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_CMD_CREATE. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+func FsconfigCreate(fd int) (err error) { | ||
+ return fsconfig(fd, FSCONFIG_CMD_CREATE, nil, nil, 0) | ||
+} | ||
+ | ||
+// FsconfigReconfigure is equivalent to fsconfig(2) called | ||
+// with cmd == FSCONFIG_CMD_RECONFIGURE. | ||
+// | ||
+// fd is the filesystem context to act upon. | ||
+func FsconfigReconfigure(fd int) (err error) { | ||
+ return fsconfig(fd, FSCONFIG_CMD_RECONFIGURE, nil, nil, 0) | ||
+} | ||
+ | ||
//sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 | ||
//sysnb Getpgid(pid int) (pgid int, err error) | ||
|
||
diff --git unix/zsyscall_linux.go unix/zsyscall_linux.go | ||
index 14ab34a..dd1720f 100644 | ||
--- unix/zsyscall_linux.go | ||
+++ unix/zsyscall_linux.go | ||
@@ -892,6 +892,16 @@ | ||
|
||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
|
||
+func fsconfig(fd int, cmd uint, key *byte, value *byte, aux int) (err error) { | ||
+ _, _, e1 := Syscall6(SYS_FSCONFIG, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(value)), uintptr(aux), 0) | ||
+ if e1 != 0 { | ||
+ err = errnoErr(e1) | ||
+ } | ||
+ return | ||
+} | ||
+ | ||
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT | ||
+ | ||
func Getdents(fd int, buf []byte) (n int, err error) { | ||
var _p0 unsafe.Pointer | ||
if len(buf) > 0 { | ||
diff --git unix/ztypes_linux.go unix/ztypes_linux.go | ||
index 18aa70b..3c9bfa2 100644 | ||
--- unix/ztypes_linux.go | ||
+++ unix/ztypes_linux.go | ||
@@ -833,6 +833,15 @@ | ||
FSPICK_EMPTY_PATH = 0x8 | ||
|
||
FSMOUNT_CLOEXEC = 0x1 | ||
+ | ||
+ FSCONFIG_SET_FLAG = 0x0 | ||
+ FSCONFIG_SET_STRING = 0x1 | ||
+ FSCONFIG_SET_BINARY = 0x2 | ||
+ FSCONFIG_SET_PATH = 0x3 | ||
+ FSCONFIG_SET_PATH_EMPTY = 0x4 | ||
+ FSCONFIG_SET_FD = 0x5 | ||
+ FSCONFIG_CMD_CREATE = 0x6 | ||
+ FSCONFIG_CMD_RECONFIGURE = 0x7 | ||
) | ||
|
||
type OpenHow struct { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters