[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


To: itojun@iijlab.net
Cc: Bill Manning <bmanning@ISI.EDU>, dnsop@cafax.se
From: Mark.Andrews@isc.org
Date: Thu, 20 Sep 2001 12:59:47 +1000
In-reply-to: Your message of "Wed, 19 Sep 2001 17:43:47 +0900." <12584.1000889027@itojun.org>
Sender: owner-dnsop@cafax.se
Subject: Re: operationally (if not yet WG) related


	To be more precise the sendmsg() in the following fails on
	certian platforms.

	Mark

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/uio.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

int
main(int argc, char **argv) {
	struct sockaddr_in6 sa;
	int fd;
	int res;
	int on = 1;

	fd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
	if (fd == -1) {
		perror("socket");
		exit(1);
	}

	fprintf(stderr, "socket options");
#ifdef SO_BSDCOMPAT
	fprintf(stderr, " SO_BSDCOMPAT");
	res = setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, (void *)&on, sizeof(on));
	if (res == -1)
		perror("setsockopt(SO_BSDCOMPAT)");
#endif

#ifdef SO_TIMESTAMP
	fprintf(stderr, " SO_TIMESTAMP");
	res = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, (void *)&on, sizeof(on));
	if (res == -1)
		perror("setsockopt(SO_TIMESTAMP)");
#endif

#ifdef IPV6_RECVPKTINFO
	fprintf(stderr, " IPV6_RECVPKTINFO");
	res = setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,
			 (void *)&on, sizeof(on));
	if (res == -1)
		perror("setsockopt(IPV6_RECVPKTINFO)");
#else
	fprintf(stderr, " IPV6_PKTINFO");
	res = setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO,
			 (void *)&on, sizeof(on));
	if (res == -1)
		perror("setsockopt(IPV6_PKTINFO)");
#endif
	fprintf(stderr, "\n");

	memset(&sa, 0, sizeof(sa));
	sa.sin6_addr = in6addr_any;
	sa.sin6_family = PF_INET6;
	sa.sin6_port = htons(0);
#ifdef SIN6_LEN
	sa.sin6_len = sizeof(sa);
#endif

	res = bind(fd, (struct sockaddr *)&sa, sizeof(sa));
	if (res == -1) {
		perror("bind");
		exit(1);
	}
		
	while (*++argv != NULL) {
		struct msghdr msg;
		struct iovec io;

		memset(&sa, 0, sizeof(sa));
		if (inet_pton(PF_INET6, *argv, &sa.sin6_addr) != 1)
			continue;
		sa.sin6_family = PF_INET6;
		sa.sin6_port = htons(9);	/* discard */
#ifdef SIN6_LEN
		sa.sin6_len = sizeof(sa);
#endif

		/* some data */
		io.iov_base = "1234";
		io.iov_len = 4;

	        msg.msg_name = &sa;
		msg.msg_namelen = sizeof(sa);
		msg.msg_iov = &io;
		msg.msg_iovlen = 1;
		msg.msg_control = NULL;
		msg.msg_controllen = 0;
		msg.msg_flags = 0;

		fprintf(stderr, "trying %s#9 ... ", *argv);

		errno = 0;
		res = sendmsg(fd, &msg, 0);
		if (res != 4)
			perror("sendto");
		else
			fprintf(stderr, "success\n");
		
	}
	close(fd);
	return (0);
}
--
Mark Andrews, Internet Software Consortium
1 Seymour St., Dundas Valley, NSW 2117, Australia
PHONE: +61 2 9871 4742                 INTERNET: Mark.Andrews@isc.org

Home | Date list | Subject list