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