diff --git a/adb/adb.cpp b/adb/adb.cpp index ad85184f6..b09e85314 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -838,10 +838,10 @@ int handle_forward_request(const char* service, transport_type ttype, char* seri } } - const char* err; - transport = acquire_one_transport(CS_ANY, ttype, serial, &err); + std::string error_msg; + transport = acquire_one_transport(CS_ANY, ttype, serial, &error_msg); if (!transport) { - sendfailmsg(reply_fd, err); + sendfailmsg(reply_fd, error_msg.c_str()); return 1; } @@ -910,14 +910,14 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r serial = service; } - const char* error_string = "unknown failure"; - transport = acquire_one_transport(CS_ANY, type, serial, &error_string); + std::string error_msg = "unknown failure"; + transport = acquire_one_transport(CS_ANY, type, serial, &error_msg); if (transport) { s->transport = transport; adb_write(reply_fd, "OKAY", 4); } else { - sendfailmsg(reply_fd, error_string); + sendfailmsg(reply_fd, error_msg.c_str()); } return 1; } @@ -975,7 +975,7 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r if(!strncmp(service,"get-serialno",strlen("get-serialno"))) { const char *out = "unknown"; transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); - if (transport && transport->serial) { + if (transport && transport->serial) { out = transport->serial; } send_msg_with_okay(reply_fd, out, strlen(out)); @@ -984,7 +984,7 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r if(!strncmp(service,"get-devpath",strlen("get-devpath"))) { const char *out = "unknown"; transport = acquire_one_transport(CS_ANY, ttype, serial, NULL); - if (transport && transport->devpath) { + if (transport && transport->devpath) { out = transport->devpath; } send_msg_with_okay(reply_fd, out, strlen(out)); diff --git a/adb/services.cpp b/adb/services.cpp index 12eb406ff..e58100f92 100644 --- a/adb/services.cpp +++ b/adb/services.cpp @@ -559,12 +559,12 @@ static void wait_for_state(int fd, void* cookie) D("wait_for_state %d\n", sinfo->state); - const char* err = "unknown error"; - atransport *t = acquire_one_transport(sinfo->state, sinfo->transport, sinfo->serial, &err); - if(t != 0) { + std::string error_msg = "unknown error"; + atransport* t = acquire_one_transport(sinfo->state, sinfo->transport, sinfo->serial, &error_msg); + if (t != 0) { WriteFdExactly(fd, "OKAY", 4); } else { - sendfailmsg(fd, err); + sendfailmsg(fd, error_msg.c_str()); } if (sinfo->serial) diff --git a/adb/sockets.cpp b/adb/sockets.cpp index 48d02d6c2..e52d6b186 100644 --- a/adb/sockets.cpp +++ b/adb/sockets.cpp @@ -827,12 +827,11 @@ static int smart_socket_enqueue(asocket *s, apacket *p) } #else /* !ADB_HOST */ if (s->transport == NULL) { - const char* error_string = "unknown failure"; - s->transport = acquire_one_transport (CS_ANY, - kTransportAny, NULL, &error_string); + std::string error_msg = "unknown failure"; + s->transport = acquire_one_transport(CS_ANY, kTransportAny, NULL, &error_msg); if (s->transport == NULL) { - sendfailmsg(s->peer->fd, error_string); + sendfailmsg(s->peer->fd, error_msg.c_str()); goto fail; } } diff --git a/adb/transport.cpp b/adb/transport.cpp index 4b9eeeb7b..f3e646110 100644 --- a/adb/transport.cpp +++ b/adb/transport.cpp @@ -800,22 +800,20 @@ static int qual_match(const char *to_test, return !*to_test; } -atransport *acquire_one_transport(int state, transport_type ttype, - const char* serial, const char** error_out) +atransport* acquire_one_transport(int state, transport_type ttype, + const char* serial, std::string* error_out) { atransport *t; atransport *result = NULL; int ambiguous = 0; retry: - if (error_out) - *error_out = "device not found"; + if (error_out) *error_out = "device not found"; adb_mutex_lock(&transport_lock); for (t = transport_list.next; t != &transport_list; t = t->next) { if (t->connection_state == CS_NOPERM) { - if (error_out) - *error_out = "insufficient permissions for device"; + if (error_out) *error_out = "insufficient permissions for device"; continue; } @@ -827,8 +825,7 @@ retry: qual_match(serial, "model:", t->model, true) || qual_match(serial, "device:", t->device, false)) { if (result) { - if (error_out) - *error_out = "more than one device"; + if (error_out) *error_out = "more than one device"; ambiguous = 1; result = NULL; break; @@ -838,8 +835,7 @@ retry: } else { if (ttype == kTransportUsb && t->type == kTransportUsb) { if (result) { - if (error_out) - *error_out = "more than one device"; + if (error_out) *error_out = "more than one device"; ambiguous = 1; result = NULL; break; @@ -847,8 +843,7 @@ retry: result = t; } else if (ttype == kTransportLocal && t->type == kTransportLocal) { if (result) { - if (error_out) - *error_out = "more than one emulator"; + if (error_out) *error_out = "more than one emulator"; ambiguous = 1; result = NULL; break; @@ -856,8 +851,7 @@ retry: result = t; } else if (ttype == kTransportAny) { if (result) { - if (error_out) - *error_out = "more than one device and emulator"; + if (error_out) *error_out = "more than one device and emulator"; ambiguous = 1; result = NULL; break; @@ -870,29 +864,33 @@ retry: if (result) { if (result->connection_state == CS_UNAUTHORIZED) { - if (error_out) - *error_out = "device unauthorized. Please check the confirmation dialog on your device."; + if (error_out) { + *error_out = "device unauthorized.\n"; + char* ADB_VENDOR_KEYS = getenv("ADB_VENDOR_KEYS"); + *error_out += "This adbd's $ADB_VENDOR_KEYS is "; + *error_out += ADB_VENDOR_KEYS ? ADB_VENDOR_KEYS : "not set"; + *error_out += "; try 'adb kill-server' if that seems wrong.\n"; + *error_out += "Otherwise check for a confirmation dialog on your device."; + } result = NULL; } - /* offline devices are ignored -- they are either being born or dying */ + /* offline devices are ignored -- they are either being born or dying */ if (result && result->connection_state == CS_OFFLINE) { - if (error_out) - *error_out = "device offline"; + if (error_out) *error_out = "device offline"; result = NULL; } - /* check for required connection state */ + + /* check for required connection state */ if (result && state != CS_ANY && result->connection_state != state) { - if (error_out) - *error_out = "invalid device state"; + if (error_out) *error_out = "invalid device state"; result = NULL; } } if (result) { /* found one that we can take */ - if (error_out) - *error_out = NULL; + if (error_out) *error_out = "success"; } else if (state != CS_ANY && (serial || !ambiguous)) { adb_sleep_ms(1000); goto retry; diff --git a/adb/transport.h b/adb/transport.h index 36a0e4019..a2077e8d1 100644 --- a/adb/transport.h +++ b/adb/transport.h @@ -17,14 +17,11 @@ #ifndef __TRANSPORT_H #define __TRANSPORT_H -#include #include -#include "adb.h" +#include -#ifdef __cplusplus -extern "C" { -#endif +#include "adb.h" #if ADB_TRACE void dump_hex(const unsigned char* ptr, size_t len); @@ -37,7 +34,7 @@ void dump_hex(const unsigned char* ptr, size_t len); * If no suitable transport is found, error is set. */ atransport* acquire_one_transport(int state, transport_type ttype, - const char* serial, const char** error_out); + const char* serial, std::string* error_out); void add_transport_disconnect(atransport* t, adisconnect* dis); void remove_transport_disconnect(atransport* t, adisconnect* dis); void kick_transport(atransport* t); @@ -74,8 +71,4 @@ void send_packet(apacket* p, atransport* t); asocket* create_device_tracker(void); -#ifdef __cplusplus -} -#endif - #endif /* __TRANSPORT_H */