diff options
author | Federico Lucifredi <flucifredi@acm.org> | 2007-05-06 20:12:18 +0000 |
---|---|---|
committer | Federico Lucifredi <flucifredi@acm.org> | 2007-05-06 20:12:18 +0000 |
commit | 8a49fc26776c8b95ce299e69903198df7bbebe11 (patch) | |
tree | f16ed29141aff95792cf73e3c636efcd534bf2bd /docs/socket-auto-port.c | |
parent | 1fef746edf313d8fb1d8417a17d536a915ca69cd (diff) | |
parent | a6a4c936ad8c9071b891bb19c4edf5779e027a19 (diff) |
refreshing branch to latest release.
git-svn-id: file:///home/lennart/svn/public/avahi/branches/federico@1455 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'docs/socket-auto-port.c')
-rw-r--r-- | docs/socket-auto-port.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/docs/socket-auto-port.c b/docs/socket-auto-port.c new file mode 100644 index 0000000..75dffaf --- /dev/null +++ b/docs/socket-auto-port.c @@ -0,0 +1,49 @@ +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <arpa/inet.h> +#include <inttypes.h> +#include <errno.h> +#include <stdio.h> +#include <unistd.h> + +int main(int argc, char *argv[]) { + int s; + struct sockaddr_storage sa; + socklen_t salen; + uint16_t port; + + if ((s = socket(PF_INET6, SOCK_STREAM, 0)) < 0) { + if (errno == EAFNOSUPPORT) + s = socket(PF_INET, SOCK_STREAM, 0); + + if (s < 0) { + perror("socket()"); + return 1; + } + } + + if (listen(s, 2) < 0) { + perror("listen()"); + return 2; + } + + salen = sizeof(sa); + if (getsockname(s, (struct sockaddr*) &sa, &salen) < 0) { + perror("getsockname()"); + return 3; + } + + if (((struct sockaddr*) &sa)->sa_family == AF_INET) + port = ((struct sockaddr_in*) &sa)->sin_port; + else + port = ((struct sockaddr_in6*) &sa)->sin6_port; + + printf("Selected port number %u\n", ntohs(port)); + + /* ... hic sunt leones ... */ + + sleep(60); + + return 0; +} |