From a3054a01dfb6033b75b9ad31189b1202cbedcefc Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 25 Feb 2019 18:47:12 +0100 Subject: ipc: add base of IPC --- service/ipc_pipe.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 service/ipc_pipe.go (limited to 'service/ipc_pipe.go') diff --git a/service/ipc_pipe.go b/service/ipc_pipe.go new file mode 100644 index 00000000..ee63f2d4 --- /dev/null +++ b/service/ipc_pipe.go @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package service + +import ( + "golang.org/x/sys/windows" + "os" + "strconv" +) + +type pipeRWC struct { + reader *os.File + writer *os.File +} + +func (p *pipeRWC) Read(b []byte) (int, error) { + return p.reader.Read(b) +} + +func (p *pipeRWC) Write(b []byte) (int, error) { + return p.writer.Write(b) +} + +func (p *pipeRWC) Close() error { + err1 := p.writer.Close() + err2 := p.reader.Close() + if err1 != nil { + return err1 + } + return err2 +} + +func inheritableSocketpairEmulation() (ourReader *os.File, theirReader *os.File, theirReaderStr string, ourWriter *os.File, theirWriter *os.File, theirWriterStr string, err error) { + ourReader, theirWriter, err = os.Pipe() + if err != nil { + return + } + err = windows.SetHandleInformation(windows.Handle(theirWriter.Fd()), windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + if err != nil { + return + } + theirWriterStr = strconv.FormatUint(uint64(theirWriter.Fd()), 10) + + theirReader, ourWriter, err = os.Pipe() + if err != nil { + return + } + err = windows.SetHandleInformation(windows.Handle(theirReader.Fd()), windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + if err != nil { + return + } + theirReaderStr = strconv.FormatUint(uint64(theirReader.Fd()), 10) + + return +} -- cgit v1.2.3-59-g8ed1b