From 6fe52d72255456e7d73df9d2f6b4a8f724ed447d Mon Sep 17 00:00:00 2001 From: Vladimir Lavor Date: Thu, 4 Apr 2019 13:37:53 +0200 Subject: socketclient: wait for socket to be created domain sockets are checked/watched for existence in same manner as shm prefixes also the connection attempts and timeout in between can be configured for async-connect Change-Id: I084a3efaefea10d106866968deab90d3fda77cfe Signed-off-by: Vladimir Lavor --- adapter/socketclient/socketclient.go | 38 +++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'adapter/socketclient/socketclient.go') diff --git a/adapter/socketclient/socketclient.go b/adapter/socketclient/socketclient.go index eec4fd0..f281955 100644 --- a/adapter/socketclient/socketclient.go +++ b/adapter/socketclient/socketclient.go @@ -4,9 +4,11 @@ import ( "bufio" "bytes" "fmt" + "github.com/fsnotify/fsnotify" "io" "net" "os" + "path/filepath" "strings" "sync" "time" @@ -72,9 +74,39 @@ func nilCallback(msgID uint16, data []byte) { Log.Warnf("no callback set, dropping message: ID=%v len=%d", msgID, len(data)) } -func (*vppClient) WaitReady() error { - // TODO: add watcher for socket file? - return nil +// WaitReady checks socket file existence and waits for it if necessary +func (c *vppClient) WaitReady() error { + // verify file existence + if _, err := os.Stat(c.sockAddr); err == nil { + return nil + } else if os.IsExist(err) { + return err + } + + // if not, watch for it + watcher, err := fsnotify.NewWatcher() + if err != nil { + return err + } + defer func() { + if err := watcher.Close(); err != nil { + Log.Errorf("failed to close file watcher: %v", err) + } + }() + path := filepath.Dir(c.sockAddr) + if err := watcher.Add(path); err != nil { + return err + } + + for { + ev := <-watcher.Events + if ev.Name == path { + if (ev.Op & fsnotify.Create) == fsnotify.Create { + // socket ready + return nil + } + } + } } func (c *vppClient) SetMsgCallback(cb adapter.MsgCallback) { -- cgit 1.2.3-korg