VirtualBox

Changeset 51581 in vbox for trunk/src/VBox/NetworkServices


Ignore:
Timestamp:
Jun 9, 2014 10:32:05 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
94286
Message:

NAT/Net: Start untangling errno vs. winsock mess. Don't refer errno
directly, while here convert some perror() calls to DPRINTFs.

Location:
trunk/src/VBox/NetworkServices/NAT
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/NAT/proxy.c

    r51576 r51581  
    3535#endif
    3636
     37static FNRTSTRFORMATTYPE proxy_sockerr_rtstrfmt;
     38
    3739static SOCKET proxy_create_socket(int, int);
    3840
     
    4244/* XXX: for mapping loopbacks to addresses in our network (ip4) */
    4345struct netif *g_proxy_netif;
     46
     47
    4448/*
    4549 * Called on the lwip thread (aka tcpip thread) from tcpip_init() via
     
    5559    LWIP_UNUSED_ARG(proxy_netif);
    5660
     61    status = RTStrFormatTypeRegister("sockerr", proxy_sockerr_rtstrfmt, NULL);
     62    AssertRC(status);
     63
    5764    g_proxy_options = opts;
    5865    g_proxy_netif = proxy_netif;
     
    99106    }
    100107}
     108
     109
     110#if !defined(RT_OS_WINDOWS)
     111/**
     112 * Formatter for %R[sockerr] - unix strerror_r() version.
     113 */
     114static DECLCALLBACK(size_t)
     115proxy_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 */
     150static DECLCALLBACK(size_t)
     151proxy_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 */
    101226
    102227
     
    300425        status = bind(s, psrc_sa, src_sa_len);
    301426        if (status == SOCKET_ERROR) {
    302             DPRINTF(("socket %d: bind: %s\n", s, strerror(errno)));
     427            DPRINTF(("socket %d: bind: %R[sockerr]\n", s, SOCKERRNO()));
    303428            closesocket(s);
    304429            return INVALID_SOCKET;
     
    307432
    308433    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()));
    311436        closesocket(s);
    312437        return INVALID_SOCKET;
     
    421546        dyniov = (IOVEC *)malloc(clen * sizeof(*dyniov));
    422547        if (dyniov == NULL) {
    423             error = -errno;
     548            error = -errno;     /* sic: not a socket error */
    424549            goto out;
    425550        }
     
    447572
    448573    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     }
    454574#else
    455575    rc = WSASendTo(sock, iov, (DWORD)clen, &nsent, 0,
    456576                   name, (int)namelen, NULL, NULL);
    457577    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    }
    463587
    464588  out:
  • trunk/src/VBox/NetworkServices/NAT/pxdns.c

    r51574 r51581  
    716716
    717717    if (nsent < 0) {
    718         DPRINTF2(("%s: send: errno %d\n", __func__, errno));
     718        DPRINTF2(("%s: send: %R[sockerr]\n", __func__, SOCKERRNO()));
    719719    }
    720720    else {
     
    782782                            SO_ERROR, (char *)&sockerr, &optlen);
    783783        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()));
    786786        }
    787787        else {
    788             DPRINTF(("%s: sock %d: errno %d\n",
     788            DPRINTF(("%s: sock %d: %R[sockerr]\n",
    789789                     __func__, fd, sockerr));
    790790        }
  • trunk/src/VBox/NetworkServices/NAT/pxping.c

    r51575 r51581  
    594594    if (status != 0) {
    595595        int error = -status;
    596         DPRINTF(("%s: sendto errno %d\n", __func__, error));
     596        DPRINTF(("%s: sendto: %R[sockerr]\n", __func__, error));
    597597
    598598#ifdef DF_WITH_IP_HDRINCL
     
    719719    if (status != 0) {
    720720        int error = -status;
    721         DPRINTF(("%s: sendto errno %d\n", __func__, error));
     721        DPRINTF(("%s: sendto: %R[sockerr]\n", __func__, error));
    722722
    723723        status = pbuf_header(p, iphlen); /* back to IP header */
     
    10761076                            SO_ERROR, (char *)&sockerr, &optlen);
    10771077        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()));
    10801080        }
    10811081        else {
    1082             DPRINTF(("%s: sock %d: errno %d\n",
     1082            DPRINTF(("%s: sock %d: %R[sockerr]\n",
    10831083                     __func__, fd, sockerr));
    10841084        }
  • trunk/src/VBox/NetworkServices/NAT/pxtcp.c

    r51574 r51581  
    935935    struct pxtcp *pxtcp = (struct pxtcp *)ctx;
    936936
    937     DPRINTF0(("%s: pxtcp %p, pcb %p, sock %d: errno %d\n",
     937    DPRINTF0(("%s: pxtcp %p, pcb %p, sock %d: %R[sockerr]\n",
    938938              __func__, (void *)pxtcp, (void *)pxtcp->pcb,
    939939              pxtcp->sock, pxtcp->sockerr));
     
    10061006                                  &dst_addr, newpcb->local_port);
    10071007    if (sock == INVALID_SOCKET) {
    1008         sockerr = errno;
     1008        sockerr = SOCKERRNO();
    10091009        goto abort;
    10101010    }
     
    10381038
    10391039  abort:
    1040     DPRINTF0(("%s: pcb %p, sock %d: errno %d\n",
     1040    DPRINTF0(("%s: pcb %p, sock %d: %R[sockerr]\n",
    10411041              __func__, (void *)newpcb, sock, sockerr));
    10421042    pxtcp_pcb_reject(ip_current_netif(), newpcb, p, sockerr);
     
    10801080{
    10811081    struct pxtcp *pxtcp;
    1082     int sockerr;
    10831082
    10841083    pxtcp = (struct pxtcp *)handler->data;
     
    10921091        }
    10931092        else {
    1094             socklen_t optlen = (socklen_t)sizeof(sockerr);
     1093            socklen_t optlen = (socklen_t)sizeof(pxtcp->sockerr);
    10951094            int status;
    10961095            SOCKET s;
     
    10981097            status = getsockopt(pxtcp->sock, SOL_SOCKET, SO_ERROR,
    10991098                                (char *)&pxtcp->sockerr, &optlen);
    1100             if (status < 0) {       /* should not happen */
    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()));
    11031102            }
    11041103            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));
    11121106            }
    11131107            s = pxtcp->sock;
     
    14841478        }
    14851479        else {
     1480            sockerr = SOCKERRNO();
     1481
    14861482            /*
    14871483             * Some errors are really not errors - if we get them,
     
    14891485             * them out here.
    14901486             */
    1491             if (errno != EWOULDBLOCK
    1492                 && errno != EAGAIN
    1493                 && errno != ENOBUFS
    1494                 && errno != ENOMEM
    1495                 && errno != EINTR)
     1487            if (sockerr == EWOULDBLOCK
     1488                || sockerr == EAGAIN
     1489                || sockerr == ENOBUFS
     1490                || sockerr == ENOMEM
     1491                || sockerr == EINTR)
    14961492            {
    1497                 sockerr = errno;
     1493                sockerr = 0;
    14981494            }
    14991495            q = qs;
     
    16401636                            (char *)&sockerr, &optlen);
    16411637        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        }
    16471644        return pxtcp_schedule_reset(pxtcp);
    16481645    }
     
    16601657        if (nread < 0) {
    16611658            sockerr = -(int)nread;
    1662             DPRINTF0(("sock %d: errno %d\n", fd, sockerr));
     1659            DPRINTF0(("sock %d: %R[sockerr]\n", fd, sockerr));
    16631660            return pxtcp_schedule_reset(pxtcp);
    16641661        }
     
    17321729                status = ioctlsocket(fd, FIONREAD, &unread);
    17331730                if (status == SOCKET_ERROR) {
    1734                     perror("FIONREAD");
     1731                    DPRINTF2(("sock %d: FIONREAD: %R[sockerr]\n",
     1732                              fd, SOCKERRNO()));
    17351733                }
    17361734                else {
     
    18551853        return 1;
    18561854    }
    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     }
    18631855    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        }
    18681870    }
    18691871}
     
    22652267                int sockerr = -(int)nread;
    22662268                LWIP_UNUSED_ARG(sockerr);
    2267                 DPRINTF0(("%s: sock %d: errno %d\n",
     2269                DPRINTF0(("%s: sock %d: %R[sockerr]\n",
    22682270                          __func__, pxtcp->sock, sockerr));
    22692271
  • trunk/src/VBox/NetworkServices/NAT/pxudp.c

    r51574 r51581  
    564564                            SO_ERROR, (char *)&sockerr, &optlen);
    565565        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()));
    568568        }
    569569        else {
    570             DPRINTF(("%s: sock %d: errno %d\n",
     570            DPRINTF(("%s: sock %d: %R[sockerr]\n",
    571571                     __func__, pxudp->sock, sockerr));
    572572        }
  • trunk/src/VBox/NetworkServices/NAT/winutils.h

    r51577 r51581  
    3636#  define __func__ __FUNCTION__
    3737#  define __attribute__(x) /* IGNORE */
     38
     39#  define SOCKERRNO() (WSAGetLastError())
    3840
    3941/**
     
    110112#  define SOCKET_ERROR (-1)
    111113
     114#  define SOCKERRNO() (errno)
     115
    112116#  define closesocket(s) close(s)
    113117#  define ioctlsocket(s, req, arg) ioctl((s), (req), (arg))
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette