aboutsummaryrefslogtreecommitdiffstats
path: root/capture_sync.c
diff options
context:
space:
mode:
authorwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>2011-06-07 23:03:12 +0000
committerwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>2011-06-07 23:03:12 +0000
commit6c33da1847abef45d7e002ccb14d21f8efce7dd8 (patch)
tree85e036877f45583ce14916bbae0b426daf05e0ee /capture_sync.c
parent28ef29effa39af6d74bbeae700996c7f41b8bf76 (diff)
Fix gcc 4.6 "set but not used [-Wunused-but-set-variable]" warnings;
Also: whitespace cleanup. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@37603 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'capture_sync.c')
-rw-r--r--capture_sync.c1368
1 files changed, 684 insertions, 684 deletions
diff --git a/capture_sync.c b/capture_sync.c
index dec9522fe1..e2ddfb07d3 100644
--- a/capture_sync.c
+++ b/capture_sync.c
@@ -59,25 +59,25 @@
* macros) on UNIX systems that don't have them.
*/
#ifndef WIFEXITED
-# define WIFEXITED(status) (((status) & 0177) == 0)
+# define WIFEXITED(status) (((status) & 0177) == 0)
#endif
#ifndef WIFSTOPPED
-# define WIFSTOPPED(status) (((status) & 0177) == 0177)
+# define WIFSTOPPED(status) (((status) & 0177) == 0177)
#endif
#ifndef WIFSIGNALED
-# define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
+# define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
#endif
#ifndef WEXITSTATUS
-# define WEXITSTATUS(status) ((status) >> 8)
+# define WEXITSTATUS(status) ((status) >> 8)
#endif
#ifndef WTERMSIG
-# define WTERMSIG(status) ((status) & 0177)
+# define WTERMSIG(status) ((status) & 0177)
#endif
#ifndef WCOREDUMP
-# define WCOREDUMP(status) ((status) & 0200)
+# define WCOREDUMP(status) ((status) & 0200)
#endif
#ifndef WSTOPSIG
-# define WSTOPSIG(status) ((status) >> 8)
+# define WSTOPSIG(status) ((status) >> 8)
#endif
#endif /* _WIN32 */
@@ -125,24 +125,24 @@ static int pipe_read_block(int pipe_fd, char *indicator, int len, char *msg,
static const char **
sync_pipe_add_arg(const char **args, int *argc, const char *arg)
{
- /* Grow the array; "*argc" currently contains the number of string
- pointers, *not* counting the NULL pointer at the end, so we have
- to add 2 in order to get the new size of the array, including the
- new pointer and the terminating NULL pointer. */
- args = g_realloc( (gpointer) args, (*argc + 2) * sizeof (char *));
+ /* Grow the array; "*argc" currently contains the number of string
+ pointers, *not* counting the NULL pointer at the end, so we have
+ to add 2 in order to get the new size of the array, including the
+ new pointer and the terminating NULL pointer. */
+ args = g_realloc( (gpointer) args, (*argc + 2) * sizeof (char *));
- /* Stuff the pointer into the penultimate element of the array, which
- is the one at the index specified by "*argc". */
- args[*argc] = arg;
+ /* Stuff the pointer into the penultimate element of the array, which
+ is the one at the index specified by "*argc". */
+ args[*argc] = arg;
- /* Now bump the count. */
- (*argc)++;
+ /* Now bump the count. */
+ (*argc)++;
- /* We overwrite the NULL pointer; put it back right after the
- element we added. */
- args[*argc] = NULL;
+ /* We overwrite the NULL pointer; put it back right after the
+ element we added. */
+ args[*argc] = NULL;
- return args;
+ return args;
}
@@ -249,39 +249,39 @@ win32strexception(DWORD exception)
{
static char errbuf[ERRBUF_SIZE+1];
static const struct exception_msg {
- int code;
- char *msg;
+ int code;
+ char *msg;
} exceptions[] = {
- { EXCEPTION_ACCESS_VIOLATION, "Access violation" },
- { EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "Array bounds exceeded" },
- { EXCEPTION_BREAKPOINT, "Breakpoint" },
- { EXCEPTION_DATATYPE_MISALIGNMENT, "Data type misalignment" },
- { EXCEPTION_FLT_DENORMAL_OPERAND, "Denormal floating-point operand" },
- { EXCEPTION_FLT_DIVIDE_BY_ZERO, "Floating-point divide by zero" },
- { EXCEPTION_FLT_INEXACT_RESULT, "Floating-point inexact result" },
- { EXCEPTION_FLT_INVALID_OPERATION, "Invalid floating-point operation" },
- { EXCEPTION_FLT_OVERFLOW, "Floating-point overflow" },
- { EXCEPTION_FLT_STACK_CHECK, "Floating-point stack check" },
- { EXCEPTION_FLT_UNDERFLOW, "Floating-point underflow" },
- { EXCEPTION_GUARD_PAGE, "Guard page violation" },
- { EXCEPTION_ILLEGAL_INSTRUCTION, "Illegal instruction" },
- { EXCEPTION_IN_PAGE_ERROR, "Page-in error" },
- { EXCEPTION_INT_DIVIDE_BY_ZERO, "Integer divide by zero" },
- { EXCEPTION_INT_OVERFLOW, "Integer overflow" },
- { EXCEPTION_INVALID_DISPOSITION, "Invalid disposition" },
- { EXCEPTION_INVALID_HANDLE, "Invalid handle" },
- { EXCEPTION_NONCONTINUABLE_EXCEPTION, "Non-continuable exception" },
- { EXCEPTION_PRIV_INSTRUCTION, "Privileged instruction" },
- { EXCEPTION_SINGLE_STEP, "Single-step complete" },
- { EXCEPTION_STACK_OVERFLOW, "Stack overflow" },
- { 0, NULL }
+ { EXCEPTION_ACCESS_VIOLATION, "Access violation" },
+ { EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "Array bounds exceeded" },
+ { EXCEPTION_BREAKPOINT, "Breakpoint" },
+ { EXCEPTION_DATATYPE_MISALIGNMENT, "Data type misalignment" },
+ { EXCEPTION_FLT_DENORMAL_OPERAND, "Denormal floating-point operand" },
+ { EXCEPTION_FLT_DIVIDE_BY_ZERO, "Floating-point divide by zero" },
+ { EXCEPTION_FLT_INEXACT_RESULT, "Floating-point inexact result" },
+ { EXCEPTION_FLT_INVALID_OPERATION, "Invalid floating-point operation" },
+ { EXCEPTION_FLT_OVERFLOW, "Floating-point overflow" },
+ { EXCEPTION_FLT_STACK_CHECK, "Floating-point stack check" },
+ { EXCEPTION_FLT_UNDERFLOW, "Floating-point underflow" },
+ { EXCEPTION_GUARD_PAGE, "Guard page violation" },
+ { EXCEPTION_ILLEGAL_INSTRUCTION, "Illegal instruction" },
+ { EXCEPTION_IN_PAGE_ERROR, "Page-in error" },
+ { EXCEPTION_INT_DIVIDE_BY_ZERO, "Integer divide by zero" },
+ { EXCEPTION_INT_OVERFLOW, "Integer overflow" },
+ { EXCEPTION_INVALID_DISPOSITION, "Invalid disposition" },
+ { EXCEPTION_INVALID_HANDLE, "Invalid handle" },
+ { EXCEPTION_NONCONTINUABLE_EXCEPTION, "Non-continuable exception" },
+ { EXCEPTION_PRIV_INSTRUCTION, "Privileged instruction" },
+ { EXCEPTION_SINGLE_STEP, "Single-step complete" },
+ { EXCEPTION_STACK_OVERFLOW, "Stack overflow" },
+ { 0, NULL }
};
-#define N_EXCEPTIONS (sizeof exceptions / sizeof exceptions[0])
+#define N_EXCEPTIONS (sizeof exceptions / sizeof exceptions[0])
int i;
for (i = 0; i < N_EXCEPTIONS; i++) {
- if (exceptions[i].code == exception)
- return exceptions[i].msg;
+ if (exceptions[i].code == exception)
+ return exceptions[i].msg;
}
g_snprintf(errbuf, (gulong)sizeof errbuf, "Exception 0x%08x", exception);
return errbuf;
@@ -378,53 +378,53 @@ sync_pipe_start(capture_options *capture_opts) {
}
if (capture_opts->ifaces->len > 1)
- argv = sync_pipe_add_arg(argv, &argc, "-t");
+ argv = sync_pipe_add_arg(argv, &argc, "-t");
if (capture_opts->use_pcapng)
- argv = sync_pipe_add_arg(argv, &argc, "-n");
+ argv = sync_pipe_add_arg(argv, &argc, "-n");
if (capture_opts->multi_files_on) {
- if (capture_opts->has_autostop_filesize) {
- argv = sync_pipe_add_arg(argv, &argc, "-b");
- g_snprintf(sfilesize, ARGV_NUMBER_LEN, "filesize:%d",capture_opts->autostop_filesize);
- argv = sync_pipe_add_arg(argv, &argc, sfilesize);
- }
-
- if (capture_opts->has_file_duration) {
- argv = sync_pipe_add_arg(argv, &argc, "-b");
- g_snprintf(sfile_duration, ARGV_NUMBER_LEN, "duration:%d",capture_opts->file_duration);
- argv = sync_pipe_add_arg(argv, &argc, sfile_duration);
- }
-
- if (capture_opts->has_ring_num_files) {
- argv = sync_pipe_add_arg(argv, &argc, "-b");
- g_snprintf(sring_num_files, ARGV_NUMBER_LEN, "files:%d",capture_opts->ring_num_files);
- argv = sync_pipe_add_arg(argv, &argc, sring_num_files);
- }
-
- if (capture_opts->has_autostop_files) {
- argv = sync_pipe_add_arg(argv, &argc, "-a");
- g_snprintf(sautostop_files, ARGV_NUMBER_LEN, "files:%d",capture_opts->autostop_files);
- argv = sync_pipe_add_arg(argv, &argc, sautostop_files);
- }
+ if (capture_opts->has_autostop_filesize) {
+ argv = sync_pipe_add_arg(argv, &argc, "-b");
+ g_snprintf(sfilesize, ARGV_NUMBER_LEN, "filesize:%d",capture_opts->autostop_filesize);
+ argv = sync_pipe_add_arg(argv, &argc, sfilesize);
+ }
+
+ if (capture_opts->has_file_duration) {
+ argv = sync_pipe_add_arg(argv, &argc, "-b");
+ g_snprintf(sfile_duration, ARGV_NUMBER_LEN, "duration:%d",capture_opts->file_duration);
+ argv = sync_pipe_add_arg(argv, &argc, sfile_duration);
+ }
+
+ if (capture_opts->has_ring_num_files) {
+ argv = sync_pipe_add_arg(argv, &argc, "-b");
+ g_snprintf(sring_num_files, ARGV_NUMBER_LEN, "files:%d",capture_opts->ring_num_files);
+ argv = sync_pipe_add_arg(argv, &argc, sring_num_files);
+ }
+
+ if (capture_opts->has_autostop_files) {
+ argv = sync_pipe_add_arg(argv, &argc, "-a");
+ g_snprintf(sautostop_files, ARGV_NUMBER_LEN, "files:%d",capture_opts->autostop_files);
+ argv = sync_pipe_add_arg(argv, &argc, sautostop_files);
+ }
} else {
if (capture_opts->has_autostop_filesize) {
- argv = sync_pipe_add_arg(argv, &argc, "-a");
- g_snprintf(sautostop_filesize, ARGV_NUMBER_LEN, "filesize:%d",capture_opts->autostop_filesize);
- argv = sync_pipe_add_arg(argv, &argc, sautostop_filesize);
+ argv = sync_pipe_add_arg(argv, &argc, "-a");
+ g_snprintf(sautostop_filesize, ARGV_NUMBER_LEN, "filesize:%d",capture_opts->autostop_filesize);
+ argv = sync_pipe_add_arg(argv, &argc, sautostop_filesize);
}
}
if (capture_opts->has_autostop_packets) {
- argv = sync_pipe_add_arg(argv, &argc, "-c");
- g_snprintf(scount, ARGV_NUMBER_LEN, "%d",capture_opts->autostop_packets);
- argv = sync_pipe_add_arg(argv, &argc, scount);
+ argv = sync_pipe_add_arg(argv, &argc, "-c");
+ g_snprintf(scount, ARGV_NUMBER_LEN, "%d",capture_opts->autostop_packets);
+ argv = sync_pipe_add_arg(argv, &argc, scount);
}
if (capture_opts->has_autostop_duration) {
- argv = sync_pipe_add_arg(argv, &argc, "-a");
- g_snprintf(sautostop_duration, ARGV_NUMBER_LEN, "duration:%d",capture_opts->autostop_duration);
- argv = sync_pipe_add_arg(argv, &argc, sautostop_duration);
+ argv = sync_pipe_add_arg(argv, &argc, "-a");
+ g_snprintf(sautostop_duration, ARGV_NUMBER_LEN, "duration:%d",capture_opts->autostop_duration);
+ argv = sync_pipe_add_arg(argv, &argc, sautostop_duration);
}
if (capture_opts->ifaces->len == 0) {
no_ifaces = TRUE;
@@ -561,11 +561,11 @@ sync_pipe_start(capture_options *capture_opts) {
#endif
if (capture_opts->save_file) {
- argv = sync_pipe_add_arg(argv, &argc, "-w");
- argv = sync_pipe_add_arg(argv, &argc, capture_opts->save_file);
+ argv = sync_pipe_add_arg(argv, &argc, "-w");
+ argv = sync_pipe_add_arg(argv, &argc, capture_opts->save_file);
}
for (i = 0; i < argc; i++) {
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "argv[%d]: %s", i, argv[i]);
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "argv[%d]: %s", i, argv[i]);
}
#ifdef _WIN32
@@ -577,27 +577,27 @@ sync_pipe_start(capture_options *capture_opts) {
/* Create a pipe for the child process */
/* (increase this value if you have trouble while fast capture file switches) */
if (! CreatePipe(&sync_pipe_read, &sync_pipe_write, &sa, 5120)) {
- /* Couldn't create the pipe between parent and child. */
- report_failure("Couldn't create sync pipe: %s",
- win32strerror(GetLastError()));
- g_free( (gpointer) argv[0]);
- g_free( (gpointer) argv);
- return FALSE;
+ /* Couldn't create the pipe between parent and child. */
+ report_failure("Couldn't create sync pipe: %s",
+ win32strerror(GetLastError()));
+ g_free( (gpointer) argv[0]);
+ g_free( (gpointer) argv);
+ return FALSE;
}
/* Create the signal pipe */
signal_pipe_name = g_strdup_printf(SIGNAL_PIPE_FORMAT, control_id);
signal_pipe = CreateNamedPipe(utf_8to16(signal_pipe_name),
- PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE, 1, 65535, 65535, 0, NULL);
+ PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE, 1, 65535, 65535, 0, NULL);
g_free(signal_pipe_name);
if (signal_pipe == INVALID_HANDLE_VALUE) {
- /* Couldn't create the signal pipe between parent and child. */
- report_failure("Couldn't create signal pipe: %s",
- win32strerror(GetLastError()));
- g_free( (gpointer) argv[0]);
- g_free( (gpointer) argv);
- return FALSE;
+ /* Couldn't create the signal pipe between parent and child. */
+ report_failure("Couldn't create signal pipe: %s",
+ win32strerror(GetLastError()));
+ g_free( (gpointer) argv[0]);
+ g_free( (gpointer) argv);
+ return FALSE;
}
/* init STARTUPINFO */
@@ -628,13 +628,13 @@ sync_pipe_start(capture_options *capture_opts) {
/* call dumpcap */
if(!CreateProcess(NULL, utf_8to16(args->str), NULL, NULL, TRUE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
- report_failure("Couldn't run %s in child process: %s",
- args->str, win32strerror(GetLastError()));
- CloseHandle(sync_pipe_read);
- CloseHandle(sync_pipe_write);
- g_free( (gpointer) argv[0]);
- g_free( (gpointer) argv);
- return FALSE;
+ report_failure("Couldn't run %s in child process: %s",
+ args->str, win32strerror(GetLastError()));
+ CloseHandle(sync_pipe_read);
+ CloseHandle(sync_pipe_write);
+ g_free( (gpointer) argv[0]);
+ g_free( (gpointer) argv);
+ return FALSE;
}
capture_opts->fork_child = (int) pi.hProcess;
g_string_free(args, TRUE);
@@ -648,33 +648,33 @@ sync_pipe_start(capture_options *capture_opts) {
#else /* _WIN32 */
if (pipe(sync_pipe) < 0) {
- /* Couldn't create the pipe between parent and child. */
- report_failure("Couldn't create sync pipe: %s", strerror(errno));
- g_free( (gpointer) argv[0]);
- g_free(argv);
- return FALSE;
+ /* Couldn't create the pipe between parent and child. */
+ report_failure("Couldn't create sync pipe: %s", strerror(errno));
+ g_free( (gpointer) argv[0]);
+ g_free(argv);
+ return FALSE;
}
if ((capture_opts->fork_child = fork()) == 0) {
- /*
- * Child process - run dumpcap with the right arguments to make
- * it just capture with the specified capture parameters
- */
- dup2(sync_pipe[PIPE_WRITE], 2);
- ws_close(sync_pipe[PIPE_READ]);
- execv(argv[0], (gpointer)argv);
- g_snprintf(errmsg, sizeof errmsg, "Couldn't run %s in child process: %s",
- argv[0], strerror(errno));
- sync_pipe_errmsg_to_parent(2, errmsg, "");
-
- /* Exit with "_exit()", so that we don't close the connection
- to the X server (and cause stuff buffered up by our parent but
- not yet sent to be sent, as that stuff should only be sent by
- our parent). We've sent an error message to the parent, so
- we exit with an exit status of 1 (any exit status other than
- 0 or 1 will cause an additional message to report that exit
- status, over and above the error message we sent to the parent). */
- _exit(1);
+ /*
+ * Child process - run dumpcap with the right arguments to make
+ * it just capture with the specified capture parameters
+ */
+ dup2(sync_pipe[PIPE_WRITE], 2);
+ ws_close(sync_pipe[PIPE_READ]);
+ execv(argv[0], (gpointer)argv);
+ g_snprintf(errmsg, sizeof errmsg, "Couldn't run %s in child process: %s",
+ argv[0], strerror(errno));
+ sync_pipe_errmsg_to_parent(2, errmsg, "");
+
+ /* Exit with "_exit()", so that we don't close the connection
+ to the X server (and cause stuff buffered up by our parent but
+ not yet sent to be sent, as that stuff should only be sent by
+ our parent). We've sent an error message to the parent, so
+ we exit with an exit status of 1 (any exit status other than
+ 0 or 1 will cause an additional message to report that exit
+ status, over and above the error message we sent to the parent). */
+ _exit(1);
}
sync_pipe_read_fd = sync_pipe[PIPE_READ];
@@ -697,13 +697,13 @@ sync_pipe_start(capture_options *capture_opts) {
#endif
if (capture_opts->fork_child == -1) {
- /* We couldn't even create the child process. */
- report_failure("Couldn't create child process: %s", strerror(errno));
- ws_close(sync_pipe_read_fd);
+ /* We couldn't even create the child process. */
+ report_failure("Couldn't create child process: %s", strerror(errno));
+ ws_close(sync_pipe_read_fd);
#ifdef _WIN32
- ws_close(capture_opts->signal_pipe_write_fd);
+ ws_close(capture_opts->signal_pipe_write_fd);
#endif
- return FALSE;
+ return FALSE;
}
capture_opts->fork_child_status = 0;
@@ -718,7 +718,7 @@ sync_pipe_start(capture_options *capture_opts) {
/* we have a running capture, now wait for the real capture filename */
pipe_input_set_handler(sync_pipe_read_fd, (gpointer) capture_opts,
- &capture_opts->fork_child, sync_pipe_input_cb);
+ &capture_opts->fork_child, sync_pipe_input_cb);
return TRUE;
}
@@ -968,173 +968,173 @@ static int
sync_pipe_run_command(const char** argv, gchar **data, gchar **primary_msg,
gchar **secondary_msg)
{
- gchar *msg;
- int data_pipe_read_fd, sync_pipe_read_fd, fork_child, ret;
- char *wait_msg;
- gchar buffer[PIPE_BUF_SIZE+1];
- int nread;
- char indicator;
- int primary_msg_len;
- char *primary_msg_text;
- int secondary_msg_len;
- char *secondary_msg_text;
- char *combined_msg;
- GString *data_buf = NULL;
- int count;
-
- ret = sync_pipe_open_command(argv, &data_pipe_read_fd, &sync_pipe_read_fd,
- &fork_child, &msg);
- if (ret == -1) {
- *primary_msg = msg;
- *secondary_msg = NULL;
- *data = NULL;
- return -1;
- }
-
- /*
- * We were able to set up to read dumpcap's output. Do so.
- *
- * First, wait for an SP_ERROR_MSG message or SP_SUCCESS message.
- */
- nread = pipe_read_block(sync_pipe_read_fd, &indicator, SP_MAX_MSG_LEN,
- buffer, primary_msg);
- if(nread <= 0) {
- /* We got a read error from the sync pipe, or we got no data at
- all from the sync pipe, so we're not going to be getting any
- data or error message from the child process. Pick up its
- exit status, and complain.
-
- We don't have to worry about killing the child, if the sync pipe
- returned an error. Usually this error is caused as the child killed
- itself while going down. Even in the rare cases that this isn't the
- case, the child will get an error when writing to the broken pipe
- the next time, cleaning itself up then. */
- ret = sync_pipe_wait_for_child(fork_child, &wait_msg);
- if(nread == 0) {
- /* We got an EOF from the sync pipe. That means that it exited
- before giving us any data to read. If ret is -1, we report
- that as a bad exit (e.g., exiting due to a signal); otherwise,
- we report it as a premature exit. */
- if (ret == -1)
- *primary_msg = wait_msg;
- else
- *primary_msg = g_strdup("Child dumpcap closed sync pipe prematurely");
- } else {
- /* We got an error from the sync pipe. If ret is -1, report
- both the sync pipe I/O error and the wait error. */
- if (ret == -1) {
- combined_msg = g_strdup_printf("%s\n\n%s", *primary_msg, wait_msg);
- g_free(*primary_msg);
- g_free(wait_msg);
- *primary_msg = combined_msg;
- }
+ gchar *msg;
+ int data_pipe_read_fd, sync_pipe_read_fd, fork_child, ret;
+ char *wait_msg;
+ gchar buffer[PIPE_BUF_SIZE+1];
+ int nread;
+ char indicator;
+ int primary_msg_len;
+ char *primary_msg_text;
+ int secondary_msg_len;
+ char *secondary_msg_text;
+ char *combined_msg;
+ GString *data_buf = NULL;
+ int count;
+
+ ret = sync_pipe_open_command(argv, &data_pipe_read_fd, &sync_pipe_read_fd,
+ &fork_child, &msg);
+ if (ret == -1) {
+ *primary_msg = msg;
+ *secondary_msg = NULL;
+ *data = NULL;
+ return -1;
}
- *secondary_msg = NULL;
- return -1;
- }
-
- /* we got a valid message block from the child, process it */
- switch(indicator) {
-
- case SP_ERROR_MSG:
/*
- * Error from dumpcap; there will be a primary message and a
- * secondary message.
+ * We were able to set up to read dumpcap's output. Do so.
+ *
+ * First, wait for an SP_ERROR_MSG message or SP_SUCCESS message.
*/
+ nread = pipe_read_block(sync_pipe_read_fd, &indicator, SP_MAX_MSG_LEN,
+ buffer, primary_msg);
+ if(nread <= 0) {
+ /* We got a read error from the sync pipe, or we got no data at
+ all from the sync pipe, so we're not going to be getting any
+ data or error message from the child process. Pick up its
+ exit status, and complain.
+
+ We don't have to worry about killing the child, if the sync pipe
+ returned an error. Usually this error is caused as the child killed
+ itself while going down. Even in the rare cases that this isn't the
+ case, the child will get an error when writing to the broken pipe
+ the next time, cleaning itself up then. */
+ ret = sync_pipe_wait_for_child(fork_child, &wait_msg);
+ if(nread == 0) {
+ /* We got an EOF from the sync pipe. That means that it exited
+ before giving us any data to read. If ret is -1, we report
+ that as a bad exit (e.g., exiting due to a signal); otherwise,
+ we report it as a premature exit. */
+ if (ret == -1)
+ *primary_msg = wait_msg;
+ else
+ *primary_msg = g_strdup("Child dumpcap closed sync pipe prematurely");
+ } else {
+ /* We got an error from the sync pipe. If ret is -1, report
+ both the sync pipe I/O error and the wait error. */
+ if (ret == -1) {
+ combined_msg = g_strdup_printf("%s\n\n%s", *primary_msg, wait_msg);
+ g_free(*primary_msg);
+ g_free(wait_msg);
+ *primary_msg = combined_msg;
+ }
+ }
+ *secondary_msg = NULL;
- /* convert primary message */
- pipe_convert_header(buffer, 4, &indicator, &primary_msg_len);
- primary_msg_text = buffer+4;
- /* convert secondary message */
- pipe_convert_header(primary_msg_text + primary_msg_len, 4, &indicator,
- &secondary_msg_len);
- secondary_msg_text = primary_msg_text + primary_msg_len + 4;
- /* the capture child will close the sync_pipe, nothing to do */
-
- /*
- * Pick up the child status.
- */
- ret = sync_pipe_close_command(&data_pipe_read_fd, &sync_pipe_read_fd,
- &fork_child, &msg);
- if (ret == -1) {
- /*
- * Child process failed unexpectedly, or wait failed; msg is the
- * error message.
- */
- *primary_msg = msg;
- *secondary_msg = NULL;
- } else {
- /*
- * Child process failed, but returned the expected exit status.
- * Return the messages it gave us, and indicate failure.
- */
- *primary_msg = g_strdup(primary_msg_text);
- *secondary_msg = g_strdup(secondary_msg_text);
- ret = -1;
- }
- *data = NULL;
- break;
-
- case SP_SUCCESS:
- /* read the output from the command */
- data_buf = g_string_new("");
- while ((count = ws_read(data_pipe_read_fd, buffer, PIPE_BUF_SIZE)) > 0) {
- buffer[count] = '\0';
- g_string_append(data_buf, buffer);
+ return -1;
}
- /*
- * Pick up the child status.
- */
- ret = sync_pipe_close_command(&data_pipe_read_fd, &sync_pipe_read_fd,
- &fork_child, &msg);
- if (ret == -1) {
- /*
- * Child process failed unexpectedly, or wait failed; msg is the
- * error message.
- */
- *primary_msg = msg;
- *secondary_msg = NULL;
- g_string_free(data_buf, TRUE);
- *data = NULL;
- } else {
- /*
- * Child process succeeded.
- */
- *primary_msg = NULL;
- *secondary_msg = NULL;
- *data = data_buf->str;
- g_string_free(data_buf, FALSE);
- }
- break;
+ /* we got a valid message block from the child, process it */
+ switch(indicator) {
- default:
- /*
- * Pick up the child status.
- */
- ret = sync_pipe_close_command(&data_pipe_read_fd, &sync_pipe_read_fd,
- &fork_child, &msg);
- if (ret == -1) {
- /*
- * Child process failed unexpectedly, or wait failed; msg is the
- * error message.
- */
- *primary_msg = msg;
- *secondary_msg = NULL;
- } else {
- /*
- * Child process returned an unknown status.
- */
- *primary_msg = g_strdup_printf("dumpcap process gave an unexpected message type: 0x%02x",
- indicator);
- *secondary_msg = NULL;
- ret = -1;
+ case SP_ERROR_MSG:
+ /*
+ * Error from dumpcap; there will be a primary message and a
+ * secondary message.
+ */
+
+ /* convert primary message */
+ pipe_convert_header(buffer, 4, &indicator, &primary_msg_len);
+ primary_msg_text = buffer+4;
+ /* convert secondary message */
+ pipe_convert_header(primary_msg_text + primary_msg_len, 4, &indicator,
+ &secondary_msg_len);
+ secondary_msg_text = primary_msg_text + primary_msg_len + 4;
+ /* the capture child will close the sync_pipe, nothing to do */
+
+ /*
+ * Pick up the child status.
+ */
+ ret = sync_pipe_close_command(&data_pipe_read_fd, &sync_pipe_read_fd,
+ &fork_child, &msg);
+ if (ret == -1) {
+ /*
+ * Child process failed unexpectedly, or wait failed; msg is the
+ * error message.
+ */
+ *primary_msg = msg;
+ *secondary_msg = NULL;
+ } else {
+ /*
+ * Child process failed, but returned the expected exit status.
+ * Return the messages it gave us, and indicate failure.
+ */
+ *primary_msg = g_strdup(primary_msg_text);
+ *secondary_msg = g_strdup(secondary_msg_text);
+ ret = -1;
+ }
+ *data = NULL;
+ break;
+
+ case SP_SUCCESS:
+ /* read the output from the command */
+ data_buf = g_string_new("");
+ while ((count = ws_read(data_pipe_read_fd, buffer, PIPE_BUF_SIZE)) > 0) {
+ buffer[count] = '\0';
+ g_string_append(data_buf, buffer);
+ }
+
+ /*
+ * Pick up the child status.
+ */
+ ret = sync_pipe_close_command(&data_pipe_read_fd, &sync_pipe_read_fd,
+ &fork_child, &msg);
+ if (ret == -1) {
+ /*
+ * Child process failed unexpectedly, or wait failed; msg is the
+ * error message.
+ */
+ *primary_msg = msg;
+ *secondary_msg = NULL;
+ g_string_free(data_buf, TRUE);
+ *data = NULL;
+ } else {
+ /*
+ * Child process succeeded.
+ */
+ *primary_msg = NULL;
+ *secondary_msg = NULL;
+ *data = data_buf->str;
+ g_string_free(data_buf, FALSE);
+ }
+ break;
+
+ default:
+ /*
+ * Pick up the child status.
+ */
+ ret = sync_pipe_close_command(&data_pipe_read_fd, &sync_pipe_read_fd,
+ &fork_child, &msg);
+ if (ret == -1) {
+ /*
+ * Child process failed unexpectedly, or wait failed; msg is the
+ * error message.
+ */
+ *primary_msg = msg;
+ *secondary_msg = NULL;
+ } else {
+ /*
+ * Child process returned an unknown status.
+ */
+ *primary_msg = g_strdup_printf("dumpcap process gave an unexpected message type: 0x%02x",
+ indicator);
+ *secondary_msg = NULL;
+ ret = -1;
+ }
+ *data = NULL;
+ break;
}
- *data = NULL;
- break;
- }
- return ret;
+ return ret;
}
/*
@@ -1233,147 +1233,147 @@ sync_if_capabilities_open(const gchar *ifname, gboolean monitor_mode,
int
sync_interface_stats_open(int *data_read_fd, int *fork_child, gchar **msg)
{
- int argc;
- const char **argv;
- int message_read_fd, ret;
- char *wait_msg;
- gchar buffer[PIPE_BUF_SIZE+1];
- int nread;
- char indicator;
- int primary_msg_len;
- char *primary_msg_text;
- int secondary_msg_len;
- char *secondary_msg_text;
- char *combined_msg;
-
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_interface_stats_open");
-
- argv = init_pipe_args(&argc);
-
- if (!argv) {
- *msg = g_strdup("We don't know where to find dumpcap.");
- return -1;
- }
-
- /* Ask for the interface statistics */
- argv = sync_pipe_add_arg(argv, &argc, "-S");
+ int argc;
+ const char **argv;
+ int message_read_fd, ret;
+ char *wait_msg;
+ gchar buffer[PIPE_BUF_SIZE+1];
+ int nread;
+ char indicator;
+ int primary_msg_len;
+ char *primary_msg_text;
+ int secondary_msg_len;
+ /*char *secondary_msg_text;*/
+ char *combined_msg;
+
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_interface_stats_open");
-#ifndef DEBUG_CHILD
- argv = sync_pipe_add_arg(argv, &argc, "-Z");
- argv = sync_pipe_add_arg(argv, &argc, SIGNAL_PIPE_CTRL_ID_NONE);
-#endif
- ret = sync_pipe_open_command(argv, data_read_fd, &message_read_fd,
- fork_child, msg);
- if (ret == -1)
- return -1;
-
- /*
- * We were able to set up to read dumpcap's output. Do so.
- *
- * First, wait for an SP_ERROR_MSG message or SP_SUCCESS message.
- */
- nread = pipe_read_block(message_read_fd, &indicator, SP_MAX_MSG_LEN,
- buffer, msg);
- if(nread <= 0) {
- /* We got a read error from the sync pipe, or we got no data at
- all from the sync pipe, so we're not going to be getting any
- data or error message from the child process. Pick up its
- exit status, and complain.
-
- We don't have to worry about killing the child, if the sync pipe
- returned an error. Usually this error is caused as the child killed
- itself while going down. Even in the rare cases that this isn't the
- case, the child will get an error when writing to the broken pipe
- the next time, cleaning itself up then. */
- ret = sync_pipe_wait_for_child(*fork_child, &wait_msg);
- if(nread == 0) {
- /* We got an EOF from the sync pipe. That means that it exited
- before giving us any data to read. If ret is -1, we report
- that as a bad exit (e.g., exiting due to a signal); otherwise,
- we report it as a premature exit. */
- if (ret == -1)
- *msg = wait_msg;
- else
- *msg = g_strdup("Child dumpcap closed sync pipe prematurely");
- } else {
- /* We got an error from the sync pipe. If ret is -1, report
- both the sync pipe I/O error and the wait error. */
- if (ret == -1) {
- combined_msg = g_strdup_printf("%s\n\n%s", *msg, wait_msg);
- g_free(*msg);
- g_free(wait_msg);
- *msg = combined_msg;
- }
+ argv = init_pipe_args(&argc);
+
+ if (!argv) {
+ *msg = g_strdup("We don't know where to find dumpcap.");
+ return -1;
}
- return -1;
- }
+ /* Ask for the interface statistics */
+ argv = sync_pipe_add_arg(argv, &argc, "-S");
- /* we got a valid message block from the child, process it */
- switch(indicator) {
+#ifndef DEBUG_CHILD
+ argv = sync_pipe_add_arg(argv, &argc, "-Z");
+ argv = sync_pipe_add_arg(argv, &argc, SIGNAL_PIPE_CTRL_ID_NONE);
+#endif
+ ret = sync_pipe_open_command(argv, data_read_fd, &message_read_fd,
+ fork_child, msg);
+ if (ret == -1)
+ return -1;
- case SP_ERROR_MSG:
/*
- * Error from dumpcap; there will be a primary message and a
- * secondary message.
+ * We were able to set up to read dumpcap's output. Do so.
+ *
+ * First, wait for an SP_ERROR_MSG message or SP_SUCCESS message.
*/
+ nread = pipe_read_block(message_read_fd, &indicator, SP_MAX_MSG_LEN,
+ buffer, msg);
+ if(nread <= 0) {
+ /* We got a read error from the sync pipe, or we got no data at
+ all from the sync pipe, so we're not going to be getting any
+ data or error message from the child process. Pick up its
+ exit status, and complain.
+
+ We don't have to worry about killing the child, if the sync pipe
+ returned an error. Usually this error is caused as the child killed
+ itself while going down. Even in the rare cases that this isn't the
+ case, the child will get an error when writing to the broken pipe
+ the next time, cleaning itself up then. */
+ ret = sync_pipe_wait_for_child(*fork_child, &wait_msg);
+ if(nread == 0) {
+ /* We got an EOF from the sync pipe. That means that it exited
+ before giving us any data to read. If ret is -1, we report
+ that as a bad exit (e.g., exiting due to a signal); otherwise,
+ we report it as a premature exit. */
+ if (ret == -1)
+ *msg = wait_msg;
+ else
+ *msg = g_strdup("Child dumpcap closed sync pipe prematurely");
+ } else {
+ /* We got an error from the sync pipe. If ret is -1, report
+ both the sync pipe I/O error and the wait error. */
+ if (ret == -1) {
+ combined_msg = g_strdup_printf("%s\n\n%s", *msg, wait_msg);
+ g_free(*msg);
+ g_free(wait_msg);
+ *msg = combined_msg;
+ }
+ }
- /* convert primary message */
- pipe_convert_header(buffer, 4, &indicator, &primary_msg_len);
- primary_msg_text = buffer+4;
- /* convert secondary message */
- pipe_convert_header(primary_msg_text + primary_msg_len, 4, &indicator,
- &secondary_msg_len);
- secondary_msg_text = primary_msg_text + primary_msg_len + 4;
- /* the capture child will close the sync_pipe, nothing to do */
-
- /*
- * Pick up the child status.
- */
- ret = sync_pipe_close_command(data_read_fd, &message_read_fd,
- fork_child, msg);
- if (ret == -1) {
- /*
- * Child process failed unexpectedly, or wait failed; msg is the
- * error message.
- */
- } else {
- /*
- * Child process failed, but returned the expected exit status.
- * Return the messages it gave us, and indicate failure.
- */
- *msg = g_strdup(primary_msg_text);
- ret = -1;
+ return -1;
}
- break;
- case SP_SUCCESS:
- /* Close the message pipe. */
- ws_close(message_read_fd);
- break;
+ /* we got a valid message block from the child, process it */
+ switch(indicator) {
- default:
- /*
- * Pick up the child status.
- */
- ret = sync_pipe_close_command(data_read_fd, &message_read_fd,
- fork_child, msg);
- if (ret == -1) {
- /*
- * Child process failed unexpectedly, or wait failed; msg is the
- * error message.
- */
- } else {
- /*
- * Child process returned an unknown status.
- */
- *msg = g_strdup_printf("dumpcap process gave an unexpected message type: 0x%02x",
- indicator);
- ret = -1;
+ case SP_ERROR_MSG:
+ /*
+ * Error from dumpcap; there will be a primary message and a
+ * secondary message.
+ */
+
+ /* convert primary message */
+ pipe_convert_header(buffer, 4, &indicator, &primary_msg_len);
+ primary_msg_text = buffer+4;
+ /* convert secondary message */
+ pipe_convert_header(primary_msg_text + primary_msg_len, 4, &indicator,
+ &secondary_msg_len);
+ /*secondary_msg_text = primary_msg_text + primary_msg_len + 4;*/
+ /* the capture child will close the sync_pipe, nothing to do */
+
+ /*
+ * Pick up the child status.
+ */
+ ret = sync_pipe_close_command(data_read_fd, &message_read_fd,
+ fork_child, msg);
+ if (ret == -1) {
+ /*
+ * Child process failed unexpectedly, or wait failed; msg is the
+ * error message.
+ */
+ } else {
+ /*
+ * Child process failed, but returned the expected exit status.
+ * Return the messages it gave us, and indicate failure.
+ */
+ *msg = g_strdup(primary_msg_text);
+ ret = -1;
+ }
+ break;
+
+ case SP_SUCCESS:
+ /* Close the message pipe. */
+ ws_close(message_read_fd);
+ break;
+
+ default:
+ /*
+ * Pick up the child status.
+ */
+ ret = sync_pipe_close_command(data_read_fd, &message_read_fd,
+ fork_child, msg);
+ if (ret == -1) {
+ /*
+ * Child process failed unexpectedly, or wait failed; msg is the
+ * error message.
+ */
+ } else {
+ /*
+ * Child process returned an unknown status.
+ */
+ *msg = g_strdup_printf("dumpcap process gave an unexpected message type: 0x%02x",
+ indicator);
+ ret = -1;
+ }
+ break;
}
- break;
- }
- return ret;
+ return ret;
}
/* Close down the stats process */
@@ -1506,12 +1506,12 @@ pipe_read_block(int pipe_fd, char *indicator, int len, char *msg,
/* read header (indicator and 3-byte length) */
newly = pipe_read_bytes(pipe_fd, header, 4, err_msg);
if(newly != 4) {
- if (newly == 0) {
- /*
- * Immediate EOF; if the capture child exits normally, this
- * is an "I'm done" indication, so don't report it as an
- * error.
- */
+ if (newly == 0) {
+ /*
+ * Immediate EOF; if the capture child exits normally, this
+ * is an "I'm done" indication, so don't report it as an
+ * error.
+ */
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,
"read %d got an EOF", pipe_fd);
return 0;
@@ -1520,8 +1520,8 @@ pipe_read_block(int pipe_fd, char *indicator, int len, char *msg,
"read %d failed to read header: %u", pipe_fd, newly);
if (newly != -1) {
/*
- * Short read, but not an immediate EOF.
- */
+ * Short read, but not an immediate EOF.
+ */
*err_msg = g_strdup_printf("Premature EOF reading from sync pipe: got only %d bytes",
newly);
}
@@ -1556,10 +1556,10 @@ pipe_read_block(int pipe_fd, char *indicator, int len, char *msg,
/* read the actual block data */
newly = pipe_read_bytes(pipe_fd, msg, required, err_msg);
if(newly != required) {
- if (newly != -1) {
+ if (newly != -1) {
*err_msg = g_strdup_printf("Unknown message from dumpcap, try to show it as a string: %s",
msg);
- }
+ }
return -1;
}
@@ -1578,111 +1578,111 @@ pipe_read_block(int pipe_fd, char *indicator, int len, char *msg,
static gboolean
sync_pipe_input_cb(gint source, gpointer user_data)
{
- capture_options *capture_opts = (capture_options *)user_data;
- int ret;
- char buffer[SP_MAX_MSG_LEN+1];
- int nread;
- char indicator;
- int primary_len;
- char *primary_msg;
- int secondary_len;
- char *secondary_msg;
- char *wait_msg, *combined_msg;
-
- nread = pipe_read_block(source, &indicator, SP_MAX_MSG_LEN, buffer,
- &primary_msg);
- if(nread <= 0) {
- /* We got a read error, or a bad message, or an EOF, from the sync pipe.
-
- If we got a read error or a bad message, nread is -1 and
- primary_msg is set to point to an error message. We don't
- have to worry about killing the child; usually this error
- is caused as the child killed itself while going down.
- Even in the rare cases that this isn't the case, the child
- will get an error when writing to the broken pipe the next time,
- cleaning itself up then.
-
- If we got an EOF, nread is 0 and primary_msg isn't set. This
- is an indication that the capture is finished. */
- ret = sync_pipe_wait_for_child(capture_opts->fork_child, &wait_msg);
- if(nread == 0) {
- /* We got an EOF from the sync pipe. That means that the capture
- child exited, and not in the middle of a message; we treat
- that as an indication that it's done, and only report an
- error if ret is -1, in which case wait_msg is the error
- message. */
- if (ret == -1)
- primary_msg = wait_msg;
- } else {
- /* We got an error from the sync pipe. If ret is -1, report
- both the sync pipe I/O error and the wait error. */
- if (ret == -1) {
- combined_msg = g_strdup_printf("%s\n\n%s", primary_msg, wait_msg);
- g_free(primary_msg);
- g_free(wait_msg);
- primary_msg = combined_msg;
- }
- }
+ capture_options *capture_opts = (capture_options *)user_data;
+ int ret;
+ char buffer[SP_MAX_MSG_LEN+1];
+ int nread;
+ char indicator;
+ int primary_len;
+ char *primary_msg;
+ int secondary_len;
+ char *secondary_msg;
+ char *wait_msg, *combined_msg;
+
+ nread = pipe_read_block(source, &indicator, SP_MAX_MSG_LEN, buffer,
+ &primary_msg);
+ if(nread <= 0) {
+ /* We got a read error, or a bad message, or an EOF, from the sync pipe.
+
+ If we got a read error or a bad message, nread is -1 and
+ primary_msg is set to point to an error message. We don't
+ have to worry about killing the child; usually this error
+ is caused as the child killed itself while going down.
+ Even in the rare cases that this isn't the case, the child
+ will get an error when writing to the broken pipe the next time,
+ cleaning itself up then.
+
+ If we got an EOF, nread is 0 and primary_msg isn't set. This
+ is an indication that the capture is finished. */
+ ret = sync_pipe_wait_for_child(capture_opts->fork_child, &wait_msg);
+ if(nread == 0) {
+ /* We got an EOF from the sync pipe. That means that the capture
+ child exited, and not in the middle of a message; we treat
+ that as an indication that it's done, and only report an
+ error if ret is -1, in which case wait_msg is the error
+ message. */
+ if (ret == -1)
+ primary_msg = wait_msg;
+ } else {
+ /* We got an error from the sync pipe. If ret is -1, report
+ both the sync pipe I/O error and the wait error. */
+ if (ret == -1) {
+ combined_msg = g_strdup_printf("%s\n\n%s", primary_msg, wait_msg);
+ g_free(primary_msg);
+ g_free(wait_msg);
+ primary_msg = combined_msg;
+ }
+ }
- /* No more child process. */
- capture_opts->fork_child = -1;
- capture_opts->fork_child_status = ret;
+ /* No more child process. */
+ capture_opts->fork_child = -1;
+ capture_opts->fork_child_status = ret;
#ifdef _WIN32
- ws_close(capture_opts->signal_pipe_write_fd);
+ ws_close(capture_opts->signal_pipe_write_fd);
#endif
- capture_input_closed(capture_opts, primary_msg);
- g_free(primary_msg);
- return FALSE;
- }
-
- /* we got a valid message block from the child, process it */
- switch(indicator) {
- case SP_FILE:
- if(!capture_input_new_file(capture_opts, buffer)) {
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_input_cb: file failed, closing capture");
-
- /* We weren't able to open the new capture file; user has been
- 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) */
- sync_pipe_stop(capture_opts);
+ capture_input_closed(capture_opts, primary_msg);
+ g_free(primary_msg);
+ return FALSE;
}
- break;
- case SP_PACKET_COUNT:
- nread = atoi(buffer);
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_input_cb: new packets %u", nread);
- capture_input_new_packets(capture_opts, nread);
- break;
- case SP_ERROR_MSG:
- /* convert primary message */
- pipe_convert_header(buffer, 4, &indicator, &primary_len);
- primary_msg = buffer+4;
- /* convert secondary message */
- pipe_convert_header(primary_msg + primary_len, 4, &indicator, &secondary_len);
- secondary_msg = primary_msg + primary_len + 4;
- /* message output */
- capture_input_error_message(capture_opts, primary_msg, secondary_msg);
- /* the capture child will close the sync_pipe, nothing to do for now */
- /* (an error message doesn't mean we have to stop capturing) */
- break;
- case SP_BAD_FILTER:
- capture_input_cfilter_error_message(capture_opts, buffer);
- /* the capture child will close the sync_pipe, nothing to do for now */
- break;
- case SP_DROPS:
- capture_input_drops(capture_opts, (guint32)strtoul(buffer, NULL, 10));
- break;
- default:
- g_assert_not_reached();
- }
-
- return TRUE;
+
+ /* we got a valid message block from the child, process it */
+ switch(indicator) {
+ case SP_FILE:
+ if(!capture_input_new_file(capture_opts, buffer)) {
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_input_cb: file failed, closing capture");
+
+ /* We weren't able to open the new capture file; user has been
+ 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) */
+ sync_pipe_stop(capture_opts);
+ }
+ break;
+ case SP_PACKET_COUNT:
+ nread = atoi(buffer);
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_input_cb: new packets %u", nread);
+ capture_input_new_packets(capture_opts, nread);
+ break;
+ case SP_ERROR_MSG:
+ /* convert primary message */
+ pipe_convert_header(buffer, 4, &indicator, &primary_len);
+ primary_msg = buffer+4;
+ /* convert secondary message */
+ pipe_convert_header(primary_msg + primary_len, 4, &indicator, &secondary_len);
+ secondary_msg = primary_msg + primary_len + 4;
+ /* message output */
+ capture_input_error_message(capture_opts, primary_msg, secondary_msg);
+ /* the capture child will close the sync_pipe, nothing to do for now */
+ /* (an error message doesn't mean we have to stop capturing) */
+ break;
+ case SP_BAD_FILTER:
+ capture_input_cfilter_error_message(capture_opts, buffer);
+ /* the capture child will close the sync_pipe, nothing to do for now */
+ break;
+ case SP_DROPS:
+ capture_input_drops(capture_opts, (guint32)strtoul(buffer, NULL, 10));
+ break;
+ default:
+ g_assert_not_reached();
+ }
+
+ return TRUE;
}
@@ -1691,65 +1691,65 @@ sync_pipe_input_cb(gint source, gpointer user_data)
static int
sync_pipe_wait_for_child(int fork_child, gchar **msgp)
{
- int fork_child_status;
- int ret;
+ int fork_child_status;
+ int ret;
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_wait_for_child: wait till child closed");
- g_assert(fork_child != -1);
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_wait_for_child: wait till child closed");
+ g_assert(fork_child != -1);
- *msgp = NULL; /* assume no error */
- ret = 0;
+ *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", strerror(errno));
- ret = -1;
- } else {
- /*
- * The child exited; return its exit status. Do not treat this as
- * an error.
- */
- ret = fork_child_status;
- if ((fork_child_status & 0xC0000000) == ERROR_SEVERITY_ERROR) {
- /* Probably an exception code */
- *msgp = g_strdup_printf("Child dumpcap process died: %s",
- win32strexception(fork_child_status));
- ret = -1;
+ if (_cwait(&fork_child_status, fork_child, _WAIT_CHILD) == -1) {
+ *msgp = g_strdup_printf("Error from cwait(): %s", strerror(errno));
+ ret = -1;
+ } else {
+ /*
+ * The child exited; return its exit status. Do not treat this as
+ * an error.
+ */
+ ret = fork_child_status;
+ if ((fork_child_status & 0xC0000000) == ERROR_SEVERITY_ERROR) {
+ /* Probably an exception code */
+ *msgp = g_strdup_printf("Child dumpcap process died: %s",
+ win32strexception(fork_child_status));
+ ret = -1;
+ }
}
- }
#else
- if (waitpid(fork_child, &fork_child_status, 0) != -1) {
- if (WIFEXITED(fork_child_status)) {
- /*
- * The child exited; return its exit status. Do not treat this as
- * an error.
- */
- ret = WEXITSTATUS(fork_child_status);
- } else if (WIFSTOPPED(fork_child_status)) {
- /* It stopped, rather than exiting. "Should not happen." */
- *msgp = g_strdup_printf("Child dumpcap process stopped: %s",
- sync_pipe_signame(WSTOPSIG(fork_child_status)));
- ret = -1;
- } else if (WIFSIGNALED(fork_child_status)) {
- /* It died with a signal. */
- *msgp = g_strdup_printf("Child dumpcap process died: %s%s",
- sync_pipe_signame(WTERMSIG(fork_child_status)),
- WCOREDUMP(fork_child_status) ? " - core dumped" : "");
- ret = -1;
+ if (waitpid(fork_child, &fork_child_status, 0) != -1) {
+ if (WIFEXITED(fork_child_status)) {
+ /*
+ * The child exited; return its exit status. Do not treat this as
+ * an error.
+ */
+ ret = WEXITSTATUS(fork_child_status);
+ } else if (WIFSTOPPED(fork_child_status)) {
+ /* It stopped, rather than exiting. "Should not happen." */
+ *msgp = g_strdup_printf("Child dumpcap process stopped: %s",
+ sync_pipe_signame(WSTOPSIG(fork_child_status)));
+ ret = -1;
+ } else if (WIFSIGNALED(fork_child_status)) {
+ /* It died with a signal. */
+ *msgp = g_strdup_printf("Child dumpcap process died: %s%s",
+ sync_pipe_signame(WTERMSIG(fork_child_status)),
+ WCOREDUMP(fork_child_status) ? " - core dumped" : "");
+ ret = -1;
+ } else {
+ /* What? It had to either have exited, or stopped, or died with
+ a signal; what happened here? */
+ *msgp = g_strdup_printf("Bad status from waitpid(): %#o",
+ fork_child_status);
+ ret = -1;
+ }
} else {
- /* What? It had to either have exited, or stopped, or died with
- a signal; what happened here? */
- *msgp = g_strdup_printf("Bad status from waitpid(): %#o",
- fork_child_status);
- ret = -1;
+ *msgp = g_strdup_printf("Error from waitpid(): %s", strerror(errno));
+ ret = -1;
}
- } else {
- *msgp = g_strdup_printf("Error from waitpid(): %s", strerror(errno));
- ret = -1;
- }
#endif
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_wait_for_child: capture child closed");
- return ret;
+ g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "sync_pipe_wait_for_child: capture child closed");
+ return ret;
}
@@ -1758,94 +1758,94 @@ sync_pipe_wait_for_child(int fork_child, gchar **msgp)
static const char *
sync_pipe_signame(int sig)
{
- const char *sigmsg;
- static char sigmsg_buf[6+1+3+1];
+ const char *sigmsg;
+ static char sigmsg_buf[6+1+3+1];
- switch (sig) {
+ switch (sig) {
- case SIGHUP:
- sigmsg = "Hangup";
- break;
+ case SIGHUP:
+ sigmsg = "Hangup";
+ break;
- case SIGINT:
- sigmsg = "Interrupted";
- break;
+ case SIGINT:
+ sigmsg = "Interrupted";
+ break;
- case SIGQUIT:
- sigmsg = "Quit";
- break;
+ case SIGQUIT:
+ sigmsg = "Quit";
+ break;
- case SIGILL:
- sigmsg = "Illegal instruction";
- break;
+ case SIGILL:
+ sigmsg = "Illegal instruction";
+ break;
- case SIGTRAP:
- sigmsg = "Trace trap";
- break;
+ case SIGTRAP:
+ sigmsg = "Trace trap";
+ break;
- case SIGABRT:
- sigmsg = "Abort";
- break;
+ case SIGABRT:
+ sigmsg = "Abort";
+ break;
- case SIGFPE:
- sigmsg = "Arithmetic exception";
- break;
+ case SIGFPE:
+ sigmsg = "Arithmetic exception";
+ break;
- case SIGKILL:
- sigmsg = "Killed";
- break;
+ case SIGKILL:
+ sigmsg = "Killed";
+ break;
- case SIGBUS:
- sigmsg = "Bus error";
- break;
+ case SIGBUS:
+ sigmsg = "Bus error";
+ break;
- case SIGSEGV:
- sigmsg = "Segmentation violation";
- break;
+ case SIGSEGV:
+ sigmsg = "Segmentation violation";
+ break;
- /* http://metalab.unc.edu/pub/Linux/docs/HOWTO/GCC-HOWTO
- Linux is POSIX compliant. These are not POSIX-defined signals ---
- ISO/IEC 9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 sez:
+ /* http://metalab.unc.edu/pub/Linux/docs/HOWTO/GCC-HOWTO
+ Linux is POSIX compliant. These are not POSIX-defined signals ---
+ ISO/IEC 9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 sez:
- ``The signals SIGBUS, SIGEMT, SIGIOT, SIGTRAP, and SIGSYS
- were omitted from POSIX.1 because their behavior is
- implementation dependent and could not be adequately catego-
- rized. Conforming implementations may deliver these sig-
- nals, but must document the circumstances under which they
- are delivered and note any restrictions concerning their
- delivery.''
+ ``The signals SIGBUS, SIGEMT, SIGIOT, SIGTRAP, and SIGSYS
+ were omitted from POSIX.1 because their behavior is
+ implementation dependent and could not be adequately catego-
+ rized. Conforming implementations may deliver these sig-
+ nals, but must document the circumstances under which they
+ are delivered and note any restrictions concerning their
+ delivery.''
- So we only check for SIGSYS on those systems that happen to
- implement them (a system can be POSIX-compliant and implement
- them, it's just that POSIX doesn't *require* a POSIX-compliant
- system to implement them).
- */
+ So we only check for SIGSYS on those systems that happen to
+ implement them (a system can be POSIX-compliant and implement
+ them, it's just that POSIX doesn't *require* a POSIX-compliant
+ system to implement them).
+ */
#ifdef SIGSYS
- case SIGSYS:
- sigmsg = "Bad system call";
- break;
+ case SIGSYS:
+ sigmsg = "Bad system call";
+ break;
#endif
- case SIGPIPE:
- sigmsg = "Broken pipe";
- break;
-
- case SIGALRM:
- sigmsg = "Alarm clock";
- break;
-
- case SIGTERM:
- sigmsg = "Terminated";
- break;
-
- default:
- /* Returning a static buffer is ok in the context we use it here */
- g_snprintf(sigmsg_buf, sizeof sigmsg_buf, "Signal %d", sig);
- sigmsg = sigmsg_buf;
- break;
- }
- return sigmsg;
+ case SIGPIPE:
+ sigmsg = "Broken pipe";
+ break;
+
+ case SIGALRM:
+ sigmsg = "Alarm clock";
+ break;
+
+ case SIGTERM:
+ sigmsg = "Terminated";
+ break;
+
+ default:
+ /* Returning a static buffer is ok in the context we use it here */
+ g_snprintf(sigmsg_buf, sizeof sigmsg_buf, "Signal %d", sig);
+ sigmsg = sigmsg_buf;
+ break;
+ }
+ return sigmsg;
}
#endif
@@ -1878,45 +1878,45 @@ void
sync_pipe_stop(capture_options *capture_opts)
{
#ifdef _WIN32
- int count;
- DWORD childstatus;
- gboolean terminate = TRUE;
+ int count;
+ DWORD childstatus;
+ gboolean terminate = TRUE;
#endif
- if (capture_opts->fork_child != -1) {
+ if (capture_opts->fork_child != -1) {
#ifndef _WIN32
- /* send the SIGINT signal to close the capture child gracefully. */
- int sts = kill(capture_opts->fork_child, SIGINT);
- if (sts != 0) {
- g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_WARNING,
- "Sending SIGINT to child failed: %s\n", strerror(errno));
- }
+ /* send the SIGINT signal to close the capture child gracefully. */
+ int sts = kill(capture_opts->fork_child, SIGINT);
+ if (sts != 0) {
+ g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_WARNING,
+ "Sending SIGINT to child failed: %s\n", strerror(errno));
+ }
#else
#define STOP_SLEEP_TIME 500 /* ms */
#define STOP_CHECK_TIME 50
- /* First, use the special signal pipe to try to close the capture child
- * gracefully.
- */
- signal_pipe_capquit_to_child(capture_opts);
-
- /* Next, wait for the process to exit on its own */
- for (count = 0; count < STOP_SLEEP_TIME / STOP_CHECK_TIME; count++) {
- if (GetExitCodeProcess((HANDLE) capture_opts->fork_child, &childstatus) &&
- childstatus != STILL_ACTIVE) {
- terminate = FALSE;
- break;
- }
- Sleep(STOP_CHECK_TIME);
- }
+ /* First, use the special signal pipe to try to close the capture child
+ * gracefully.
+ */
+ signal_pipe_capquit_to_child(capture_opts);
+
+ /* Next, wait for the process to exit on its own */
+ for (count = 0; count < STOP_SLEEP_TIME / STOP_CHECK_TIME; count++) {
+ if (GetExitCodeProcess((HANDLE) capture_opts->fork_child, &childstatus) &&
+ childstatus != STILL_ACTIVE) {
+ terminate = FALSE;
+ break;
+ }
+ Sleep(STOP_CHECK_TIME);
+ }
- /* Force the issue. */
- if (terminate) {
- g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_WARNING,
- "sync_pipe_stop: forcing child to exit");
- sync_pipe_kill(capture_opts->fork_child);
- }
+ /* Force the issue. */
+ if (terminate) {
+ g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_WARNING,
+ "sync_pipe_stop: forcing child to exit");
+ sync_pipe_kill(capture_opts->fork_child);
+ }
#endif
- }
+ }
}