- Timestamp:
- Sep 23, 2009 3:15:55 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 52715
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/socket.c
r23178 r23241 542 542 sorecvfrom(PNATState pData, struct socket *so) 543 543 { 544 ssize_t ret = 0; 544 545 struct sockaddr_in addr; 545 546 socklen_t addrlen = sizeof(struct sockaddr_in); … … 568 569 int size; 569 570 #endif 570 int rc = 0;571 int rc = 0; 571 572 static int signaled = 0; 572 573 … … 592 593 { 593 594 rc = ioctlsocket(so->s, FIONREAD, &n); 594 595 if ( (rc == -1) 596 && (errno == EAGAIN 597 || errno == EWOULDBLOCK 598 || errno == EINPROGRESS 599 || errno == ENOTCONN)) 600 { 601 m_free(pData, m); 602 return; 603 } 595 604 if (rc == -1 && signaled == 0) 596 605 { 597 606 LogRel(("NAT: can't fetch amount of bytes on socket %R[natsock], so message will be truncated.\n", so)); 598 607 signaled = 1; 608 m_free(pData, m); 609 return; 599 610 } 600 611 … … 606 617 } 607 618 } 608 m->m_len= recvfrom(so->s, m->m_data, len, 0,619 ret = recvfrom(so->s, m->m_data, len, 0, 609 620 (struct sockaddr *)&addr, &addrlen); 610 621 Log2((" did recvfrom %d, errno = %d-%s\n", … … 652 663 m->m_pkthdr.header = mtod(m, void *); 653 664 m->m_data += sizeof(struct udpiphdr); 654 len= recvfrom(so->s, mtod(m, char *), n, 0,665 ret = recvfrom(so->s, mtod(m, char *), n, 0, 655 666 (struct sockaddr *)&addr, &addrlen); 656 m->m_len = len;657 667 /* @todo (r=vvl) check which flags and type should be passed */ 658 668 #endif 659 if(len < 0) 669 m->m_len = ret; 670 if(ret < 0) 660 671 { 661 672 u_char code = ICMP_UNREACH_PORT; … … 666 677 code = ICMP_UNREACH_NET; 667 678 668 Log2((dfd," rx error, tx icmp ICMP_UNREACH:%i\n", code)); 679 m_free(pData, m); 680 if ( errno == EAGAIN 681 || errno == EWOULDBLOCK 682 || errno == EINPROGRESS 683 || errno == ENOTCONN) 684 { 685 return; 686 } 687 688 Log2((" rx error, tx icmp ICMP_UNREACH:%i\n", code)); 669 689 icmp_error(pData, so->so_m, ICMP_UNREACH, code, 0, strerror(errno)); 670 690 so->so_m = NULL; 671 m_free(pData, m);672 691 } 673 692 else … … 1253 1272 static int signalled = 0; 1254 1273 rc = ioctlsocket(so->s, FIONREAD, &len); 1255 if (rc != -1 && signalled == 0) 1274 if ( rc == -1 1275 && (errno == EAGAIN 1276 || errno == EWOULDBLOCK 1277 || errno == EINPROGRESS 1278 || errno == ENOTCONN)) 1279 { 1280 return; 1281 } 1282 if (rc == -1 && signalled == 0) 1256 1283 { 1257 1284 signalled = 1; 1258 LogRel(("NAT: fetching number of bits has been failed for ICMP socket \n")); 1285 LogRel(("NAT: fetching number of bits has been failed for ICMP socket (%d: %s)\n", 1286 errno, strerror(errno))); 1287 return; 1259 1288 } 1260 1289 len = (len != 0 && rc != -1 ? len : 1500); … … 1266 1295 if (len == -1 || len == 0) 1267 1296 { 1268 u_char code = ICMP_UNREACH_PORT; 1297 u_char code; 1298 if ( len == -1 1299 && (errno == EAGAIN 1300 || errno == EWOULDBLOCK 1301 || errno == EINPROGRESS 1302 || errno == ENOTCONN)) 1303 { 1304 return; 1305 } 1306 code = ICMP_UNREACH_PORT; 1269 1307 1270 1308 if (errno == EHOSTUNREACH) … … 1273 1311 code = ICMP_UNREACH_NET; 1274 1312 1275 DEBUG_MISC((dfd," udp icmp rx errno = %d-%s\n",1313 LogRel((" udp icmp rx errno = %d-%s\n", 1276 1314 errno, strerror(errno))); 1277 1315 icmp_error(pData, so->so_m, ICMP_UNREACH, code, 0, strerror(errno));
Note:
See TracChangeset
for help on using the changeset viewer.