package daemon
import (
)
func (, string) {
logger.Println("pid is", syscall.Getpid())
logger.Println("going to listen", )
, := listen()
if != nil {
logger.Printf("failed to listen on %s: %v", , )
logger.Println("aborting")
os.Exit(2)
}
, := store.NewStore()
if != nil {
logger.Printf("failed to create storage: %v", )
logger.Printf("serving anyway")
}
:= make(chan os.Signal)
:= make(chan struct{})
signal.Notify(, syscall.SIGTERM, syscall.SIGINT)
go func() {
select {
case := <-:
logger.Printf("received signal %s", )
case <-:
logger.Printf("No active client, daemon exit")
}
:= os.Remove()
if != nil {
logger.Printf("failed to remove socket %s: %v", , )
}
= .Close()
if != nil {
logger.Printf("failed to close storage: %v", )
}
= .Close()
if != nil {
logger.Printf("failed to close listener: %v", )
}
logger.Println("listener closed, waiting to exit")
}()
:= &service{, }
rpc.RegisterName(api.ServiceName, )
logger.Println("starting to serve RPC calls")
:= true
:= sync.WaitGroup{}
.Add(1)
go func() {
.Wait()
close()
}()
for {
, := .Accept()
if != nil {
logger.Printf("Failed to accept: %#v", )
break
}
if {
= false
} else {
.Add(1)
}
go func() {
rpc.DefaultServer.ServeConn()
.Done()
}()
}
logger.Println("exiting")
}