close(device.signal.stop)
}
-func (device *Device) Wait() {
- <-device.signal.stop
+func (device *Device) WaitChannel() chan struct{} {
+ return device.signal.stop
}
logger.Info = log.New(logInfo,
"INFO: ",
- log.Ldate|log.Ltime|log.Lshortfile,
+ log.Ldate|log.Ltime,
)
logger.Error = log.New(logErr,
"ERROR: ",
- log.Ldate|log.Ltime|log.Lshortfile,
+ log.Ldate|log.Ltime,
)
return logger
}
"fmt"
"log"
"os"
+ "os/signal"
"runtime"
)
if err != nil {
logError.Fatal("UAPI listen error:", err)
}
- defer uapi.Close()
+
+ errs := make(chan error)
+ term := make(chan os.Signal)
+ wait := device.WaitChannel()
go func() {
for {
conn, err := uapi.Accept()
if err != nil {
- logError.Fatal("UAPI accept error:", err)
+ errs <- err
+ return
}
go ipcHandle(device, conn)
}
}()
- device.Wait()
+ logInfo.Println("UAPI listener started")
+
+ // wait for program to terminate
+
+ signal.Notify(term, os.Kill)
+ signal.Notify(term, os.Interrupt)
+
+ select {
+ case <-wait:
+ case <-term:
+ case <-errs:
+ }
+
+ // clean up UAPI bind
+
+ uapi.Close()
+
+ logInfo.Println("Closing")
}