aboutsummaryrefslogtreecommitdiff
path: root/security/skip/files/patch-ce
blob: 31fadd547ff2fc6ff69f857db215a73b50291d76 (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 skipsrc-1.0/skip/tools/lib/skip_freebsd.c
--- skipsrc-1.0.orig/skip/tools/lib/skip_freebsd.c	Fri Oct 25 13:13:02 1996
+++ skipsrc-1.0/skip/tools/lib/skip_freebsd.c	Fri Dec  5 17:33:01 1997
@@ -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);