aboutsummaryrefslogtreecommitdiffstats
path: root/extcap
diff options
context:
space:
mode:
authorRoland Knall <roland.knall@br-automation.com>2016-02-23 11:12:17 +0100
committerRoland Knall <rknall@gmail.com>2016-02-29 12:32:03 +0000
commita4e2263ac4c15c9bfb78444b0b0747cae8022a9c (patch)
tree4c23b02d465011888441692b92e45de5b03a3357 /extcap
parent0e5a73fa4e8804c07cf56d6b0e47232ba536621c (diff)
extcap: Move extcap handling to base
Also add the extcap-version parameter to enable parsing of version and helppage separately Change-Id: I35ba5aa992940ffbb0cd9ebea8b7c3a1e8629d74 Reviewed-on: https://code.wireshark.org/review/14094 Petri-Dish: Roland Knall <rknall@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Dario Lombardo <lomato@gmail.com> Reviewed-by: Roland Knall <rknall@gmail.com>
Diffstat (limited to 'extcap')
-rw-r--r--extcap/androiddump.c201
-rw-r--r--extcap/extcap-base.c191
-rw-r--r--extcap/extcap-base.h65
-rw-r--r--extcap/randpktdump.c113
-rw-r--r--extcap/sshdump.c123
5 files changed, 374 insertions, 319 deletions
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;
}