package main import ( "context" "fmt" "net" "os" "google.golang.org/grpc" gen "golang.zx2c4.com/wireguard/android/gen" "golang.zx2c4.com/wireguard/device" ) type LibwgServiceImpl struct { gen.UnimplementedLibwgServer logger *device.Logger } var _ gen.LibwgServer = (*LibwgServiceImpl)(nil) var server *grpc.Server func NewLibwgService(logger *device.Logger) gen.LibwgServer { return &LibwgServiceImpl{logger: logger} } func StartGrpc(sock_path string, logger *device.Logger) (int, string) { if server != nil { return -1, "Already started" } if _, err := os.Stat(sock_path); err == nil { if err := os.RemoveAll(sock_path); err != nil { return -1, fmt.Sprintf("Cleanup failed: %v %v", sock_path, err) } } listener, err := net.Listen("unix", sock_path) if err != nil { return -1, fmt.Sprintf("Listen failed: %v %v", sock_path, err) } server = grpc.NewServer() service := NewLibwgService(logger) gen.RegisterLibwgServer(server, service) go func() { server.Serve(listener) }() logger.Verbosef("gRPC started") return 0, "" } func (e *LibwgServiceImpl) Version(ctx context.Context, req *gen.VersionRequest) (*gen.VersionResponse, error) { r := &gen.VersionResponse{ Version: Version(), } return r, nil } func (e *LibwgServiceImpl) StopGrpc(ctx context.Context, req *gen.StopGrpcRequest) (*gen.StopGrpcResponse, error) { if server != nil { server.Stop() server = nil } r := &gen.StopGrpcResponse{ } return r, nil }