aboutsummaryrefslogtreecommitdiffstats
path: root/dumpcap.c
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2019-11-07 23:11:00 +0000
committerJoão Valverde <j@v6e.pt>2019-11-11 17:17:36 +0000
commit5d18c9b4dffb6733e90b5205bccabcf18d8fa04a (patch)
tree2bc538d12f16a29c983402bff8390181067c95b5 /dumpcap.c
parentd7d1686a95868d5df1f8e2ba5e6097c622ba1b64 (diff)
dumpcap: Add support for TCP@IPv6 socket captures
Bug: 15820 Change-Id: Id32f376190c115b0808ba72e5b63e019e2a70274 Reviewed-on: https://code.wireshark.org/review/35030 Petri-Dish: João Valverde <j@v6e.pt> Tested-by: Petri Dish Buildbot Reviewed-by: João Valverde <j@v6e.pt>
Diffstat (limited to 'dumpcap.c')
-rw-r--r--dumpcap.c51
1 files changed, 10 insertions, 41 deletions
diff --git a/dumpcap.c b/dumpcap.c
index e15a796aed..429460d682 100644
--- a/dumpcap.c
+++ b/dumpcap.c
@@ -1379,44 +1379,20 @@ cap_pipe_select(int pipe_fd)
static int
cap_open_socket(char *pipename, capture_src *pcap_src, char *errmsg, size_t errmsgl)
{
- char *sockname = pipename + 4;
- struct sockaddr_in sa;
- char buf[16];
- char *p;
- unsigned long port;
- size_t len;
+ struct sockaddr_storage sa;
int fd;
- memset(&sa, 0, sizeof(sa));
-
- p = strchr(sockname, ':');
- if (p == NULL) {
- len = strlen(sockname);
- port = DEF_TCP_PORT;
- }
- else {
- len = p - sockname;
- port = strtoul(p + 1, &p, 10);
- if (*p || port > 65535) {
- goto fail_invalid;
- }
- }
-
- if (len > 15) {
- goto fail_invalid;
- }
-
- g_snprintf ( buf,(gulong)len + 1, "%s", sockname );
- buf[len] = '\0';
- if (!ws_inet_pton4(buf, (guint32 *)&sa.sin_addr)) {
- goto fail_invalid;
+ /* Skip the initial "TCP@" in the pipename. */
+ if (ws_socket_ptoa(&sa, pipename + 4, DEF_TCP_PORT) < 0) {
+ g_snprintf(errmsg, (gulong)errmsgl,
+ "The capture session could not be initiated because"
+ "\"%s\" is not a valid socket specification", pipename);
+ pcap_src->cap_pipe_err = PIPERR;
+ return -1;
}
- sa.sin_family = AF_INET;
- sa.sin_port = g_htons((u_short)port);
-
- if (((fd = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0) ||
- (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0)) {
+ if ((fd = (int)socket(sa.ss_family, SOCK_STREAM, 0)) < 0 ||
+ connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
g_snprintf(errmsg, (gulong)errmsgl,
"The capture session could not be initiated due to the socket error: \n"
#ifdef _WIN32
@@ -1433,13 +1409,6 @@ cap_open_socket(char *pipename, capture_src *pcap_src, char *errmsg, size_t errm
pcap_src->from_cap_socket = TRUE;
return fd;
-
-fail_invalid:
- g_snprintf(errmsg, (gulong)errmsgl,
- "The capture session could not be initiated because\n"
- "\"%s\" is not a valid socket specification", pipename);
- pcap_src->cap_pipe_err = PIPERR;
- return -1;
}
/* Wrapper: distinguish between closesocket on Windows; use ws_close