Home | History | Annotate | Line # | Download | only in if_vlan
siocXmulti.c revision 1.1.2.2
      1  1.1.2.2  pgoyette 
      2  1.1.2.2  pgoyette #include <sys/socket.h>
      3  1.1.2.2  pgoyette #include <sys/ioctl.h>
      4  1.1.2.2  pgoyette 
      5  1.1.2.2  pgoyette #include <net/if.h>
      6  1.1.2.2  pgoyette #include <netinet/in.h>
      7  1.1.2.2  pgoyette #include <arpa/inet.h>
      8  1.1.2.2  pgoyette 
      9  1.1.2.2  pgoyette #include <stdio.h>
     10  1.1.2.2  pgoyette #include <stdlib.h>
     11  1.1.2.2  pgoyette #include <string.h>
     12  1.1.2.2  pgoyette #include <strings.h>
     13  1.1.2.2  pgoyette #include <unistd.h>
     14  1.1.2.2  pgoyette #include <err.h>
     15  1.1.2.2  pgoyette 
     16  1.1.2.2  pgoyette enum{
     17  1.1.2.2  pgoyette 	ARG_PROG = 0,
     18  1.1.2.2  pgoyette 	ARG_OP,
     19  1.1.2.2  pgoyette 	ARG_IFNAME,
     20  1.1.2.2  pgoyette 	ARG_ADDR,
     21  1.1.2.2  pgoyette 	ARG_NUM
     22  1.1.2.2  pgoyette };
     23  1.1.2.2  pgoyette 
     24  1.1.2.2  pgoyette static void
     25  1.1.2.2  pgoyette usage(void)
     26  1.1.2.2  pgoyette {
     27  1.1.2.2  pgoyette 
     28  1.1.2.2  pgoyette 	printf("%s <add|del> <ifname> <IPv4 addr>\n",
     29  1.1.2.2  pgoyette 	    getprogname());
     30  1.1.2.2  pgoyette 	exit(1);
     31  1.1.2.2  pgoyette }
     32  1.1.2.2  pgoyette 
     33  1.1.2.2  pgoyette int
     34  1.1.2.2  pgoyette main(int argc, char *argv[])
     35  1.1.2.2  pgoyette {
     36  1.1.2.2  pgoyette 	int			 fd, rv;
     37  1.1.2.2  pgoyette 	unsigned long		 req;
     38  1.1.2.2  pgoyette 	struct ifreq		 ifr;
     39  1.1.2.2  pgoyette 	unsigned int		 ifidx;
     40  1.1.2.2  pgoyette 	struct sockaddr_in	*sin;
     41  1.1.2.2  pgoyette 	struct sockaddr_in6	*sin6;
     42  1.1.2.2  pgoyette 
     43  1.1.2.2  pgoyette 	bzero(&ifr, sizeof(ifr));
     44  1.1.2.2  pgoyette 
     45  1.1.2.2  pgoyette 	if (argc != ARG_NUM)
     46  1.1.2.2  pgoyette 		usage();
     47  1.1.2.2  pgoyette 
     48  1.1.2.2  pgoyette 	if (strcmp(argv[ARG_OP], "add") == 0)
     49  1.1.2.2  pgoyette 		req = SIOCADDMULTI;
     50  1.1.2.2  pgoyette 	else if (strcmp(argv[ARG_OP], "del") == 0)
     51  1.1.2.2  pgoyette 		req = SIOCDELMULTI;
     52  1.1.2.2  pgoyette 	else
     53  1.1.2.2  pgoyette 		usage();
     54  1.1.2.2  pgoyette 
     55  1.1.2.2  pgoyette 	ifidx = if_nametoindex(argv[ARG_IFNAME]);
     56  1.1.2.2  pgoyette 	if (ifidx == 0)
     57  1.1.2.2  pgoyette 		err(1, "if_nametoindex(%s)", argv[ARG_IFNAME]);
     58  1.1.2.2  pgoyette 
     59  1.1.2.2  pgoyette 	strncpy(ifr.ifr_name, argv[ARG_IFNAME], sizeof(ifr.ifr_name));
     60  1.1.2.2  pgoyette 
     61  1.1.2.2  pgoyette 	sin = (struct sockaddr_in *)&ifr.ifr_addr;
     62  1.1.2.2  pgoyette 	sin->sin_family = AF_INET;
     63  1.1.2.2  pgoyette 	sin->sin_len = sizeof(*sin);
     64  1.1.2.2  pgoyette 	rv = inet_pton(AF_INET, argv[ARG_ADDR], &sin->sin_addr);
     65  1.1.2.2  pgoyette 
     66  1.1.2.2  pgoyette 	if (rv != 1) {
     67  1.1.2.2  pgoyette 		sin6 = (struct sockaddr_in6 *)&ifr.ifr_addr;
     68  1.1.2.2  pgoyette 		sin6->sin6_family = AF_INET6;
     69  1.1.2.2  pgoyette 		sin6->sin6_len = sizeof(*sin6);
     70  1.1.2.2  pgoyette 		rv = inet_pton(AF_INET6, argv[ARG_ADDR], &sin6->sin6_addr);
     71  1.1.2.2  pgoyette 
     72  1.1.2.2  pgoyette 		if (rv != 1)
     73  1.1.2.2  pgoyette 			errx(1, "inet_pton(%s)", argv[ARG_ADDR]);
     74  1.1.2.2  pgoyette 	}
     75  1.1.2.2  pgoyette 
     76  1.1.2.2  pgoyette 	fd = socket(AF_INET, SOCK_DGRAM, 0);
     77  1.1.2.2  pgoyette 	if (fd < 0)
     78  1.1.2.2  pgoyette 		err(1, "socket");
     79  1.1.2.2  pgoyette 
     80  1.1.2.2  pgoyette 	if (ioctl(fd, req, (caddr_t)&ifr) < 0) {
     81  1.1.2.2  pgoyette 		err(1, "ioctl(%s)",
     82  1.1.2.2  pgoyette 		    (req == SIOCADDMULTI) ? "SIOCADDMULTI" : "SIOCDELMULTI");
     83  1.1.2.2  pgoyette 	}
     84  1.1.2.2  pgoyette 
     85  1.1.2.2  pgoyette 	close(fd);
     86  1.1.2.2  pgoyette 
     87  1.1.2.2  pgoyette 	return 0;
     88  1.1.2.2  pgoyette }
     89