Browse Source

net: fix latent bug in _info example.

Ben Hutchings points out that struct sockaddr isn't large enough to hold
a struct sockaddr_in6.  Our example works because we only access the family
field, but anyone extending it might be surprised; use a union instead.
Rusty Russell 15 years ago
parent
commit
7274405006
1 changed files with 10 additions and 5 deletions
  1. 10 5
      ccan/net/_info

+ 10 - 5
ccan/net/_info

@@ -14,6 +14,7 @@
  *	#include <ccan/net/net.h>
  *	#include <sys/types.h>
  *	#include <sys/socket.h>
+ *	#include <netinet/in.h>
  *	#include <stdio.h>
  *	#include <err.h>
  *
@@ -22,8 +23,12 @@
  *		struct addrinfo *addr;
  *		const char *dest, *port;
  *		int fd;
- *		struct sockaddr saddr;
- *		socklen_t slen = sizeof(saddr);
+ *		union {
+ *			struct sockaddr s;
+ *			struct sockaddr_in v4;
+ *			struct sockaddr_in6 v6;
+ *		} u;
+ *		socklen_t slen = sizeof(u);
  *	
  *		if (argc == 2) {
  *			dest = argv[1];
@@ -42,10 +47,10 @@
  *		if (fd < 0)
  *			err(1, "Failed to connect to %s", dest);
  *	
- *		if (getsockname(fd, &saddr, &slen) == 0)
+ *		if (getsockname(fd, &u.s, &slen) == 0)
  *			printf("Connected via %s\n",
- *			       saddr.sa_family == AF_INET6 ? "IPv6"
- *			       : saddr.sa_family == AF_INET ? "IPv4"
+ *			       u.s.sa_family == AF_INET6 ? "IPv6"
+ *			       : u.s.sa_family == AF_INET ? "IPv4"
  *			       : "UNKNOWN??");
  *		else
  *			err(1, "Failed to get socket type for connection");