aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikael Kanstrup <mikael.kanstrup@gmail.com>2017-06-30 12:41:08 +0200
committerMichael Mann <mmann78@netscape.net>2017-07-07 23:17:58 +0000
commit9830b7b2610174d7199fd79932909cc960d2f90f (patch)
tree511fea3977354faddce2e90de0781a16366cf0d3
parent7bacf534d8ad78e9c7506ff276cbe07303f62162 (diff)
androiddump: Reduce code duplication
Some more repeated code patterns identified. Reduce code duplication by adding some helper functions. Change-Id: I0fecd511fd56049e9eae111cdad08252dffff6cb Reviewed-on: https://code.wireshark.org/review/22480 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
-rw-r--r--extcap/androiddump.c181
1 files changed, 78 insertions, 103 deletions
diff --git a/extcap/androiddump.c b/extcap/androiddump.c
index 9407b38e6f..00b3743807 100644
--- a/extcap/androiddump.c
+++ b/extcap/androiddump.c
@@ -269,6 +269,68 @@ static inline int is_specified_interface(char *interface, const char *interface_
return !strncmp(interface, interface_prefix, strlen(interface_prefix));
}
+static gboolean is_logcat_interface(char *interface) {
+ return is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS);
+}
+
+static gboolean is_logcat_text_interface(char *interface) {
+ return is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) ||
+ is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_CRASH);
+}
+
+static char* get_serial_from_interface(char *interface)
+{
+ static const char* const iface_prefix[] = {
+ INTERFACE_ANDROID_LOGCAT_MAIN,
+ INTERFACE_ANDROID_LOGCAT_SYSTEM,
+ INTERFACE_ANDROID_LOGCAT_RADIO,
+ INTERFACE_ANDROID_LOGCAT_EVENTS,
+ INTERFACE_ANDROID_LOGCAT_TEXT_MAIN,
+ INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM,
+ INTERFACE_ANDROID_LOGCAT_TEXT_RADIO,
+ INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS,
+ INTERFACE_ANDROID_LOGCAT_TEXT_CRASH,
+ INTERFACE_ANDROID_BLUETOOTH_HCIDUMP,
+ INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER,
+ INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET,
+ NULL
+ };
+ int i;
+ const char* curr = NULL;
+ for (i = 0; (curr = iface_prefix[i]); i++) {
+ if (is_specified_interface(interface, curr) &&
+ strlen(interface) > strlen(curr) + 1) {
+ return interface + strlen(curr) + 1;
+ }
+ }
+ return NULL;
+}
+
+static const char* interface_to_logbuf(char* interface)
+{
+ const char *const adb_log_main = "log:main";
+ const char *const adb_log_system = "log:system";
+ const char *const adb_log_radio = "log:radio";
+ const char *const adb_log_events = "log:events";
+ const char *logbuf = NULL;
+
+ if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN))
+ logbuf = adb_log_main;
+ else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM))
+ logbuf = adb_log_system;
+ else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO))
+ logbuf = adb_log_radio;
+ else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS))
+ logbuf = adb_log_events;
+ return logbuf;
+}
+
/*
* General errors and warnings are reported through g_warning() in
* androiddump.
@@ -830,15 +892,7 @@ static void new_interface(extcap_parameters * extcap_conf, const gchar *interfac
is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET)) {
extcap_base_register_interface_ext(extcap_conf, interface, ifdisplay, 99, "BluetoothH4", "Bluetooth HCI UART transport layer plus pseudo-header" );
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_CRASH)) {
+ } else if (is_logcat_interface(interface) || is_logcat_text_interface(interface)) {
extcap_base_register_interface(extcap_conf, interface, ifdisplay, 252, "Upper PDU" );
} else if (is_specified_interface(interface, INTERFACE_ANDROID_TCPDUMP)) {
extcap_base_register_interface(extcap_conf, interface, ifdisplay, 1, "Ethernet");
@@ -1206,10 +1260,7 @@ static int list_config(char *interface) {
"arg {number=1}{call=--adb-server-tcp-port}{display=ADB Server TCP Port}{type=integer}{range=0,65535}{default=5037}\n"
"arg {number=2}{call=--verbose}{display=Verbose/Debug output on console}{type=boolean}{default=false}\n");
return EXIT_CODE_SUCCESS;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS)) {
+ } else if (is_logcat_interface(interface)) {
printf("arg {number=0}{call=--adb-server-ip}{display=ADB Server IP Address}{type=string}{default=127.0.0.1}\n"
"arg {number=1}{call=--adb-server-tcp-port}{display=ADB Server TCP Port}{type=integer}{range=0,65535}{default=5037}\n"
"arg {number=2}{call=--logcat-text}{display=Use text logcat}{type=boolean}{default=false}\n"
@@ -1217,11 +1268,7 @@ static int list_config(char *interface) {
"arg {number=4}{call=--logcat-custom-options}{display=Custom logcat parameters}{type=string}\n"
"arg {number=5}{call=--verbose}{display=Verbose/Debug output on console}{type=boolean}{default=false}\n");
return EXIT_CODE_SUCCESS;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) ||
- is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_CRASH)) {
+ } else if (is_logcat_text_interface(interface)) {
printf("arg {number=0}{call=--adb-server-ip}{display=ADB Server IP Address}{type=string}{default=127.0.0.1}\n"
"arg {number=1}{call=--adb-server-tcp-port}{display=ADB Server TCP Port}{type=integer}{range=0,65535}{default=5037}\n"
"arg {number=2}{call=--logcat-ignore-log-buffer}{display=Ignore log buffer}{type=boolean}{default=false}\n"
@@ -1249,7 +1296,7 @@ static int capture_android_bluetooth_hcidump(char *interface, char *fifo,
const char *adb_shell_hcidump = "shell:hcidump -R -t";
const char *adb_shell_su_hcidump = "shell:su -c hcidump -R -t";
int result;
- char *serial_number = NULL;
+ char *serial_number;
time_t ts = 0;
unsigned int captured_length;
gint64 hex;
@@ -1266,11 +1313,7 @@ static int capture_android_bluetooth_hcidump(char *interface, char *fifo,
extcap_dumper = extcap_dumper_open(fifo, EXTCAP_ENCAP_BLUETOOTH_H4_WITH_PHDR);
- if (is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_HCIDUMP) &&
- strlen(interface) > strlen(INTERFACE_ANDROID_BLUETOOTH_HCIDUMP) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_BLUETOOTH_HCIDUMP) + 1;
- }
-
+ serial_number = get_serial_from_interface(interface);
sock = adb_connect_transport(adb_server_ip, adb_server_tcp_port, serial_number);
if (sock == INVALID_SOCKET)
return EXIT_CODE_INVALID_SOCKET_3;
@@ -1605,7 +1648,7 @@ static int capture_android_bluetooth_external_parser(char *interface,
socket_handle_t sock;
struct sockaddr_in server;
int captured_length;
- char *serial_number = NULL;
+ char *serial_number;
static unsigned int id = 1;
struct sockaddr_in client;
@@ -1613,11 +1656,7 @@ static int capture_android_bluetooth_external_parser(char *interface,
SET_DATA(h4_header, value_own_pcap_bluetooth_h4_header, packet);
extcap_dumper = extcap_dumper_open(fifo, EXTCAP_ENCAP_BLUETOOTH_H4_WITH_PHDR);
-
- if (is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER) &&
- strlen(interface) > strlen(INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER) + 1;
- }
+ serial_number = get_serial_from_interface(interface);
if (bt_forward_socket) {
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
@@ -1830,7 +1869,7 @@ static int capture_android_bluetooth_btsnoop_net(char *interface, char *fifo,
socket_handle_t sock;
const char *adb_tcp_btsnoop_net = "tcp:8872";
int result;
- char *serial_number = NULL;
+ char *serial_number;
uint64_t ts;
static const uint64_t BTSNOOP_TIMESTAMP_BASE = G_GUINT64_CONSTANT(0x00dcddb30f2f8000);
uint32_t *reported_length;
@@ -1849,12 +1888,7 @@ static int capture_android_bluetooth_btsnoop_net(char *interface, char *fifo,
SET_DATA(h4_header, value_own_pcap_bluetooth_h4_header, payload - sizeof(own_pcap_bluetooth_h4_header));
extcap_dumper = extcap_dumper_open(fifo, EXTCAP_ENCAP_BLUETOOTH_H4_WITH_PHDR);
-
- if (is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET) &&
- strlen(interface) > strlen(INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET) + 1;
- }
-
+ serial_number = get_serial_from_interface(interface);
sock = adb_connect_transport(adb_server_ip, adb_server_tcp_port, serial_number);
if (sock == INVALID_SOCKET)
return EXIT_CODE_INVALID_SOCKET_7;
@@ -1945,6 +1979,7 @@ static int capture_android_bluetooth_btsnoop_net(char *interface, char *fifo,
/* Android Logcat Text*/
/*----------------------------------------------------------------------------*/
+
static int capture_android_logcat_text(char *interface, char *fifo,
const char *adb_server_ip, unsigned short *adb_server_tcp_port,
int logcat_ignore_log_buffer, const char *logcat_custom_parameter) {
@@ -1971,26 +2006,7 @@ static int capture_android_logcat_text(char *interface, char *fifo,
exported_pdu_header_protocol_normal.tag = GUINT16_TO_BE(WIRESHARK_UPPER_PDU_TAG_DISSECTOR_NAME);
exported_pdu_header_protocol_normal.length = GUINT16_TO_BE(strlen(wireshark_protocol_logcat_text) + 2);
- if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_MAIN) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_MAIN) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_SYSTEM) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_SYSTEM) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_RADIO) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_RADIO) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_EVENTS) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_EVENTS) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_TEXT_CRASH) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_TEXT_CRASH) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_TEXT_CRASH) + 1;
- }
-
+ serial_number = get_serial_from_interface(interface);
sock = adb_connect_transport(adb_server_ip, adb_server_tcp_port, serial_number);
if (sock == INVALID_SOCKET)
return EXIT_CODE_INVALID_SOCKET_8;
@@ -2126,10 +2142,6 @@ static int capture_android_logcat(char *interface, char *fifo,
struct exported_pdu_header exported_pdu_header_end = {0, 0};
static const char *wireshark_protocol_logcat = "logcat";
static const char *wireshark_protocol_logcat_events = "logcat_events";
- const char *adb_log_main = "log:main";
- const char *adb_log_system = "log:system";
- const char *adb_log_radio = "log:radio";
- const char *adb_log_events = "log:events";
const char *adb_command;
uint16_t *payload_length;
uint16_t *try_header_size;
@@ -2147,29 +2159,13 @@ static int capture_android_logcat(char *interface, char *fifo,
exported_pdu_header_protocol_normal.tag = GUINT16_TO_BE(WIRESHARK_UPPER_PDU_TAG_DISSECTOR_NAME);
exported_pdu_header_protocol_normal.length = GUINT16_TO_BE(strlen(wireshark_protocol_logcat) + 2);
- if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_MAIN) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_MAIN) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_SYSTEM) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_SYSTEM) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_RADIO) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_RADIO) + 1;
- } else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS) && strlen(interface) > strlen(INTERFACE_ANDROID_LOGCAT_EVENTS) + 1) {
- serial_number = interface + strlen(INTERFACE_ANDROID_LOGCAT_EVENTS) + 1;
- }
-
+ serial_number = get_serial_from_interface(interface);
sock = adb_connect_transport(adb_server_ip, adb_server_tcp_port, serial_number);
if (sock == INVALID_SOCKET)
return EXIT_CODE_INVALID_SOCKET_9;
- if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN))
- adb_command = adb_log_main;
- else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM))
- adb_command = adb_log_system;
- else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO))
- adb_command = adb_log_radio;
- else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS))
- adb_command = adb_log_events;
- else {
+ adb_command = interface_to_logbuf(interface);
+ if (!adb_command) {
g_warning("Unknown interface: <%s>", interface);
closesocket(sock);
return EXIT_CODE_GENERIC;
@@ -2234,20 +2230,6 @@ static int capture_android_logcat(char *interface, char *fifo,
if (sock == INVALID_SOCKET)
return EXIT_CODE_INVALID_SOCKET_10;
- if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_MAIN))
- adb_command = adb_log_main;
- else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_SYSTEM))
- adb_command = adb_log_system;
- else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_RADIO))
- adb_command = adb_log_radio;
- else if (is_specified_interface(interface, INTERFACE_ANDROID_LOGCAT_EVENTS))
- adb_command = adb_log_events;
- else {
- g_warning("Unknown interface: <%s>", interface);
- closesocket(sock);
- return EXIT_CODE_GENERIC;
- }
-
result = adb_send(sock, adb_command);
if (result) {
g_warning("WARNIG: Error while sending command <%s>", adb_command);
@@ -2783,10 +2765,7 @@ int main(int argc, char **argv) {
}
if (extcap_conf->capture) {
- if (extcap_conf->interface && (is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_MAIN) ||
- is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_SYSTEM) ||
- is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_RADIO) ||
- is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_EVENTS)))
+ if (extcap_conf->interface && is_logcat_interface(extcap_conf->interface))
if (logcat_text)
ret = capture_android_logcat_text(extcap_conf->interface,
extcap_conf->fifo, adb_server_ip, adb_server_tcp_port,
@@ -2794,11 +2773,7 @@ int main(int argc, char **argv) {
else
ret = capture_android_logcat(extcap_conf->interface,
extcap_conf->fifo, adb_server_ip, adb_server_tcp_port);
- else if (extcap_conf->interface && (is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_TEXT_MAIN) ||
- is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM) ||
- is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_TEXT_RADIO) ||
- is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS) ||
- (is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_LOGCAT_TEXT_CRASH))))
+ else if (extcap_conf->interface && is_logcat_text_interface(extcap_conf->interface))
ret = capture_android_logcat_text(extcap_conf->interface,
extcap_conf->fifo, adb_server_ip, adb_server_tcp_port,
logcat_ignore_log_buffer, logcat_custom_parameter);