| 
version 1.1, 2012/02/21 22:14:23
 | 
version 1.1.1.3, 2023/09/27 11:11:38
 | 
| 
 Line 1
 | 
 Line 1
 | 
 |  /* | 
  /* | 
 |   *  $Id$ | 
   | 
 |   * | 
   | 
 |   *  libnet | 
   *  libnet | 
 |   *  libnet_write.c - writes a prebuilt packet to the network | 
   *  libnet_write.c - writes a prebuilt packet to the network | 
 |   * | 
   * | 
 |   *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com> | 
   *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com> | 
 |   *  All rights reserved. | 
   *  All rights reserved. | 
|  *  win32 specific code  |  *  win32 specific code | 
 |   *  Copyright (c) 2002 - 2003 Roberto Larcher <roberto.larcher@libero.it> | 
   *  Copyright (c) 2002 - 2003 Roberto Larcher <roberto.larcher@libero.it> | 
 |   * | 
   * | 
 |   * Redistribution and use in source and binary forms, with or without | 
   * Redistribution and use in source and binary forms, with or without | 
| 
 Line 32
 | 
 Line 30
 | 
 |   * | 
   * | 
 |   */ | 
   */ | 
 |   | 
   | 
| #if (HAVE_CONFIG_H) | #include "common.h" | 
| #include "../include/config.h" |   | 
| #endif |   | 
| #if (!(_WIN32) || (__CYGWIN__))  |   | 
| #include "../include/libnet.h" |   | 
| #else |   | 
| #include "../include/win32/libnet.h" |   | 
| #include "../include/win32/config.h" |   | 
| #include "packet32.h" |   | 
| #include "Ntddndis.h" |   | 
| #endif |   | 
 |   | 
   | 
 |  int | 
  int | 
 |  libnet_write(libnet_t *l) | 
  libnet_write(libnet_t *l) | 
 |  { | 
  { | 
 |      int c; | 
      int c; | 
|     u_int32_t len; |     uint32_t len; | 
|     u_int8_t *packet = NULL; |     uint8_t *packet = NULL; | 
 |   | 
   | 
 |      if (l == NULL) | 
      if (l == NULL) | 
|     {  |     { | 
 |          return (-1); | 
          return (-1); | 
 |      } | 
      } | 
 |   | 
   | 
| 
 Line 72  libnet_write(libnet_t *l)
 | 
 Line 60  libnet_write(libnet_t *l)
 | 
 |              if (len > LIBNET_MAX_PACKET) | 
              if (len > LIBNET_MAX_PACKET) | 
 |              { | 
              { | 
 |                  snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
                  snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
|                         "%s(): packet is too large (%d bytes)\n", |                         "%s(): packet is too large (%d bytes)", | 
 |                          __func__, len); | 
                          __func__, len); | 
 |                  goto done; | 
                  goto done; | 
 |              } | 
              } | 
| 
 Line 88  libnet_write(libnet_t *l)
 | 
 Line 76  libnet_write(libnet_t *l)
 | 
 |              break; | 
              break; | 
 |          default: | 
          default: | 
 |              snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
              snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
|                         "%s(): unsuported injection type\n", __func__); |                         "%s(): unsupported injection type", __func__); | 
 |              goto done; | 
              goto done; | 
 |      } | 
      } | 
 |   | 
   | 
| 
 Line 125  done:
 | 
 Line 113  done:
 | 
 |   | 
   | 
 |  #if defined (__WIN32__) | 
  #if defined (__WIN32__) | 
 |  libnet_ptag_t | 
  libnet_ptag_t | 
| libnet_win32_build_fake_ethernet(u_int8_t *dst, u_int8_t *src, u_int16_t type, | libnet_win32_build_fake_ethernet (uint8_t *dst, uint8_t *src, uint16_t type, | 
| u_int8_t *payload, u_int32_t payload_s, u_int8_t *packet, libnet_t *l, |                                   const uint8_t *payload, uint32_t payload_s, | 
| libnet_ptag_t ptag) |                                   uint8_t *packet, libnet_t *l, libnet_ptag_t ptag) | 
 |  { | 
  { | 
 |      struct libnet_ethernet_hdr eth_hdr; | 
      struct libnet_ethernet_hdr eth_hdr; | 
 |   | 
   | 
| 
 Line 136  libnet_ptag_t ptag)
 | 
 Line 124  libnet_ptag_t ptag)
 | 
 |          return (-1); | 
          return (-1); | 
 |      } | 
      } | 
 |   | 
   | 
