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
5 #include <netinet/in.h>
7 +#include <netinet/ip.h>
8 #include <net/if_arp.h>
12 perror("SIOCSIFFLAGS");
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)
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;
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",
43 + memcpy(&ifraddr,ifr,sizeof(struct ifreq));
44 + memcpy(&ifrbcast,ifr,sizeof(struct ifreq));
46 + if (ioctl(skfd, SIOCGIFADDR, &ifraddr) < 0) {
47 + fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno));
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));
69 - int goterr = 0, didnetmask = 0, donetmask = 0;
70 + int goterr = 0, didnetmask = 0, donetmask = 0, dobcast = 1;
81 goterr |= set_flag(ifr.ifr_name, IFF_BROADCAST);
86 - goterr = set_netmask(ap->fd, &ifr, &sa);
87 + goterr = set_netmask(ap->fd, &ifr, &sa, dobcast);
92 /* set CIDR netmask */
95 - goterr = set_netmask(skfd, &ifr, &sa_netmask);
96 + goterr = set_netmask(skfd, &ifr, &sa_netmask, dobcast);