diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | extcap/androiddump.c | 201 | ||||
-rw-r--r-- | extcap/extcap-base.c | 191 | ||||
-rw-r--r-- | extcap/extcap-base.h | 65 | ||||
-rw-r--r-- | extcap/randpktdump.c | 113 | ||||
-rw-r--r-- | extcap/sshdump.c | 123 |
6 files changed, 375 insertions, 320 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index dca9ee746f..11744f5d9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2409,8 +2409,8 @@ if(BUILD_randpktdump) ${CMAKE_DL_LIBS} ) set(randpktdump_FILES - extcap/randpktdump.c extcap/extcap-base.c + extcap/randpktdump.c ) add_executable(randpktdump WIN32 ${randpktdump_FILES}) diff --git a/extcap/androiddump.c b/extcap/androiddump.c index a862c9ec76..f9083a3128 100644 --- a/extcap/androiddump.c +++ b/extcap/androiddump.c @@ -95,9 +95,9 @@ #define INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET "android-bluetooth-btsnoop-net" #define INTERFACE_ANDROID_WIFI_TCPDUMP "android-wifi-tcpdump" -#define ANDROIDDUMP_VERSION_MAJOR 1U -#define ANDROIDDUMP_VERSION_MINOR 0U -#define ANDROIDDUMP_VERSION_RELEASE 1U +#define ANDROIDDUMP_VERSION_MAJOR "1" +#define ANDROIDDUMP_VERSION_MINOR "0" +#define ANDROIDDUMP_VERSION_RELEASE "1" #define SERIAL_NUMER_LENGTH_MAX 512 @@ -505,15 +505,34 @@ static int adb_send(socket_handle_t sock, const char *adb_service) { return 0; } -static void new_interface(const gchar *interface_id, +static void new_interface(extcap_parameters * extcap_conf, const gchar *interface_id, const gchar *serial_number, const gchar *display_name) { - printf("interface {display=%s %s}{value=%s-%s}\n", - display_name, serial_number, interface_id, serial_number); + char * interface = g_strdup_printf("%s-%s", interface_id, serial_number); + char * ifdisplay = g_strdup_printf("%s %s", display_name, serial_number); + + if (is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_HCIDUMP) || + is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER) || + 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)) { + extcap_base_register_interface(extcap_conf, interface, ifdisplay, 252, "Upper PDU" ); + } else if (is_specified_interface(interface, INTERFACE_ANDROID_WIFI_TCPDUMP)) { + extcap_base_register_interface(extcap_conf, interface, ifdisplay, 1, "Ethernet"); + } } -static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server_tcp_port) { +static int register_interfaces(extcap_parameters * extcap_conf, const char *adb_server_ip, unsigned short *adb_server_tcp_port) { static char packet[PACKET_LENGTH]; static char helpful_packet[PACKET_LENGTH]; char *response; @@ -537,9 +556,6 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server int api_level; int disable_interface; - /* This is done here, so that androiddump get's listed in the about dialog */ - printf ( "extcap {version=%u.%u.%u}\n", ANDROIDDUMP_VERSION_MAJOR, ANDROIDDUMP_VERSION_MINOR, ANDROIDDUMP_VERSION_RELEASE ); - /* NOTE: It seems that "adb devices" and "adb shell" closed connection so cannot send next command after them, there is need to reconnect */ @@ -584,7 +600,7 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server /* If tcpdump is found in the android device, add Android Wifi Tcpdump as an interface */ if (strstr(response,"tcpdump version")) { - new_interface(INTERFACE_ANDROID_WIFI_TCPDUMP, serial_number, "Android WiFi"); + new_interface(extcap_conf, INTERFACE_ANDROID_WIFI_TCPDUMP, serial_number, "Android WiFi"); } sock = adb_connect(adb_server_ip, adb_server_tcp_port); @@ -606,16 +622,16 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server errmsg_print("VERBOSE: Android API Level for %s is %i", serial_number, api_level); if (api_level < 21) { - new_interface(INTERFACE_ANDROID_LOGCAT_MAIN, serial_number, "Android Logcat Main"); - new_interface(INTERFACE_ANDROID_LOGCAT_SYSTEM, serial_number, "Android Logcat System"); - new_interface(INTERFACE_ANDROID_LOGCAT_RADIO, serial_number, "Android Logcat Radio"); - new_interface(INTERFACE_ANDROID_LOGCAT_EVENTS, serial_number, "Android Logcat Events"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_MAIN, serial_number, "Android Logcat Main"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_SYSTEM, serial_number, "Android Logcat System"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_RADIO, serial_number, "Android Logcat Radio"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_EVENTS, serial_number, "Android Logcat Events"); } else { - new_interface(INTERFACE_ANDROID_LOGCAT_TEXT_MAIN, serial_number, "Android Logcat Main"); - new_interface(INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM, serial_number, "Android Logcat System"); - new_interface(INTERFACE_ANDROID_LOGCAT_TEXT_RADIO, serial_number, "Android Logcat Radio"); - new_interface(INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS, serial_number, "Android Logcat Events"); - new_interface(INTERFACE_ANDROID_LOGCAT_TEXT_CRASH, serial_number, "Android Logcat Crash"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_TEXT_MAIN, serial_number, "Android Logcat Main"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_TEXT_SYSTEM, serial_number, "Android Logcat System"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_TEXT_RADIO, serial_number, "Android Logcat Radio"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_TEXT_EVENTS, serial_number, "Android Logcat Events"); + new_interface(extcap_conf, INTERFACE_ANDROID_LOGCAT_TEXT_CRASH, serial_number, "Android Logcat Crash"); } if (api_level >= 5 && api_level < 17) { @@ -651,7 +667,7 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server } if (!disable_interface) { - new_interface(INTERFACE_ANDROID_BLUETOOTH_HCIDUMP, serial_number, "Android Bluetooth Hcidump"); + new_interface(extcap_conf, INTERFACE_ANDROID_BLUETOOTH_HCIDUMP, serial_number, "Android Bluetooth Hcidump"); } } @@ -717,7 +733,7 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server } if (!disable_interface) { - new_interface(INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER, serial_number, "Android Bluetooth External Parser"); + new_interface(extcap_conf, INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER, serial_number, "Android Bluetooth External Parser"); } } @@ -786,7 +802,7 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server } if (!disable_interface) { - new_interface(INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET, serial_number, "Android Bluetooth Btsnoop Net"); + new_interface(extcap_conf, INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET, serial_number, "Android Bluetooth Btsnoop Net"); } } } @@ -794,38 +810,6 @@ static int list_interfaces(const char *adb_server_ip, unsigned short *adb_server return 0; } -static int list_dlts(char *interface) { - if (!interface) { - errmsg_print("ERROR: No interface specified."); - return 1; - } - - if (is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_HCIDUMP) || - is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER) || - is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET)) { - printf("dlt {number=99}{name=BluetoothH4}{display=Bluetooth HCI UART transport layer plus pseudo-header}\n"); - return 0; - } 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)) { - printf("dlt {number=252}{name=Upper PDU}{display=Upper PDU}\n"); - return 0; - } else if (is_specified_interface(interface, INTERFACE_ANDROID_WIFI_TCPDUMP)) { - printf("dlt {number=1}{name=Ethernet}{display=Ethernet}\n"); - return 0; - } - - errmsg_print("ERROR: Invalid interface: <%s>", interface); - return 1; -} - - static int list_config(char *interface) { if (!interface) { errmsg_print("ERROR: No interface specified."); @@ -1984,6 +1968,7 @@ static int capture_android_logcat(char *interface, char *fifo, } closesocket(sock); + return 0; } @@ -2194,13 +2179,7 @@ static int capture_android_wifi_tcpdump(char *interface, char *fifo, int main(int argc, char **argv) { int option_idx = 0; - int do_capture = 0; - int do_config = 0; - int do_list_interfaces = 0; - int do_dlts = 0; int result; - char *fifo = NULL; - char *interface = NULL; const char *adb_server_ip = NULL; unsigned short *adb_server_tcp_port = NULL; unsigned int logcat_text = 0; @@ -2216,6 +2195,8 @@ int main(int argc, char **argv) { unsigned short default_bt_server_tcp_port = 4330; const char *default_bt_local_ip = "127.0.0.1"; unsigned short default_bt_local_tcp_port = 4330; + extcap_parameters * extcap_conf = NULL; + #ifdef _WIN32 WSADATA wsaData; @@ -2229,12 +2210,18 @@ int main(int argc, char **argv) { help(); return 0; } + extcap_conf = g_new0(extcap_parameters, 1); + + extcap_base_set_util_info(extcap_conf,ANDROIDDUMP_VERSION_MAJOR, ANDROIDDUMP_VERSION_MINOR, ANDROIDDUMP_VERSION_RELEASE, NULL); + + /* For extcap, no other ports can be configured anyway */ + register_interfaces(extcap_conf, default_adb_server_ip, &default_adb_server_tcp_port); while ((result = getopt_long(argc, argv, "", longopts, &option_idx)) != -1) { switch (result) { case OPT_VERSION: - printf("%u.%u.%u\n", ANDROIDDUMP_VERSION_MAJOR, ANDROIDDUMP_VERSION_MINOR, ANDROIDDUMP_VERSION_RELEASE); + printf("%s.%s.%s\n", ANDROIDDUMP_VERSION_MAJOR, ANDROIDDUMP_VERSION_MINOR, ANDROIDDUMP_VERSION_RELEASE); return 0; case OPT_VERBOSE: if (optarg) @@ -2253,27 +2240,6 @@ int main(int argc, char **argv) { verbose_print("\n"); } break; - case OPT_LIST_INTERFACES: - do_list_interfaces = 1; - break; - case OPT_LIST_DLTS: - do_dlts = 1; - break; - case OPT_INTERFACE: - interface = optarg; - break; - case OPT_CONFIG: - do_config = 1; - break; - case OPT_CAPTURE: - do_capture = 1; - break; - case OPT_CAPTURE_FILTER: - /* currently unused */ - break; - case OPT_FIFO: - fifo = optarg; - break; case OPT_HELP: help(); return 0; @@ -2314,8 +2280,11 @@ int main(int argc, char **argv) { *bt_local_tcp_port = (unsigned short) g_ascii_strtoull(optarg, NULL, 10); break; default: - printf("Invalid argument <%s>. Try --help.\n", argv[optind - 1]); - return -1; + if (!extcap_base_parse_options(extcap_conf, result - EXTCAP_OPT_LIST_INTERFACES, optarg)) + { + printf("Invalid argument <%s>. Try --help.\n", argv[optind - 1]); + return -1; + } } } @@ -2334,12 +2303,6 @@ int main(int argc, char **argv) { if (!bt_local_tcp_port) bt_local_tcp_port = &default_bt_local_tcp_port; - if (do_config) - return list_config(interface); - - if (do_dlts) - return list_dlts(interface); - #ifdef _WIN32 result = WSAStartup(MAKEWORD(1,1), &wsaData); if (result != 0) { @@ -2348,45 +2311,43 @@ int main(int argc, char **argv) { } #endif /* _WIN32 */ - if (do_list_interfaces) - { - list_interfaces(adb_server_ip, adb_server_tcp_port); + if (extcap_base_handle_interface(extcap_conf)) return 0; - } - if (fifo == NULL) { - errmsg_print("ERROR: No FIFO or file specified"); - return 1; - } + if (extcap_conf->show_config) + return list_config(extcap_conf->interface); - if (do_capture) { - if (interface && (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))) + 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 (logcat_text) - return capture_android_logcat_text(interface, fifo, adb_server_ip, adb_server_tcp_port); + return capture_android_logcat_text(extcap_conf->interface, extcap_conf->fifo, adb_server_ip, adb_server_tcp_port); else - return capture_android_logcat(interface, fifo, adb_server_ip, adb_server_tcp_port); - else if (interface && (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)))) - return capture_android_logcat_text(interface, fifo, adb_server_ip, adb_server_tcp_port); - else if (interface && is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_HCIDUMP)) - return capture_android_bluetooth_hcidump(interface, fifo, adb_server_ip, adb_server_tcp_port); - else if (interface && is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_EXTERNAL_PARSER)) - return capture_android_bluetooth_external_parser(interface, fifo, adb_server_ip, adb_server_tcp_port, + return 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)))) + return capture_android_logcat_text(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_BLUETOOTH_HCIDUMP)) + return capture_android_bluetooth_hcidump(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_BLUETOOTH_EXTERNAL_PARSER)) + return capture_android_bluetooth_external_parser(extcap_conf->interface, extcap_conf->fifo, adb_server_ip, adb_server_tcp_port, bt_server_tcp_port, bt_forward_socket, bt_local_ip, bt_local_tcp_port); - else if (interface && (is_specified_interface(interface, INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET))) - return capture_android_bluetooth_btsnoop_net(interface, fifo, adb_server_ip, adb_server_tcp_port); - else if (interface && (is_specified_interface(interface,INTERFACE_ANDROID_WIFI_TCPDUMP))) - return capture_android_wifi_tcpdump(interface, fifo, adb_server_ip,adb_server_tcp_port); + else if (extcap_conf->interface && (is_specified_interface(extcap_conf->interface, INTERFACE_ANDROID_BLUETOOTH_BTSNOOP_NET))) + return capture_android_bluetooth_btsnoop_net(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_WIFI_TCPDUMP))) + return capture_android_wifi_tcpdump(extcap_conf->interface, extcap_conf->fifo, adb_server_ip,adb_server_tcp_port); else return 2; } + /* clean up stuff */ + extcap_base_cleanup(&extcap_conf); + return 0; } diff --git a/extcap/extcap-base.c b/extcap/extcap-base.c index 51d2061469..e449b085e5 100644 --- a/extcap/extcap-base.c +++ b/extcap/extcap-base.c @@ -22,8 +22,36 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" + #include "extcap-base.h" +#include <stdlib.h> +#include <stdint.h> +#include <string.h> + +#ifdef HAVE_GETOPT_H + #include <getopt.h> +#endif + +#ifndef HAVE_GETOPT_LONG + #include "wsutil/wsgetopt.h" +#endif + +enum extcap_options { + EXTCAP_BASE_OPTIONS_ENUM +}; + +typedef struct _extcap_interface +{ + char * interface; + char * description; + + uint16_t dlt; + char * dltname; + char * dltdescription; +} extcap_interface; + #ifdef _WIN32 BOOLEAN IsHandleRedirected(DWORD handle) { @@ -71,6 +99,169 @@ void attach_parent_console() } #endif +void extcap_base_register_interface(extcap_parameters * extcap, const char * interface, const char * ifdescription, uint16_t dlt, const char * dltdescription ) +{ + extcap_base_register_interface_ext(extcap, interface, ifdescription, dlt, NULL, dltdescription ); +} + +void extcap_base_register_interface_ext(extcap_parameters * extcap, + const char * interface, const char * ifdescription, + uint16_t dlt, const char * dltname, const char * dltdescription ) +{ + extcap_interface * iface = g_new0(extcap_interface, 1); + + if (interface == NULL) + return; + + iface->interface = g_strdup(interface); + iface->description = g_strdup(ifdescription); + iface->dlt = dlt; + iface->dltname = g_strdup(dltname); + iface->dltdescription = g_strdup(dltdescription); + + extcap->interfaces = g_list_append(extcap->interfaces, (gpointer) iface); +} + +void extcap_base_set_util_info(extcap_parameters * extcap, const char * major, const char * minor, const char * release, const char * helppage) +{ + g_assert(major); + extcap->version = g_strdup_printf("%s%s%s%s%s", + major, + minor ? "." : "", + minor ? minor : "", + release ? "." : "", + release ? release : ""); + extcap->helppage = g_strdup(helppage); +} + +uint8_t extcap_base_parse_options(extcap_parameters * extcap, int result, char * optargument ) +{ + switch (result) { + case EXTCAP_OPT_LIST_INTERFACES: + extcap->do_list_interfaces = 1; + break; + case EXTCAP_OPT_VERSION: + extcap->do_version = 1; + break; + case EXTCAP_OPT_LIST_DLTS: + extcap->do_list_dlts = 1; + break; + case EXTCAP_OPT_INTERFACE: + extcap->interface = g_strdup(optargument); + break; + case EXTCAP_OPT_CONFIG: + extcap->show_config = 1; + break; + case EXTCAP_OPT_CAPTURE: + extcap->capture = 1; + break; + case EXTCAP_OPT_CAPTURE_FILTER: + extcap->capture_filter = g_strdup(optargument); + break; + case EXTCAP_OPT_FIFO: + extcap->fifo = g_strdup(optargument); + break; + } + + return 1; +} + +static void extcap_iface_print(gpointer data, gpointer userdata _U_) +{ + extcap_interface * iface = (extcap_interface *)data; + + printf("interface {value=%s}", iface->interface); + if (iface->description != NULL) + printf ("{display=%s}\n", iface->description); + else + printf ("\n"); +} + +static gint extcap_iface_compare(gconstpointer a, gconstpointer b) +{ + extcap_interface * iface_a = (extcap_interface *)a; + + return (g_strcmp0(iface_a->interface, (char *) b)); +} + +static void extcap_print_version(extcap_parameters * extcap) +{ + printf("extcap {version=%s}", extcap->version != NULL ? extcap->version : "unknown"); + if (extcap->helppage != NULL) + printf("{help=%s}", extcap->helppage); + printf("\n"); +} + +static gint extcap_iface_listall(extcap_parameters * extcap, uint8_t list_ifs) +{ + if (list_ifs) { + extcap_print_version(extcap); + g_list_foreach(extcap->interfaces, extcap_iface_print, extcap); + } else { + if (extcap->do_version) { + extcap_print_version(extcap); + } else { + GList * element = NULL; + extcap_interface * iface = NULL; + if ((element = g_list_find_custom(extcap->interfaces, extcap->interface, extcap_iface_compare)) == NULL) + return 0; + + iface = (extcap_interface *) element->data; + printf("dlt {number=%d}{name=%s}", iface->dlt, iface->dltname != NULL ? iface->dltname : iface->interface); + if (iface->description != NULL) + printf ("{display=%s}\n", iface->dltdescription); + else + printf ("\n"); + } + } + + return 1; +} + +uint8_t extcap_base_handle_interface(extcap_parameters * extcap) +{ + /* A fifo must be provided for capture */ + if (extcap->capture && (extcap->fifo == NULL || strlen(extcap->fifo) <= 0)) { + extcap->capture = 0; + errmsg_print("Extcap Error: No FIFO pipe provided"); + return 0; + } + + if (extcap->do_list_interfaces) { + return extcap_iface_listall(extcap, 1); + } else if (extcap->do_version || extcap->do_list_dlts) { + return extcap_iface_listall(extcap, 0); + } else { + /* An interface must exist */ + if (g_list_find_custom(extcap->interfaces, extcap->interface, extcap_iface_compare) == NULL) { + errmsg_print("Extcap Error: No interface [%s] provided", extcap->interface); + return 0; + } + } + + return 0; +} + +static void extcap_iface_free(gpointer data) +{ + extcap_interface * iface = (extcap_interface *)data; + g_free(iface->interface); + g_free(iface->description); + g_free(iface->dltname); + g_free(iface->dltdescription); +} + +void extcap_base_cleanup(extcap_parameters ** extcap) +{ + g_list_free_full((*extcap)->interfaces, extcap_iface_free); + g_free((*extcap)->fifo); + g_free((*extcap)->interface); + g_free((*extcap)->version); + g_free((*extcap)->helppage); + g_free(*extcap); + *extcap = NULL; +} + /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * diff --git a/extcap/extcap-base.h b/extcap/extcap-base.h index 07617b15df..3e2f847b84 100644 --- a/extcap/extcap-base.h +++ b/extcap/extcap-base.h @@ -27,6 +27,7 @@ #include <glib.h> #include <glib/gprintf.h> #include <stdlib.h> +#include <stdint.h> #ifdef HAVE_GETOPT_H #include <getopt.h> @@ -65,31 +66,59 @@ #endif #define EXTCAP_BASE_OPTIONS_ENUM \ - OPT_LIST_INTERFACES, \ - OPT_LIST_DLTS, \ - OPT_INTERFACE, \ - OPT_CONFIG, \ - OPT_CAPTURE, \ - OPT_CAPTURE_FILTER, \ - OPT_FIFO \ + EXTCAP_OPT_LIST_INTERFACES, \ + EXTCAP_OPT_VERSION, \ + EXTCAP_OPT_LIST_DLTS, \ + EXTCAP_OPT_INTERFACE, \ + EXTCAP_OPT_CONFIG, \ + EXTCAP_OPT_CAPTURE, \ + EXTCAP_OPT_CAPTURE_FILTER, \ + EXTCAP_OPT_FIFO \ #define EXTCAP_BASE_OPTIONS \ - { "extcap-interfaces", no_argument, NULL, OPT_LIST_INTERFACES}, \ - { "extcap-dlts", no_argument, NULL, OPT_LIST_DLTS}, \ - { "extcap-interface", required_argument, NULL, OPT_INTERFACE}, \ - { "extcap-config", no_argument, NULL, OPT_CONFIG}, \ - { "capture", no_argument, NULL, OPT_CAPTURE}, \ - { "extcap-capture-filter", required_argument, NULL, OPT_CAPTURE_FILTER}, \ - { "fifo", required_argument, NULL, OPT_FIFO} \ - -#ifdef _WIN32 -BOOLEAN IsHandleRedirected(DWORD handle); -void attach_parent_console(); + { "extcap-interfaces", no_argument, NULL, EXTCAP_OPT_LIST_INTERFACES}, \ + { "extcap-version", optional_argument, NULL, EXTCAP_OPT_VERSION}, \ + { "extcap-dlts", no_argument, NULL, EXTCAP_OPT_LIST_DLTS}, \ + { "extcap-interface", required_argument, NULL, EXTCAP_OPT_INTERFACE}, \ + { "extcap-config", no_argument, NULL, EXTCAP_OPT_CONFIG}, \ + { "capture", no_argument, NULL, EXTCAP_OPT_CAPTURE}, \ + { "extcap-capture-filter", required_argument, NULL, EXTCAP_OPT_CAPTURE_FILTER}, \ + { "fifo", required_argument, NULL, EXTCAP_OPT_FIFO} \ + +#if defined(_WIN32) + BOOLEAN IsHandleRedirected(DWORD handle); + void attach_parent_console(); #endif #define errmsg_print(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); } +typedef struct _extcap_parameters +{ + char * fifo; + char * interface; + char * capture_filter; + + char * version; + char * helppage; + uint8_t capture; + uint8_t show_config; + + /* private content */ + GList * interfaces; + uint8_t do_version; + uint8_t do_list_dlts; + uint8_t do_list_interfaces; + +} extcap_parameters; + +void extcap_base_register_interface(extcap_parameters * extcap, const char * interface, const char * ifdescription, uint16_t dlt, const char * dltdescription ); +void extcap_base_register_interface_ext(extcap_parameters * extcap, const char * interface, const char * ifdescription, uint16_t dlt, const char * dltname, const char * dltdescription ); +void extcap_base_set_util_info(extcap_parameters * extcap, const char * major, const char * minor, const char * release, const char * helppage); +uint8_t extcap_base_parse_options(extcap_parameters * extcap, int result, char * optargument); +uint8_t extcap_base_handle_interface(extcap_parameters * extcap); +void extcap_base_cleanup(extcap_parameters ** extcap); + #endif /* diff --git a/extcap/randpktdump.c b/extcap/randpktdump.c index 7651b6635c..316822d532 100644 --- a/extcap/randpktdump.c +++ b/extcap/randpktdump.c @@ -29,9 +29,9 @@ #include "randpkt_core/randpkt_core.h" #define RANDPKT_EXTCAP_INTERFACE "randpkt" -#define RANDPKTDUMP_VERSION_MAJOR 0 -#define RANDPKTDUMP_VERSION_MINOR 1 -#define RANDPKTDUMP_VERSION_RELEASE 0 +#define RANDPKTDUMP_VERSION_MAJOR "0" +#define RANDPKTDUMP_VERSION_MINOR "1" +#define RANDPKTDUMP_VERSION_RELEASE "0" #define verbose_print(...) { if (verbose) printf(__VA_ARGS__); } @@ -103,13 +103,6 @@ static void help(const char* binname) } -static int list_interfaces(void) -{ - printf("extcap {version=%u.%u.%u}\n", RANDPKTDUMP_VERSION_MAJOR, RANDPKTDUMP_VERSION_MINOR, RANDPKTDUMP_VERSION_RELEASE); - printf("interface {value=%s}{display=Random packet generator}\n", RANDPKT_EXTCAP_INTERFACE); - return EXIT_SUCCESS; -} - static int list_config(char *interface) { unsigned inc = 0; @@ -156,33 +149,10 @@ static int list_config(char *interface) return EXIT_SUCCESS; } -static int list_dlts(const char *interface) -{ - if (!interface) { - errmsg_print("ERROR: No interface specified."); - return EXIT_FAILURE; - } - - if (g_strcmp0(interface, RANDPKT_EXTCAP_INTERFACE)) { - errmsg_print("ERROR: interface must be %s", RANDPKT_EXTCAP_INTERFACE); - return EXIT_FAILURE; - } - - printf("dlt {number=147}{name=%s}{display=Generator dependent DLT}\n", RANDPKT_EXTCAP_INTERFACE); - - return EXIT_SUCCESS; -} - int main(int argc, char *argv[]) { int option_idx = 0; - int do_capture = 0; - int do_dlts = 0; - int do_config = 0; - int do_list_interfaces = 0; int result; - char* fifo = NULL; - char* interface = NULL; int maxbytes = 5000; guint64 count = 1000; int random_type = FALSE; @@ -193,6 +163,11 @@ int main(int argc, char *argv[]) wtap_dumper* savedump; int i; + extcap_parameters * extcap_conf = g_new0(extcap_parameters, 1); + + extcap_base_set_util_info(extcap_conf, RANDPKTDUMP_VERSION_MAJOR, RANDPKTDUMP_VERSION_MINOR, RANDPKTDUMP_VERSION_RELEASE, NULL); + extcap_base_register_interface(extcap_conf, RANDPKT_EXTCAP_INTERFACE, "Random packet generator", 147, "Generator dependent DLT"); + #ifdef _WIN32 WSADATA wsaData; #endif /* _WIN32 */ @@ -214,42 +189,11 @@ int main(int argc, char *argv[]) while ((result = getopt_long(argc, argv, ":", longopts, &option_idx)) != -1) { switch (result) { case OPT_VERSION: - printf("%u.%u.%u\n", RANDPKTDUMP_VERSION_MAJOR, RANDPKTDUMP_VERSION_MINOR, RANDPKTDUMP_VERSION_RELEASE); + printf("%s.%s.%s\n", RANDPKTDUMP_VERSION_MAJOR, RANDPKTDUMP_VERSION_MINOR, RANDPKTDUMP_VERSION_RELEASE); return 0; case OPT_VERBOSE: - break; - - case OPT_LIST_INTERFACES: - do_list_interfaces = 1; - break; - - case OPT_LIST_DLTS: - do_dlts = 1; - break; - - case OPT_INTERFACE: - if (interface) - g_free(interface); - interface = g_strdup(optarg); - break; - - case OPT_CONFIG: - do_config = 1; - break; - - case OPT_CAPTURE: - do_capture = 1; - break; - - case OPT_CAPTURE_FILTER: - /* currently unused */ - break; - - case OPT_FIFO: - if (fifo) - g_free(fifo); - fifo = g_strdup(optarg); + verbose = TRUE; break; case OPT_HELP: @@ -290,8 +234,12 @@ int main(int argc, char *argv[]) break; default: - errmsg_print("Invalid option 1: %s", argv[optind - 1]); - return EXIT_FAILURE; + /* Handle extcap specific options */ + if (!extcap_base_parse_options(extcap_conf, result - EXTCAP_OPT_LIST_INTERFACES, optarg)) + { + errmsg_print("Invalid option: %s", argv[optind - 1]); + return EXIT_FAILURE; + } } } @@ -300,14 +248,11 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - if (do_list_interfaces) - return list_interfaces(); - - if (do_config) - return list_config(interface); + if (extcap_base_handle_interface(extcap_conf)) + return EXIT_SUCCESS; - if (do_dlts) - return list_dlts(interface); + if (extcap_conf->show_config) + return list_config(extcap_conf->interface); /* Some sanity checks */ if ((random_type) && (all_random)) { @@ -330,13 +275,9 @@ int main(int argc, char *argv[]) } #endif /* _WIN32 */ - if (do_capture) { - if (!fifo) { - errmsg_print("ERROR: No FIFO or file specified"); - return 1; - } + if (extcap_conf->capture) { - if (g_strcmp0(interface, RANDPKT_EXTCAP_INTERFACE)) { + if (g_strcmp0(extcap_conf->interface, RANDPKT_EXTCAP_INTERFACE)) { errmsg_print("ERROR: invalid interface"); return 1; } @@ -353,7 +294,7 @@ int main(int argc, char *argv[]) verbose_print("Generating packets: %s\n", example->abbrev); - randpkt_example_init(example, fifo, maxbytes); + randpkt_example_init(example, extcap_conf->fifo, maxbytes); randpkt_loop(example, count); randpkt_example_close(example); } else { @@ -361,7 +302,7 @@ int main(int argc, char *argv[]) example = randpkt_find_example(produce_type); if (!example) return 1; - randpkt_example_init(example, fifo, maxbytes); + randpkt_example_init(example, extcap_conf->fifo, maxbytes); while (count-- > 0) { randpkt_loop(example, 1); @@ -379,11 +320,7 @@ int main(int argc, char *argv[]) } /* clean up stuff */ - if (interface) - g_free(interface); - - if (fifo) - g_free(fifo); + extcap_base_cleanup(&extcap_conf); if (type) g_free(type); diff --git a/extcap/sshdump.c b/extcap/sshdump.c index da7df908dd..8ed9cf6887 100644 --- a/extcap/sshdump.c +++ b/extcap/sshdump.c @@ -58,9 +58,9 @@ #define STDOUT_FILENO 1 #endif -#define SSHDUMP_VERSION_MAJOR 1U -#define SSHDUMP_VERSION_MINOR 0U -#define SSHDUMP_VERSION_RELEASE 0U +#define SSHDUMP_VERSION_MAJOR "1" +#define SSHDUMP_VERSION_MINOR "0" +#define SSHDUMP_VERSION_RELEASE "0" #define SSH_EXTCAP_INTERFACE "ssh" #define SSH_READ_BLOCK_SIZE 256 @@ -384,30 +384,6 @@ static void help(const char* binname) printf(" --remote-filter <filter>: a filter for remote capture (default: don't listen on local local interfaces IPs)\n"); } -static int list_interfaces(void) -{ - printf("extcap {version=%u.%u.%u}\n", SSHDUMP_VERSION_MAJOR, SSHDUMP_VERSION_MINOR, SSHDUMP_VERSION_RELEASE); - printf("interface {value=%s}{display=SSH remote capture}\n", SSH_EXTCAP_INTERFACE); - return EXIT_SUCCESS; -} - -static int list_dlts(const char *interface) -{ - if (!interface) { - errmsg_print("ERROR: No interface specified."); - return EXIT_FAILURE; - } - - if (g_strcmp0(interface, SSH_EXTCAP_INTERFACE)) { - errmsg_print("ERROR: interface must be %s", SSH_EXTCAP_INTERFACE); - return EXIT_FAILURE; - } - - printf("dlt {number=147}{name=%s}{display=Remote capture dependant DLT}\n", SSH_EXTCAP_INTERFACE); - return EXIT_SUCCESS; -} - - static char* local_interfaces_to_filter(unsigned int remote_port) { char* filter = NULL; @@ -547,24 +523,24 @@ int main(int argc, char **argv) { int result; int option_idx = 0; - int do_list_interfaces = 0; - int do_config = 0; - int do_capture = 0; int i; - char* interface = NULL; char* remote_host = NULL; unsigned int remote_port = 22; char* remote_username = NULL; char* remote_password = NULL; - int do_dlts = 0; - char* fifo = NULL; char* remote_interface = NULL; char* remote_capture_bin = NULL; - char* extcap_filter = NULL; char* sshkey = NULL; char* sshkey_passphrase = NULL; char* remote_filter = NULL; unsigned long int count = 0; + int ret = 0; + + extcap_parameters * extcap_conf = g_new0(extcap_parameters, 1); + + extcap_base_set_util_info(extcap_conf, SSHDUMP_VERSION_MAJOR, SSHDUMP_VERSION_MINOR, SSHDUMP_VERSION_RELEASE, NULL); + extcap_base_register_interface(extcap_conf, SSH_EXTCAP_INTERFACE, "SSH remote capture", 147, "Remote capture dependant DLT"); + #ifdef _WIN32 WSADATA wsaData; @@ -598,37 +574,9 @@ int main(int argc, char **argv) break; case OPT_VERSION: - printf("%u.%u.%u\n", SSHDUMP_VERSION_MAJOR, SSHDUMP_VERSION_MINOR, SSHDUMP_VERSION_RELEASE); + printf("%s.%s.%s\n", SSHDUMP_VERSION_MAJOR, SSHDUMP_VERSION_MINOR, SSHDUMP_VERSION_RELEASE); return EXIT_SUCCESS; - case OPT_LIST_INTERFACES: - do_list_interfaces = 1; - break; - - case OPT_LIST_DLTS: - do_dlts = 1; - break; - - case OPT_INTERFACE: - if (interface) - g_free(interface); - interface = g_strdup(optarg); - break; - - case OPT_CONFIG: - do_config = 1; - break; - - case OPT_CAPTURE: - do_capture = 1; - break; - - case OPT_FIFO: - if (fifo) - g_free(fifo); - fifo = g_strdup(optarg); - break; - case OPT_REMOTE_HOST: if (remote_host) g_free(remote_host); @@ -681,12 +629,6 @@ int main(int argc, char **argv) remote_capture_bin = g_strdup(optarg); break; - case OPT_CAPTURE_FILTER: - if (extcap_filter) - g_free(extcap_filter); - extcap_filter = g_strdup(optarg); - break; - case OPT_REMOTE_FILTER: if (remote_filter) g_free(remote_filter); @@ -703,8 +645,11 @@ int main(int argc, char **argv) break; default: - errmsg_print("Invalid option: %s", argv[optind - 1]); - return EXIT_FAILURE; + if (!extcap_base_parse_options(extcap_conf, result - EXTCAP_OPT_LIST_INTERFACES, optarg)) + { + errmsg_print("Invalid option: %s", argv[optind - 1]); + return EXIT_FAILURE; + } } } @@ -713,14 +658,11 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - if (do_list_interfaces) - return list_interfaces(); - - if (do_config) - return list_config(interface, remote_port); + if (extcap_base_handle_interface(extcap_conf)) + return EXIT_SUCCESS; - if (do_dlts) - return list_dlts(interface); + if (extcap_conf->show_config) + return list_config(extcap_conf->interface, remote_port); #ifdef _WIN32 result = WSAStartup(MAKEWORD(1,1), &wsaData); @@ -731,31 +673,26 @@ int main(int argc, char **argv) } #endif /* _WIN32 */ - if (do_capture) { + if (extcap_conf->capture) { char* filter; - int ret = 0; - if (!fifo) { - errmsg_print("ERROR: No FIFO or file specified"); - return 1; - } - if (g_strcmp0(interface, SSH_EXTCAP_INTERFACE)) { - errmsg_print("ERROR: invalid interface"); - return 1; - } + if (!remote_host) { errmsg_print("Missing parameter: --remote-host"); return 1; } - filter = concat_filters(extcap_filter, remote_filter); + filter = concat_filters(extcap_conf->capture_filter, remote_filter); ret = ssh_open_remote_connection(remote_host, remote_port, remote_username, remote_password, sshkey, sshkey_passphrase, remote_interface, - filter, remote_capture_bin, count, fifo); + filter, remote_capture_bin, count, extcap_conf->fifo); g_free(filter); - return ret; + } else { + verbose_print("You should not come here... maybe some parameter missing?\n"); + ret = 1; } - verbose_print("You should not come here... maybe some parameter missing?\n"); - return 1; + /* clean up stuff */ + extcap_base_cleanup(&extcap_conf); + return ret; } |