+// 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
+ }
+ }
+ }