#include <sys/socket.h>
#include <err.h>
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
int
do_bind(int sock, uint16_t port)
{
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
return bind(sock, (struct sockaddr *) &addr, sizeof addr);
}
int
get_bound_port(int sock)
{
union {
struct sockaddr_storage ss;
struct sockaddr_in sin;
} addr;
socklen_t addrlen = sizeof addr;
if (getsockname(sock, (struct sockaddr *) &addr, &addrlen) == -1)
return -1;
if (addr.ss.ss_family == AF_INET)
return ntohs(addr.sin.sin_port);
return -1;
}
int
main()
{
int sock;
int port;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1)
err(1, "Can't create socket");
if (do_bind(sock, 0) == -1)
err(1, "Can't bind socket");
if (listen(sock, 0) == -1)
err(1, "Can't listen on socket");
port = get_bound_port(sock);
if (port == -1)
err(1, "Can't get bound port");
printf("Bound port = %d\n", port);
close(sock);
return 0;
}