(*): simplify by using `struct sockaddr_storage'

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6524 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1999-07-24 18:41:32 +00:00
parent 60443f2a5e
commit d377c71ac6
2 changed files with 27 additions and 78 deletions

View File

@@ -172,37 +172,29 @@ static void
init_socket(struct descr *d, krb5_address *a, int family, int type, int port) init_socket(struct descr *d, krb5_address *a, int family, int type, int port)
{ {
krb5_error_code ret; krb5_error_code ret;
struct sockaddr *sa; struct sockaddr_storage __ss;
void *sa_buf; struct sockaddr *sa = (struct sockaddr *)&__ss;
int sa_size; int sa_size;
memset(d, 0, sizeof(*d)); memset(d, 0, sizeof(*d));
d->s = -1; d->s = -1;
sa_size = krb5_max_sockaddr_size ();
sa_buf = malloc(sa_size);
if (sa_buf == NULL) {
kdc_log(0, "Failed to allocate %u bytes", sa_size);
return;
}
sa = (struct sockaddr *)sa_buf;
ret = krb5_addr2sockaddr (a, sa, &sa_size, port); ret = krb5_addr2sockaddr (a, sa, &sa_size, port);
if (ret) { if (ret) {
krb5_warn(context, ret, "krb5_anyaddr"); krb5_warn(context, ret, "krb5_anyaddr");
close(d->s); close(d->s);
d->s = -1; d->s = -1;
goto out; return;
} }
if (sa->sa_family != family) if (sa->sa_family != family)
goto out; return;
d->s = socket(family, type, 0); d->s = socket(family, type, 0);
if(d->s < 0){ if(d->s < 0){
krb5_warn(context, errno, "socket(%d, %d, 0)", family, type); krb5_warn(context, errno, "socket(%d, %d, 0)", family, type);
d->s = -1; d->s = -1;
goto out; return;
} }
#if defined(HAVE_SETSOCKOPT) && defined(SOL_SOCKET) && defined(SO_REUSEADDR) #if defined(HAVE_SETSOCKOPT) && defined(SOL_SOCKET) && defined(SO_REUSEADDR)
{ {
@@ -216,15 +208,13 @@ init_socket(struct descr *d, krb5_address *a, int family, int type, int port)
krb5_warn(context, errno, "bind(%d)", ntohs(port)); krb5_warn(context, errno, "bind(%d)", ntohs(port));
close(d->s); close(d->s);
d->s = -1; d->s = -1;
goto out; return;
} }
if(type == SOCK_STREAM && listen(d->s, SOMAXCONN) < 0){ if(type == SOCK_STREAM && listen(d->s, SOMAXCONN) < 0){
krb5_warn(context, errno, "listen"); krb5_warn(context, errno, "listen");
close(d->s); close(d->s);
d->s = -1; return;
} }
out:
free (sa_buf);
} }
/* /*
@@ -379,41 +369,30 @@ static void
handle_udp(struct descr *d) handle_udp(struct descr *d)
{ {
unsigned char *buf; unsigned char *buf;
struct sockaddr *sa; struct sockaddr_storage __ss;
void *sa_buf; struct sockaddr *sa = (struct sockaddr *)&__ss;
int sa_size;
int from_len; int from_len;
int n; int n;
sa_size = krb5_max_sockaddr_size ();
sa_buf = malloc(sa_size);
if (sa_buf == NULL) {
kdc_log(0, "Failed to allocate %u bytes", sa_size);
return;
}
sa = (struct sockaddr *)sa_buf;
buf = malloc(max_request); buf = malloc(max_request);
if(buf == NULL){ if(buf == NULL){
kdc_log(0, "Failed to allocate %u bytes", max_request); kdc_log(0, "Failed to allocate %u bytes", max_request);
free (sa_buf);
return; return;
} }
from_len = sa_size; from_len = sizeof(__ss);
n = recvfrom(d->s, buf, max_request, 0, n = recvfrom(d->s, buf, max_request, 0,
sa, &from_len); sa, &from_len);
if(n < 0){ if(n < 0){
krb5_warn(context, errno, "recvfrom"); krb5_warn(context, errno, "recvfrom");
goto out; goto out;
} }
if(n == 0){ if(n == 0) {
goto out; goto out;
} }
do_request(buf, n, 0, d->s, sa, from_len); do_request(buf, n, 0, d->s, sa, from_len);
out: out:
free (buf); free (buf);
free (sa_buf);
} }
static void static void
@@ -456,36 +435,25 @@ de_http(char *buf)
static void static void
add_new_tcp (struct descr *d, int index, int min_free) add_new_tcp (struct descr *d, int index, int min_free)
{ {
size_t sa_size; struct sockaddr_storage __ss;
char *sa_buf; struct sockaddr *sa = (struct sockaddr *)&__ss;
struct sockaddr *sa;
int s; int s;
int from_len; int from_len;
sa_size = krb5_max_sockaddr_size (); from_len = sizeof(__ss);
sa_buf = malloc(sa_size);
if (sa_buf == NULL) {
kdc_log(0, "Failed to allocate %u bytes", sa_size);
return;
}
sa = (struct sockaddr *)sa_buf;
from_len = sa_size;
s = accept(d[index].s, sa, &from_len); s = accept(d[index].s, sa, &from_len);
if(s < 0){ if(s < 0){
krb5_warn(context, errno, "accept"); krb5_warn(context, errno, "accept");
goto out; return;
} }
if(min_free == -1){ if(min_free == -1){
close(s); close(s);
goto out; return;
} }
d[min_free].s = s; d[min_free].s = s;
d[min_free].timeout = time(NULL) + TCP_TIMEOUT; d[min_free].timeout = time(NULL) + TCP_TIMEOUT;
d[min_free].type = SOCK_STREAM; d[min_free].type = SOCK_STREAM;
out:
free (sa);
} }
/* /*
@@ -636,9 +604,8 @@ handle_tcp(struct descr *d, int index, int min_free)
{ {
unsigned char buf[1024]; unsigned char buf[1024];
char addr[32]; char addr[32];
void *sa_buf; struct sockaddr_storage __ss;
struct sockaddr *sa; struct sockaddr *sa = (struct sockaddr *)&__ss;
int sa_size;
int from_len; int from_len;
int n; int n;
int ret; int ret;
@@ -648,14 +615,6 @@ handle_tcp(struct descr *d, int index, int min_free)
return; return;
} }
sa_size = krb5_max_sockaddr_size ();
sa_buf = malloc(sa_size);
if (sa_buf == NULL) {
kdc_log(0, "Failed to allocate %u bytes", sa_size);
return;
}
sa = (struct sockaddr *)sa_buf;
/* /*
* We can't trust recvfrom to return an address so we always call * We can't trust recvfrom to return an address so we always call
* getpeername. * getpeername.
@@ -664,16 +623,16 @@ handle_tcp(struct descr *d, int index, int min_free)
n = recvfrom(d[index].s, buf, sizeof(buf), 0, NULL, NULL); n = recvfrom(d[index].s, buf, sizeof(buf), 0, NULL, NULL);
if(n < 0){ if(n < 0){
krb5_warn(context, errno, "recvfrom"); krb5_warn(context, errno, "recvfrom");
goto out; return;
} }
from_len = sa_size; from_len = sizeof(__ss);
if (getpeername(d[index].s, sa, &from_len) < 0) { if (getpeername(d[index].s, sa, &from_len) < 0) {
krb5_warn(context, errno, "getpeername"); krb5_warn(context, errno, "getpeername");
goto out; return;
} }
addr_to_string(sa, from_len, addr, sizeof(addr)); addr_to_string(sa, from_len, addr, sizeof(addr));
if (grow_descr (&d[index], n)) if (grow_descr (&d[index], n))
goto out; return;
memcpy(d[index].buf + d[index].len, buf, n); memcpy(d[index].buf + d[index].len, buf, n);
d[index].len += n; d[index].len += n;
if(d[index].len > 4 && d[index].buf[0] == 0) { if(d[index].len > 4 && d[index].buf[0] == 0) {
@@ -688,17 +647,15 @@ handle_tcp(struct descr *d, int index, int min_free)
clear_descr (d + index); clear_descr (d + index);
} else { } else {
kdc_log (0, "TCP data of strange type from %s", addr); kdc_log (0, "TCP data of strange type from %s", addr);
goto out; return;
} }
if (ret < 0) if (ret < 0)
goto out; return;
else if (ret == 1) { else if (ret == 1) {
do_request(d[index].buf, d[index].len, 1, do_request(d[index].buf, d[index].len, 1,
d[index].s, sa, from_len); d[index].s, sa, from_len);
clear_descr(d + index); clear_descr(d + index);
} }
out:
free (sa_buf);
} }
void void

View File

@@ -533,15 +533,8 @@ doit (int port)
krb5_addresses addrs; krb5_addresses addrs;
unsigned n, i; unsigned n, i;
fd_set real_fdset; fd_set real_fdset;
void *sa_buf; struct sockaddr_storage __ss;
int sa_max_size; struct sockaddr *sa = (struct sockaddr *)&__ss;
struct sockaddr *sa;
sa_max_size = krb5_max_sockaddr_size ();
sa_buf = malloc (sa_max_size);
if (sa_buf == NULL)
krb5_errx (context, 1, "out of memory");
sa = (struct sockaddr *)sa_buf;
ret = krb5_get_default_realm (context, &realm); ret = krb5_get_default_realm (context, &realm);
if (ret) if (ret)
@@ -598,7 +591,7 @@ doit (int port)
for (i = 0; i < n; ++i) for (i = 0; i < n; ++i)
if (FD_ISSET(sockets[i], &fdset)) { if (FD_ISSET(sockets[i], &fdset)) {
u_char buf[BUFSIZ]; u_char buf[BUFSIZ];
int addrlen = sa_max_size; int addrlen = sizeof(__ss);
ret = recvfrom (sockets[i], buf, sizeof(buf), 0, ret = recvfrom (sockets[i], buf, sizeof(buf), 0,
sa, &addrlen); sa, &addrlen);
@@ -618,7 +611,6 @@ doit (int port)
krb5_free_addresses (context, &addrs); krb5_free_addresses (context, &addrs);
krb5_free_principal (context, server); krb5_free_principal (context, server);
krb5_free_context (context); krb5_free_context (context);
free (sa_buf);
return 0; return 0;
} }