Home | History | Annotate | Download | only in mc_opts
      1 #include <sys/types.h>
      2 #include <sys/socket.h>
      3 #include <netinet/in.h>
      4 #include <arpa/inet.h>
      5 #include <errno.h>
      6 #include <string.h>
      7 #include <stdlib.h>
      8 #include <unistd.h>
      9 #include <stdio.h>
     10 #include <netdb.h>
     11 
     12 #define	MAXBUFSIZ	8096
     13 
     14 static int errors;
     15 
     16 int main(int argc, char *argv[])
     17 {
     18 	int s;
     19 	struct in_addr gimr;
     20 	struct ip_mreq simr;
     21 
     22 	unsigned i1, i2, i3, i4;
     23 	struct hostent *hp, *gethostbyname();
     24 
     25 	char sintf[20], gintf[20];
     26 	unsigned char ttl;
     27 	char loop = 0;
     28 	unsigned int len = 0;
     29 
     30 	if (argc != 2) {
     31 		fprintf(stderr,
     32 			"usage: %s interface_name (or i.i.i.i)\n", argv[0]);
     33 		exit(1);
     34 	}
     35 	s = socket(AF_INET, SOCK_DGRAM, 0);
     36 	if (s == -1) {
     37 		perror("Error: can't open socket");
     38 		exit(1);
     39 	}
     40 
     41 	printf("agrv sub 1 is %s\n", argv[1]);
     42 	hp = gethostbyname(argv[1]);
     43 	if (hp)
     44 		memcpy(&simr.imr_interface.s_addr, hp->h_addr, hp->h_length);
     45 	else if (sscanf(argv[1], "%u.%u.%u.%u", &i1, &i2, &i3, &i4) != 4) {
     46 		fprintf(stderr, "Bad interface address\n");
     47 		exit(1);
     48 	} else
     49 		simr.imr_interface.s_addr =
     50 		    htonl((i1 << 24) | (i2 << 16) | (i3 << 8) | i4);
     51 	strcpy(sintf, inet_ntoa(simr.imr_interface));
     52 
     53 	/* verify socket options */
     54 	if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF,
     55 		       &simr.imr_interface.s_addr,
     56 		       sizeof(simr.imr_interface.s_addr)) != 0) {
     57 		perror("Error: Setting IP_MULTICAST_IF");
     58 		errors++;
     59 	} else
     60 		printf("Set interface: %s for multicasting\n", sintf);
     61 
     62 	len = sizeof(gimr);
     63 	if (getsockopt
     64 	    (s, IPPROTO_IP, IP_MULTICAST_IF, &gimr, (socklen_t *)&len) != 0) {
     65 		perror("Getting IP_MULTICAST_IF");
     66 		errors++;
     67 	} else {
     68 		strcpy(gintf, inet_ntoa(gimr));
     69 		printf("Got multicasting socket interface: %s\n", gintf);
     70 	}
     71 
     72 	/* Verify that the multicastion for the interface was set */
     73 	if (strcmp(sintf, gintf) != 0) {
     74 		printf("Error: IP_MULTICAST_IF was not set\n");
     75 		errors++;
     76 	} else
     77 		printf
     78 		    ("Socket has been set for multicasting on interface: %s\n",
     79 		     sintf);
     80 
     81 	len = sizeof(ttl);
     82 	if (getsockopt
     83 	    (s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, (socklen_t *)&len) != 0) {
     84 		perror("Error: Gettting IP_MULTICAST_TTL");
     85 		errors++;
     86 	} else
     87 		printf("getsockopt: got ttl = %i\n", ttl);
     88 	if (ttl != 1)
     89 		printf("Error: IP_MULTICAST_TTL not default value, ttl = %i\n",
     90 		       ttl);
     91 	ttl = 10;		/* Set ttl to 10 */
     92 	len = sizeof(ttl);
     93 	if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL,
     94 		       &ttl, sizeof(ttl)) != 0) {
     95 		perror("Error: Setting IP_MULTICAST_TTL");
     96 		errors++;
     97 	} else
     98 		printf("TTL set on multicast socket\n");
     99 	if (getsockopt
    100 	    (s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, (socklen_t *)&len) != 0) {
    101 		perror("Error: Getting IP_MULTICAST_TTL");
    102 		errors++;
    103 	}
    104 	if (ttl != 10) {
    105 		printf("Error: IP_MULTICAST_TTL not set, ttl = %i\n", ttl);
    106 		errors++;
    107 	}
    108 
    109 	len = sizeof(loop);
    110 	if (getsockopt
    111 	    (s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop,
    112 	     (socklen_t *)&len) != 0) {
    113 		perror("Error: Getting IP_MULTICAST_LOOP");
    114 		errors++;
    115 	} else
    116 		printf("Got loopback setting\n");
    117 	if (loop != 1) {
    118 		printf("Error: IP_MULTICAST_LOOP not enabled, loop = %i\n",
    119 		       loop);
    120 		errors++;
    121 	} else
    122 		printf("IP_MULTICAST_LOOP is enabled\n");
    123 
    124 	loop = 0;		/* Disable IP_MULTICAST_LOOP */
    125 	if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(char)) !=
    126 	    0) {
    127 		errors++;
    128 		perror("Error: Setting IP_MULTICAST_LOOP");
    129 	} else
    130 		printf("Multicast loopback disabled\n");
    131 	if (getsockopt
    132 	    (s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop,
    133 	     (socklen_t *)&len) != 0) {
    134 		perror("Error: Getting IP_MULTICAST_LOOP");
    135 		errors++;
    136 	} else
    137 		printf("Got multicast loopback value\n");
    138 	if (loop != 0) {
    139 		printf("Error: IP_MULTICAST_LOOP not disabled, loop = %i\n",
    140 		       loop);
    141 		errors++;
    142 	} else
    143 		printf("IP_MULTICAST_LOOP disabled\n");
    144 
    145 	close(s);
    146 	if (errors)
    147 		exit(1);
    148 	exit(0);
    149 }
    150