xref: /aosp_15_r20/tools/treble/hacksaw/bind/remoteclient.go (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
1*105f6285SAndroid Build Coastguard Worker// Copyright 2020 Google LLC
2*105f6285SAndroid Build Coastguard Worker//
3*105f6285SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*105f6285SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*105f6285SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*105f6285SAndroid Build Coastguard Worker//
7*105f6285SAndroid Build Coastguard Worker//     https://www.apache.org/licenses/LICENSE-2.0
8*105f6285SAndroid Build Coastguard Worker//
9*105f6285SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*105f6285SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*105f6285SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*105f6285SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*105f6285SAndroid Build Coastguard Worker// limitations under the License.
14*105f6285SAndroid Build Coastguard Worker
15*105f6285SAndroid Build Coastguard Workerpackage bind
16*105f6285SAndroid Build Coastguard Worker
17*105f6285SAndroid Build Coastguard Workerimport (
18*105f6285SAndroid Build Coastguard Worker	"errors"
19*105f6285SAndroid Build Coastguard Worker	"net/rpc"
20*105f6285SAndroid Build Coastguard Worker)
21*105f6285SAndroid Build Coastguard Worker
22*105f6285SAndroid Build Coastguard Worker//RemoteBinderClient sends client requests to RPC
23*105f6285SAndroid Build Coastguard Workertype RemoteBinderClient struct {
24*105f6285SAndroid Build Coastguard Worker	rpcClient  *rpc.Client
25*105f6285SAndroid Build Coastguard Worker	SocketPath string
26*105f6285SAndroid Build Coastguard Worker}
27*105f6285SAndroid Build Coastguard Worker
28*105f6285SAndroid Build Coastguard Workerfunc NewRemoteBindClient(socketPath string) PathBinder {
29*105f6285SAndroid Build Coastguard Worker	var r RemoteBinderClient
30*105f6285SAndroid Build Coastguard Worker	r.SocketPath = socketPath
31*105f6285SAndroid Build Coastguard Worker	return &r
32*105f6285SAndroid Build Coastguard Worker}
33*105f6285SAndroid Build Coastguard Worker
34*105f6285SAndroid Build Coastguard Workerfunc (r *RemoteBinderClient) initRpcClient() error {
35*105f6285SAndroid Build Coastguard Worker	if r.rpcClient != nil {
36*105f6285SAndroid Build Coastguard Worker		return nil
37*105f6285SAndroid Build Coastguard Worker	}
38*105f6285SAndroid Build Coastguard Worker	var err error
39*105f6285SAndroid Build Coastguard Worker	r.rpcClient, err = rpc.DialHTTP("unix", r.SocketPath)
40*105f6285SAndroid Build Coastguard Worker	return err
41*105f6285SAndroid Build Coastguard Worker}
42*105f6285SAndroid Build Coastguard Worker
43*105f6285SAndroid Build Coastguard Workerfunc (r *RemoteBinderClient) BindReadOnly(source string, destination string) error {
44*105f6285SAndroid Build Coastguard Worker	args := BindReadOnlyArgs{source, destination}
45*105f6285SAndroid Build Coastguard Worker	var reply BindReadOnlyReply
46*105f6285SAndroid Build Coastguard Worker	if err := r.initRpcClient(); err != nil {
47*105f6285SAndroid Build Coastguard Worker		return err
48*105f6285SAndroid Build Coastguard Worker	}
49*105f6285SAndroid Build Coastguard Worker	if err := r.rpcClient.Call("Server.BindReadOnly", &args, &reply); err != nil {
50*105f6285SAndroid Build Coastguard Worker		return err
51*105f6285SAndroid Build Coastguard Worker	}
52*105f6285SAndroid Build Coastguard Worker	if reply.Err != "" {
53*105f6285SAndroid Build Coastguard Worker		return errors.New(reply.Err)
54*105f6285SAndroid Build Coastguard Worker	}
55*105f6285SAndroid Build Coastguard Worker	return nil
56*105f6285SAndroid Build Coastguard Worker}
57*105f6285SAndroid Build Coastguard Worker
58*105f6285SAndroid Build Coastguard Workerfunc (r *RemoteBinderClient) BindReadWrite(source string, destination string) error {
59*105f6285SAndroid Build Coastguard Worker	args := BindReadWriteArgs{source, destination}
60*105f6285SAndroid Build Coastguard Worker	var reply BindReadWriteReply
61*105f6285SAndroid Build Coastguard Worker	if err := r.initRpcClient(); err != nil {
62*105f6285SAndroid Build Coastguard Worker		return err
63*105f6285SAndroid Build Coastguard Worker	}
64*105f6285SAndroid Build Coastguard Worker	if err := r.rpcClient.Call("Server.BindReadWrite", &args, &reply); err != nil {
65*105f6285SAndroid Build Coastguard Worker		return err
66*105f6285SAndroid Build Coastguard Worker	}
67*105f6285SAndroid Build Coastguard Worker	if reply.Err != "" {
68*105f6285SAndroid Build Coastguard Worker		return errors.New(reply.Err)
69*105f6285SAndroid Build Coastguard Worker	}
70*105f6285SAndroid Build Coastguard Worker	return nil
71*105f6285SAndroid Build Coastguard Worker}
72*105f6285SAndroid Build Coastguard Worker
73*105f6285SAndroid Build Coastguard Workerfunc (r *RemoteBinderClient) Unbind(destination string) error {
74*105f6285SAndroid Build Coastguard Worker	args := UnbindArgs{destination}
75*105f6285SAndroid Build Coastguard Worker	var reply UnbindReply
76*105f6285SAndroid Build Coastguard Worker	if err := r.initRpcClient(); err != nil {
77*105f6285SAndroid Build Coastguard Worker		return err
78*105f6285SAndroid Build Coastguard Worker	}
79*105f6285SAndroid Build Coastguard Worker	if err := r.rpcClient.Call("Server.Unbind", &args, &reply); err != nil {
80*105f6285SAndroid Build Coastguard Worker		return err
81*105f6285SAndroid Build Coastguard Worker	}
82*105f6285SAndroid Build Coastguard Worker	if reply.Err != "" {
83*105f6285SAndroid Build Coastguard Worker		return errors.New(reply.Err)
84*105f6285SAndroid Build Coastguard Worker	}
85*105f6285SAndroid Build Coastguard Worker	return nil
86*105f6285SAndroid Build Coastguard Worker}
87*105f6285SAndroid Build Coastguard Worker
88*105f6285SAndroid Build Coastguard Workerfunc (r *RemoteBinderClient) List() ([]string, error) {
89*105f6285SAndroid Build Coastguard Worker	var args ListArgs
90*105f6285SAndroid Build Coastguard Worker	var reply ListReply
91*105f6285SAndroid Build Coastguard Worker	if err := r.initRpcClient(); err != nil {
92*105f6285SAndroid Build Coastguard Worker		return nil, err
93*105f6285SAndroid Build Coastguard Worker	}
94*105f6285SAndroid Build Coastguard Worker	if err := r.rpcClient.Call("Server.List", &args, &reply); err != nil {
95*105f6285SAndroid Build Coastguard Worker		return nil, err
96*105f6285SAndroid Build Coastguard Worker	}
97*105f6285SAndroid Build Coastguard Worker
98*105f6285SAndroid Build Coastguard Worker	if reply.Err != "" {
99*105f6285SAndroid Build Coastguard Worker		return nil, errors.New(reply.Err)
100*105f6285SAndroid Build Coastguard Worker	}
101*105f6285SAndroid Build Coastguard Worker
102*105f6285SAndroid Build Coastguard Worker	return reply.BindList, nil
103*105f6285SAndroid Build Coastguard Worker}
104