diff options
author | guy <guy@f5534014-38df-0310-8fa8-9805f1628bb7> | 2009-08-04 18:39:43 +0000 |
---|---|---|
committer | guy <guy@f5534014-38df-0310-8fa8-9805f1628bb7> | 2009-08-04 18:39:43 +0000 |
commit | 402b607eedd2b026f2fa688602d56cb9f87a0d38 (patch) | |
tree | 7eefc7e2f960a6ae21b50ab61f5e056f88987efe /epan/dissectors/packet-pop.c | |
parent | 56db8a8007516a564e9f18095d51e9324e190b8a (diff) |
Clean up white space a bit - use 2-space indenting.
Put a bunch of code that does nothing unless data_val is non-null inside
"if (data_val)", and get rid of the individual tests.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@29292 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-pop.c')
-rw-r--r-- | epan/dissectors/packet-pop.c | 540 |
1 files changed, 265 insertions, 275 deletions
diff --git a/epan/dissectors/packet-pop.c b/epan/dissectors/packet-pop.c index 4dc10b809f..dd2c637af3 100644 --- a/epan/dissectors/packet-pop.c +++ b/epan/dissectors/packet-pop.c @@ -81,21 +81,21 @@ static GHashTable *pop_data_segment_table = NULL; static GHashTable *pop_data_reassembled_table = NULL; static const fragment_items pop_data_frag_items = { - /* Fragment subtrees */ - &ett_pop_data_fragment, - &ett_pop_data_fragments, - /* Fragment fields */ - &hf_pop_data_fragments, - &hf_pop_data_fragment, - &hf_pop_data_fragment_overlap, - &hf_pop_data_fragment_overlap_conflicts, - &hf_pop_data_fragment_multiple_tails, - &hf_pop_data_fragment_too_long_fragment, - &hf_pop_data_fragment_error, - /* Reassembled in field */ - &hf_pop_data_reassembled_in, - /* Tag */ - "DATA fragments" + /* Fragment subtrees */ + &ett_pop_data_fragment, + &ett_pop_data_fragments, + /* Fragment fields */ + &hf_pop_data_fragments, + &hf_pop_data_fragment, + &hf_pop_data_fragment_overlap, + &hf_pop_data_fragment_overlap_conflicts, + &hf_pop_data_fragment_multiple_tails, + &hf_pop_data_fragment_too_long_fragment, + &hf_pop_data_fragment_error, + /* Reassembled in field */ + &hf_pop_data_reassembled_in, + /* Tag */ + "DATA fragments" }; struct pop_proto_data { @@ -116,239 +116,237 @@ static gboolean response_is_continuation(const guchar *data); static void dissect_pop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - struct pop_proto_data *frame_data; - gboolean is_request; - gboolean is_continuation; - proto_tree *pop_tree, *reqresp_tree; - proto_item *ti; - gint offset = 0; - const guchar *line; - gint next_offset; - int linelen; - int tokenlen; - const guchar *next_token; - fragment_data *frag_msg = NULL; - tvbuff_t *next_tvb = NULL; - conversation_t *conversation = NULL; - struct pop_data_val *data_val = NULL; - gint length_remaining; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "POP"); - - /* - * Find the end of the first line. - * - * Note that "tvb_find_line_end()" will return a value that is - * not longer than what's in the buffer, so the "tvb_get_ptr()" - * call won't throw an exception. - */ - linelen = tvb_find_line_end(tvb, offset, -1, &next_offset, FALSE); - line = tvb_get_ptr(tvb, offset, linelen); - - if (pinfo->match_port == pinfo->destport) { - is_request = TRUE; - is_continuation = FALSE; - } else { - is_request = FALSE; - is_continuation = response_is_continuation(line); - } - - frame_data = p_get_proto_data(pinfo->fd, proto_pop); - - if (!frame_data) { - - conversation = find_conversation(pinfo->fd->num, - &pinfo->src, &pinfo->dst, - pinfo->ptype, - pinfo->srcport, pinfo->destport, 0); - - if (conversation == NULL) { /* No conversation, create one */ - conversation = conversation_new(pinfo->fd->num, - &pinfo->src, &pinfo->dst, pinfo->ptype, - pinfo->srcport, pinfo->destport, 0); - } - - data_val = conversation_get_proto_data(conversation, proto_pop); - - if (!data_val) { - - /* - * No - create one and attach it. - */ - data_val = se_alloc(sizeof(struct pop_data_val)); - data_val->msg_request = FALSE; - data_val->msg_read_len = 0; - data_val->msg_tot_len = 0; - - conversation_add_proto_data(conversation, proto_pop, data_val); - } - } - - if (check_col(pinfo->cinfo, COL_INFO)) { - /* - * Put the first line from the buffer into the summary - * if it's a POP request or reply (but leave out the - * line terminator). - * Otherwise, just call it a continuation. - */ - if (is_continuation) { - length_remaining = tvb_length_remaining(tvb, offset); - col_set_str(pinfo->cinfo, COL_INFO, "S: DATA fragment"); - col_append_fstr(pinfo->cinfo, COL_INFO, ", %d byte%s", - length_remaining, - plurality (length_remaining, "", "s")); - } - else - col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s", - is_request ? "C" : "S", - format_text(line, linelen)); - } - - if (tree) { - ti = proto_tree_add_item(tree, proto_pop, tvb, offset, -1, - FALSE); - pop_tree = proto_item_add_subtree(ti, ett_pop); - - if (is_continuation) { - - if(pop_data_desegment) { - - if(!frame_data) { - - data_val->msg_read_len += tvb_length(tvb); - - frame_data = se_alloc(sizeof(struct pop_proto_data)); - - frame_data->conversation_id = conversation->index; - frame_data->more_frags = data_val->msg_read_len < data_val->msg_tot_len; - - p_add_proto_data(pinfo->fd, proto_pop, frame_data); - } - - frag_msg = fragment_add_seq_next (tvb, 0, pinfo, - frame_data->conversation_id, - pop_data_segment_table, - pop_data_reassembled_table, - tvb_length(tvb), - frame_data->more_frags); - - next_tvb = process_reassembled_data (tvb, offset, pinfo, - "Reassembled DATA", - frag_msg, &pop_data_frag_items, - NULL, pop_tree); - - if(next_tvb) { - - if(imf_handle) - call_dissector(imf_handle, next_tvb, pinfo, tree); - - if(data_val) { - /* we have read everything - reset */ - - data_val->msg_read_len = 0; - data_val->msg_tot_len = 0; - } - pinfo->fragmented = FALSE; - } else { - pinfo->fragmented = TRUE; - } - - } else { - - /* - * Put the whole packet into the tree as data. - */ - call_dissector(data_handle,tvb, pinfo, pop_tree); - - } - return; - } - - /* - * Put the line into the protocol tree. - */ - ti = proto_tree_add_string_format(pop_tree, - (is_request) ? - hf_pop_request : - hf_pop_response, - tvb, offset, - next_offset - offset, - "", "%s", - tvb_format_text(tvb, offset, next_offset - offset)); - reqresp_tree = proto_item_add_subtree(ti, ett_pop_reqresp); - - /* - * Extract the first token, and, if there is a first - * token, add it as the request or reply code. - */ - tokenlen = get_token_len(line, line + linelen, &next_token); - if (tokenlen != 0) { - proto_tree_add_item(reqresp_tree, - (is_request) ? - hf_pop_request_command : - hf_pop_response_indicator, - tvb, offset, tokenlen, FALSE); - - if(is_request) { - /* see if this is RETR or TOP command */ - if(data_val && ((g_ascii_strncasecmp(line, "RETR", 4) == 0) || - (g_ascii_strncasecmp(line, "TOP", 3) == 0))) - /* the next response will tell us how many bytes */ - data_val->msg_request = TRUE; - } else { - if(data_val && data_val->msg_request) { - /* this is a response to a RETR or TOP command */ - - if(g_ascii_strncasecmp(line, "+OK ", 4) == 0) { - /* the message will be sent - work out how many bytes */ - data_val->msg_read_len = 0; - data_val->msg_tot_len = atoi(line + 4); - } - data_val->msg_request = FALSE; - } - } - - offset += (gint) (next_token - line); - linelen -= (int) (next_token - line); - } - - /* - * Add the rest of the first line as request or - * reply param/description. - */ - if (linelen != 0) { - proto_tree_add_item(reqresp_tree, - (is_request) ? - hf_pop_request_parameter : - hf_pop_response_description, - tvb, offset, linelen, FALSE); - } - offset = next_offset; - - /* - * Show the rest of the request or response as text, - * a line at a time. - */ - while (tvb_offset_exists(tvb, offset)) { - /* - * Find the end of the line. - */ - tvb_find_line_end(tvb, offset, -1, &next_offset, FALSE); - - /* - * Put this line. - */ - proto_tree_add_string_format(pop_tree, - (is_request) ? - hf_pop_request_data : - hf_pop_response_data, - tvb, offset, - next_offset - offset, - "", "%s", - tvb_format_text(tvb, offset, next_offset - offset)); - offset = next_offset; - } - } + struct pop_proto_data *frame_data; + gboolean is_request; + gboolean is_continuation; + proto_tree *pop_tree, *reqresp_tree; + proto_item *ti; + gint offset = 0; + const guchar *line; + gint next_offset; + int linelen; + int tokenlen; + const guchar *next_token; + fragment_data *frag_msg = NULL; + tvbuff_t *next_tvb = NULL; + conversation_t *conversation = NULL; + struct pop_data_val *data_val = NULL; + gint length_remaining; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "POP"); + + /* + * Find the end of the first line. + * + * Note that "tvb_find_line_end()" will return a value that is + * not longer than what's in the buffer, so the "tvb_get_ptr()" + * call won't throw an exception. + */ + linelen = tvb_find_line_end(tvb, offset, -1, &next_offset, FALSE); + line = tvb_get_ptr(tvb, offset, linelen); + + if (pinfo->match_port == pinfo->destport) { + is_request = TRUE; + is_continuation = FALSE; + } else { + is_request = FALSE; + is_continuation = response_is_continuation(line); + } + + frame_data = p_get_proto_data(pinfo->fd, proto_pop); + + if (!frame_data) { + + conversation = find_conversation(pinfo->fd->num, + &pinfo->src, &pinfo->dst, + pinfo->ptype, + pinfo->srcport, pinfo->destport, 0); + + if (conversation == NULL) { /* No conversation, create one */ + conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, + pinfo->ptype, pinfo->srcport, + pinfo->destport, 0); + } + + data_val = conversation_get_proto_data(conversation, proto_pop); + + if (!data_val) { + + /* + * No - create one and attach it. + */ + data_val = se_alloc(sizeof(struct pop_data_val)); + data_val->msg_request = FALSE; + data_val->msg_read_len = 0; + data_val->msg_tot_len = 0; + + conversation_add_proto_data(conversation, proto_pop, data_val); + } + } + + if (check_col(pinfo->cinfo, COL_INFO)) { + /* + * Put the first line from the buffer into the summary + * if it's a POP request or reply (but leave out the + * line terminator). + * Otherwise, just call it a continuation. + */ + if (is_continuation) { + length_remaining = tvb_length_remaining(tvb, offset); + col_add_fstr(pinfo->cinfo, COL_INFO, "S: DATA fragment, %d byte%s", + length_remaining, plurality (length_remaining, "", "s")); + } + else + col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s", is_request ? "C" : "S", + format_text(line, linelen)); + } + + if (tree) { + ti = proto_tree_add_item(tree, proto_pop, tvb, offset, -1, FALSE); + pop_tree = proto_item_add_subtree(ti, ett_pop); + + if (is_continuation) { + + if (pop_data_desegment) { + + if (!frame_data) { + + data_val->msg_read_len += tvb_length(tvb); + + frame_data = se_alloc(sizeof(struct pop_proto_data)); + + frame_data->conversation_id = conversation->index; + frame_data->more_frags = data_val->msg_read_len < data_val->msg_tot_len; + + p_add_proto_data(pinfo->fd, proto_pop, frame_data); + } + + frag_msg = fragment_add_seq_next(tvb, 0, pinfo, + frame_data->conversation_id, + pop_data_segment_table, + pop_data_reassembled_table, + tvb_length(tvb), + frame_data->more_frags); + + next_tvb = process_reassembled_data(tvb, offset, pinfo, + "Reassembled DATA", + frag_msg, &pop_data_frag_items, + NULL, pop_tree); + + if (next_tvb) { + + if (imf_handle) + call_dissector(imf_handle, next_tvb, pinfo, tree); + + if (data_val) { + /* we have read everything - reset */ + + data_val->msg_read_len = 0; + data_val->msg_tot_len = 0; + } + pinfo->fragmented = FALSE; + } else { + pinfo->fragmented = TRUE; + } + + } else { + + /* + * Put the whole packet into the tree as data. + */ + call_dissector(data_handle,tvb, pinfo, pop_tree); + + } + return; + } + + /* + * Put the line into the protocol tree. + */ + ti = proto_tree_add_string_format(pop_tree, + (is_request) ? + hf_pop_request : + hf_pop_response, + tvb, offset, + next_offset - offset, + "", "%s", + tvb_format_text(tvb, offset, next_offset - offset)); + reqresp_tree = proto_item_add_subtree(ti, ett_pop_reqresp); + + /* + * Extract the first token, and, if there is a first + * token, add it as the request or reply code. + */ + tokenlen = get_token_len(line, line + linelen, &next_token); + if (tokenlen != 0) { + proto_tree_add_item(reqresp_tree, + (is_request) ? + hf_pop_request_command : + hf_pop_response_indicator, + tvb, offset, tokenlen, FALSE); + + if (data_val) { + if (is_request) { + /* see if this is RETR or TOP command */ + if (g_ascii_strncasecmp(line, "RETR", 4) == 0 || + g_ascii_strncasecmp(line, "TOP", 3) == 0) + /* the next response will tell us how many bytes */ + data_val->msg_request = TRUE; + } else { + if (data_val->msg_request) { + /* this is a response to a RETR or TOP command */ + + if (g_ascii_strncasecmp(line, "+OK ", 4) == 0) { + /* the message will be sent - work out how many bytes */ + data_val->msg_read_len = 0; + data_val->msg_tot_len = atoi(line + 4); + } + data_val->msg_request = FALSE; + } + } + } + + offset += (gint) (next_token - line); + linelen -= (int) (next_token - line); + } + + /* + * Add the rest of the first line as request or + * reply param/description. + */ + if (linelen != 0) { + proto_tree_add_item(reqresp_tree, + (is_request) ? + hf_pop_request_parameter : + hf_pop_response_description, + tvb, offset, linelen, FALSE); + } + offset = next_offset; + + /* + * Show the rest of the request or response as text, + * a line at a time. + */ + while (tvb_offset_exists(tvb, offset)) { + /* + * Find the end of the line. + */ + tvb_find_line_end(tvb, offset, -1, &next_offset, FALSE); + + /* + * Put this line. + */ + proto_tree_add_string_format(pop_tree, + (is_request) ? + hf_pop_request_data : + hf_pop_response_data, + tvb, offset, + next_offset - offset, + "", "%s", + tvb_format_text(tvb, offset, next_offset - offset)); + offset = next_offset; + } + } } static gboolean response_is_continuation(const guchar *data) @@ -374,64 +372,56 @@ proto_register_pop(void) static hf_register_info hf[] = { { &hf_pop_response, { "Response", "pop.response", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_pop_response_indicator, { "Response indicator", "pop.response.indicator", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_pop_response_description, { "Response description", "pop.response.description", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_pop_response_data, { "Data", "pop.response.data", - FT_STRING, BASE_NONE, NULL, 0x0, - "Response Data", HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, "Response Data", HFILL }}, { &hf_pop_request, { "Request", "pop.request", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_pop_request_command, { "Request command", "pop.request.command", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_pop_request_parameter, { "Request parameter", "pop.request.parameter", - FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_pop_request_data, { "Data", "pop.request.data", - FT_STRING, BASE_NONE, NULL, 0x0, - "Request data", HFILL }}, + FT_STRING, BASE_NONE, NULL, 0x0, "Request data", HFILL }}, /* Fragment entries */ { &hf_pop_data_fragments, { "DATA fragments", "pop.data.fragments", FT_NONE, BASE_NONE, - NULL, 0x00, "Message fragments", HFILL } }, + NULL, 0x00, "Message fragments", HFILL } }, { &hf_pop_data_fragment, { "DATA fragment", "pop.data.fragment", FT_FRAMENUM, BASE_NONE, - NULL, 0x00, "Message fragment", HFILL } }, + NULL, 0x00, "Message fragment", HFILL } }, { &hf_pop_data_fragment_overlap, { "DATA fragment overlap", "pop.data.fragment.overlap", FT_BOOLEAN, - BASE_NONE, NULL, 0x0, "Message fragment overlap", HFILL } }, + BASE_NONE, NULL, 0x0, "Message fragment overlap", HFILL } }, { &hf_pop_data_fragment_overlap_conflicts, { "DATA fragment overlapping with conflicting data", - "pop.data.fragment.overlap.conflicts", FT_BOOLEAN, BASE_NONE, NULL, - 0x0, "Message fragment overlapping with conflicting data", HFILL } }, + "pop.data.fragment.overlap.conflicts", FT_BOOLEAN, BASE_NONE, NULL, + 0x0, "Message fragment overlapping with conflicting data", HFILL } }, { &hf_pop_data_fragment_multiple_tails, { "DATA has multiple tail fragments", - "pop.data.fragment.multiple_tails", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Message has multiple tail fragments", HFILL } }, + "pop.data.fragment.multiple_tails", FT_BOOLEAN, BASE_NONE, + NULL, 0x0, "Message has multiple tail fragments", HFILL } }, { &hf_pop_data_fragment_too_long_fragment, { "DATA fragment too long", "pop.data.fragment.too_long_fragment", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, "Message fragment too long", - HFILL } }, + FT_BOOLEAN, BASE_NONE, NULL, 0x0, "Message fragment too long", + HFILL } }, { &hf_pop_data_fragment_error, { "DATA defragmentation error", "pop.data.fragment.error", FT_FRAMENUM, - BASE_NONE, NULL, 0x00, "Message defragmentation error", HFILL } }, + BASE_NONE, NULL, 0x00, "Message defragmentation error", HFILL } }, { &hf_pop_data_reassembled_in, { "Reassembled DATA in frame", "pop.data.reassembled.in", FT_FRAMENUM, BASE_NONE, - NULL, 0x00, "This DATA fragment is reassembled in this frame", HFILL } }, + NULL, 0x00, "This DATA fragment is reassembled in this frame", HFILL } }, }; static gint *ett[] = { |