package daemon

import (
	
	
	
	

	
	
	
)

// Serve runs the daemon service, listening on the socket specified by sockpath
// and serving data from dbpath. It quits upon receiving SIGTERM, SIGINT or when
// all active clients have disconnected.
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{}
	// prevent daemon exit before serving first client
	.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")
}