diff options
author | João Valverde <joao.valverde@tecnico.ulisboa.pt> | 2019-11-07 23:11:00 +0000 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2019-11-11 17:17:36 +0000 |
commit | 5d18c9b4dffb6733e90b5205bccabcf18d8fa04a (patch) | |
tree | 2bc538d12f16a29c983402bff8390181067c95b5 /dumpcap.c | |
parent | d7d1686a95868d5df1f8e2ba5e6097c622ba1b64 (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.c | 51 |
1 files changed, 10 insertions, 41 deletions
@@ -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 |