static int _adb_connect(const std::string& service, std::string* error) { D("_adb_connect: %s", service.c_str()); if (service.empty() || service.size() > MAX_PAYLOAD) { *error = android::base::StringPrintf("bad service name length (%zd)", service.size()); return -1; } std::string reason; int fd = socket_spec_connect(__adb_server_socket_spec, &reason); if (fd < 0) { *error = android::base::StringPrintf("cannot connect to daemon at %s: %s", __adb_server_socket_spec, reason.c_str()); return -2; } if (memcmp(&service[0], "host", 4) != 0 && switch_socket_transport(fd, error)) { return -1; } if (!SendProtocolString(fd, service)) { *error = perror_str("write failure during connection"); adb_close(fd); return -1; } if (!adb_status(fd, error)) { adb_close(fd); return -1; } D("_adb_connect: return fd %d", fd); return fd; }
bool adb_kill_server() { D("adb_kill_server"); std::string reason; int fd = socket_spec_connect(__adb_server_socket_spec, &reason); if (fd < 0) { fprintf(stderr, "cannot connect to daemon at %s: %s\n", __adb_server_socket_spec, reason.c_str()); return true; } if (!SendProtocolString(fd, "host:kill")) { fprintf(stderr, "error: write failure during connection: %s\n", strerror(errno)); return false; } // The server might send OKAY, so consume that. char buf[4]; ReadFdExactly(fd, buf, 4); // Now that no more data is expected, wait for socket orderly shutdown or error, indicating // server death. ReadOrderlyShutdown(fd); return true; }
int service_to_fd(const char* name, const atransport* transport) { int ret = -1; if (is_socket_spec(name)) { std::string error; ret = socket_spec_connect(name, &error); if (ret < 0) { LOG(ERROR) << "failed to connect to socket '" << name << "': " << error; } #if !ADB_HOST } else if(!strncmp("dev:", name, 4)) { ret = unix_open(name + 4, O_RDWR | O_CLOEXEC); } else if(!strncmp(name, "framebuffer:", 12)) { ret = create_service_thread(framebuffer_service, 0); } else if (!strncmp(name, "jdwp:", 5)) { ret = create_jdwp_connection_fd(atoi(name+5)); } else if(!strncmp(name, "shell", 5)) { ret = ShellService(name + 5, transport); } else if(!strncmp(name, "exec:", 5)) { ret = StartSubprocess(name + 5, nullptr, SubprocessType::kRaw, SubprocessProtocol::kNone); } else if(!strncmp(name, "sync:", 5)) { ret = create_service_thread(file_sync_service, NULL); } else if(!strncmp(name, "remount:", 8)) { ret = create_service_thread(remount_service, NULL); } else if(!strncmp(name, "reboot:", 7)) { void* arg = strdup(name + 7); if (arg == NULL) return -1; ret = create_service_thread(reboot_service, arg); } else if(!strncmp(name, "root:", 5)) { ret = create_service_thread(restart_root_service, NULL); } else if(!strncmp(name, "unroot:", 7)) { ret = create_service_thread(restart_unroot_service, NULL); } else if(!strncmp(name, "backup:", 7)) { ret = StartSubprocess(android::base::StringPrintf("/system/bin/bu backup %s", (name + 7)).c_str(), nullptr, SubprocessType::kRaw, SubprocessProtocol::kNone); } else if(!strncmp(name, "restore:", 8)) { ret = StartSubprocess("/system/bin/bu restore", nullptr, SubprocessType::kRaw, SubprocessProtocol::kNone); } else if(!strncmp(name, "tcpip:", 6)) { int port; if (sscanf(name + 6, "%d", &port) != 1) { return -1; } ret = create_service_thread(restart_tcp_service, (void *) (uintptr_t) port); } else if(!strncmp(name, "usb:", 4)) { ret = create_service_thread(restart_usb_service, NULL); } else if (!strncmp(name, "reverse:", 8)) { ret = reverse_service(name + 8); } else if(!strncmp(name, "disable-verity:", 15)) { ret = create_service_thread(set_verity_enabled_state_service, (void*)0); } else if(!strncmp(name, "enable-verity:", 15)) { ret = create_service_thread(set_verity_enabled_state_service, (void*)1); } else if (!strcmp(name, "reconnect")) { ret = create_service_thread(reconnect_service, const_cast<atransport*>(transport)); #endif } if (ret >= 0) { close_on_exec(ret); } return ret; }