aboutsummaryrefslogtreecommitdiffstats
path: root/security/skip/files/patch-co
blob: f82d4dae0ae9efd7b64669ff8f8cf541c992e76a (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
diff -ur --unidirectional-new-file skipsrc-1.0.orig/skip/tools/lib/skip_freebsd.c work.new/skip/tools/lib/skip_freebsd.c
--- skipsrc-1.0.orig/skip/tools/lib/skip_freebsd.c  Fri Oct 25 13:13:02 1996
+++ work.new/skip/tools/lib/skip_freebsd.c  Mon Mar  8 21:33:38 1999
@@ -235,7 +235,7 @@
 char *
 skip_default_if()
 {
-#define    SKIP_DEFAULT_IF     "eth0"  /* 3com 3c589 */
+#define    SKIP_DEFAULT_IF     "ed1"
    static char     devname[MAXPATHLEN];
    char            cbuf[sizeof(struct ifreq) * 16];
    struct ifconf       ifc;
@@ -244,6 +244,7 @@
    struct sockaddr_in  *sa;
    char            hostname[MAXHOSTNAMELEN];
    int         s, n;
+   int         goodness = 0;
 
    strcpy(devname, SKIP_DEFAULT_IF);
 
@@ -253,11 +254,13 @@
 
    hp = _skip_gethostbyname(hostname);
 
+#if 0
    if (hp == NULL) {
        return(devname);
    }
+#endif
 
-   if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+   if ((s = socket(PF_INET, SOCK_RAW, 0)) < 0) {
        return (devname);
    }
 
@@ -276,33 +279,37 @@
     * just in case the primary can't be found.
     * 
     */
-   end = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
-   while (ifr < end) {
+   for (end = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len),
+       ifr = ifc.ifc_req;
+     ifr < end;
+     ifr = (struct ifreq *)
+       ((char *) &ifr->ifr_addr + ifr->ifr_addr.sa_len))
+   {
+       int newgoodness = 0;
 
        strcpy(ifflags.ifr_name, ifr->ifr_name);
        if (ioctl(s, SIOCGIFFLAGS, (char *) &ifflags) < 0) {
-           /*goto out;*/
+           continue;
        }
        if ((ifflags.ifr_flags & (IFF_LOOPBACK|IFF_UP|IFF_RUNNING)) ==
                    (IFF_UP|IFF_RUNNING)) {
-           /*
-            * note the interface name just in case
-            */
-           strcpy(devname, ifr->ifr_name);
-           /*
-            * but try to find an exact match
-            */
-           sa = (struct sockaddr_in *) &ifr->ifr_addr;
-           if (memcmp(hp->h_addr_list[0], (void *) &sa->sin_addr,
-                           hp->h_length) == 0) {
-                   break;
+           /* try to find an exact match */
+           if (hp && ifr->ifr_addr.sa_family == AF_INET) {
+               sa = (struct sockaddr_in *) &ifr->ifr_addr;
+               if (memcmp(hp->h_addr_list[0],
+               (void *) &sa->sin_addr, hp->h_length) == 0)
+                   break;
+           }
+           /* try to prefer ethernet interfaces */
+           if (ifflags.ifr_flags & IFF_BROADCAST)
+               newgoodness += 1;
+           if (!(ifflags.ifr_flags & IFF_POINTOPOINT))
+               newgoodness += 1;
+           if (newgoodness > goodness) {
+               strcpy(devname, ifr->ifr_name);
+               goodness = newgoodness;
            }
        }
-       if(ifr->ifr_addr.sa_len)      /* Dohw! */
-           ifr = (struct ifreq *) ((caddr_t) ifr +
-           ifr->ifr_addr.sa_len -
-           sizeof(struct sockaddr));
-       ifr++;
    }
 out:
    (void) close(s);