Diff for /embedaddon/libnet/src/libnet_raw.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2013/07/22 11:54:42 version 1.1.1.3, 2023/09/27 11:11:38
Line 30 Line 30
  *   *
  */   */
   
#if (HAVE_CONFIG_H)#include "common.h"
#include "../include/config.h"
 #ifndef HAVE_SOCKLEN_T
 typedef int socklen_t;
 #endif  #endif
 #if (!(_WIN32) || (__CYGWIN__))   
 #include "../include/libnet.h"  
 #else  
 #include "../include/win32/libnet.h"  
 #endif  
   
   /* TODO this doesn't make any sense, the code in the #else branch is littered
      with conditionals on __WIN32__ that are never reachable, what happened?
      */
 #if defined (__WIN32__)  #if defined (__WIN32__)
 int  int
 libnet_open_raw4(libnet_t *l)  libnet_open_raw4(libnet_t *l)
Line 64  libnet_close_raw6(libnet_t *l) Line 64  libnet_close_raw6(libnet_t *l)
     return (libnet_close_link_interface(l));      return (libnet_close_link_interface(l));
 }  }
 #else  #else
 int  
 libnet_open_raw4(libnet_t *l)  
 {  
     int len; /* now supposed to be socklen_t, but maybe old systems used int? */  
   
   static int libnet_finish_setup_socket(libnet_t *l)
   {
 #if !(__WIN32__)  #if !(__WIN32__)
      int n = 1;       int n = 1;
 #if (__svr4__)  #if (__svr4__)
Line 76  libnet_open_raw4(libnet_t *l) Line 74  libnet_open_raw4(libnet_t *l)
 #else  #else
     int *nptr = &n;      int *nptr = &n;
 #endif  /* __svr4__ */  #endif  /* __svr4__ */
#else #else
         BOOL n;          BOOL n;
 #endif  #endif
       unsigned len;
   
     if (l == NULL)  
     {   
         return (-1);  
     }   
   
     l->fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);  
     if (l->fd == -1)  
     {  
         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,   
                 "%s(): SOCK_RAW allocation failed: %s\n",  
                  __func__, strerror(errno));  
         goto bad;  
     }  
   
 #ifdef IP_HDRINCL  
 /*   
  * man raw  
  *  
  * The IPv4 layer generates an IP header when sending a packet unless  
  * the IP_HDRINCL socket option is enabled on the socket.  When it  
  * is enabled, the packet must contain an IP header.  For  
  * receiving the IP header is always included in the packet.  
  */  
 #if !(__WIN32__)  
     if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, nptr, sizeof(n)) == -1)  
 #else  
     n = TRUE;  
     if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, &n, sizeof(n)) == -1)  
 #endif  
   
     {  
         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,   
                 "%s(): set IP_HDRINCL failed: %s\n",  
                 __func__, strerror(errno));  
         goto bad;  
     }  
 #endif /*  IP_HDRINCL  */  
   
 #ifdef SO_SNDBUF  #ifdef SO_SNDBUF
   
 /*  /*
Line 130  libnet_open_raw4(libnet_t *l) Line 91  libnet_open_raw4(libnet_t *l)
     len = sizeof(n);      len = sizeof(n);
     if (getsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, &len) < 0)      if (getsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, &len) < 0)
     {      {
        snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                 "%s(): get SO_SNDBUF failed: %s\n",                 "%s(): get SO_SNDBUF failed: %s",
                  __func__, strerror(errno));                   __func__, strerror(errno));
         goto bad;          goto bad;
     }      }
           
     for (n += 128; n < 1048576; n += 128)      for (n += 128; n < 1048576; n += 128)
     {      {
        if (setsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, len) < 0)         if (setsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, len) < 0)
         {          {
             if (errno == ENOBUFS)              if (errno == ENOBUFS)
             {              {
                 break;                  break;
             }              }
             snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,              snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                     "%s(): set SO_SNDBUF failed: %s\n",                     "%s(): set SO_SNDBUF failed: %s",
                      __func__, strerror(errno));                       __func__, strerror(errno));
              goto bad;               goto bad;
         }          }
Line 164  libnet_open_raw4(libnet_t *l) Line 125  libnet_open_raw4(libnet_t *l)
     if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, nptr, sizeof(n)) == -1)      if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, nptr, sizeof(n)) == -1)
     {      {
         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,          snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                "%s(): set SO_BROADCAST failed: %s\n",                "%s(): set SO_BROADCAST failed: %s",
                 __func__, strerror(errno));                  __func__, strerror(errno));
         goto bad;          goto bad;
     }      }
 #endif  /*  SO_BROADCAST  */  #endif  /*  SO_BROADCAST  */
   
   #if (__linux__)
       if(l->device != NULL)
           if(setsockopt(l->fd, SOL_SOCKET, SO_BINDTODEVICE, l->device, strlen(l->device)) == -1) {
               snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                   "%s(): set SO_BINDTODEVICE failed: %s", __func__, strerror(errno));
               goto bad;
           }
   #endif  /* __linux__ */
   
       return 0;
   
   bad:
       return (-1);
   }
   
   
   
   
   int
   libnet_open_raw4(libnet_t *l)
   {
   #if !(__WIN32__)
        int n = 1;
   #if (__svr4__)
        void *nptr = &n;
   #else
       int *nptr = &n;
   #endif  /* __svr4__ */
   #else
           BOOL n;
   #endif
   
       if (l == NULL)
       {
           return (-1);
       }
   
       l->fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
       if (l->fd == -1)
       {
           snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                   "%s(): SOCK_RAW allocation failed: %s",
                    __func__, strerror(errno));
           goto bad;
       }
   
   #ifdef IP_HDRINCL
   /*
    * man raw
    *
    * The IPv4 layer generates an IP header when sending a packet unless
    * the IP_HDRINCL socket option is enabled on the socket.  When it
    * is enabled, the packet must contain an IP header.  For
    * receiving the IP header is always included in the packet.
    */
   #if !(__WIN32__)
       if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, nptr, sizeof(n)) == -1)
   #else
       n = TRUE;
       if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, &n, sizeof(n)) == -1)
   #endif
   
       {
           snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
                   "%s(): set IP_HDRINCL failed: %s",
                   __func__, strerror(errno));
           goto bad;
       }
   #endif /*  IP_HDRINCL  */
   
   
       if (libnet_finish_setup_socket(l) == -1)
           goto bad;
   
     return (l->fd);      return (l->fd);
   
 bad:  bad:
    return (-1);        return (-1);
 }  }
   
   
