1*20733378SAndroid Build Coastguard Worker /* 2*20733378SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*20733378SAndroid Build Coastguard Worker * 4*20733378SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*20733378SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*20733378SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*20733378SAndroid Build Coastguard Worker * 8*20733378SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*20733378SAndroid Build Coastguard Worker * 10*20733378SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*20733378SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*20733378SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*20733378SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*20733378SAndroid Build Coastguard Worker * limitations under the License. 15*20733378SAndroid Build Coastguard Worker */ 16*20733378SAndroid Build Coastguard Worker 17*20733378SAndroid Build Coastguard Worker package android.aconfigd; 18*20733378SAndroid Build Coastguard Worker 19*20733378SAndroid Build Coastguard Worker import android.net.LocalSocket; 20*20733378SAndroid Build Coastguard Worker import android.net.LocalSocketAddress; 21*20733378SAndroid Build Coastguard Worker import android.util.Slog; 22*20733378SAndroid Build Coastguard Worker 23*20733378SAndroid Build Coastguard Worker import java.io.DataInputStream; 24*20733378SAndroid Build Coastguard Worker import java.io.DataOutputStream; 25*20733378SAndroid Build Coastguard Worker import java.io.IOException; 26*20733378SAndroid Build Coastguard Worker import java.io.InputStream; 27*20733378SAndroid Build Coastguard Worker 28*20733378SAndroid Build Coastguard Worker /** @hide */ 29*20733378SAndroid Build Coastguard Worker public class AconfigdClientSocketImpl implements AconfigdClientSocket { 30*20733378SAndroid Build Coastguard Worker 31*20733378SAndroid Build Coastguard Worker private static String TAG = "AconfigdClientSocketImpl"; 32*20733378SAndroid Build Coastguard Worker 33*20733378SAndroid Build Coastguard Worker private LocalSocket mLocalSocket; 34*20733378SAndroid Build Coastguard Worker private LocalSocketAddress mLocalSocketAddress; 35*20733378SAndroid Build Coastguard Worker AconfigdClientSocketImpl(LocalSocketAddress address)36*20733378SAndroid Build Coastguard Worker public AconfigdClientSocketImpl(LocalSocketAddress address) { 37*20733378SAndroid Build Coastguard Worker mLocalSocket = new LocalSocket(); 38*20733378SAndroid Build Coastguard Worker mLocalSocketAddress = address; 39*20733378SAndroid Build Coastguard Worker } 40*20733378SAndroid Build Coastguard Worker AconfigdClientSocketImpl()41*20733378SAndroid Build Coastguard Worker AconfigdClientSocketImpl() { 42*20733378SAndroid Build Coastguard Worker this(new LocalSocketAddress( 43*20733378SAndroid Build Coastguard Worker "aconfigd_system", 44*20733378SAndroid Build Coastguard Worker LocalSocketAddress.Namespace.RESERVED)); 45*20733378SAndroid Build Coastguard Worker } 46*20733378SAndroid Build Coastguard Worker 47*20733378SAndroid Build Coastguard Worker /** 48*20733378SAndroid Build Coastguard Worker * Connect the socket 49*20733378SAndroid Build Coastguard Worker * 50*20733378SAndroid Build Coastguard Worker * @hide 51*20733378SAndroid Build Coastguard Worker */ connect()52*20733378SAndroid Build Coastguard Worker public void connect() throws IOException { 53*20733378SAndroid Build Coastguard Worker if (mLocalSocket.isConnected()) return; 54*20733378SAndroid Build Coastguard Worker mLocalSocket.connect(mLocalSocketAddress); 55*20733378SAndroid Build Coastguard Worker } 56*20733378SAndroid Build Coastguard Worker 57*20733378SAndroid Build Coastguard Worker /** 58*20733378SAndroid Build Coastguard Worker * send request 59*20733378SAndroid Build Coastguard Worker * 60*20733378SAndroid Build Coastguard Worker * @param requests stream of requests 61*20733378SAndroid Build Coastguard Worker * @hide 62*20733378SAndroid Build Coastguard Worker */ 63*20733378SAndroid Build Coastguard Worker @Override send(byte[] requests)64*20733378SAndroid Build Coastguard Worker public InputStream send(byte[] requests) { 65*20733378SAndroid Build Coastguard Worker if (!mLocalSocket.isConnected()) { 66*20733378SAndroid Build Coastguard Worker try { 67*20733378SAndroid Build Coastguard Worker connect(); 68*20733378SAndroid Build Coastguard Worker } catch (IOException e) { 69*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "fail to connect to the server socket", e); 70*20733378SAndroid Build Coastguard Worker return null; 71*20733378SAndroid Build Coastguard Worker } 72*20733378SAndroid Build Coastguard Worker } 73*20733378SAndroid Build Coastguard Worker 74*20733378SAndroid Build Coastguard Worker DataInputStream inputStream = null; 75*20733378SAndroid Build Coastguard Worker DataOutputStream outputStream = null; 76*20733378SAndroid Build Coastguard Worker try { 77*20733378SAndroid Build Coastguard Worker inputStream = new DataInputStream(mLocalSocket.getInputStream()); 78*20733378SAndroid Build Coastguard Worker outputStream = new DataOutputStream(mLocalSocket.getOutputStream()); 79*20733378SAndroid Build Coastguard Worker } catch (IOException ioe) { 80*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "failed to get local socket iostreams", ioe); 81*20733378SAndroid Build Coastguard Worker return null; 82*20733378SAndroid Build Coastguard Worker } 83*20733378SAndroid Build Coastguard Worker 84*20733378SAndroid Build Coastguard Worker // send requests 85*20733378SAndroid Build Coastguard Worker try { 86*20733378SAndroid Build Coastguard Worker outputStream.writeInt(requests.length); 87*20733378SAndroid Build Coastguard Worker outputStream.write(requests); 88*20733378SAndroid Build Coastguard Worker Slog.i(TAG, "flag requests sent to aconfigd"); 89*20733378SAndroid Build Coastguard Worker } catch (IOException ioe) { 90*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "failed to send requests to aconfigd", ioe); 91*20733378SAndroid Build Coastguard Worker return null; 92*20733378SAndroid Build Coastguard Worker } 93*20733378SAndroid Build Coastguard Worker 94*20733378SAndroid Build Coastguard Worker // read return 95*20733378SAndroid Build Coastguard Worker try { 96*20733378SAndroid Build Coastguard Worker int num_bytes = inputStream.readInt(); 97*20733378SAndroid Build Coastguard Worker Slog.i(TAG, "received " + num_bytes + " bytes back from aconfigd"); 98*20733378SAndroid Build Coastguard Worker return mLocalSocket.getInputStream(); 99*20733378SAndroid Build Coastguard Worker } catch (IOException ioe) { 100*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "failed to read requests return from aconfigd", ioe); 101*20733378SAndroid Build Coastguard Worker return null; 102*20733378SAndroid Build Coastguard Worker } 103*20733378SAndroid Build Coastguard Worker } 104*20733378SAndroid Build Coastguard Worker 105*20733378SAndroid Build Coastguard Worker /** 106*20733378SAndroid Build Coastguard Worker * Close the local socket 107*20733378SAndroid Build Coastguard Worker * 108*20733378SAndroid Build Coastguard Worker * @hide 109*20733378SAndroid Build Coastguard Worker */ 110*20733378SAndroid Build Coastguard Worker @Override close()111*20733378SAndroid Build Coastguard Worker public void close() { 112*20733378SAndroid Build Coastguard Worker try { 113*20733378SAndroid Build Coastguard Worker mLocalSocket.shutdownInput(); 114*20733378SAndroid Build Coastguard Worker mLocalSocket.shutdownOutput(); 115*20733378SAndroid Build Coastguard Worker mLocalSocket.close(); 116*20733378SAndroid Build Coastguard Worker } catch (IOException e) { 117*20733378SAndroid Build Coastguard Worker Slog.e(TAG, "failed to close socket", e); 118*20733378SAndroid Build Coastguard Worker } 119*20733378SAndroid Build Coastguard Worker } 120*20733378SAndroid Build Coastguard Worker 121*20733378SAndroid Build Coastguard Worker } 122