-
-int
-socket_setup(int fd, const char *ip)
-{
- struct ip_mreqn mreq;
- uint8_t ttl = 255;
- int yes = 1;
- int no = 0;
- struct sockaddr_in sa;
-
- sa.sin_family = AF_INET;
- sa.sin_port = htons(MCAST_PORT);
- inet_pton(AF_INET, MCAST_ADDR, &sa.sin_addr);
-
- memset(&mreq, 0, sizeof(mreq));
- mreq.imr_address.s_addr = htonl(INADDR_ANY);
- mreq.imr_multiaddr = sa.sin_addr;
-
- if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0)
- fprintf(stderr, "ioctl failed: IP_MULTICAST_TTL\n");
-
- if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0)
- fprintf(stderr, "ioctl failed: SO_REUSEADDR\n");
-
- if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
- fprintf(stderr, "failed to join multicast group: %s\n", strerror(errno));
- close(fd);
- fd = -1;
- return -1;
- }
-
- if (setsockopt(fd, IPPROTO_IP, IP_RECVTTL, &yes, sizeof(yes)) < 0)
- fprintf(stderr, "ioctl failed: IP_RECVTTL\n");
-
- if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &yes, sizeof(yes)) < 0)
- fprintf(stderr, "ioctl failed: IP_PKTINFO\n");
-
- if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &no, sizeof(no)) < 0)
- fprintf(stderr, "ioctl failed: IP_MULTICAST_LOOP\n");
-
- return 0;
-}
-
-void*
-memdup(void *d, int l)
-{
- void *r = malloc(l);
- if (!r)
- return NULL;
- memcpy(r, d, l);
- return r;
-}
-