|     memset(ð_hdr, 0, sizeof(eth_hdr));   |     memset(ð_hdr, 0, sizeof(eth_hdr)); | 
 |      eth_hdr.ether_type = htons(type); | 
      eth_hdr.ether_type = htons(type); | 
 |      memcpy(eth_hdr.ether_dhost, dst, ETHER_ADDR_LEN);  /* destination address */ | 
      memcpy(eth_hdr.ether_dhost, dst, ETHER_ADDR_LEN);  /* destination address */ | 
 |      memcpy(eth_hdr.ether_shost, src, ETHER_ADDR_LEN);  /* source address */ | 
      memcpy(eth_hdr.ether_shost, src, ETHER_ADDR_LEN);  /* source address */ | 
| 
 Line 154  libnet_ptag_t ptag)
 | 
 Line 142  libnet_ptag_t ptag)
 | 
 |  } | 
  } | 
 |   | 
   | 
 |  libnet_ptag_t | 
  libnet_ptag_t | 
| libnet_win32_build_fake_token(u_int8_t *dst, u_int8_t *src, u_int16_t type, | libnet_win32_build_fake_token (uint8_t *dst, uint8_t *src, uint16_t type, | 
| u_int8_t *payload, u_int32_t payload_s, u_int8_t *packet, libnet_t *l, |                                const uint8_t *payload, uint32_t payload_s, | 
| libnet_ptag_t ptag) |                                uint8_t *packet, libnet_t *l, libnet_ptag_t ptag) | 
 |  { | 
  { | 
 |      struct libnet_token_ring_hdr token_ring_hdr; | 
      struct libnet_token_ring_hdr token_ring_hdr; | 
|     |  | 
 |      if (!packet) | 
      if (!packet) | 
 |      { | 
      { | 
 |          return (-1); | 
          return (-1); | 
 |      } | 
      } | 
 |   | 
   | 
|     memset(&token_ring_hdr, 0, sizeof(token_ring_hdr));  |     memset(&token_ring_hdr, 0, sizeof(token_ring_hdr)); | 
 |      token_ring_hdr.token_ring_access_control    = 0x10; | 
      token_ring_hdr.token_ring_access_control    = 0x10; | 
 |      token_ring_hdr.token_ring_frame_control     = 0x40; | 
      token_ring_hdr.token_ring_frame_control     = 0x40; | 
 |      token_ring_hdr.token_ring_llc_dsap          = 0xaa; | 
      token_ring_hdr.token_ring_llc_dsap          = 0xaa; | 
 |      token_ring_hdr.token_ring_llc_ssap          = 0xaa; | 
      token_ring_hdr.token_ring_llc_ssap          = 0xaa; | 
 |      token_ring_hdr.token_ring_llc_control_field = 0x03; | 
      token_ring_hdr.token_ring_llc_control_field = 0x03; | 
 |      token_ring_hdr.token_ring_type              = htons(type); | 
      token_ring_hdr.token_ring_type              = htons(type); | 
|     memcpy(token_ring_hdr.token_ring_dhost, dst, ETHER_ADDR_LEN);  |     memcpy(token_ring_hdr.token_ring_dhost, dst, ETHER_ADDR_LEN); | 
|     memcpy(token_ring_hdr.token_ring_shost, libnet_get_hwaddr(l),  |     memcpy(token_ring_hdr.token_ring_shost, libnet_get_hwaddr(l), | 
|            ETHER_ADDR_LEN);  |            ETHER_ADDR_LEN); | 
|      |  | 
 |      if (payload && payload_s) | 
      if (payload && payload_s) | 
 |      { | 
      { | 
 |          /* | 
          /* | 
| 
 Line 188  libnet_ptag_t ptag)
 | 
 Line 176  libnet_ptag_t ptag)
 | 
 |      return (1); | 
      return (1); | 
 |  } | 
  } | 
 |   | 
   | 
 |   | 
   | 
 |  int | 
  int | 
| libnet_win32_write_raw_ipv4(libnet_t *l, u_int8_t *payload, u_int32_t payload_s) | libnet_win32_write_raw_ipv4(libnet_t *l, const uint8_t *payload, uint32_t payload_s) | 
| {     | { | 
 |      static BYTE dst[ETHER_ADDR_LEN]; | 
      static BYTE dst[ETHER_ADDR_LEN]; | 
 |      static BYTE src[ETHER_ADDR_LEN]; | 
      static BYTE src[ETHER_ADDR_LEN]; | 
 |           | 
   | 
 |      u_int8_t *packet      = NULL; | 
   | 
 |      u_int32_t packet_s; | 
   | 
 |   | 
   | 
|     LPPACKET lpPacket   = NULL; |     uint8_t *packet; | 
|     DWORD remoteip      = 0; |     uint32_t packet_s; | 
|     DWORD BytesTransfered; |  | 
|   |     DWORD remoteip = 0; | 
 |      NetType type; | 
      NetType type; | 
 |      struct libnet_ipv4_hdr *ip_hdr = NULL; | 
      struct libnet_ipv4_hdr *ip_hdr = NULL; | 
|          |  | 
 |      memset(dst, 0, sizeof(dst)); | 
      memset(dst, 0, sizeof(dst)); | 
 |      memset(src, 0, sizeof(src)); | 
      memset(src, 0, sizeof(src)); | 
 |   | 
   | 
 |      packet_s = payload_s + l->link_offset; | 
      packet_s = payload_s + l->link_offset; | 
|     packet = (u_int8_t *)malloc(packet_s); |     packet = (uint8_t*) alloca(packet_s); | 
|     if (packet == NULL) |  | 
|   |     /* we have to do the IP checksum | 
|   |      * FIXME: warning is correct, checksum modifies its input. | 
|   |      *        Fix is to build checksum inside the allocated 'packet' | 
|   |      */ | 
|   |     if (libnet_inet_checksum(l, (uint8_t*)payload, IPPROTO_IP, LIBNET_IPV4_H, payload, payload+payload_s) == -1) | 
 |      { | 
      { | 
 |          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
   | 
 |                  "%s(): failed to allocate packet\n", __func__); | 
   | 
 |          return (-1); | 
   | 
 |      } | 
   | 
 |           | 
   | 
 |      /* we have to do the IP checksum  */ | 
   | 
 |      if (libnet_do_checksum(l, payload, IPPROTO_IP, LIBNET_IPV4_H) == -1) | 
   | 
 |      { | 
   | 
 |          /* error msg set in libnet_do_checksum */ | 
          /* error msg set in libnet_do_checksum */ | 
 |          return (-1); | 
          return (-1); | 
|     }  |     } | 
 |   | 
   | 
 |      /* MACs, IPs and other stuff... */ | 
      /* MACs, IPs and other stuff... */ | 
 |      ip_hdr = (struct libnet_ipv4_hdr *)payload; | 
      ip_hdr = (struct libnet_ipv4_hdr *)payload; | 
 |      memcpy(src, libnet_get_hwaddr(l), sizeof(src)); | 
      memcpy(src, libnet_get_hwaddr(l), sizeof(src)); | 
 |      remoteip = ip_hdr->ip_dst.S_un.S_addr; | 
      remoteip = ip_hdr->ip_dst.S_un.S_addr; | 
|                  |  | 
 |      /* check if the remote station is the local station */ | 
      /* check if the remote station is the local station */ | 
 |      if (remoteip == libnet_get_ipaddr4(l)) | 
      if (remoteip == libnet_get_ipaddr4(l)) | 
 |      { | 
      { | 
| 
 Line 239  libnet_win32_write_raw_ipv4(libnet_t *l, u_int8_t *pay
 | 
 Line 221  libnet_win32_write_raw_ipv4(libnet_t *l, u_int8_t *pay
 | 
 |      } | 
      } | 
 |   | 
   | 
 |      PacketGetNetType(l->lpAdapter, &type); | 
      PacketGetNetType(l->lpAdapter, &type); | 
|          |  | 
 |      switch(type.LinkType) | 
      switch(type.LinkType) | 
 |      { | 
      { | 
 |          case NdisMedium802_3: | 
          case NdisMedium802_3: | 
| 
 Line 257  libnet_win32_write_raw_ipv4(libnet_t *l, u_int8_t *pay
 | 
 Line 239  libnet_win32_write_raw_ipv4(libnet_t *l, u_int8_t *pay
 | 
 |          case NdisMediumArcnet878_2: | 
          case NdisMediumArcnet878_2: | 
 |          default: | 
          default: | 
 |              snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
              snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
|                 "%s(): network type (%d) is not supported\n", __func__, |                 "%s(): network type (%d) is not supported", __func__, | 
 |                  type.LinkType); | 
                  type.LinkType); | 
 |              return (-1); | 
              return (-1); | 
 |              break; | 
   | 
 |      }     | 
   | 
 |   | 
   | 
 |      BytesTransfered = -1; | 
   | 
 |      if ((lpPacket = PacketAllocatePacket()) == NULL) | 
   | 
 |      { | 
   | 
 |          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
   | 
 |                  "%s(): failed to allocate the LPPACKET structure\n", __func__); | 
   | 
 |              return (-1); | 
   | 
 |      } | 
      } | 
|      |     return libnet_write_link (l, packet, packet_s); | 
|     PacketInitPacket(lpPacket, packet, packet_s); |   | 
 |   | 
|     /* PacketSendPacket returns a BOOLEAN */ |   | 
|     if (PacketSendPacket(l->lpAdapter, lpPacket, TRUE)) |   | 
|     { |   | 
|         BytesTransfered = packet_s; |   | 
|     } |   | 
 |   | 
|     PacketFreePacket(lpPacket); |   | 
|     free(packet); |   | 
 |   | 
|     return (BytesTransfered); |   | 
 |  } | 
  } | 
 |   | 
   | 
 |  int | 
  int | 
| libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u_int32_t size) | libnet_write_raw_ipv4(libnet_t *l, const uint8_t *packet, uint32_t size) | 
 |  { | 
  { | 
 |      return (libnet_win32_write_raw_ipv4(l, packet, size)); | 
      return (libnet_win32_write_raw_ipv4(l, packet, size)); | 
 |  } | 
  } | 
 |   | 
   | 
 |  int | 
  int | 
| libnet_write_raw_ipv6(libnet_t *l, u_int8_t *packet, u_int32_t size) | libnet_write_raw_ipv6(libnet_t *l, const uint8_t *packet, uint32_t size) | 
 |  { | 
  { | 
 |      /* no difference in win32 */ | 
      /* no difference in win32 */ | 
 |      return (libnet_write_raw_ipv4(l, packet, size)); | 
      return (libnet_write_raw_ipv4(l, packet, size)); | 
| 
 Line 301  libnet_write_raw_ipv6(libnet_t *l, u_int8_t *packet, u
 | 
 Line 262  libnet_write_raw_ipv6(libnet_t *l, u_int8_t *packet, u
 | 
 |  #else /* __WIN32__ */ | 
  #else /* __WIN32__ */ | 
 |   | 
   | 
 |  int | 
  int | 
| libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u_int32_t size) | libnet_write_raw_ipv4(libnet_t *l, const uint8_t *packet, uint32_t size) | 
 |  { | 
  { | 
 |      int c; | 
      int c; | 
 |      struct sockaddr_in sin; | 
      struct sockaddr_in sin; | 
 |      struct libnet_ipv4_hdr *ip_hdr; | 
      struct libnet_ipv4_hdr *ip_hdr; | 
 |   | 
   | 
 |      if (l == NULL) | 
      if (l == NULL) | 
|     {  |     { | 
 |          return (-1); | 
          return (-1); | 
|     }  |     } | 
 |   | 
   | 
 |      ip_hdr = (struct libnet_ipv4_hdr *)packet; | 
      ip_hdr = (struct libnet_ipv4_hdr *)packet; | 
 |   | 
   | 
| 
 Line 318  libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u
 | 
 Line 279  libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u
 | 
 |      /* | 
      /* | 
 |       *  For link access, we don't need to worry about the inconsistencies of | 
       *  For link access, we don't need to worry about the inconsistencies of | 
 |       *  certain BSD kernels.  However, raw socket nuances abound.  Certain | 
       *  certain BSD kernels.  However, raw socket nuances abound.  Certain | 
|      *  BSD implmentations require the ip_len and ip_off fields to be in host |      *  BSD implementations require the ip_len and ip_off fields to be in host | 
 |       *  byte order. | 
       *  byte order. | 
 |       */ | 
       */ | 
 |      ip_hdr->ip_len = FIX(ip_hdr->ip_len); | 
      ip_hdr->ip_len = FIX(ip_hdr->ip_len); | 
| 
 Line 328  libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u
 | 
 Line 289  libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u
 | 
 |      memset(&sin, 0, sizeof(sin)); | 
      memset(&sin, 0, sizeof(sin)); | 
 |      sin.sin_family  = AF_INET; | 
      sin.sin_family  = AF_INET; | 
 |      sin.sin_addr.s_addr = ip_hdr->ip_dst.s_addr; | 
      sin.sin_addr.s_addr = ip_hdr->ip_dst.s_addr; | 
 |  #if (__WIN32__) | 
   | 
 |      /* set port for TCP */ | 
   | 
 |      /* | 
   | 
 |       *  XXX - should first check to see if there's a pblock for a TCP | 
   | 
 |       *  header, if not we can use a dummy value for the port. | 
   | 
 |       */ | 
   | 
 |      if (ip_hdr->ip_p == 6) | 
   | 
 |      { | 
   | 
 |          struct libnet_tcp_hdr *tcph_p = | 
   | 
 |                  (struct libnet_tcp_hdr *)(packet + (ip_hdr->ip_hl << 2)); | 
   | 
 |          sin.sin_port = tcph_p->th_dport; | 
   | 
 |      } | 
   | 
 |      /* set port for UDP */ | 
   | 
 |      /* | 
   | 
 |       *  XXX - should first check to see if there's a pblock for a UDP | 
   | 
 |       *  header, if not we can use a dummy value for the port. | 
   | 
 |       */ | 
   | 
 |      else if (ip_hdr->ip_p == 17) | 
   | 
 |      { | 
   | 
 |          struct libnet_udp_hdr *udph_p = | 
   | 
 |                  (struct libnet_udp_hdr *)(packet + (ip_hdr->ip_hl << 2)); | 
   | 
 |         sin.sin_port = udph_p->uh_dport; | 
   | 
 |      } | 
   | 
 |  #endif /* __WIN32__ */ | 
   | 
 |   | 
   | 
 |      c = sendto(l->fd, packet, size, 0, (struct sockaddr *)&sin, | 
      c = sendto(l->fd, packet, size, 0, (struct sockaddr *)&sin, | 
|             sizeof(struct sockaddr)); |             sizeof(sin)); | 
 |   | 
   | 
 |  #if (LIBNET_BSD_BYTE_SWAP) | 
  #if (LIBNET_BSD_BYTE_SWAP) | 
 |      ip_hdr->ip_len = UNFIX(ip_hdr->ip_len); | 
      ip_hdr->ip_len = UNFIX(ip_hdr->ip_len); | 
| 
 Line 363  libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u
 | 
 Line 300  libnet_write_raw_ipv4(libnet_t *l, u_int8_t *packet, u
 | 
 |   | 
   | 
 |      if (c != size) | 
      if (c != size) | 
 |      { | 
      { | 
 |  #if !(__WIN32__) | 
   | 
 |          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
|                 "%s(): %d bytes written (%s)\n", __func__, c, |                 "%s(): %d bytes written (%s)", __func__, c, | 
 |                  strerror(errno)); | 
                  strerror(errno)); | 
 |  #else /* __WIN32__ */ | 
   | 
 |          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
   | 
 |                  "%s(): %d bytes written (%d)\n", __func__, c, | 
   | 
 |                  WSAGetLastError()); | 
   | 
 |  #endif /* !__WIN32__ */ | 
   | 
 |      } | 
      } | 
 |      return (c); | 
      return (c); | 
 |  } | 
  } | 
 |   | 
   | 
 |  int | 
  int | 
| libnet_write_raw_ipv6(libnet_t *l, u_int8_t *packet, u_int32_t size) | libnet_write_raw_ipv6(libnet_t *l, const uint8_t *packet, uint32_t size) | 
 |  { | 
  { | 
 |   | 
      int c = -1; | 
 |   | 
   | 
 |  #if defined HAVE_SOLARIS && !defined HAVE_SOLARIS_IPV6 | 
  #if defined HAVE_SOLARIS && !defined HAVE_SOLARIS_IPV6 | 
|     snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, "%s(): no IPv6 support\n", |     snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, "%s(): no IPv6 support", | 
 |              __func__, strerror(errno)); | 
              __func__, strerror(errno)); | 
 |      return (-1); | 
   | 
 |  } | 
   | 
 |  #else | 
  #else | 
 |      int c; | 
   | 
 |      struct sockaddr_in6 sin; | 
      struct sockaddr_in6 sin; | 
 |      struct libnet_ipv6_hdr *ip_hdr; | 
      struct libnet_ipv6_hdr *ip_hdr; | 
 |   | 
   | 
 |      if (l == NULL) | 
      if (l == NULL) | 
|     {  |     { | 
 |          return (-1); | 
          return (-1); | 
|     }  |     } | 
 |   | 
   | 
 |      ip_hdr = (struct libnet_ipv6_hdr *)packet; | 
      ip_hdr = (struct libnet_ipv6_hdr *)packet; | 
 |   | 
   | 
| 
 Line 400  libnet_write_raw_ipv6(libnet_t *l, u_int8_t *packet, u
 | 
 Line 330  libnet_write_raw_ipv6(libnet_t *l, u_int8_t *packet, u
 | 
 |      sin.sin6_family  = AF_INET6; | 
      sin.sin6_family  = AF_INET6; | 
 |      memcpy(sin.sin6_addr.s6_addr, ip_hdr->ip_dst.libnet_s6_addr, | 
      memcpy(sin.sin6_addr.s6_addr, ip_hdr->ip_dst.libnet_s6_addr, | 
 |              sizeof(ip_hdr->ip_dst.libnet_s6_addr)); | 
              sizeof(ip_hdr->ip_dst.libnet_s6_addr)); | 
|         |  | 
 |      c = sendto(l->fd, packet, size, 0, (struct sockaddr *)&sin, sizeof(sin)); | 
      c = sendto(l->fd, packet, size, 0, (struct sockaddr *)&sin, sizeof(sin)); | 
 |      if (c != size) | 
      if (c != size) | 
 |      { | 
      { | 
 |  #if !(__WIN32__) | 
   | 
 |          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
|                 "%s(): %d bytes written (%s)\n", __func__, c, |                 "%s(): %d bytes written (%s)", __func__, c, | 
 |                  strerror(errno)); | 
                  strerror(errno)); | 
 |  #else /* __WIN32__ */ | 
   | 
 |          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, | 
   | 
 |                  "%s(): %d bytes written (%d)\n", __func__, c, | 
   | 
 |                  WSAGetLastError()); | 
   | 
 |  #endif /* !__WIN32__ */ | 
   | 
 |      } | 
      } | 
 |   | 
  #endif  /* HAVE_SOLARIS && !HAVE_SOLARIS_IPV6 */ | 
 |      return (c); | 
      return (c); | 
 |  } | 
  } | 
| #endif | #endif /* __WIN32__ */ | 
| #endif  |  | 
| /* EOF */ | /** | 
|   |  * Local Variables: | 
|   |  *  indent-tabs-mode: nil | 
|   |  *  c-file-style: "stroustrup" | 
|   |  * End: | 
|   |  */ |