aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--capchild/capture_sync.c15
-rw-r--r--capture_opts.c9
-rw-r--r--capture_opts.h7
-rw-r--r--extcap.c44
-rw-r--r--extcap.h10
5 files changed, 45 insertions, 40 deletions
diff --git a/capchild/capture_sync.c b/capchild/capture_sync.c
index 9f3d0ca0b9..33e730ed66 100644
--- a/capchild/capture_sync.c
+++ b/capchild/capture_sync.c
@@ -526,19 +526,12 @@ sync_pipe_start(capture_options *capture_opts, capture_session *cap_session, inf
#else
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; /* this hides the console window */
-#if defined(_WIN32)
- /* needs first a check if NULL *
- * otherwise wouldn't work with non extcap interfaces */
- if(interface_opts.extcap_fifo != NULL)
- {
- if(strncmp(interface_opts.extcap_fifo,"\\\\.\\pipe\\",9)== 0)
- {
- si.hStdInput = extcap_get_win32_handle();
- }
- }
+#ifdef HAVE_EXTCAP
+ if(interface_opts.extcap_pipe_h != INVALID_HANDLE_VALUE)
+ si.hStdInput = interface_opts.extcap_pipe_h;
else
#endif
- si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = sync_pipe_write;
diff --git a/capture_opts.c b/capture_opts.c
index 29bb484b20..0f7a88ee3f 100644
--- a/capture_opts.c
+++ b/capture_opts.c
@@ -68,6 +68,9 @@ capture_opts_init(capture_options *capture_opts)
capture_opts->default_options.extcap_args = NULL;
capture_opts->default_options.extcap_userdata = NULL;
capture_opts->default_options.extcap_pid = INVALID_EXTCAP_PID;
+#ifdef _WIN32
+ capture_opts->default_options.extcap_pipe_h = INVALID_HANDLE_VALUE;
+#endif
capture_opts->default_options.extcap_control_in = NULL;
capture_opts->default_options.extcap_control_out = NULL;
#endif
@@ -713,6 +716,9 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str
interface_opts.extcap_args = NULL;
interface_opts.extcap_pid = INVALID_EXTCAP_PID;
interface_opts.extcap_userdata = NULL;
+#ifdef _WIN32
+ interface_opts.extcap_pipe_h = INVALID_HANDLE_VALUE;
+#endif
interface_opts.extcap_control_in = g_strdup(capture_opts->default_options.extcap_control_in);
interface_opts.extcap_control_out = g_strdup(capture_opts->default_options.extcap_control_out);
#endif
@@ -1226,6 +1232,9 @@ collect_ifaces(capture_options *capture_opts)
if (interface_opts.extcap_args)
g_hash_table_ref(interface_opts.extcap_args);
interface_opts.extcap_userdata = NULL;
+#ifdef _WIN32
+ interface_opts.extcap_pipe_h = INVALID_HANDLE_VALUE;
+#endif
interface_opts.extcap_control_in = NULL;
interface_opts.extcap_control_out = NULL;
#endif
diff --git a/capture_opts.h b/capture_opts.h
index 8e1cb8de2a..22d03c8472 100644
--- a/capture_opts.h
+++ b/capture_opts.h
@@ -36,6 +36,10 @@
#include <caputils/capture_ifinfo.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@@ -232,6 +236,9 @@ typedef struct interface_options_tag {
GPid extcap_pid; /* pid of running process or INVALID_EXTCAP_PID */
gpointer extcap_userdata;
guint extcap_child_watch;
+#ifdef _WIN32
+ HANDLE extcap_pipe_h;
+#endif
gchar *extcap_control_in;
gchar *extcap_control_out;
#endif
diff --git a/extcap.c b/extcap.c
index 9bb36c178b..d025c9fe25 100644
--- a/extcap.c
+++ b/extcap.c
@@ -63,7 +63,7 @@
#include "extcap_spawn.h"
#ifdef _WIN32
-static HANDLE pipe_h = NULL;
+static HANDLE pipe_h = INVALID_HANDLE_VALUE;
#endif
static void extcap_child_watch_cb(GPid pid, gint status, gpointer user_data);
@@ -1032,13 +1032,14 @@ void extcap_if_cleanup(capture_options *capture_opts, gchar **errormsg)
"Extcap [%s] - Cleaning up fifo: %s; PID: %d", interface_opts.name,
interface_opts.extcap_fifo, interface_opts.extcap_pid);
#ifdef _WIN32
- if (pipe_h)
+ if (interface_opts.extcap_pipe_h != INVALID_HANDLE_VALUE)
{
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,
"Extcap [%s] - Closing pipe", interface_opts.name);
- FlushFileBuffers(pipe_h);
- DisconnectNamedPipe(pipe_h);
- CloseHandle(pipe_h);
+ FlushFileBuffers(interface_opts.extcap_pipe_h);
+ DisconnectNamedPipe(interface_opts.extcap_pipe_h);
+ CloseHandle(interface_opts.extcap_pipe_h);
+ interface_opts.extcap_pipe_h = INVALID_HANDLE_VALUE;
}
#else
if (interface_opts.extcap_fifo != NULL && file_exists(interface_opts.extcap_fifo))
@@ -1353,15 +1354,21 @@ extcap_init_interfaces(capture_options *capture_opts)
/* create control pipes if having toolbar */
if (extcap_has_toolbar(interface_opts.name))
{
- extcap_create_pipe(&interface_opts.extcap_control_in);
- extcap_create_pipe(&interface_opts.extcap_control_out);
+ extcap_create_pipe(interface_opts.name, &interface_opts.extcap_control_in,
+ EXTCAP_CONTROL_IN_PREFIX);
+ extcap_create_pipe(interface_opts.name, &interface_opts.extcap_control_out,
+ EXTCAP_CONTROL_OUT_PREFIX);
}
/* create pipe for fifo */
- if (!extcap_create_pipe(&interface_opts.extcap_fifo))
+ if (!extcap_create_pipe(interface_opts.name, &interface_opts.extcap_fifo,
+ EXTCAP_PIPE_PREFIX))
{
return FALSE;
}
+#ifdef _WIN32
+ interface_opts.extcap_pipe_h = pipe_h;
+#endif
/* Create extcap call */
args = extcap_prepare_arguments(interface_opts);
@@ -1396,9 +1403,8 @@ extcap_init_interfaces(capture_options *capture_opts)
*/
if (pid != INVALID_EXTCAP_PID)
{
- extcap_wait_for_pipe(pipe_h, pid);
+ extcap_wait_for_pipe(interface_opts.extcap_pipe_h, pid);
}
-
#endif
interface_opts.extcap_userdata = (gpointer) userdata;
@@ -1410,16 +1416,7 @@ extcap_init_interfaces(capture_options *capture_opts)
return TRUE;
}
-#ifdef _WIN32
-/* called by capture_sync to get the CreatNamedPipe handle*/
-HANDLE
-extcap_get_win32_handle()
-{
- return pipe_h;
-}
-#endif
-
-gboolean extcap_create_pipe(char **fifo)
+gboolean extcap_create_pipe(const gchar *ifname, gchar **fifo, const gchar *pipe_prefix)
{
#ifdef _WIN32
gchar timestr[ 14 + 1 ];
@@ -1435,7 +1432,7 @@ gboolean extcap_create_pipe(char **fifo)
* so we won't get a null pointer back from localtime().
*/
strftime(timestr, sizeof(timestr), "%Y%m%d%H%M%S", localtime(&current_time));
- pipename = g_strconcat("\\\\.\\pipe\\", EXTCAP_PIPE_PREFIX, "_", timestr, NULL);
+ pipename = g_strconcat("\\\\.\\pipe\\", pipe_prefix, "_", ifname, "_", timestr, NULL);
/* Security struct to enable Inheritable HANDLE */
memset(&security, 0, sizeof(SECURITY_ATTRIBUTES));
@@ -1466,10 +1463,13 @@ gboolean extcap_create_pipe(char **fifo)
gchar *temp_name = NULL;
int fd = 0;
- if ((fd = create_tempfile(&temp_name, EXTCAP_PIPE_PREFIX, NULL)) < 0)
+ gchar *pfx = g_strconcat(pipe_prefix, "_", ifname, NULL);
+ if ((fd = create_tempfile(&temp_name, pfx, NULL)) < 0)
{
+ g_free(pfx);
return FALSE;
}
+ g_free(pfx);
ws_close(fd);
diff --git a/extcap.h b/extcap.h
index addf30fad7..2e6739fa00 100644
--- a/extcap.h
+++ b/extcap.h
@@ -29,7 +29,6 @@
#include <glib.h>
#ifdef _WIN32
-#include <windows.h>
#include <wsutil/unicode-utils.h>
#endif
@@ -41,6 +40,8 @@
/* Prefix for the pipe interfaces */
#define EXTCAP_PIPE_PREFIX "wireshark_extcap"
+#define EXTCAP_CONTROL_IN_PREFIX "wireshark_control_in"
+#define EXTCAP_CONTROL_OUT_PREFIX "wireshark_control_out"
#define EXTCAP_ARGUMENT_CONFIG "--extcap-config"
#define EXTCAP_ARGUMENT_LIST_INTERFACES "--extcap-interfaces"
@@ -138,16 +139,11 @@ extcap_has_configuration(const char * ifname, gboolean is_required);
gboolean
extcap_has_toolbar(const char *ifname);
-#ifdef WIN32
-HANDLE
-extcap_get_win32_handle();
-#endif
-
gboolean
extcap_init_interfaces(capture_options * capture_opts);
gboolean
-extcap_create_pipe(char ** fifo);
+extcap_create_pipe(const gchar *ifname, gchar **fifo, const gchar *pipe_prefix);
/* Clean up all if related stuff */
void