udpdump: fix recvfrom error on windows.

Change-Id: Ia88d00593163b1c1e9a0e120aeff5e36f0135474
Reviewed-on: https://code.wireshark.org/review/20319
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
This commit is contained in:
Dario Lombardo 2017-03-01 11:32:24 +01:00 committed by Alexis La Goutte
parent 9157e4035d
commit 929e0e897c
1 changed files with 19 additions and 2 deletions

View File

@ -123,7 +123,9 @@ static int setup_listener(const guint16 port, socket_handle_t* sock)
{
int optval;
struct sockaddr_in serveraddr;
#ifndef _WIN32
struct timeval timeout = { 1, 0 };
#endif
*sock = socket(AF_INET, SOCK_DGRAM, 0);
@ -138,10 +140,12 @@ static int setup_listener(const guint16 port, socket_handle_t* sock)
goto cleanup_setup_listener;
}
#ifndef _WIN32
if (setsockopt (*sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, (socklen_t)sizeof(timeout)) < 0) {
g_warning("Can't set socket option SO_RCVTIMEO: %s", strerror(errno));
goto cleanup_setup_listener;
}
#endif
memset(&serveraddr, 0x0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
@ -298,7 +302,7 @@ static int dump_packet(const char* proto_name, const guint16 listenport, const c
static void run_listener(const char* fifo, const guint16 port, const char* proto_name)
{
struct sockaddr_in clientaddr;
int clientlen = 0;
int clientlen = sizeof(clientaddr);
socket_handle_t sock;
char buf[PKT_BUF_SIZE];
ssize_t buflen;
@ -330,7 +334,20 @@ static void run_listener(const char* fifo, const guint16 port, const char* proto
case EINTR:
break;
default:
g_warning("Error in recvfrom: %s %d", strerror(errno), errno);
#ifdef _WIN32
{
wchar_t *errmsg = NULL;
int err = WSAGetLastError();
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&errmsg, 0, NULL);
g_warning("Error in recvfrom: %S (err=%d)", errmsg, err);
LocalFree(errmsg);
}
#else
g_warning("Error in recvfrom: %s (errno=%d)", strerror(errno), errno);
#endif
run_loop = FALSE;
break;
}