]> git.ipfire.org Git - people/ms/ipfire-3.x.git/blame - net-tools/patches/net-tools-1.60-bcast.patch
Move all packages to root.
[people/ms/ipfire-3.x.git] / net-tools / patches / net-tools-1.60-bcast.patch
CommitLineData
236898d6
MT
1--- net-tools-1.60/ifconfig.c.broadcast 2004-11-03 12:05:30.000000000 +0100
2+++ net-tools-1.60/ifconfig.c 2004-11-04 15:39:32.817077232 +0100
3@@ -36,6 +36,7 @@
4 #include <sys/ioctl.h>
5 #include <netinet/in.h>
6 #include <net/if.h>
7+#include <netinet/ip.h>
8 #include <net/if_arp.h>
9 #include <stdio.h>
10 #include <errno.h>
11@@ -138,6 +139,7 @@
12 perror("SIOCSIFFLAGS");
13 return -1;
14 }
15+
16 return (0);
17 }
18
19@@ -212,17 +214,41 @@
20 exit(0);
21 }
22
23-static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa)
24+static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa, int new_bcast)
25 {
26 int err = 0;
27-
28- memcpy((char *) &ifr->ifr_netmask, (char *) sa,
29- sizeof(struct sockaddr));
30+ struct sockaddr_in * ip_addr, * netmask, *bcast;
31+ struct ifreq ifraddr;
32+ struct ifreq ifrbcast;
33+
34+ memcpy((char *) &ifr->ifr_netmask, (char *) sa,
35+ sizeof(struct sockaddr));
36 if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) {
37 fprintf(stderr, "SIOCSIFNETMASK: %s\n",
38 strerror(errno));
39 err = 1;
40 }
41+
42+ if (new_bcast) {
43+ memcpy(&ifraddr,ifr,sizeof(struct ifreq));
44+ memcpy(&ifrbcast,ifr,sizeof(struct ifreq));
45+
46+ if (ioctl(skfd, SIOCGIFADDR, &ifraddr) < 0) {
47+ fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno));
48+ err = 1;
49+ }
50+
51+ ip_addr = (struct sockaddr_in *)&ifraddr.ifr_addr;
52+ netmask = (struct sockaddr_in *)&ifr->ifr_netmask;
53+ bcast = (struct sockaddr_in *)&ifrbcast.ifr_broadaddr;
54+ /* calculate new broadcast adress */
55+ bcast->sin_addr.s_addr = ip_addr->sin_addr.s_addr | ~netmask->sin_addr.s_addr;
56+ /* set new broadcast adress */
57+ if (ioctl(skfd, SIOCSIFBRDADDR, &ifrbcast) < 0) {
58+ fprintf(stderr, "SIOCSIFBROADCAST: %s\n", strerror(errno));
59+ err = 1;
60+ }
61+ }
62 return 0;
63 }
64
65@@ -234,7 +260,7 @@
66 struct aftype *ap;
67 struct hwtype *hw;
68 struct ifreq ifr;
69- int goterr = 0, didnetmask = 0, donetmask = 0;
70+ int goterr = 0, didnetmask = 0, donetmask = 0, dobcast = 1;
71 char **spp;
72 int fd;
73 #if HAVE_AFINET6
74@@ -506,6 +532,7 @@
75 strerror(errno));
76 goterr = 1;
77 }
78+ dobcast = 0;
79 spp++;
80 }
81 goterr |= set_flag(ifr.ifr_name, IFF_BROADCAST);
82@@ -542,7 +569,7 @@
83 continue;
84 }
85 didnetmask++;
86- goterr = set_netmask(ap->fd, &ifr, &sa);
87+ goterr = set_netmask(ap->fd, &ifr, &sa, dobcast);
88 spp++;
89 continue;
90 }
91@@ -964,7 +991,7 @@
92 /* set CIDR netmask */
93 if (donetmask) {
94 donetmask = 0;
95- goterr = set_netmask(skfd, &ifr, &sa_netmask);
96+ goterr = set_netmask(skfd, &ifr, &sa_netmask, dobcast);
97 didnetmask++;
98 }
99