From 0712ec69c70d5065447f7ffdbd907e3d7ae50ae9 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 28 Feb 2019 03:58:43 +0100 Subject: ipc: implement event system with pipes Also use Go 1.12's Sysconn Signed-off-by: Jason A. Donenfeld --- service/ipc_pipe.go | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'service/ipc_pipe.go') 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 } -- cgit v1.2.3-59-g8ed1b