Changeset 51581 in vbox for trunk/src/VBox/NetworkServices
- Timestamp:
- Jun 9, 2014 10:32:05 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 94286
- Location:
- trunk/src/VBox/NetworkServices/NAT
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/NetworkServices/NAT/proxy.c
r51576 r51581 35 35 #endif 36 36 37 static FNRTSTRFORMATTYPE proxy_sockerr_rtstrfmt; 38 37 39 static SOCKET proxy_create_socket(int, int); 38 40 … … 42 44 /* XXX: for mapping loopbacks to addresses in our network (ip4) */ 43 45 struct netif *g_proxy_netif; 46 47 44 48 /* 45 49 * Called on the lwip thread (aka tcpip thread) from tcpip_init() via … … 55 59 LWIP_UNUSED_ARG(proxy_netif); 56 60 61 status = RTStrFormatTypeRegister("sockerr", proxy_sockerr_rtstrfmt, NULL); 62 AssertRC(status); 63 57 64 g_proxy_options = opts; 58 65 g_proxy_netif = proxy_netif; … … 99 106 } 100 107 } 108 109 110 #if !defined(RT_OS_WINDOWS) 111 /** 112 * Formatter for %R[sockerr] - unix strerror_r() version. 113 */ 114 static DECLCALLBACK(size_t) 115 proxy_sockerr_rtstrfmt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, 116 const char *pszType, const void *pvValue, 117 int cchWidth, int cchPrecision, unsigned int fFlags, 118 void *pvUser) 119 { 120 const int error = (int)(intptr_t)pvValue; 121 size_t cb = 0; 122 123 const char *msg = NULL; 124 char buf[128]; 125 126 NOREF(cchWidth); 127 NOREF(cchPrecision); 128 NOREF(fFlags); 129 NOREF(pvUser); 130 131 AssertReturn(strcmp(pszType, "sockerr") == 0, 0); 132 133 /* make sure return type mismatch is caught */ 134 #if defined(RT_OS_LINUX) && defined(_GNU_SOURCE) 135 msg = strerror_r(error, buf, sizeof(buf)); 136 #else 137 { 138 int status = strerror_r(error, buf, sizeof(buf)); 139 msg = buf; 140 } 141 #endif 142 return RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, "%s", msg); 143 } 144 145 #else /* RT_OS_WINDOWS */ 146 147 /** 148 * Formatter for %R[sockerr] - windows FormatMessage() version. 149 */ 150 static DECLCALLBACK(size_t) 151 proxy_sockerr_rtstrfmt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, 152 const char *pszType, const void *pvValue, 153 int cchWidth, int cchPrecision, unsigned int fFlags, 154 void *pvUser) 155 { 156 const int error = (int)(intptr_t)pvValue; 157 size_t cb = 0; 158 159 NOREF(cchWidth); 160 NOREF(cchPrecision); 161 NOREF(fFlags); 162 NOREF(pvUser); 163 164 AssertReturn(strcmp(pszType, "sockerr") == 0, 0); 165 166 /* 167 * XXX: Windows strerror() doesn't handle posix error codes, but 168 * since winsock uses its own, it shouldn't be much of a problem. 169 * If you see a strange error message, it's probably from 170 * FormatMessage() for an error from <WinError.h> that has the 171 * same numeric value. 172 */ 173 if (error < _sys_nerr) { 174 char buf[128] = ""; 175 int status; 176 177 status = strerror_s(buf, sizeof(buf), error); 178 if (status == 0) { 179 if (strcmp(buf, "Unknown error") == 0) { 180 /* windows strerror() doesn't add the numeric value */ 181 cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, 182 "Unknown error: %d", error); 183 } 184 else { 185 cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, 186 "%s", buf); 187 } 188 } 189 else { 190 cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, 191 "Unknown error: %d", error); 192 } 193 } 194 else { 195 DWORD nchars; 196 char *msg = NULL; 197 198 nchars = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM 199 | FORMAT_MESSAGE_ALLOCATE_BUFFER, 200 NULL, error, LANG_NEUTRAL, 201 (LPSTR)&msg, 0, 202 NULL); 203 if (nchars <= 0 || msg == NULL) { 204 cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, 205 "Unknown error: %d", error); 206 } 207 else { 208 /* FormatMessage() "helpfully" adds newline; get rid of it */ 209 char *crpos = strchr(msg, '\r'); 210 if (crpos != NULL) { 211 *crpos = '\0'; 212 } 213 214 cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, 215 "%s", msg); 216 } 217 218 if (msg != NULL) { 219 LocalFree(msg); 220 } 221 } 222 223 return cb; 224 } 225 #endif /* RT_OS_WINDOWS */ 101 226 102 227 … … 300 425 status = bind(s, psrc_sa, src_sa_len); 301 426 if (status == SOCKET_ERROR) { 302 DPRINTF(("socket %d: bind: % s\n", s, strerror(errno)));427 DPRINTF(("socket %d: bind: %R[sockerr]\n", s, SOCKERRNO())); 303 428 closesocket(s); 304 429 return INVALID_SOCKET; … … 307 432 308 433 status = connect(s, pdst_sa, dst_sa_len); 309 if (status == SOCKET_ERROR && errno!= EINPROGRESS) {310 DPRINTF(("socket %d: connect: % s\n", s, strerror(errno)));434 if (status == SOCKET_ERROR && SOCKERRNO() != EINPROGRESS) { 435 DPRINTF(("socket %d: connect: %R[sockerr]\n", s, SOCKERRNO())); 311 436 closesocket(s); 312 437 return INVALID_SOCKET; … … 421 546 dyniov = (IOVEC *)malloc(clen * sizeof(*dyniov)); 422 547 if (dyniov == NULL) { 423 error = -errno; 548 error = -errno; /* sic: not a socket error */ 424 549 goto out; 425 550 } … … 447 572 448 573 nsent = sendmsg(sock, &mh, 0); 449 if (nsent < 0) {450 error = -errno;451 DPRINTF(("%s: fd %d: sendmsg errno %d\n",452 __func__, sock, errno));453 }454 574 #else 455 575 rc = WSASendTo(sock, iov, (DWORD)clen, &nsent, 0, 456 576 name, (int)namelen, NULL, NULL); 457 577 if (rc == SOCKET_ERROR) { 458 DPRINTF(("%s: fd %d: sendmsg errno %d\n", 459 __func__, sock, WSAGetLastError())); 460 error = -WSAGetLastError(); 461 } 462 #endif 578 nsent = -1; 579 } 580 #endif 581 if (nsent < 0) { 582 error = SOCKERRNO(); 583 DPRINTF(("%s: socket %d: sendmsg: %R[sockerr]\n", 584 __func__, sock, error)); 585 error = -error; 586 } 463 587 464 588 out: -
trunk/src/VBox/NetworkServices/NAT/pxdns.c
r51574 r51581 716 716 717 717 if (nsent < 0) { 718 DPRINTF2(("%s: send: errno %d\n", __func__, errno));718 DPRINTF2(("%s: send: %R[sockerr]\n", __func__, SOCKERRNO())); 719 719 } 720 720 else { … … 782 782 SO_ERROR, (char *)&sockerr, &optlen); 783 783 if (status < 0) { 784 DPRINTF(("%s: sock %d: SO_ERROR failed with errno %d\n",785 __func__, fd, errno));784 DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n", 785 __func__, fd, SOCKERRNO())); 786 786 } 787 787 else { 788 DPRINTF(("%s: sock %d: errno %d\n",788 DPRINTF(("%s: sock %d: %R[sockerr]\n", 789 789 __func__, fd, sockerr)); 790 790 } -
trunk/src/VBox/NetworkServices/NAT/pxping.c
r51575 r51581 594 594 if (status != 0) { 595 595 int error = -status; 596 DPRINTF(("%s: sendto errno %d\n", __func__, error));596 DPRINTF(("%s: sendto: %R[sockerr]\n", __func__, error)); 597 597 598 598 #ifdef DF_WITH_IP_HDRINCL … … 719 719 if (status != 0) { 720 720 int error = -status; 721 DPRINTF(("%s: sendto errno %d\n", __func__, error));721 DPRINTF(("%s: sendto: %R[sockerr]\n", __func__, error)); 722 722 723 723 status = pbuf_header(p, iphlen); /* back to IP header */ … … 1076 1076 SO_ERROR, (char *)&sockerr, &optlen); 1077 1077 if (status < 0) { 1078 DPRINTF(("%s: sock %d: SO_ERROR failed with errno %d\n",1079 __func__, fd, errno));1078 DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n", 1079 __func__, fd, SOCKERRNO())); 1080 1080 } 1081 1081 else { 1082 DPRINTF(("%s: sock %d: errno %d\n",1082 DPRINTF(("%s: sock %d: %R[sockerr]\n", 1083 1083 __func__, fd, sockerr)); 1084 1084 } -
trunk/src/VBox/NetworkServices/NAT/pxtcp.c
r51574 r51581 935 935 struct pxtcp *pxtcp = (struct pxtcp *)ctx; 936 936 937 DPRINTF0(("%s: pxtcp %p, pcb %p, sock %d: errno %d\n",937 DPRINTF0(("%s: pxtcp %p, pcb %p, sock %d: %R[sockerr]\n", 938 938 __func__, (void *)pxtcp, (void *)pxtcp->pcb, 939 939 pxtcp->sock, pxtcp->sockerr)); … … 1006 1006 &dst_addr, newpcb->local_port); 1007 1007 if (sock == INVALID_SOCKET) { 1008 sockerr = errno;1008 sockerr = SOCKERRNO(); 1009 1009 goto abort; 1010 1010 } … … 1038 1038 1039 1039 abort: 1040 DPRINTF0(("%s: pcb %p, sock %d: errno %d\n",1040 DPRINTF0(("%s: pcb %p, sock %d: %R[sockerr]\n", 1041 1041 __func__, (void *)newpcb, sock, sockerr)); 1042 1042 pxtcp_pcb_reject(ip_current_netif(), newpcb, p, sockerr); … … 1080 1080 { 1081 1081 struct pxtcp *pxtcp; 1082 int sockerr;1083 1082 1084 1083 pxtcp = (struct pxtcp *)handler->data; … … 1092 1091 } 1093 1092 else { 1094 socklen_t optlen = (socklen_t)sizeof( sockerr);1093 socklen_t optlen = (socklen_t)sizeof(pxtcp->sockerr); 1095 1094 int status; 1096 1095 SOCKET s; … … 1098 1097 status = getsockopt(pxtcp->sock, SOL_SOCKET, SO_ERROR, 1099 1098 (char *)&pxtcp->sockerr, &optlen); 1100 if (status < 0) { 1101 sockerr = errno; /* ??? */1102 perror("connect: getsockopt");1099 if (status < 0) { /* should not happen */ 1100 DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n", 1101 __func__, fd, SOCKERRNO())); 1103 1102 } 1104 1103 else { 1105 #ifndef RT_OS_WINDOWS 1106 errno = pxtcp->sockerr; /* to avoid strerror_r */ 1107 #else 1108 /* see winutils.h */ 1109 WSASetLastError(pxtcp->sockerr); 1110 #endif 1111 perror("connect"); 1104 DPRINTF(("%s: sock %d: connect: %R[sockerr]\n", 1105 __func__, fd, pxtcp->sockerr)); 1112 1106 } 1113 1107 s = pxtcp->sock; … … 1484 1478 } 1485 1479 else { 1480 sockerr = SOCKERRNO(); 1481 1486 1482 /* 1487 1483 * Some errors are really not errors - if we get them, … … 1489 1485 * them out here. 1490 1486 */ 1491 if ( errno != EWOULDBLOCK1492 && errno != EAGAIN1493 && errno != ENOBUFS1494 && errno != ENOMEM1495 && errno != EINTR)1487 if (sockerr == EWOULDBLOCK 1488 || sockerr == EAGAIN 1489 || sockerr == ENOBUFS 1490 || sockerr == ENOMEM 1491 || sockerr == EINTR) 1496 1492 { 1497 sockerr = errno;1493 sockerr = 0; 1498 1494 } 1499 1495 q = qs; … … 1640 1636 (char *)&sockerr, &optlen); 1641 1637 if (status < 0) { /* should not happen */ 1642 perror("getsockopt"); 1643 sockerr = ECONNRESET; 1644 } 1645 1646 DPRINTF0(("sock %d: errno %d\n", fd, sockerr)); 1638 DPRINTF(("sock %d: SO_ERROR failed: %R[sockerr]\n", 1639 fd, SOCKERRNO())); 1640 } 1641 else { 1642 DPRINTF0(("sock %d: %R[sockerr]\n", fd, sockerr)); 1643 } 1647 1644 return pxtcp_schedule_reset(pxtcp); 1648 1645 } … … 1660 1657 if (nread < 0) { 1661 1658 sockerr = -(int)nread; 1662 DPRINTF0(("sock %d: errno %d\n", fd, sockerr));1659 DPRINTF0(("sock %d: %R[sockerr]\n", fd, sockerr)); 1663 1660 return pxtcp_schedule_reset(pxtcp); 1664 1661 } … … 1732 1729 status = ioctlsocket(fd, FIONREAD, &unread); 1733 1730 if (status == SOCKET_ERROR) { 1734 perror("FIONREAD"); 1731 DPRINTF2(("sock %d: FIONREAD: %R[sockerr]\n", 1732 fd, SOCKERRNO())); 1735 1733 } 1736 1734 else { … … 1855 1853 return 1; 1856 1854 } 1857 else if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) {1858 /* haven't read anything, just return */1859 DPRINTF2(("pxtcp %p: sock %d read cancelled\n",1860 (void *)pxtcp, pxtcp->sock));1861 return 0;1862 }1863 1855 else { 1864 /* socket error! */ 1865 DPRINTF0(("pxtcp %p: sock %d read errno %d\n", 1866 (void *)pxtcp, pxtcp->sock, errno)); 1867 return -errno; 1856 int sockerr = SOCKERRNO(); 1857 1858 if (sockerr == EWOULDBLOCK || sockerr == EAGAIN || sockerr == EINTR) { 1859 /* haven't read anything, just return */ 1860 DPRINTF2(("pxtcp %p: sock %d read cancelled\n", 1861 (void *)pxtcp, pxtcp->sock)); 1862 return 0; 1863 } 1864 else { 1865 /* socket error! */ 1866 DPRINTF0(("pxtcp %p: sock %d read: %R[sockerr]\n", 1867 (void *)pxtcp, pxtcp->sock, sockerr)); 1868 return -sockerr; 1869 } 1868 1870 } 1869 1871 } … … 2265 2267 int sockerr = -(int)nread; 2266 2268 LWIP_UNUSED_ARG(sockerr); 2267 DPRINTF0(("%s: sock %d: errno %d\n",2269 DPRINTF0(("%s: sock %d: %R[sockerr]\n", 2268 2270 __func__, pxtcp->sock, sockerr)); 2269 2271 -
trunk/src/VBox/NetworkServices/NAT/pxudp.c
r51574 r51581 564 564 SO_ERROR, (char *)&sockerr, &optlen); 565 565 if (status < 0) { 566 DPRINTF(("%s: sock %d: SO_ERROR failed with errno %d\n",567 __func__, pxudp->sock, errno));566 DPRINTF(("%s: sock %d: SO_ERROR failed:%R[sockerr]\n", 567 __func__, pxudp->sock, SOCKERRNO())); 568 568 } 569 569 else { 570 DPRINTF(("%s: sock %d: errno %d\n",570 DPRINTF(("%s: sock %d: %R[sockerr]\n", 571 571 __func__, pxudp->sock, sockerr)); 572 572 } -
trunk/src/VBox/NetworkServices/NAT/winutils.h
r51577 r51581 36 36 # define __func__ __FUNCTION__ 37 37 # define __attribute__(x) /* IGNORE */ 38 39 # define SOCKERRNO() (WSAGetLastError()) 38 40 39 41 /** … … 110 112 # define SOCKET_ERROR (-1) 111 113 114 # define SOCKERRNO() (errno) 115 112 116 # define closesocket(s) close(s) 113 117 # define ioctlsocket(s, req, arg) ioctl((s), (req), (arg))
Note:
See TracChangeset
for help on using the changeset viewer.