full diff: https://github.com/containerd/fifo/compare/f15a3290365b9d2627d189e619ab4008e0069caf...0724c46b320cf96bb172a0550c19a4b1fca4dacb
- Add OpenFifoDup2
- use golang.org/x/sys/unix for dup2 (fixes build on arm64)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
... | ... |
@@ -131,7 +131,7 @@ google.golang.org/genproto 3f1135a288c9a07e340ae8ba4cc6 |
131 | 131 |
|
132 | 132 |
# containerd |
133 | 133 |
github.com/containerd/containerd d4e78200d6da62480c85bf6f26b7221ea938f396 |
134 |
-github.com/containerd/fifo f15a3290365b9d2627d189e619ab4008e0069caf |
|
134 |
+github.com/containerd/fifo 0724c46b320cf96bb172a0550c19a4b1fca4dacb |
|
135 | 135 |
github.com/containerd/continuity efbc4488d8fe1bdc16bde3b2d2990d9b3a899165 |
136 | 136 |
github.com/containerd/cgroups 318312a373405e5e91134d8063d04d59768a1bff |
137 | 137 |
github.com/containerd/console 5d7e1412f07b502a01029ea20e20e0d2be31fa7c # v1.0.1 |
... | ... |
@@ -25,6 +25,7 @@ import ( |
25 | 25 |
"syscall" |
26 | 26 |
|
27 | 27 |
"github.com/pkg/errors" |
28 |
+ "golang.org/x/sys/unix" |
|
28 | 29 |
) |
29 | 30 |
|
30 | 31 |
type fifo struct { |
... | ... |
@@ -41,6 +42,21 @@ type fifo struct { |
41 | 41 |
|
42 | 42 |
var leakCheckWg *sync.WaitGroup |
43 | 43 |
|
44 |
+// OpenFifoDup2 is same as OpenFifo, but additionally creates a copy of the FIFO file descriptor with dup2 syscall. |
|
45 |
+func OpenFifoDup2(ctx context.Context, fn string, flag int, perm os.FileMode, fd int) (io.ReadWriteCloser, error) { |
|
46 |
+ f, err := openFifo(ctx, fn, flag, perm) |
|
47 |
+ if err != nil { |
|
48 |
+ return nil, errors.Wrap(err, "fifo error") |
|
49 |
+ } |
|
50 |
+ |
|
51 |
+ if err := unix.Dup2(int(f.file.Fd()), fd); err != nil { |
|
52 |
+ _ = f.Close() |
|
53 |
+ return nil, errors.Wrap(err, "dup2 error") |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ return f, nil |
|
57 |
+} |
|
58 |
+ |
|
44 | 59 |
// OpenFifo opens a fifo. Returns io.ReadWriteCloser. |
45 | 60 |
// Context can be used to cancel this function until open(2) has not returned. |
46 | 61 |
// Accepted flags: |
... | ... |
@@ -52,6 +68,10 @@ var leakCheckWg *sync.WaitGroup |
52 | 52 |
// fifo isn't open. read/write will be connected after the actual fifo is |
53 | 53 |
// open or after fifo is closed. |
54 | 54 |
func OpenFifo(ctx context.Context, fn string, flag int, perm os.FileMode) (io.ReadWriteCloser, error) { |
55 |
+ return openFifo(ctx, fn, flag, perm) |
|
56 |
+} |
|
57 |
+ |
|
58 |
+func openFifo(ctx context.Context, fn string, flag int, perm os.FileMode) (*fifo, error) { |
|
55 | 59 |
if _, err := os.Stat(fn); err != nil { |
56 | 60 |
if os.IsNotExist(err) && flag&syscall.O_CREAT != 0 { |
57 | 61 |
if err := mkfifo(fn, uint32(perm&os.ModePerm)); err != nil && !os.IsExist(err) { |