diff options
Diffstat (limited to 'dumpcap.c')
-rw-r--r-- | dumpcap.c | 81 |
1 files changed, 42 insertions, 39 deletions
@@ -337,6 +337,10 @@ main(int argc, char *argv[]) /*** hidden option: Ethereal child mode (using binary output messages) ***/ case 'Z': capture_child = TRUE; +#ifdef _WIN32 + /* set output pipe to binary mode, to avoid ugly text conversions */ + _setmode(1, O_BINARY); +#endif break; /*** all non capture option specific ***/ @@ -505,51 +509,51 @@ console_log_handler(const char *log_domain, GLogLevelFlags log_level, /* * Maximum length of sync pipe message data. Must be < 2^24, as the * message length is 3 bytes. - * XXX - this must be large enough to handle a Really Big Filter + * XXX - this should be large enough to handle a Really Big Filter * Expression, as the error message for an incorrect filter expression * is a bit larger than the filter expression. */ #define SP_MAX_MSG_LEN 4096 +/* write a single message header to the recipient pipe */ +static int +pipe_write_header(int pipe, char indicator, int length) +{ + guchar header[1+3]; /* indicator + 3-byte len */ + + + g_assert(length <= SP_MAX_MSG_LEN); + + /* write header (indicator + 3-byte len) */ + header[0] = indicator; + header[1] = (length >> 16) & 0xFF; + header[2] = (length >> 8) & 0xFF; + header[3] = (length >> 0) & 0xFF; + + /* write header */ + return write(pipe, header, sizeof header); +} /* write a message to the recipient pipe in the standard format (3 digit message length (excluding length and indicator field), 1 byte message indicator and the rest is the message). - If msg is NULL, the message has only a length and indicator. - Otherwise, if secondary_msg isn't NULL, send both msg and - secondary_msg as null-terminated strings, otherwise just send - msg as a null-terminated string and follow it with an empty string. */ + If msg is NULL, the message has only a length and indicator. */ static void -pipe_write_block(int pipe, char indicator, const char *msg, - const char *secondary_msg) +pipe_write_block(int pipe, char indicator, const char *msg) { - guchar header[3+1]; /* indicator + 3-byte len */ int ret; - size_t len, secondary_len, total_len; + size_t len; /*g_warning("write %d enter", pipe);*/ - len = 0; - secondary_len = 0; - total_len = 0; if(msg != NULL) { - len = strlen(msg) + 1; /* include the terminating '\0' */ - total_len = len; - if(secondary_msg == NULL) - secondary_msg = ""; /* default to an empty string */ - secondary_len = strlen(secondary_msg) + 1; - total_len += secondary_len; + len = strlen(msg) + 1; /* including the terminating '\0'! */ + } else { + len = 0; } - g_assert(indicator < '0' || indicator > '9'); - g_assert(total_len <= SP_MAX_MSG_LEN); /* write header (indicator + 3-byte len) */ - header[0] = indicator; - header[1] = (total_len >> 16) & 0xFF; - header[2] = (total_len >> 8) & 0xFF; - header[3] = (total_len >> 0) & 0xFF; - - ret = write(pipe, header, sizeof header); + ret = pipe_write_header(pipe, indicator, len); if(ret == -1) { return; } @@ -561,10 +565,6 @@ pipe_write_block(int pipe, char indicator, const char *msg, if(ret == -1) { return; } - ret = write(pipe, secondary_msg, secondary_len); - if(ret == -1) { - return; - } } else { /*g_warning("write %d indicator: %c no value", pipe, indicator);*/ } @@ -583,7 +583,7 @@ sync_pipe_packet_count_to_parent(int packet_count) if(capture_child) { g_snprintf(tmp, sizeof(tmp), "%d", packet_count); g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "Packets: %s", tmp); - pipe_write_block(1, SP_PACKET_COUNT, tmp, NULL); + pipe_write_block(1, SP_PACKET_COUNT, tmp); } else { count += packet_count; fprintf(stderr, "\rPackets: %u ", count); @@ -600,7 +600,7 @@ sync_pipe_filename_to_parent(const char *filename) g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_MESSAGE, "File: %s", filename); if(capture_child) { - pipe_write_block(1, SP_FILE, filename, NULL); + pipe_write_block(1, SP_FILE, filename); } } @@ -612,7 +612,7 @@ sync_pipe_cfilter_error_to_parent(const char *cfilter _U_, const char *errmsg) g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "Capture filter error: %s", errmsg); if (capture_child) { - pipe_write_block(1, SP_BAD_FILTER, errmsg, NULL); + pipe_write_block(1, SP_BAD_FILTER, errmsg); } } @@ -620,13 +620,16 @@ void sync_pipe_errmsg_to_parent(const char *error_msg, const char *secondary_error_msg) { - g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_MESSAGE, "Error: %s", error_msg); - if (secondary_error_msg != NULL) - g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_MESSAGE, "Secondary error: %s", - secondary_error_msg); + g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_MESSAGE, + "Primary Error: %s", error_msg); + g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_MESSAGE, + "Secondary Error: %s", secondary_error_msg); if(capture_child) { - pipe_write_block(1, SP_ERROR_MSG, error_msg, secondary_error_msg); + /* first write a "master header" with the length of the two messages plus their "slave headers" */ + pipe_write_header(1, SP_ERROR_MSG, strlen(error_msg) + 1 + 4 + strlen(secondary_error_msg) + 1 + 4); + pipe_write_block(1, SP_ERROR_MSG, error_msg); + pipe_write_block(1, SP_ERROR_MSG, secondary_error_msg); } } @@ -640,7 +643,7 @@ sync_pipe_drops_to_parent(int drops) g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_MESSAGE, "Packets dropped: %s", tmp); if(capture_child) { - pipe_write_block(1, SP_DROPS, tmp, NULL); + pipe_write_block(1, SP_DROPS, tmp); } } |