adb_auth_client.c revision 045a4a9c3a317e60ab1078f5a689bf302ee2ab19
1d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby/* 2d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * Copyright (C) 2012 The Android Open Source Project 3d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * 4d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License"); 5d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * you may not use this file except in compliance with the License. 6d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * You may obtain a copy of the License at 7d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * 8d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * http://www.apache.org/licenses/LICENSE-2.0 9d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * 10d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * Unless required by applicable law or agreed to in writing, software 11d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS, 12d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * See the License for the specific language governing permissions and 14d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * limitations under the License. 15d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby */ 16d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 17d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <stdio.h> 18d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <string.h> 19d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <resolv.h> 20d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <cutils/list.h> 21d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <cutils/sockets.h> 22d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 23d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "sysdeps.h" 24d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "adb.h" 25d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "adb_auth.h" 26d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "fdevent.h" 27d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "mincrypt/rsa.h" 28d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 29d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#define TRACE_TAG TRACE_AUTH 30d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 31d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 32d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystruct adb_public_key { 33d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct listnode node; 34d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby RSAPublicKey key; 35d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}; 36d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 37d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic char *key_paths[] = { 38d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby "/adb_keys", 39d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby "/data/misc/adb/adb_keys", 40d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby NULL 41d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}; 42d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 43d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic fdevent listener_fde; 44d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic int framework_fd = -1; 45d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 46045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic void usb_disconnected(void* unused, atransport* t); 47045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic struct adisconnect usb_disconnect = { usb_disconnected, 0, 0, 0 }; 48045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic atransport* usb_transport; 49045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic bool needs_retry = false; 50d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 51d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void read_keys(const char *file, struct listnode *list) 52d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 53d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct adb_public_key *key; 54d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby FILE *f; 55d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby char buf[MAX_PAYLOAD]; 56d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby char *sep; 57d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 58d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 59d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby f = fopen(file, "r"); 60d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (!f) { 61d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Can't open '%s'\n", file); 62d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 63d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 64d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 65d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby while (fgets(buf, sizeof(buf), f)) { 66d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby /* Allocate 4 extra bytes to decode the base64 data in-place */ 67d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby key = calloc(1, sizeof(*key) + 4); 68d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (!key) { 69d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Can't malloc key\n"); 70d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby break; 71d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 72d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 73d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby sep = strpbrk(buf, " \t"); 74d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (sep) 75d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby *sep = '\0'; 76d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 77d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = __b64_pton(buf, (u_char *)&key->key, sizeof(key->key) + 4); 78d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret != sizeof(key->key)) { 79d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("%s: Invalid base64 data ret=%d\n", file, ret); 80d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby free(key); 81d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby continue; 82d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 83d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 84d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (key->key.len != RSANUMWORDS) { 85d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("%s: Invalid key len %d\n", file, key->key.len); 86d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby free(key); 87d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby continue; 88d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 89d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 90d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby list_add_tail(list, &key->node); 91d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 92d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 93d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fclose(f); 94d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 95d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 96d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void free_keys(struct listnode *list) 97d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 98d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct listnode *item; 99d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 100d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby while (!list_empty(list)) { 101d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby item = list_head(list); 102d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby list_remove(item); 103d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby free(node_to_item(item, struct adb_public_key, node)); 104d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 105d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 106d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 107345cb066d2e0c774c877a85d3035f298df1daf16Benoit Gobystatic void load_keys(struct listnode *list) 108d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 109d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby char *path; 110d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby char **paths = key_paths; 111d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct stat buf; 112d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 113345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby list_init(list); 114d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 115d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby while ((path = *paths++)) { 116d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (!stat(path, &buf)) { 117d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Loading keys from '%s'\n", path); 118345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby read_keys(path, list); 119d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 120d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 121d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 122d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 123d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyint adb_auth_generate_token(void *token, size_t token_size) 124d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 125d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby FILE *f; 126d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 127d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 128d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby f = fopen("/dev/urandom", "r"); 129d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (!f) 130d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return 0; 131d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 132d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = fread(token, token_size, 1, f); 133d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 134d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fclose(f); 135d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return ret * token_size; 136d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 137d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 138d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyint adb_auth_verify(void *token, void *sig, int siglen) 139d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 140d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct listnode *item; 141d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct adb_public_key *key; 142345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby struct listnode key_list; 143345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby int ret = 0; 144d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 145d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (siglen != RSANUMBYTES) 146d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return 0; 147d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 148345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby load_keys(&key_list); 149345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby 150d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby list_for_each(item, &key_list) { 151d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby key = node_to_item(item, struct adb_public_key, node); 152d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = RSA_verify(&key->key, sig, siglen, token); 153d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret) 154345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby break; 155d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 156d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 157345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby free_keys(&key_list); 158345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby 159345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby return ret; 160d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 161d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 162045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic void usb_disconnected(void* unused, atransport* t) 163045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby{ 164045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby D("USB disconnect"); 165045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby remove_transport_disconnect(usb_transport, &usb_disconnect); 166045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby usb_transport = NULL; 167045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby needs_retry = false; 168045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby} 169045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby 170d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void adb_auth_event(int fd, unsigned events, void *data) 171d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 172d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby char response[2]; 173d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 174d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 175d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (events & FDE_READ) { 176d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = unix_read(fd, response, sizeof(response)); 177d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret < 0) { 178045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby D("Framework disconnect"); 179045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby if (usb_transport) 180045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby fdevent_remove(&usb_transport->auth_fde); 181d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby framework_fd = -1; 182d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 183d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby else if (ret == 2 && response[0] == 'O' && response[1] == 'K') { 184045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby if (usb_transport) 185045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby adb_auth_verified(usb_transport); 186d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 187d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 188d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 189d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 190d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyvoid adb_auth_confirm_key(unsigned char *key, size_t len, atransport *t) 191d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 192d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby char msg[MAX_PAYLOAD]; 193d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int ret; 194d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 195045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby usb_transport = t; 196045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby add_transport_disconnect(t, &usb_disconnect); 197045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby 198d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (framework_fd < 0) { 199d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Client not connected\n"); 200045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby needs_retry = true; 201d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 202d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 203d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 204d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (key[len - 1] != '\0') { 205d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Key must be a null-terminated string\n"); 206d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 207d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 208d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 209d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = snprintf(msg, sizeof(msg), "PK%s", key); 210d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret >= (signed)sizeof(msg)) { 211d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Key too long. ret=%d", ret); 212d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 213d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 214d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Sending '%s'\n", msg); 215d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 216d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = unix_write(framework_fd, msg, ret); 217d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret < 0) { 218d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Failed to write PK, errno=%d\n", errno); 219d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 220d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 221d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 222d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fdevent_install(&t->auth_fde, framework_fd, adb_auth_event, t); 223d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fdevent_add(&t->auth_fde, FDE_READ); 224d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 225d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 226d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void adb_auth_listener(int fd, unsigned events, void *data) 227d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 228d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby struct sockaddr addr; 229d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby socklen_t alen; 230d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int s; 231d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 232d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby alen = sizeof(addr); 233d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 234d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby s = adb_socket_accept(fd, &addr, &alen); 235d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (s < 0) { 236d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Failed to accept: errno=%d\n", errno); 237d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 238d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 239d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 240d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby framework_fd = s; 241045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby 242045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby if (needs_retry) { 243045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby needs_retry = false; 244045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby send_auth_request(usb_transport); 245045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby } 246d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 247d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 248d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyvoid adb_auth_init(void) 249d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{ 250d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby int fd, ret; 251d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 252d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fd = android_get_control_socket("adbd"); 253d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (fd < 0) { 254d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Failed to get adbd socket\n"); 255d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 256d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 257d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 258d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby ret = listen(fd, 4); 259d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby if (ret < 0) { 260d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby D("Failed to listen on '%d'\n", fd); 261d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby return; 262d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby } 263d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby 264d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fdevent_install(&listener_fde, fd, adb_auth_listener, NULL); 265d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby fdevent_add(&listener_fde, FDE_READ); 266d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby} 267