From f3f6a1d0d4279930be1434fa66cc0b3fbbb850f0 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Sun, 31 Jan 2016 19:12:26 -0800 Subject: [PATCH 1/2] adb: add adb_get_feature_set. Extract a feature set getter function from commandline.cpp. Change-Id: I30a3eb0b060a88379e29be16264637816e378978 --- adb/adb_client.cpp | 24 ++++++++++++++++ adb/adb_client.h | 7 +++++ adb/commandline.cpp | 68 ++++++++++++--------------------------------- 3 files changed, 48 insertions(+), 51 deletions(-) diff --git a/adb/adb_client.cpp b/adb/adb_client.cpp index bbc4dc72b..db9b71087 100644 --- a/adb/adb_client.cpp +++ b/adb/adb_client.cpp @@ -295,3 +295,27 @@ bool adb_query(const std::string& service, std::string* result, std::string* err adb_close(fd); return true; } + +std::string format_host_command(const char* command, TransportType type, const char* serial) { + if (serial) { + return android::base::StringPrintf("host-serial:%s:%s", serial, command); + } + + const char* prefix = "host"; + if (type == kTransportUsb) { + prefix = "host-usb"; + } else if (type == kTransportLocal) { + prefix = "host-local"; + } + return android::base::StringPrintf("%s:%s", prefix, command); +} + +bool adb_get_feature_set(FeatureSet* feature_set, std::string* error) { + std::string result; + if (adb_query(format_host_command("features", __adb_transport, __adb_serial), &result, error)) { + *feature_set = StringToFeatureSet(result); + return true; + } + feature_set->clear(); + return false; +} diff --git a/adb/adb_client.h b/adb/adb_client.h index 5de0638ef..112c13a4e 100644 --- a/adb/adb_client.h +++ b/adb/adb_client.h @@ -18,6 +18,7 @@ #define _ADB_CLIENT_H_ #include "adb.h" +#include "transport.h" #include @@ -52,4 +53,10 @@ int adb_send_emulator_command(int argc, const char** argv, const char* serial); // event of OKAY, false in the event of FAIL or protocol error. bool adb_status(int fd, std::string* error); +// Create a host command corresponding to selected transport type/serial. +std::string format_host_command(const char* command, TransportType type, const char* serial); + +// Get the feature set of the current preferred transport. +bool adb_get_feature_set(FeatureSet* feature_set, std::string* error); + #endif diff --git a/adb/commandline.cpp b/adb/commandline.cpp index f88669808..db8df14a3 100644 --- a/adb/commandline.cpp +++ b/adb/commandline.cpp @@ -428,49 +428,6 @@ static void copy_to_file(int inFd, int outFd) { free(buf); } -static std::string format_host_command(const char* command, - TransportType type, const char* serial) { - if (serial) { - return android::base::StringPrintf("host-serial:%s:%s", serial, command); - } - - const char* prefix = "host"; - if (type == kTransportUsb) { - prefix = "host-usb"; - } else if (type == kTransportLocal) { - prefix = "host-local"; - } - return android::base::StringPrintf("%s:%s", prefix, command); -} - -namespace { - -enum class ErrorAction { - kPrintToStderr, - kDoNotPrint -}; - -} // namespace - -// Fills |feature_set| using the target indicated by |transport_type| and |serial|. Returns false -// and clears |feature_set| on failure. |error_action| selects whether to also print error messages -// on failure. -static bool GetFeatureSet(TransportType transport_type, const char* serial, FeatureSet* feature_set, - ErrorAction error_action) { - std::string result, error; - - if (adb_query(format_host_command("features", transport_type, serial), &result, &error)) { - *feature_set = StringToFeatureSet(result); - return true; - } - - if (error_action == ErrorAction::kPrintToStderr) { - fprintf(stderr, "error: %s\n", error.c_str()); - } - feature_set->clear(); - return false; -} - static void send_window_size_change(int fd, std::unique_ptr& shell) { #if !defined(_WIN32) // Old devices can't handle window size changes. @@ -712,10 +669,12 @@ static int RemoteShell(bool use_shell_protocol, const std::string& type_arg, return exit_code; } -static int adb_shell(int argc, const char** argv, - TransportType transport_type, const char* serial) { +static int adb_shell(int argc, const char** argv) { FeatureSet features; - if (!GetFeatureSet(transport_type, serial, &features, ErrorAction::kPrintToStderr)) { + std::string error; + + if (!adb_get_feature_set(&features, &error)) { + fprintf(stderr, "error: %s\n", error.c_str()); return 1; } @@ -1096,7 +1055,8 @@ static int send_shell_command(TransportType transport_type, const char* serial, // Use shell protocol if it's supported and the caller doesn't explicitly disable it. if (!disable_shell_protocol) { FeatureSet features; - if (GetFeatureSet(transport_type, serial, &features, ErrorAction::kDoNotPrint)) { + std::string error; + if (adb_get_feature_set(&features, &error)) { use_shell_protocol = CanUseFeature(features, kFeatureShell2); } else { // Device was unreachable. @@ -1575,7 +1535,7 @@ int adb_commandline(int argc, const char **argv) { return adb_send_emulator_command(argc, argv, serial); } else if (!strcmp(argv[0], "shell")) { - return adb_shell(argc, argv, transport_type, serial); + return adb_shell(argc, argv); } else if (!strcmp(argv[0], "exec-in") || !strcmp(argv[0], "exec-out")) { int exec_in = !strcmp(argv[0], "exec-in"); @@ -1731,7 +1691,9 @@ int adb_commandline(int argc, const char **argv) { else if (!strcmp(argv[0], "install")) { if (argc < 2) return usage(); FeatureSet features; - if (!GetFeatureSet(transport_type, serial, &features, ErrorAction::kPrintToStderr)) { + std::string error; + if (!adb_get_feature_set(&features, &error)) { + fprintf(stderr, "error: %s\n", error.c_str()); return 1; } @@ -1747,7 +1709,9 @@ int adb_commandline(int argc, const char **argv) { else if (!strcmp(argv[0], "uninstall")) { if (argc < 2) return usage(); FeatureSet features; - if (!GetFeatureSet(transport_type, serial, &features, ErrorAction::kPrintToStderr)) { + std::string error; + if (!adb_get_feature_set(&features, &error)) { + fprintf(stderr, "error: %s\n", error.c_str()); return 1; } @@ -1850,7 +1814,9 @@ int adb_commandline(int argc, const char **argv) { else if (!strcmp(argv[0], "features")) { // Only list the features common to both the adb client and the device. FeatureSet features; - if (!GetFeatureSet(transport_type, serial, &features, ErrorAction::kPrintToStderr)) { + std::string error; + if (!adb_get_feature_set(&features, &error)) { + fprintf(stderr, "error: %s\n", error.c_str()); return 1; } From a166e71e216dbfe4bff8dfc369b10ab08e183427 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 29 Jan 2016 12:08:34 -0800 Subject: [PATCH 2/2] adb: add nullability specifiers to adb_client.h. Change-Id: I93287b876cb06d871b4330d2733ef6f43c58fbbf --- adb/adb_client.h | 21 ++++++++++++--------- adb/sysdeps.h | 4 ++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/adb/adb_client.h b/adb/adb_client.h index 112c13a4e..a9df4d7a6 100644 --- a/adb/adb_client.h +++ b/adb/adb_client.h @@ -24,8 +24,8 @@ // Connect to adb, connect to the named service, and return a valid fd for // interacting with that service upon success or a negative number on failure. -int adb_connect(const std::string& service, std::string* error); -int _adb_connect(const std::string& service, std::string* error); +int adb_connect(const std::string& service, std::string* _Nonnull error); +int _adb_connect(const std::string& service, std::string* _Nonnull error); // Connect to adb, connect to the named service, returns true if the connection // succeeded AND the service returned OKAY. Outputs any returned error otherwise. @@ -33,30 +33,33 @@ bool adb_command(const std::string& service); // Connects to the named adb service and fills 'result' with the response. // Returns true on success; returns false and fills 'error' on failure. -bool adb_query(const std::string& service, std::string* result, std::string* error); +bool adb_query(const std::string& service, std::string* _Nonnull result, + std::string* _Nonnull error); // Set the preferred transport to connect to. -void adb_set_transport(TransportType type, const char* serial); +void adb_set_transport(TransportType type, const char* _Nullable serial); // Set TCP specifics of the transport to use. void adb_set_tcp_specifics(int server_port); // Set TCP Hostname of the transport to use. -void adb_set_tcp_name(const char* hostname); +void adb_set_tcp_name(const char* _Nullable hostname); // Send commands to the current emulator instance. Will fail if there is not // exactly one emulator connected (or if you use -s with a // that does not designate an emulator). -int adb_send_emulator_command(int argc, const char** argv, const char* serial); +int adb_send_emulator_command(int argc, const char* _Nonnull* _Nonnull argv, + const char* _Nullable serial); // Reads a standard adb status response (OKAY|FAIL) and returns true in the // event of OKAY, false in the event of FAIL or protocol error. -bool adb_status(int fd, std::string* error); +bool adb_status(int fd, std::string* _Nonnull error); // Create a host command corresponding to selected transport type/serial. -std::string format_host_command(const char* command, TransportType type, const char* serial); +std::string format_host_command(const char* _Nonnull command, TransportType type, + const char* _Nullable serial); // Get the feature set of the current preferred transport. -bool adb_get_feature_set(FeatureSet* feature_set, std::string* error); +bool adb_get_feature_set(FeatureSet* _Nonnull feature_set, std::string* _Nonnull error); #endif diff --git a/adb/sysdeps.h b/adb/sysdeps.h index 2190c61f7..a39775efc 100644 --- a/adb/sysdeps.h +++ b/adb/sysdeps.h @@ -61,6 +61,10 @@ #ifdef _WIN32 +// Clang-only nullability specifiers +#define _Nonnull +#define _Nullable + #include #include #include