#ifdef _WIN32
#include "capture-wpcap.h"
#endif
-#include "ui_util.h"
+
+#include "ui/ui_util.h"
+
#include <wsutil/file_util.h>
#include "log.h"
}
#endif
+#ifdef HAVE_PCAP_CREATE
if (interface_opts.monitor_mode) {
argv = sync_pipe_add_arg(argv, &argc, "-I");
}
+#endif
#ifdef HAVE_PCAP_REMOTE
if (interface_opts.datatx_udp)
/* Couldn't create the message pipe between parent and child. */
*msg = g_strdup_printf("Couldn't create sync pipe: %s",
win32strerror(GetLastError()));
- for (i = 0; i < argc; i++) {
+ for (i = 0; argv[i] != NULL; i++) {
g_free( (gpointer) argv[i]);
}
g_free( (gpointer) argv);
win32strerror(GetLastError()));
CloseHandle(sync_pipe[PIPE_READ]);
CloseHandle(sync_pipe[PIPE_WRITE]);
- for (i = 0; i < argc; i++) {
+ for (i = 0; argv[i] != NULL; i++) {
g_free( (gpointer) argv[i]);
}
g_free( (gpointer) argv);
CloseHandle(data_pipe[PIPE_WRITE]);
CloseHandle(sync_pipe[PIPE_READ]);
CloseHandle(sync_pipe[PIPE_WRITE]);
- for (i = 0; i < argc; i++) {
+ for (i = 0; argv[i] != NULL; i++) {
g_free( (gpointer) argv[i]);
}
g_free( (gpointer) argv);
}
/*
- * Wait for dumpcap to finish. On success, *msg is unchanged, and 0 is
- * returned. On failure, *msg points to an error message for the
- * failure, and -1 is returned. In the latter case, *msg must be
- * freed with g_free().
+ * Close the pipes we're using to read from dumpcap, and wait for it
+ * to exit. On success, *msgp is unchanged, and the exit status of
+ * dumpcap is returned. On failure (which includes "dumpcap exited
+ * due to being killed by a signal or an exception"), *msgp points
+ * to an error message for the failure, and -1 is returned. In the
+ * latter case, *msgp must be freed with g_free().
*/
static int
sync_pipe_close_command(int *data_read_fd, int *message_read_fd,
- int *fork_child, gchar **msg)
+ int *fork_child, gchar **msgp)
{
ws_close(*data_read_fd);
if (message_read_fd != NULL)
sync_pipe_kill(*fork_child);
#endif
- return sync_pipe_wait_for_child(*fork_child, msg);
+ return sync_pipe_wait_for_child(*fork_child, msgp);
}
/*
alerted. Close the sync pipe. */
ws_close(source);
- /* the child has send us a filename which we couldn't open.
- this probably means, the child is creating files faster than we can handle it.
- this should only be the case for very fast file switches
- we can't do much more than telling the child to stop
- (this is the "emergency brake" if user e.g. wants to switch files every second) */
+ /* The child has sent us a filename which we couldn't open.
+
+ This could mean that the child is creating files faster
+ than we can handle it. (XXX - why would that result in
+ a failure to open the file?)
+
+ That should only be the case for very fast file switches;
+ We can't do much more than telling the child to stop.
+ (This is the "emergency brake" if the user e.g. wants to
+ switch files every second).
+
+ This can also happen if the user specified "-", meaning
+ "standard output", as the capture file. */
sync_pipe_stop(capture_opts);
+ capture_input_closed(capture_opts, NULL);
+ return FALSE;
}
break;
case SP_PACKET_COUNT:
-/* the child process is going down, wait until it's completely terminated */
+/*
+ * dumpcap is exiting; wait for it to exit. On success, *msgp is
+ * unchanged, and the exit status of dumpcap is returned. On
+ * failure (which includes "dumpcap exited due to being killed by
+ * a signal or an exception"), *msgp points to an error message
+ * for the failure, and -1 is returned. In the latter case, *msgp
+ * must be freed with g_free().
+ */
static int
sync_pipe_wait_for_child(int fork_child, gchar **msgp)
{
g_assert(fork_child != -1);
*msgp = NULL; /* assume no error */
- ret = 0;
#ifdef _WIN32
if (_cwait(&fork_child_status, fork_child, _WAIT_CHILD) == -1) {
*msgp = g_strdup_printf("Error from cwait(): %s", g_strerror(errno));