Line 197  int libnet_open_raw6(libnet_t *l) Line 233  int libnet_open_raw6(libnet_t *l)
 int  int
 libnet_open_raw6(libnet_t *l)  libnet_open_raw6(libnet_t *l)
 {  {
 #if !(__WIN32__)  
 #if (__svr4__)  
      int one = 1;  
      void *oneptr = &one;  
 #else  
 #if (__linux__)  
     int one = 1;  
     int *oneptr = &one;  
 #endif  
 #endif  /* __svr4__ */  
 #else  
     BOOL one;  
 #endif  
   
 /* Solaris IPv6 stuff */  
       
     if (l == NULL)      if (l == NULL)
     {       { 
         return (-1);          return (-1);
Line 222  libnet_open_raw6(libnet_t *l) Line 242  libnet_open_raw6(libnet_t *l)
     if (l->fd == -1)      if (l->fd == -1)
     {      {
         snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,           snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, 
                "%s(): SOCK_RAW allocation failed: %s\n", __func__,                "%s(): SOCK_RAW allocation failed: %s", __func__,
                 strerror(errno));                  strerror(errno));
         goto bad;          goto bad;
     }      }
   
#if (__linux__)
    if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, oneptr, sizeof(one)) == -1)    if (libnet_finish_setup_socket(l) == -1)
    { 
        snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, 
                "%s(): set SO_BROADCAST failed: %s\n", __func__, 
                strerror(errno)); 
         goto bad;          goto bad;
     }  
     if(l->device != NULL)  
         if(setsockopt(l->fd, SOL_SOCKET, SO_BINDTODEVICE, l->device, strlen(l->device)) == -1) {  
             snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,  
                 "%s(): set SO_BINDTODEVICE failed: %s\n", __func__, strerror(errno));  
             goto bad;  
         }  
   
 #endif  /* __linux__ */  
     return (l->fd);      return (l->fd);
   
 bad:  bad:
Line 260  libnet_close_raw6(libnet_t *l) Line 268  libnet_close_raw6(libnet_t *l)
     return (close(l->fd));      return (close(l->fd));
 }  }
 #endif  #endif
/* EOF */
 /**
  * Local Variables:
  *  indent-tabs-mode: nil
  *  c-file-style: "stroustrup"
  * End:
  */

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>