]>
Commit | Line | Data |
---|---|---|
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 |