Home | History | Annotate | Download | only in qemu
      1 /* Copyright (C) 2007-2008 The Android Open Source Project
      2 **
      3 ** This software is licensed under the terms of the GNU General Public
      4 ** License version 2, as published by the Free Software Foundation, and
      5 ** may be copied, distributed, and modified under those terms.
      6 **
      7 ** This program is distributed in the hope that it will be useful,
      8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
      9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 ** GNU General Public License for more details.
     11 */
     12 #include "sockets.h"
     13 #include "qemu-common.h"
     14 #include <fcntl.h>
     15 #include <stddef.h>
     16 #include "qemu_debug.h"
     17 #include "qemu-char.h"
     18 #include <stdlib.h>
     19 #include <string.h>
     20 #include "android/utils/path.h"
     21 #include "android/utils/debug.h"
     22 #include "android/utils/misc.h"
     23 
     24 #define  D(...) VERBOSE_PRINT(socket,__VA_ARGS__)
     25 
     26 #ifdef _WIN32
     27 #  define xxWIN32_LEAN_AND_MEAN
     28 #  include <windows.h>
     29 #  include <winsock2.h>
     30 #  include <ws2tcpip.h>
     31 #else /* !_WIN32 */
     32 #  include <sys/ioctl.h>
     33 #  include <sys/socket.h>
     34 #  include <netinet/in.h>
     35 #  include <netinet/tcp.h>
     36 #  ifdef __linux__ /* Recent versions of glibc only define EAI_NODATA, which is an
     37                       extension to the POSIX standard, if __USE_GNU is defined. */
     38 #    define __USE_GNU
     39 #    include <netdb.h>
     40 #    undef __USE_GNU
     41 #  else /* !__linux__ */
     42 #    include <netdb.h>
     43 #  endif /* !__linux__ */
     44 #  if HAVE_UNIX_SOCKETS
     45 #    include <sys/un.h>
     46 #    ifndef UNIX_PATH_MAX
     47 #      define  UNIX_PATH_MAX  (sizeof(((struct sockaddr_un*)0)->sun_path)-1)
     48 #    endif
     49 #  endif
     50 #endif /* !_WIN32 */
     51 
     52 
     53 
     54 /* QSOCKET_CALL is used to deal with the fact that EINTR happens pretty
     55  * easily in QEMU since we use SIGALRM to implement periodic timers
     56  */
     57 #ifdef _WIN32
     58 #  define  QSOCKET_CALL(_ret,_cmd)   \
     59     do { _ret = (_cmd); } while ( _ret < 0 && WSAGetLastError() == WSAEINTR )
     60 #else
     61 #  define  QSOCKET_CALL(_ret,_cmd)   \
     62     do { \
     63         errno = 0; \
     64         do { _ret = (_cmd); } while ( _ret < 0 && errno == EINTR ); \
     65     } while (0);
     66 #endif
     67 
     68 #ifdef _WIN32
     69 
     70 #include <errno.h>
     71 
     72 static int  winsock_error;
     73 
     74 #define  WINSOCK_ERRORS_LIST \
     75     EE(WSA_INVALID_HANDLE,EINVAL,"invalid handle") \
     76     EE(WSA_NOT_ENOUGH_MEMORY,ENOMEM,"not enough memory") \
     77     EE(WSA_INVALID_PARAMETER,EINVAL,"invalid parameter") \
     78     EE(WSAEINTR,EINTR,"interrupted function call") \
     79     EE(WSAEALREADY,EALREADY,"operation already in progress") \
     80     EE(WSAEBADF,EBADF,"bad file descriptor") \
     81     EE(WSAEACCES,EACCES,"permission denied") \
     82     EE(WSAEFAULT,EFAULT,"bad address") \
     83     EE(WSAEINVAL,EINVAL,"invalid argument") \
     84     EE(WSAEMFILE,EMFILE,"too many opened files") \
     85     EE(WSAEWOULDBLOCK,EWOULDBLOCK,"resource temporarily unavailable") \
     86     EE(WSAEINPROGRESS,EINPROGRESS,"operation now in progress") \
     87     EE(WSAEALREADY,EAGAIN,"operation already in progress") \
     88     EE(WSAENOTSOCK,EBADF,"socket operation not on socket") \
     89     EE(WSAEDESTADDRREQ,EDESTADDRREQ,"destination address required") \
     90     EE(WSAEMSGSIZE,EMSGSIZE,"message too long") \
     91     EE(WSAEPROTOTYPE,EPROTOTYPE,"wrong protocol type for socket") \
     92     EE(WSAENOPROTOOPT,ENOPROTOOPT,"bad protocol option") \
     93     EE(WSAEADDRINUSE,EADDRINUSE,"address already in use") \
     94     EE(WSAEADDRNOTAVAIL,EADDRNOTAVAIL,"cannot assign requested address") \
     95     EE(WSAENETDOWN,ENETDOWN,"network is down") \
     96     EE(WSAENETUNREACH,ENETUNREACH,"network unreachable") \
     97     EE(WSAENETRESET,ENETRESET,"network dropped connection on reset") \
     98     EE(WSAECONNABORTED,ECONNABORTED,"software caused connection abort") \
     99     EE(WSAECONNRESET,ECONNRESET,"connection reset by peer") \
    100     EE(WSAENOBUFS,ENOBUFS,"no buffer space available") \
    101     EE(WSAEISCONN,EISCONN,"socket is already connected") \
    102     EE(WSAENOTCONN,ENOTCONN,"socket is not connected") \
    103     EE(WSAESHUTDOWN,ESHUTDOWN,"cannot send after socket shutdown") \
    104     EE(WSAETOOMANYREFS,ETOOMANYREFS,"too many references") \
    105     EE(WSAETIMEDOUT,ETIMEDOUT,"connection timed out") \
    106     EE(WSAECONNREFUSED,ECONNREFUSED,"connection refused") \
    107     EE(WSAELOOP,ELOOP,"cannot translate name") \
    108     EE(WSAENAMETOOLONG,ENAMETOOLONG,"name too long") \
    109     EE(WSAEHOSTDOWN,EHOSTDOWN,"host is down") \
    110     EE(WSAEHOSTUNREACH,EHOSTUNREACH,"no route to host") \
    111 
    112 typedef struct {
    113     int          winsock;
    114     int          unix;
    115     const char*  string;
    116 } WinsockError;
    117 
    118 static const WinsockError  _winsock_errors[] = {
    119 #define  EE(w,u,s)   { w, u, s },
    120     WINSOCK_ERRORS_LIST
    121 #undef   EE
    122     { -1, -1, NULL }
    123 };
    124 
    125 /* this function reads the latest winsock error code and updates
    126  * errno to a matching value. It also returns the new value of
    127  * errno.
    128  */
    129 static int
    130 _fix_errno( void )
    131 {
    132     const WinsockError*  werr = _winsock_errors;
    133     int                  unix = EINVAL;  /* generic error code */
    134 
    135 	winsock_error = WSAGetLastError();
    136 
    137     for ( ; werr->string != NULL; werr++ ) {
    138         if (werr->winsock == winsock_error) {
    139             unix = werr->unix;
    140             break;
    141         }
    142     }
    143     errno = unix;
    144     return -1;
    145 }
    146 
    147 static int
    148 _set_errno( int  code )
    149 {
    150     winsock_error = -1;
    151     errno         = code;
    152     return -1;
    153 }
    154 
    155 /* this function returns a string describing the latest Winsock error */
    156 const char*
    157 _errno_str(void)
    158 {
    159     const WinsockError*  werr   = _winsock_errors;
    160     const char*          result = NULL;
    161 
    162     for ( ; werr->string; werr++ ) {
    163         if (werr->winsock == winsock_error) {
    164             result = werr->string;
    165             break;
    166         }
    167     }
    168 
    169     if (result == NULL) {
    170         result = tempstr_format(
    171                     "Unkown socket error (Winsock=0x%08x) errno=%d: %s",
    172                     winsock_error, errno, strerror(errno));
    173     }
    174     return result;
    175 }
    176 #else
    177 static int
    178 _fix_errno( void )
    179 {
    180     return -1;
    181 }
    182 
    183 static int
    184 _set_errno( int  code )
    185 {
    186     errno = code;
    187     return -1;
    188 }
    189 #endif
    190 
    191 /* socket types */
    192 
    193 static int
    194 socket_family_to_bsd( SocketFamily  family )
    195 {
    196     switch (family) {
    197     case SOCKET_INET: return AF_INET;
    198     case SOCKET_IN6:  return AF_INET6;
    199 #if HAVE_UNIX_SOCKETS
    200     case SOCKET_UNIX: return AF_LOCAL;
    201 #endif
    202     default: return -1;
    203     }
    204 }
    205 
    206 static int
    207 socket_type_to_bsd( SocketType  type )
    208 {
    209     switch (type) {
    210         case SOCKET_DGRAM:  return SOCK_DGRAM;
    211         case SOCKET_STREAM: return SOCK_STREAM;
    212         default: return 0;
    213     }
    214 }
    215 
    216 static SocketType
    217 socket_type_from_bsd( int  type )
    218 {
    219     switch (type) {
    220         case SOCK_DGRAM:  return SOCKET_DGRAM;
    221         case SOCK_STREAM: return SOCKET_STREAM;
    222         default:          return (SocketType) SOCKET_UNSPEC;
    223     }
    224 }
    225 
    226 #if 0
    227 static int
    228 socket_type_check( SocketType  type )
    229 {
    230     return (type == SOCKET_DGRAM || type == SOCKET_STREAM);
    231 }
    232 #endif
    233 
    234 /* socket addresses */
    235 
    236 void
    237 sock_address_init_inet( SockAddress*  a, uint32_t  ip, uint16_t  port )
    238 {
    239     a->family         = SOCKET_INET;
    240     a->u.inet.port    = port;
    241     a->u.inet.address = ip;
    242 }
    243 
    244 void
    245 sock_address_init_in6 ( SockAddress*  a, const uint8_t*  ip6[16], uint16_t  port )
    246 {
    247     a->family = SOCKET_IN6;
    248     a->u.in6.port = port;
    249     memcpy( a->u.in6.address, ip6, sizeof(a->u.in6.address) );
    250 }
    251 
    252 void
    253 sock_address_init_unix( SockAddress*  a, const char*  path )
    254 {
    255     a->family       = SOCKET_UNIX;
    256     a->u._unix.path  = strdup(path ? path : "");
    257     a->u._unix.owner = 1;
    258 }
    259 
    260 void  sock_address_done( SockAddress*  a )
    261 {
    262     if (a->family == SOCKET_UNIX && a->u._unix.owner) {
    263         a->u._unix.owner = 0;
    264         free((char*)a->u._unix.path);
    265     }
    266 }
    267 
    268 static char*
    269 format_char( char*  buf, char*  end, int  c )
    270 {
    271     if (buf < end) {
    272         if (buf+1 == end) {
    273             *buf++ = 0;
    274         } else {
    275             *buf++ = (char) c;
    276             *buf    = 0;
    277         }
    278     }
    279     return buf;
    280 }
    281 
    282 static char*
    283 format_str( char*  buf, char*  end, const char*  str )
    284 {
    285     int  len   = strlen(str);
    286     int  avail = end - buf;
    287 
    288     if (len > avail)
    289         len = avail;
    290 
    291     memcpy( buf, str, len );
    292     buf += len;
    293 
    294     if (buf == end)
    295         buf[-1] = 0;
    296     else
    297         buf[0] = 0;
    298 
    299     return buf;
    300 }
    301 
    302 static char*
    303 format_unsigned( char*  buf, char*  end, unsigned  val )
    304 {
    305     char  temp[16];
    306     int   nn;
    307 
    308     for ( nn = 0; val != 0; nn++ ) {
    309         int  rem = val % 10;
    310         temp[nn] = '0'+rem;
    311         val /= 10;
    312     }
    313 
    314     if (nn == 0)
    315         temp[nn++] = '0';
    316 
    317     while (nn > 0)
    318         buf = format_char(buf, end, temp[--nn]);
    319 
    320     return buf;
    321 }
    322 
    323 static char*
    324 format_hex( char*  buf, char*  end, unsigned  val, int  ndigits )
    325 {
    326     int   shift = 4*ndigits;
    327     static const char   hex[16] = "0123456789abcdef";
    328 
    329     while (shift >= 0) {
    330         buf = format_char(buf, end, hex[(val >> shift) & 15]);
    331         shift -= 4;
    332     }
    333     return buf;
    334 }
    335 
    336 static char*
    337 format_ip4( char*  buf, char*  end, uint32_t  ip )
    338 {
    339     buf = format_unsigned( buf, end, (unsigned)(ip >> 24) );
    340     buf = format_char( buf, end, '.');
    341     buf = format_unsigned( buf, end, (unsigned)((ip >> 16) & 255));
    342     buf = format_char( buf, end, '.');
    343     buf = format_unsigned( buf, end, (unsigned)((ip >> 8) & 255));
    344     buf = format_char( buf, end, '.');
    345     buf = format_unsigned( buf, end, (unsigned)(ip & 255));
    346     return buf;
    347 }
    348 
    349 static char*
    350 format_ip6( char*  buf, char*  end, const uint8_t*  ip6 )
    351 {
    352     int  nn;
    353     for (nn = 0; nn < 8; nn++) {
    354         int  val = (ip6[0] << 16) | ip6[1];
    355         ip6 += 2;
    356         if (nn > 0)
    357             buf = format_char(buf, end, ':');
    358         if (val == 0)
    359             continue;
    360         buf  = format_hex(buf, end, val, 4);
    361     }
    362     return buf;
    363 }
    364 
    365 const char*
    366 sock_address_to_string( const SockAddress*  a )
    367 {
    368     static char buf0[MAX_PATH];
    369     char *buf = buf0, *end = buf + sizeof(buf0);
    370 
    371     switch (a->family) {
    372     case SOCKET_INET:
    373         buf = format_ip4( buf, end, a->u.inet.address );
    374         buf = format_char( buf, end, ':' );
    375         buf = format_unsigned( buf, end, (unsigned) a->u.inet.port );
    376         break;
    377 
    378     case SOCKET_IN6:
    379         buf = format_ip6( buf, end, a->u.in6.address );
    380         buf = format_char( buf, end, ':' );
    381         buf = format_unsigned( buf, end, (unsigned) a->u.in6.port );
    382         break;
    383 
    384     case SOCKET_UNIX:
    385         buf = format_str( buf, end, a->u._unix.path );
    386         break;
    387 
    388     default:
    389         return NULL;
    390     }
    391 
    392     return buf0;
    393 }
    394 
    395 int
    396 sock_address_equal( const SockAddress*  a, const SockAddress*  b )
    397 {
    398     if (a->family != b->family)
    399         return 0;
    400 
    401     switch (a->family) {
    402     case SOCKET_INET:
    403         return (a->u.inet.address == b->u.inet.address &&
    404                 a->u.inet.port    == b->u.inet.port);
    405 
    406     case SOCKET_IN6:
    407         return (!memcmp(a->u.in6.address, b->u.in6.address, 16) &&
    408                 a->u.in6.port == b->u.in6.port);
    409 
    410     case SOCKET_UNIX:
    411         return (!strcmp(a->u._unix.path, b->u._unix.path));
    412 
    413     default:
    414         return 0;
    415     }
    416 }
    417 
    418 int
    419 sock_address_get_port( const SockAddress*  a )
    420 {
    421     switch (a->family) {
    422     case SOCKET_INET:
    423         return a->u.inet.port;
    424     case SOCKET_IN6:
    425         return a->u.in6.port;
    426     default:
    427         return -1;
    428     }
    429 }
    430 
    431 void
    432 sock_address_set_port( SockAddress*  a, uint16_t  port )
    433 {
    434     switch (a->family) {
    435     case SOCKET_INET:
    436         a->u.inet.port = port;
    437         break;
    438     case SOCKET_IN6:
    439         a->u.in6.port = port;
    440         break;
    441     default:
    442         ;
    443     }
    444 }
    445 
    446 const char*
    447 sock_address_get_path( const SockAddress*  a )
    448 {
    449     if (a->family == SOCKET_UNIX)
    450         return a->u._unix.path;
    451     else
    452         return NULL;
    453 }
    454 
    455 int
    456 sock_address_get_ip( const SockAddress*  a )
    457 {
    458     if (a->family == SOCKET_INET)
    459         return a->u.inet.address;
    460 
    461     return -1;
    462 }
    463 
    464 #if 0
    465 char*
    466 bufprint_sock_address( char*  p, char*  end, const SockAddress*  a )
    467 {
    468     switch (a->family) {
    469     case SOCKET_INET:
    470         {
    471             uint32_t  ip = a->u.inet.address;
    472 
    473             return bufprint( p, end, "%d.%d.%d.%d:%d",
    474                          (ip >> 24) & 255, (ip >> 16) & 255,
    475                          (ip >> 8) & 255, ip & 255,
    476                          a->u.inet.port );
    477         }
    478     case SOCKET_IN6:
    479         {
    480             int             nn     = 0;
    481             const char*     column = "";
    482             const uint8_t*  tab    = a->u.in6.address;
    483             for (nn = 0; nn < 16; nn += 2) {
    484                 p = bufprint(p, end, "%s%04x", column, (tab[n] << 8) | tab[n+1]);
    485                 column = ":";
    486             }
    487             return bufprint(p, end, ":%d", a->u.in6.port);
    488         }
    489     case SOCKET_UNIX:
    490         {
    491             return bufprint(p, end, "%s", a->u._unix.path);
    492         }
    493     default:
    494         return p;
    495     }
    496 }
    497 #endif
    498 
    499 int
    500 sock_address_to_bsd( const SockAddress*  a, void*  paddress, size_t  *psize )
    501 {
    502     switch (a->family) {
    503     case SOCKET_INET:
    504         {
    505             struct sockaddr_in*  dst = (struct sockaddr_in*) paddress;
    506 
    507             *psize = sizeof(*dst);
    508 
    509             memset( paddress, 0, *psize );
    510 
    511             dst->sin_family      = AF_INET;
    512             dst->sin_port        = htons(a->u.inet.port);
    513             dst->sin_addr.s_addr = htonl(a->u.inet.address);
    514         }
    515         break;
    516 
    517 #if HAVE_IN6_SOCKETS
    518     case SOCKET_IN6:
    519         {
    520             struct sockaddr_in6*  dst = (struct sockaddr_in6*) paddress;
    521 
    522             *psize = sizeof(*dst);
    523 
    524             memset( paddress, 0, *psize );
    525 
    526             dst->sin6_family = AF_INET6;
    527             dst->sin6_port   = htons(a->u.in6.port);
    528             memcpy( dst->sin6_addr.s6_addr, a->u.in6.address, 16 );
    529         }
    530         break;
    531 #endif /* HAVE_IN6_SOCKETS */
    532 
    533 #if HAVE_UNIX_SOCKETS
    534     case SOCKET_UNIX:
    535         {
    536             int                  slen = strlen(a->u._unix.path);
    537             struct sockaddr_un*  dst = (struct sockaddr_un*) paddress;
    538 
    539             if (slen >= UNIX_PATH_MAX)
    540                 return -1;
    541 
    542             memset( paddress, 0, sizeof(*dst) );
    543 
    544             dst->sun_family = AF_LOCAL;
    545             memcpy( dst->sun_path, a->u._unix.path, slen );
    546             dst->sun_path[slen] = 0;
    547 
    548             *psize = (char*)&dst->sun_path[slen+1] - (char*)dst;
    549         }
    550         break;
    551 #endif /* HAVE_UNIX_SOCKETS */
    552 
    553     default:
    554         return _set_errno(EINVAL);
    555     }
    556 
    557     return 0;
    558 }
    559 
    560 int
    561 sock_address_to_inet( SockAddress*  a, int  *paddr_ip, int  *paddr_port )
    562 {
    563     struct sockaddr   addr;
    564     socklen_t         addrlen;
    565 
    566     if (a->family != SOCKET_INET) {
    567         return _set_errno(EINVAL);
    568     }
    569 
    570     if (sock_address_to_bsd(a, &addr, &addrlen) < 0)
    571         return -1;
    572 
    573     *paddr_ip   = ntohl(((struct sockaddr_in*)&addr)->sin_addr.s_addr);
    574     *paddr_port = ntohs(((struct sockaddr_in*)&addr)->sin_port);
    575 
    576     return 0;
    577 }
    578 
    579 int
    580 sock_address_from_bsd( SockAddress*  a, const void*  from, size_t  fromlen )
    581 {
    582     switch (((struct sockaddr*)from)->sa_family) {
    583     case AF_INET:
    584         {
    585             struct sockaddr_in*  src = (struct sockaddr_in*) from;
    586 
    587             if (fromlen < sizeof(*src))
    588                 return _set_errno(EINVAL);
    589 
    590             a->family         = SOCKET_INET;
    591             a->u.inet.port    = ntohs(src->sin_port);
    592             a->u.inet.address = ntohl(src->sin_addr.s_addr);
    593         }
    594         break;
    595 
    596 #ifdef HAVE_IN6_SOCKETS
    597     case AF_INET6:
    598         {
    599             struct sockaddr_in6*  src = (struct sockaddr_in6*) from;
    600 
    601             if (fromlen < sizeof(*src))
    602                 return _set_errno(EINVAL);
    603 
    604             a->family     = SOCKET_IN6;
    605             a->u.in6.port = ntohs(src->sin6_port);
    606             memcpy(a->u.in6.address, src->sin6_addr.s6_addr, 16);
    607         }
    608         break;
    609 #endif
    610 
    611 #ifdef HAVE_UNIX_SOCKETS
    612     case AF_LOCAL:
    613         {
    614             struct sockaddr_un*  src = (struct sockaddr_un*) from;
    615             char*                end;
    616 
    617             if (fromlen < sizeof(*src))
    618                 return _set_errno(EINVAL);
    619 
    620             /* check that the path is zero-terminated */
    621             end = memchr(src->sun_path, 0, UNIX_PATH_MAX);
    622             if (end == NULL)
    623                 return _set_errno(EINVAL);
    624 
    625             a->family = SOCKET_UNIX;
    626             a->u._unix.owner = 1;
    627             a->u._unix.path  = strdup(src->sun_path);
    628         }
    629         break;
    630 #endif
    631 
    632     default:
    633         return _set_errno(EINVAL);
    634     }
    635     return 0;
    636 }
    637 
    638 
    639 int
    640 sock_address_init_resolve( SockAddress*  a, const char*  hostname, uint16_t  port, int  preferIn6 )
    641 {
    642     struct addrinfo   hints[1];
    643     struct addrinfo*  res;
    644     int               ret;
    645 
    646     memset(hints, 0, sizeof(hints));
    647     hints->ai_family   = preferIn6 ? AF_INET6 : AF_UNSPEC;
    648 
    649     ret = getaddrinfo(hostname, NULL, hints, &res);
    650     if (ret != 0) {
    651         int  err;
    652 
    653         switch (ret) {
    654         case EAI_AGAIN:  /* server is down */
    655         case EAI_FAIL:   /* server is sick */
    656             err = EHOSTDOWN;
    657             break;
    658 
    659 #ifdef EAI_NODATA
    660         case EAI_NODATA:
    661 #endif
    662         case EAI_NONAME:
    663             err = ENOENT;
    664             break;
    665 
    666         case EAI_MEMORY:
    667             err = ENOMEM;
    668             break;
    669 
    670         default:
    671             err = EINVAL;
    672         }
    673         return _set_errno(err);
    674     }
    675 
    676     /* Parse the returned list of addresses. */
    677     {
    678         struct addrinfo*  res_ipv4 = NULL;
    679         struct addrinfo*  res_ipv6 = NULL;
    680         struct addrinfo*  r;
    681 
    682        /* If preferIn6 is false, we stop on the first IPv4 address,
    683         * otherwise, we stop on the first IPv6 one
    684         */
    685         for (r = res; r != NULL; r = r->ai_next) {
    686             if (r->ai_family == AF_INET && res_ipv4 == NULL) {
    687                 res_ipv4 = r;
    688                 if (!preferIn6)
    689                     break;
    690             }
    691             else if (r->ai_family == AF_INET6 && res_ipv6 == NULL) {
    692                 res_ipv6 = r;
    693                 if (preferIn6)
    694                     break;
    695             }
    696         }
    697 
    698         /* Select the best address in 'r', which will be NULL
    699          * if there is no corresponding address.
    700          */
    701         if (preferIn6) {
    702             r = res_ipv6;
    703             if (r == NULL)
    704                 r = res_ipv4;
    705         } else {
    706             r = res_ipv4;
    707             if (r == NULL)
    708                 r = res_ipv6;
    709         }
    710 
    711         if (r == NULL) {
    712             ret = _set_errno(ENOENT);
    713             goto Exit;
    714         }
    715 
    716         /* Convert to a SockAddress */
    717         ret = sock_address_from_bsd( a, r->ai_addr, r->ai_addrlen );
    718         if (ret < 0)
    719             goto Exit;
    720     }
    721 
    722     /* need to set the port */
    723     switch (a->family) {
    724     case SOCKET_INET: a->u.inet.port = port; break;
    725     case SOCKET_IN6:  a->u.in6.port  = port; break;
    726     default: ;
    727     }
    728 
    729 Exit:
    730     freeaddrinfo(res);
    731     return ret;
    732 }
    733 
    734 /* The Winsock headers for mingw lack some definitions */
    735 #ifndef AI_ADDRCONFIG
    736 #  define  AI_ADDRCONFIG  0
    737 #endif
    738 
    739 SockAddress**
    740 sock_address_list_create( const char*  hostname,
    741                           const char*  port,
    742                           unsigned     flags )
    743 {
    744     SockAddress**    list = NULL;
    745     SockAddress*     addr;
    746     int              nn, count, ret;
    747     struct addrinfo  ai, *res, *e;
    748 
    749     memset(&ai, 0, sizeof(ai));
    750     ai.ai_flags   |= AI_ADDRCONFIG;
    751     ai.ai_family   = PF_UNSPEC;
    752 
    753     if (flags & SOCKET_LIST_FORCE_INET)
    754         ai.ai_family = PF_INET;
    755     else if (flags & SOCKET_LIST_FORCE_IN6)
    756         ai.ai_family = PF_INET6;
    757 
    758     if (flags & SOCKET_LIST_PASSIVE)
    759         ai.ai_flags |= AI_PASSIVE;
    760     else
    761         ai.ai_flags |= AI_CANONNAME;
    762 
    763     while (1) {
    764         struct addrinfo  hints = ai;
    765 
    766         ret = getaddrinfo(hostname, port, &hints, &res);
    767         if (ret == 0)
    768             break;
    769 
    770         switch (ret) {
    771 #ifdef EAI_ADDRFAMILY
    772         case EAI_ADDRFAMILY:
    773 #endif
    774         case EAI_NODATA:
    775             _set_errno(ENOENT);
    776             break;
    777         case EAI_FAMILY:
    778             _set_errno(EAFNOSUPPORT);
    779             break;
    780         case EAI_AGAIN:
    781             _set_errno(EAGAIN);
    782             break;
    783 #ifdef EAI_SYSTEM
    784         case EAI_SYSTEM:
    785             if (errno == EINTR)
    786                 continue;
    787             break;
    788 #endif
    789         default:
    790             _set_errno(EINVAL);
    791         }
    792         return NULL;
    793     }
    794 
    795     /* allocate result list */
    796     for (count = 0, e = res; e != NULL; e = e->ai_next)
    797         count += 1;
    798 
    799     list = (SockAddress**) qemu_malloc((count+1)*sizeof(SockAddress*));
    800     addr = (SockAddress*)  qemu_malloc(count*sizeof(SockAddress));
    801 
    802     for (nn = 0, e = res; e != NULL; e = e->ai_next) {
    803 
    804         ret = sock_address_from_bsd(addr, e->ai_addr, e->ai_addrlen);
    805         if (ret < 0)
    806             continue;
    807 
    808         list[nn++] = addr++;
    809     }
    810     list[nn] = NULL;
    811     freeaddrinfo(res);
    812     return list;
    813 }
    814 
    815 void
    816 sock_address_list_free( SockAddress**  list )
    817 {
    818     int  nn;
    819     SockAddress*  addr;
    820 
    821     if (list == NULL)
    822         return;
    823 
    824     addr = list[0];
    825     for (nn = 0; list[nn] != NULL; nn++) {
    826         sock_address_done(list[nn]);
    827         list[nn] = NULL;
    828     }
    829     qemu_free(addr);
    830     qemu_free(list);
    831 }
    832 
    833 int
    834 sock_address_get_numeric_info( SockAddress*  a,
    835                                char*         host,
    836                                size_t        hostlen,
    837                                char*         serv,
    838                                size_t        servlen )
    839 {
    840     struct sockaddr*  saddr;
    841     socklen_t         slen;
    842     int               ret;
    843 
    844     switch (a->family) {
    845     case SOCKET_INET:
    846         saddr = (struct sockaddr*) &a->u.inet.address;
    847         slen  = sizeof(a->u.inet.address);
    848         break;
    849 
    850 #if HAVE_IN6_SOCKET
    851     case SOCKET_IN6:
    852         saddr = (struct sockaddr*) &a->u.in6.address;
    853         slen  = sizeof(a->u.in6.address);
    854         break;
    855 #endif
    856     default:
    857         return _set_errno(EINVAL);
    858     }
    859 
    860     ret = getnameinfo( saddr, slen, host, hostlen, serv, servlen,
    861                        NI_NUMERICHOST | NI_NUMERICSERV );
    862 
    863     switch (ret) {
    864     case 0:
    865         break;
    866     case EAI_AGAIN:
    867         ret = EAGAIN;
    868         break;
    869     default:
    870         ret = EINVAL;
    871     }
    872     return ret;
    873 }
    874 
    875 int
    876 socket_create( SocketFamily  family, SocketType  type )
    877 {
    878     int   ret;
    879     int   sfamily = socket_family_to_bsd(family);
    880     int   stype   = socket_type_to_bsd(type);
    881 
    882     if (sfamily < 0 || stype < 0) {
    883         return _set_errno(EINVAL);
    884     }
    885 
    886     QSOCKET_CALL(ret, socket(sfamily, stype, 0));
    887     if (ret < 0)
    888         return _fix_errno();
    889 
    890     return ret;
    891 }
    892 
    893 
    894 int
    895 socket_create_inet( SocketType  type )
    896 {
    897     return socket_create( SOCKET_INET, type );
    898 }
    899 
    900 #if HAVE_IN6_SOCKETS
    901 int
    902 socket_create_in6 ( SocketType  type )
    903 {
    904     return socket_create( SOCKET_IN6, type );
    905 }
    906 #endif
    907 
    908 #if HAVE_UNIX_SOCKETS
    909 int
    910 socket_create_unix( SocketType  type )
    911 {
    912     return socket_create( SOCKET_UNIX, type );
    913 }
    914 #endif
    915 
    916 int  socket_can_read(int  fd)
    917 {
    918 #ifdef _WIN32
    919     unsigned long  opt;
    920 
    921     if (ioctlsocket(fd, FIONREAD, &opt) < 0)
    922         return 0;
    923 
    924     return opt;
    925 #else
    926     int  opt;
    927 
    928     if (ioctl(fd, FIONREAD, &opt) < 0)
    929         return 0;
    930 
    931     return opt;
    932 #endif
    933 }
    934 
    935 #define   SOCKET_CALL(cmd)  \
    936     int  ret; \
    937     QSOCKET_CALL(ret, (cmd)); \
    938     if (ret < 0) \
    939         return _fix_errno(); \
    940     return ret; \
    941 
    942 int
    943 socket_send(int  fd, const void*  buf, int  buflen)
    944 {
    945     SOCKET_CALL(send(fd, buf, buflen, 0))
    946 }
    947 
    948 int
    949 socket_send_oob( int  fd, const void*  buf, int  buflen )
    950 {
    951     SOCKET_CALL(send(fd, buf, buflen, MSG_OOB));
    952 }
    953 
    954 int
    955 socket_sendto(int  fd, const void*  buf, int  buflen, const SockAddress*  to)
    956 {
    957     struct sockaddr   sa;
    958     socklen_t         salen;
    959 
    960     if (sock_address_to_bsd(to, &sa, &salen) < 0)
    961         return -1;
    962 
    963     SOCKET_CALL(sendto(fd, buf, buflen, 0, &sa, salen));
    964 }
    965 
    966 int
    967 socket_recv(int  fd, void*  buf, int  len)
    968 {
    969     SOCKET_CALL(recv(fd, buf, len, 0));
    970 }
    971 
    972 int
    973 socket_recvfrom(int  fd, void*  buf, int  len, SockAddress*  from)
    974 {
    975     struct sockaddr   sa;
    976     socklen_t         salen = sizeof(sa);
    977     int               ret;
    978 
    979     QSOCKET_CALL(ret,recvfrom(fd,buf,len,0,&sa,&salen));
    980     if (ret < 0)
    981         return _fix_errno();
    982 
    983     if (sock_address_from_bsd(from, &sa, salen) < 0)
    984         return -1;
    985 
    986     return ret;
    987 }
    988 
    989 int
    990 socket_connect( int  fd, const SockAddress*  address )
    991 {
    992     struct sockaddr   addr;
    993     socklen_t         addrlen;
    994 
    995     if (sock_address_to_bsd(address, &addr, &addrlen) < 0)
    996         return -1;
    997 
    998     SOCKET_CALL(connect(fd,&addr,addrlen));
    999 }
   1000 
   1001 int
   1002 socket_bind( int  fd, const SockAddress*  address )
   1003 {
   1004     struct sockaddr  addr;
   1005     socklen_t        addrlen;
   1006 
   1007     if (sock_address_to_bsd(address, &addr, &addrlen) < 0)
   1008         return -1;
   1009 
   1010     SOCKET_CALL(bind(fd, &addr, addrlen));
   1011 }
   1012 
   1013 int
   1014 socket_get_address( int  fd, SockAddress*  address )
   1015 {
   1016     struct sockaddr   addr;
   1017     socklen_t         addrlen = sizeof(addr);
   1018     int               ret;
   1019 
   1020     QSOCKET_CALL(ret, getsockname(fd, &addr, &addrlen));
   1021     if (ret < 0)
   1022         return _fix_errno();
   1023 
   1024     return sock_address_from_bsd(address, &addr, addrlen);
   1025 }
   1026 
   1027 int
   1028 socket_get_peer_address( int  fd, SockAddress*  address )
   1029 {
   1030     struct sockaddr   addr;
   1031     socklen_t         addrlen = sizeof(addr);
   1032     int               ret;
   1033 
   1034     QSOCKET_CALL(ret, getpeername(fd, &addr, &addrlen));
   1035     if (ret < 0)
   1036         return _fix_errno();
   1037 
   1038     return sock_address_from_bsd(address, &addr, addrlen);
   1039 }
   1040 
   1041 int
   1042 socket_listen( int  fd, int  backlog )
   1043 {
   1044     SOCKET_CALL(listen(fd, backlog));
   1045 }
   1046 
   1047 int
   1048 socket_accept( int  fd, SockAddress*  address )
   1049 {
   1050     struct sockaddr   addr;
   1051     socklen_t         addrlen = sizeof(addr);
   1052     int               ret;
   1053 
   1054     QSOCKET_CALL(ret, accept(fd, &addr, &addrlen));
   1055     if (ret < 0)
   1056         return _fix_errno();
   1057 
   1058     if (address) {
   1059         if (sock_address_from_bsd(address, &addr, addrlen) < 0) {
   1060             socket_close(ret);
   1061             return -1;
   1062         }
   1063     }
   1064     return ret;
   1065 }
   1066 
   1067 static int
   1068 socket_getoption(int  fd, int  domain, int  option, int  defaut)
   1069 {
   1070     int  ret;
   1071     while (1) {
   1072 #ifdef _WIN32
   1073         DWORD opt = (DWORD)-1;
   1074 #else
   1075         int  opt  = -1;
   1076 #endif
   1077         size_t  optlen = sizeof(opt);
   1078         ret = getsockopt(fd, domain, option, (char*)&opt, &optlen);
   1079         if (ret == 0)
   1080             return (int)opt;
   1081         if (errno != EINTR)
   1082             return defaut;
   1083     }
   1084 #undef OPT_CAST
   1085 }
   1086 
   1087 
   1088 SocketType socket_get_type(int fd)
   1089 {
   1090     int   so_type = socket_getoption(fd, SOL_SOCKET, SO_TYPE, -1);
   1091     return socket_type_from_bsd(so_type);
   1092 }
   1093 
   1094 int socket_set_nonblock(int fd)
   1095 {
   1096 #ifdef _WIN32
   1097     unsigned long opt = 1;
   1098     return ioctlsocket(fd, FIONBIO, &opt);
   1099 #else
   1100     int   flags = fcntl(fd, F_GETFL);
   1101     return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
   1102 #endif
   1103 }
   1104 
   1105 int socket_set_blocking(int fd)
   1106 {
   1107 #ifdef _WIN32
   1108     unsigned long opt = 0;
   1109     return ioctlsocket(fd, FIONBIO, &opt);
   1110 #else
   1111     int   flags = fcntl(fd, F_GETFL);
   1112     return fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
   1113 #endif
   1114 }
   1115 
   1116 static int
   1117 socket_setoption(int  fd, int  domain, int  option, int  _flag)
   1118 {
   1119 #ifdef _WIN32
   1120     DWORD  flag = (DWORD) _flag;
   1121 #else
   1122     int    flag = _flag;
   1123 #endif
   1124     return setsockopt( fd, domain, option, (const char*)&flag, sizeof(flag) );
   1125 }
   1126 
   1127 int socket_set_xreuseaddr(int  fd)
   1128 {
   1129 #ifdef _WIN32
   1130    /* on Windows, SO_REUSEADDR is used to indicate that several programs can
   1131     * bind to the same port. this is completely different from the Unix
   1132     * semantics. instead of SO_EXCLUSIVEADDR to ensure that explicitely prevent
   1133     * this.
   1134     */
   1135     return socket_setoption(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, 1);
   1136 #else
   1137     return socket_setoption(fd, SOL_SOCKET, SO_REUSEADDR, 1);
   1138 #endif
   1139 }
   1140 
   1141 
   1142 int socket_set_oobinline(int  fd)
   1143 {
   1144     return socket_setoption(fd, SOL_SOCKET, SO_OOBINLINE, 1);
   1145 }
   1146 
   1147 
   1148 int  socket_set_nodelay(int  fd)
   1149 {
   1150     return socket_setoption(fd, IPPROTO_TCP, TCP_NODELAY, 1);
   1151 }
   1152 
   1153 int socket_set_ipv6only(int  fd)
   1154 {
   1155 /* IPV6_ONLY is only supported since Vista on Windows,
   1156  * and the Mingw headers lack its definition anyway.
   1157  */
   1158 #if defined(_WIN32) && !defined(IPV6_V6ONLY)
   1159 	return 0;
   1160 #else
   1161     return socket_setoption(fd, IPPROTO_IPV6, IPV6_V6ONLY, 1);
   1162 #endif
   1163 }
   1164 
   1165 
   1166 int socket_get_error(int fd)
   1167 {
   1168     return socket_getoption(fd, SOL_SOCKET, SO_ERROR, -1);
   1169 }
   1170 
   1171 #ifdef _WIN32
   1172 #include <stdlib.h>
   1173 
   1174 static void socket_cleanup(void)
   1175 {
   1176     WSACleanup();
   1177 }
   1178 
   1179 int socket_init(void)
   1180 {
   1181     WSADATA Data;
   1182     int ret, err;
   1183 
   1184     ret = WSAStartup(MAKEWORD(2,2), &Data);
   1185     if (ret != 0) {
   1186         err = WSAGetLastError();
   1187         return -1;
   1188     }
   1189     atexit(socket_cleanup);
   1190     return 0;
   1191 }
   1192 
   1193 #else /* !_WIN32 */
   1194 
   1195 int socket_init(void)
   1196 {
   1197    return 0;   /* nothing to do on Unix */
   1198 }
   1199 
   1200 #endif /* !_WIN32 */
   1201 
   1202 #ifdef _WIN32
   1203 
   1204 static void
   1205 socket_close_handler( void*  _fd )
   1206 {
   1207     int   fd = (int)_fd;
   1208     int   ret;
   1209     char  buff[64];
   1210 
   1211     /* we want to drain the read side of the socket before closing it */
   1212     do {
   1213         ret = recv( fd, buff, sizeof(buff), 0 );
   1214     } while (ret < 0 && WSAGetLastError() == WSAEINTR);
   1215 
   1216     if (ret < 0 && WSAGetLastError() == EWOULDBLOCK)
   1217         return;
   1218 
   1219     qemu_set_fd_handler( fd, NULL, NULL, NULL );
   1220     closesocket( fd );
   1221 }
   1222 
   1223 void
   1224 socket_close( int  fd )
   1225 {
   1226     int  old_errno = errno;
   1227 
   1228     shutdown( fd, SD_BOTH );
   1229     /* we want to drain the socket before closing it */
   1230     qemu_set_fd_handler( fd, socket_close_handler, NULL, (void*)fd );
   1231 
   1232     errno = old_errno;
   1233 }
   1234 
   1235 #else /* !_WIN32 */
   1236 
   1237 #include <unistd.h>
   1238 
   1239 void
   1240 socket_close( int  fd )
   1241 {
   1242     int  old_errno = errno;
   1243 
   1244     shutdown( fd, SHUT_RDWR );
   1245     close( fd );
   1246 
   1247     errno = old_errno;
   1248 }
   1249 
   1250 #endif /* !_WIN32 */
   1251 
   1252 
   1253 static int
   1254 socket_bind_server( int  s, const SockAddress*  to, SocketType  type )
   1255 {
   1256     socket_set_xreuseaddr(s);
   1257 
   1258     if (socket_bind(s, to) < 0) {
   1259         D("could not bind server socket address %s: %s",
   1260           sock_address_to_string(to), errno_str);
   1261         goto FAIL;
   1262     }
   1263 
   1264     if (type == SOCKET_STREAM) {
   1265         if (socket_listen(s, 4) < 0) {
   1266             D("could not listen server socket %s: %s",
   1267               sock_address_to_string(to), errno_str);
   1268             goto FAIL;
   1269         }
   1270     }
   1271     return  s;
   1272 
   1273 FAIL:
   1274     socket_close(s);
   1275     return -1;
   1276 }
   1277 
   1278 
   1279 static int
   1280 socket_connect_client( int  s, const SockAddress*  to )
   1281 {
   1282     if (socket_connect(s, to) < 0) {
   1283         D( "could not connect client socket to %s: %s\n",
   1284            sock_address_to_string(to), errno_str );
   1285         socket_close(s);
   1286         return -1;
   1287     }
   1288 
   1289     socket_set_nonblock( s );
   1290     return s;
   1291 }
   1292 
   1293 
   1294 static int
   1295 socket_in_server( int  address, int  port, SocketType  type )
   1296 {
   1297     SockAddress  addr;
   1298     int          s;
   1299 
   1300     sock_address_init_inet( &addr, address, port );
   1301     s = socket_create_inet( type );
   1302     if (s < 0)
   1303         return -1;
   1304 
   1305     return socket_bind_server( s, &addr, type );
   1306 }
   1307 
   1308 
   1309 static int
   1310 socket_in_client( SockAddress*  to, SocketType  type )
   1311 {
   1312     int  s;
   1313 
   1314     s = socket_create_inet( type );
   1315     if (s < 0) return -1;
   1316 
   1317     return socket_connect_client( s, to );
   1318 }
   1319 
   1320 
   1321 int
   1322 socket_loopback_server( int  port, SocketType  type )
   1323 {
   1324     return socket_in_server( SOCK_ADDRESS_INET_LOOPBACK, port, type );
   1325 }
   1326 
   1327 int
   1328 socket_loopback_client( int  port, SocketType  type )
   1329 {
   1330     SockAddress  addr;
   1331 
   1332     sock_address_init_inet( &addr, SOCK_ADDRESS_INET_LOOPBACK, port );
   1333     return socket_in_client( &addr, type );
   1334 }
   1335 
   1336 
   1337 int
   1338 socket_network_client( const char*  host, int  port, SocketType  type )
   1339 {
   1340     SockAddress  addr;
   1341 
   1342     if (sock_address_init_resolve( &addr, host, port, 0) < 0)
   1343         return -1;
   1344 
   1345     return socket_in_client( &addr, type );
   1346 }
   1347 
   1348 
   1349 int
   1350 socket_anyaddr_server( int  port, SocketType  type )
   1351 {
   1352     return socket_in_server( SOCK_ADDRESS_INET_ANY, port, type );
   1353 }
   1354 
   1355 int
   1356 socket_accept_any( int  server_fd )
   1357 {
   1358     int  fd;
   1359 
   1360     QSOCKET_CALL(fd, accept( server_fd, NULL, 0 ));
   1361     if (fd < 0) {
   1362         D( "could not accept client connection from fd %d: %s",
   1363            server_fd, errno_str );
   1364         return -1;
   1365     }
   1366 
   1367     /* set to non-blocking */
   1368     socket_set_nonblock( fd );
   1369     return fd;
   1370 }
   1371 
   1372 
   1373 #if HAVE_UNIX_SOCKETS
   1374 
   1375 int
   1376 socket_unix_server( const char*  name, SocketType  type )
   1377 {
   1378     SockAddress   addr;
   1379     int           s, ret;
   1380 
   1381     s = socket_create_unix( type );
   1382     if (s < 0)
   1383         return -1;
   1384 
   1385     sock_address_init_unix( &addr, name );
   1386 
   1387     do {
   1388         ret = unlink( name );
   1389     } while (ret < 0 && errno == EINTR);
   1390 
   1391     ret = socket_bind_server( s, &addr, type );
   1392 
   1393     sock_address_done( &addr );
   1394     return ret;
   1395 }
   1396 
   1397 int
   1398 socket_unix_client( const char*  name, SocketType  type )
   1399 {
   1400     SockAddress   addr;
   1401     int           s, ret;
   1402 
   1403     s = socket_create_unix(type);
   1404     if (s < 0)
   1405         return -1;
   1406 
   1407     sock_address_init_unix( &addr, name );
   1408 
   1409     ret =  socket_connect_client( s, &addr );
   1410 
   1411     sock_address_done( &addr );
   1412     return ret;
   1413 }
   1414 
   1415 #endif /* HAVE_UNIX_SOCKETS */
   1416 
   1417 
   1418 
   1419 int
   1420 socket_pair(int *fd1, int *fd2)
   1421 {
   1422 #ifndef _WIN32
   1423     int   fds[2];
   1424     int   ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
   1425 
   1426     if (!ret) {
   1427         socket_set_nonblock(fds[0]);
   1428         socket_set_nonblock(fds[1]);
   1429         *fd1 = fds[0];
   1430         *fd2 = fds[1];
   1431     }
   1432     return ret;
   1433 #else /* _WIN32 */
   1434     /* on Windows, select() only works with network sockets, which
   1435      * means we absolutely cannot use Win32 PIPEs to implement
   1436      * socket pairs with the current event loop implementation.
   1437      * We're going to do like Cygwin: create a random pair
   1438      * of localhost TCP sockets and connect them together
   1439      */
   1440     int                 s0, s1, s2, port;
   1441     struct sockaddr_in  sockin;
   1442     socklen_t           len;
   1443 
   1444     /* first, create the 'server' socket.
   1445      * a port number of 0 means 'any port between 1024 and 5000.
   1446      * see Winsock bind() documentation for details */
   1447     s0 = socket_loopback_server( 0, SOCK_STREAM );
   1448     if (s0 < 0)
   1449         return -1;
   1450 
   1451     /* now connect a client socket to it, we first need to
   1452      * extract the server socket's port number */
   1453     len = sizeof sockin;
   1454     if (getsockname(s0, (struct sockaddr*) &sockin, &len) < 0) {
   1455         closesocket (s0);
   1456         return -1;
   1457     }
   1458 
   1459     port = ntohs(sockin.sin_port);
   1460     s2   = socket_loopback_client( port, SOCK_STREAM );
   1461     if (s2 < 0) {
   1462         closesocket(s0);
   1463         return -1;
   1464     }
   1465 
   1466     /* we need to accept the connection on the server socket
   1467      * this will create the second socket for the pair
   1468      */
   1469     len = sizeof sockin;
   1470     s1  = accept(s0, (struct sockaddr*) &sockin, &len);
   1471     if (s1 == INVALID_SOCKET) {
   1472         closesocket (s0);
   1473         closesocket (s2);
   1474         return -1;
   1475     }
   1476     socket_set_nonblock(s1);
   1477 
   1478     /* close server socket */
   1479     closesocket(s0);
   1480     *fd1 = s1;
   1481     *fd2 = s2;
   1482     return 0;
   1483 #endif /* _WIN32 */
   1484 }
   1485 
   1486 
   1487 
   1488 int
   1489 socket_mcast_inet_add_membership( int  s, uint32_t  ip )
   1490 {
   1491     struct ip_mreq imr;
   1492 
   1493     imr.imr_multiaddr.s_addr = htonl(ip);
   1494     imr.imr_interface.s_addr = htonl(INADDR_ANY);
   1495 
   1496     if ( setsockopt( s, IPPROTO_IP, IP_ADD_MEMBERSHIP,
   1497                      (const char *)&imr,
   1498                      sizeof(struct ip_mreq)) < 0 )
   1499     {
   1500         return _fix_errno();
   1501     }
   1502     return 0;
   1503 }
   1504 
   1505 int
   1506 socket_mcast_inet_drop_membership( int  s, uint32_t  ip )
   1507 {
   1508     struct ip_mreq imr;
   1509 
   1510     imr.imr_multiaddr.s_addr = htonl(ip);
   1511     imr.imr_interface.s_addr = htonl(INADDR_ANY);
   1512 
   1513     if ( setsockopt( s, IPPROTO_IP, IP_DROP_MEMBERSHIP,
   1514                      (const char *)&imr,
   1515                      sizeof(struct ip_mreq)) < 0 )
   1516     {
   1517         return _fix_errno();
   1518     }
   1519     return 0;
   1520 }
   1521 
   1522 int
   1523 socket_mcast_inet_set_loop( int  s, int  enabled )
   1524 {
   1525     return socket_setoption( s, IPPROTO_IP, IP_MULTICAST_LOOP, !!enabled );
   1526 }
   1527 
   1528 int
   1529 socket_mcast_inet_set_ttl( int  s, int  ttl )
   1530 {
   1531     return socket_setoption( s, IPPROTO_IP, IP_MULTICAST_TTL, ttl );
   1532 }
   1533 
   1534 
   1535 char*
   1536 host_name( void )
   1537 {
   1538     static char buf[256];  /* 255 is the max host name length supported by DNS */
   1539     int         ret;
   1540 
   1541     QSOCKET_CALL(ret, gethostname(buf, sizeof(buf)));
   1542 
   1543     if (ret < 0)
   1544         return "localhost";
   1545     else
   1546         return buf;
   1547 }
   1548