diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-02-28 03:58:43 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-02-28 08:05:02 +0100 |
commit | 0712ec69c70d5065447f7ffdbd907e3d7ae50ae9 (patch) | |
tree | fe870bd30b6990d87e1d1ce01e109f3975f676c3 /service/ipc_pipe.go | |
parent | README: backports are missing 1.12 for now (diff) | |
download | wireguard-windows-0712ec69c70d5065447f7ffdbd907e3d7ae50ae9.tar.xz wireguard-windows-0712ec69c70d5065447f7ffdbd907e3d7ae50ae9.zip |
ipc: implement event system with pipes
Also use Go 1.12's Sysconn
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'service/ipc_pipe.go')
-rw-r--r-- | service/ipc_pipe.go | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/service/ipc_pipe.go b/service/ipc_pipe.go index ee63f2d4..00f54bf7 100644 --- a/service/ipc_pipe.go +++ b/service/ipc_pipe.go @@ -33,26 +33,44 @@ func (p *pipeRWC) Close() error { 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() +func makeInheritableAndGetStr(f *os.File) (str string, err error) { + sc, err := f.SyscallConn() if err != nil { return } - err = windows.SetHandleInformation(windows.Handle(theirWriter.Fd()), windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + err2 := sc.Control(func(fd uintptr) { + err = windows.SetHandleInformation(windows.Handle(fd), windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + str = strconv.FormatUint(uint64(fd), 10) + }) + if err2 != nil { + err = err2 + } + return +} + +func inheritableEvents() (ourEvents *os.File, theirEvents *os.File, theirEventStr string, err error) { + theirEvents, ourEvents, err = os.Pipe() if err != nil { return } - theirWriterStr = strconv.FormatUint(uint64(theirWriter.Fd()), 10) + theirEventStr, err = makeInheritableAndGetStr(theirEvents) + return +} - theirReader, ourWriter, err = os.Pipe() +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(theirReader.Fd()), windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + theirWriterStr, err = makeInheritableAndGetStr(theirWriter) if err != nil { return } - theirReaderStr = strconv.FormatUint(uint64(theirReader.Fd()), 10) + theirReader, ourWriter, err = os.Pipe() + if err != nil { + return + } + theirReaderStr, err = makeInheritableAndGetStr(theirReader) return } |