| Index: client/internal/logdog/butler/streamserver/npipe_posix.go
|
| diff --git a/client/internal/logdog/butler/streamserver/npipe_posix.go b/client/internal/logdog/butler/streamserver/npipe_posix.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..204c419fcd5913c6f36cf3e033412912f36860c6
|
| --- /dev/null
|
| +++ b/client/internal/logdog/butler/streamserver/npipe_posix.go
|
| @@ -0,0 +1,91 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// +build darwin dragonfly freebsd linux netbsd openbsd
|
| +
|
| +package streamserver
|
| +
|
| +import (
|
| + "fmt"
|
| + "net"
|
| + "os"
|
| +
|
| + log "github.com/luci/luci-go/common/logging"
|
| + "golang.org/x/net/context"
|
| +)
|
| +
|
| +type namedPipeServer struct {
|
| + namedPipeServerBase
|
| +
|
| + path string // The path on the filesystem of the UNIX domain named socket
|
| +}
|
| +
|
| +func (s *namedPipeServer) GoString() string {
|
| + return fmt.Sprintf("namedPipeServer[%s]", s.path)
|
| +}
|
| +
|
| +// Wrapper around the "unix"-type Listener that cleans up the named pipe on
|
| +// creation and 'Close()'
|
| +type selfCleaningUNIXListener struct {
|
| + path string
|
| + listener net.Listener
|
| +}
|
| +
|
| +// NewNamedPipeServer instantiates a new POSIX named pipe server instance.
|
| +func NewNamedPipeServer(ctx context.Context, path string) StreamServer {
|
| + s := &namedPipeServer{
|
| + path: path,
|
| + }
|
| + s.initBase(ctx)
|
| + return s
|
| +}
|
| +
|
| +// OS-specific override to create a UNIX named socket listener
|
| +func (s *namedPipeServer) createListener() (net.Listener, error) {
|
| + log.Fields{
|
| + "path": s.path,
|
| + }.Infof(s.ctx, "Creating POSIX server socket Listener.")
|
| + return newSelfCleaningUNIXListener(s.path)
|
| +}
|
| +
|
| +//
|
| +// selfCleaningUNIXListener
|
| +//
|
| +
|
| +func newSelfCleaningUNIXListener(path string) (net.Listener, error) {
|
| + // Cleanup any previous entry
|
| + os.Remove(path)
|
| +
|
| + // Create a UNIX listener
|
| + listener, err := net.Listen("unix", path)
|
| + if err != nil {
|
| + return nil, err
|
| + }
|
| +
|
| + l := selfCleaningUNIXListener{
|
| + path: path,
|
| + listener: listener,
|
| + }
|
| + return &l, nil
|
| +}
|
| +
|
| +// Implements net.Listner.Accept
|
| +func (l *selfCleaningUNIXListener) Accept() (c net.Conn, err error) {
|
| + return l.listener.Accept()
|
| +}
|
| +
|
| +// Implements net.Listener.Close
|
| +func (l *selfCleaningUNIXListener) Close() error {
|
| + if err := l.listener.Close(); err != nil {
|
| + return err
|
| + }
|
| +
|
| + os.Remove(l.path)
|
| + return nil
|
| +}
|
| +
|
| +// Implements net.Listener.Addr
|
| +func (l *selfCleaningUNIXListener) Addr() net.Addr {
|
| + return l.listener.Addr()
|
| +}
|
|
|