support ipv6

This commit is contained in:
Love Hörnquist Åstrand
2012-03-07 07:58:25 -08:00
parent 92b243a638
commit d791e70894
3 changed files with 24 additions and 46 deletions

View File

@@ -162,6 +162,9 @@ client_doit (const char *hostname, int port, const char *service,
s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); s = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
if (s < 0) if (s < 0)
continue; continue;
socket_set_ipv6only(s, 1);
if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { if (connect (s, a->ai_addr, a->ai_addrlen) < 0) {
warn ("connect(%s)", hostname); warn ("connect(%s)", hostname);
close (s); close (s);

View File

@@ -39,7 +39,7 @@ krb5_context context;
static int static int
proto (int sock, const char *hostname, const char *service) proto (int sock, const char *hostname, const char *service)
{ {
struct sockaddr_in remote, local; struct sockaddr_storage remote, local;
socklen_t addrlen; socklen_t addrlen;
krb5_address remote_addr, local_addr; krb5_address remote_addr, local_addr;
krb5_context context; krb5_context context;
@@ -54,12 +54,12 @@ proto (int sock, const char *hostname, const char *service)
addrlen = sizeof(local); addrlen = sizeof(local);
if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0
|| addrlen != sizeof(local)) || addrlen > sizeof(local))
err (1, "getsockname(%s)", hostname); err (1, "getsockname(%s)", hostname);
addrlen = sizeof(remote); addrlen = sizeof(remote);
if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0
|| addrlen != sizeof(remote)) || addrlen > sizeof(remote))
err (1, "getpeername(%s)", hostname); err (1, "getpeername(%s)", hostname);
status = krb5_init_context(&context); status = krb5_init_context(&context);
@@ -74,13 +74,12 @@ proto (int sock, const char *hostname, const char *service)
if (status) if (status)
krb5_err(context, 1, status, "krb5_auth_con_init"); krb5_err(context, 1, status, "krb5_auth_con_init");
local_addr.addr_type = AF_INET; status = krb5_sockaddr2address (context, (struct sockaddr *)&local, &local_addr);
local_addr.address.length = sizeof(local.sin_addr); if (status)
local_addr.address.data = &local.sin_addr; krb5_err(context, 1, status, "krb5_sockaddr2address(local)");
status = krb5_sockaddr2address (context, (struct sockaddr *)&remote, &remote_addr);
remote_addr.addr_type = AF_INET; if (status)
remote_addr.address.length = sizeof(remote.sin_addr); krb5_err(context, 1, status, "krb5_sockaddr2address(remote)");
remote_addr.address.data = &remote.sin_addr;
status = krb5_auth_con_setaddrs (context, status = krb5_auth_con_setaddrs (context,
auth_context, auth_context,

View File

@@ -39,7 +39,7 @@ krb5_context context;
static int static int
proto (int sock, const char *service) proto (int sock, const char *service)
{ {
struct sockaddr_in remote, local; struct sockaddr_storage remote, local;
socklen_t addrlen; socklen_t addrlen;
krb5_address remote_addr, local_addr; krb5_address remote_addr, local_addr;
krb5_ccache ccache; krb5_ccache ccache;
@@ -52,25 +52,24 @@ proto (int sock, const char *service)
addrlen = sizeof(local); addrlen = sizeof(local);
if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0
|| addrlen != sizeof(local)) || addrlen > sizeof(local))
err (1, "getsockname)"); err (1, "getsockname)");
addrlen = sizeof(remote); addrlen = sizeof(remote);
if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0
|| addrlen != sizeof(remote)) || addrlen > sizeof(remote))
err (1, "getpeername"); err (1, "getpeername");
status = krb5_auth_con_init (context, &auth_context); status = krb5_auth_con_init (context, &auth_context);
if (status) if (status)
krb5_err(context, 1, status, "krb5_auth_con_init"); krb5_err(context, 1, status, "krb5_auth_con_init");
local_addr.addr_type = AF_INET; status = krb5_sockaddr2address (context, (struct sockaddr *)&local, &local_addr);
local_addr.address.length = sizeof(local.sin_addr); if (status)
local_addr.address.data = &local.sin_addr; krb5_err(context, 1, status, "krb5_sockaddr2address(local)");
status = krb5_sockaddr2address (context, (struct sockaddr *)&remote, &remote_addr);
remote_addr.addr_type = AF_INET; if (status)
remote_addr.address.length = sizeof(remote.sin_addr); krb5_err(context, 1, status, "krb5_sockaddr2address(remote)");
remote_addr.address.data = &remote.sin_addr;
status = krb5_auth_con_setaddrs (context, status = krb5_auth_con_setaddrs (context,
auth_context, auth_context,
@@ -174,34 +173,11 @@ proto (int sock, const char *service)
static int static int
doit (int port, const char *service) doit (int port, const char *service)
{ {
int sock, sock2; rk_socket_t sock;
struct sockaddr_in my_addr;
int one = 1;
sock = socket (AF_INET, SOCK_STREAM, 0); mini_inetd(port, &sock);
if (sock < 0)
err (1, "socket");
memset (&my_addr, 0, sizeof(my_addr)); return proto(sock, service);
my_addr.sin_family = AF_INET;
my_addr.sin_port = port;
my_addr.sin_addr.s_addr = INADDR_ANY;
if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
(void *)&one, sizeof(one)) < 0)
warn ("setsockopt SO_REUSEADDR");
if (bind (sock, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0)
err (1, "bind");
if (listen (sock, 1) < 0)
err (1, "listen");
sock2 = accept (sock, NULL, NULL);
if (sock2 < 0)
err (1, "accept");
return proto (sock2, service);
} }
int int