summaryrefslogtreecommitdiff
path: root/security/openvas/files/patch-misc_pcap.c
blob: 13deb13373769fbec77fb4f9986cbce59aa47236 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
--- misc/pcap.c	2022-02-22 05:32:53.000000000 -0500
+++ misc/pcap.c	2022-05-21 23:28:28.467854000 -0500
@@ -38,6 +38,13 @@
 #include <sys/ioctl.h>
 #include <sys/param.h>
 #include <sys/types.h>
+#if defined __FreeBSD__
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <errno.h>
+#endif
 #include <unistd.h>
 
 #define MAXROUTES 1024
@@ -1196,8 +1203,84 @@
         }
       else
         {
+#if defined(__FreeBSD__)
+          void * addr_ptr;
+          struct sockaddr * sockaddr_ptr;
+          struct ifaddrs * ifaddrs_ptr;
+          int status;
+          char address[INET6_ADDRSTRLEN];
+          unsigned long tmp;
+
+          status = getifaddrs (& ifaddrs_ptr);
+          if(status == -1) {
+            g_debug("Error in 'getifaddrs': %d (%s)\n",
+                 errno, strerror (errno));
+            exit (1);
+          }
+
+          while (ifaddrs_ptr) 
+	  {
+            if (ifaddrs_ptr->ifa_addr->sa_family == AF_INET) 
+	    {
+              strncpy (iface, ifaddrs_ptr->ifa_name, sizeof (iface));
+              iface[MAX_IFACE_NAME_LEN - 1] = '\0';
+
+              sockaddr_ptr = ifaddrs_ptr->ifa_dstaddr;
+              addr_ptr = &((struct sockaddr_in *)  sockaddr_ptr)->sin_addr;
+
+              inet_ntop (ifaddrs_ptr->ifa_addr->sa_family,
+                          addr_ptr,
+                          address, sizeof (address));
+
+	      endptr = NULL;
+              tmp = strtoul (address, &endptr, 16);
+	      myroutes[numroutes].dest = tmp;
+
+              endptr = NULL;
+              tmp = strtol ("0", &endptr, 10);
+              myroutes[numroutes].metric = tmp;
+
+              sockaddr_ptr = ifaddrs_ptr->ifa_netmask;
+              addr_ptr = &((struct sockaddr_in *)  sockaddr_ptr)->sin_addr;
+
+              inet_ntop (ifaddrs_ptr->ifa_addr->sa_family,
+                          addr_ptr,
+                          address, sizeof (address));
+
+	      endptr = NULL;
+              tmp = strtoul (address, &endptr, 16);
+              myroutes[numroutes].mask = tmp;
+
+              g_debug("#%d: for dev %s, The dest is %lX and the mask is %lX",
+                     numroutes, iface, myroutes[numroutes].dest,
+                     myroutes[numroutes].mask);
+
+              for (i = 0; i < numinterfaces; i++)
+                if (!strcmp (iface, mydevs[i].name))
+                {
+                  myroutes[numroutes].dev = &mydevs[i];
+                  break;
+                }
+
+              if (i == numinterfaces)
+                g_message (
+                    "Failed to find interface %s",
+                    iface);
+              
+	      numroutes++;
+              
+	      if (numroutes >= MAXROUTES)
+              {
+                g_message ("You seem to have WAY to many routes!");
+                break;
+              }		
+	    }
+	    ifaddrs_ptr = ifaddrs_ptr->ifa_next;
+    	  }
+#else        
           g_message ("Could not read from /proc/net/route");
           return NULL;
+#endif          
         }
     }
   else