From 2bfe5cd8a4cb886fb68fadc50c5b9c3ad3c6a8b4 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Fri, 11 Feb 2000 17:45:45 +0000 Subject: [PATCH] (init_sockets): pay attention to explicit_addresses some more comments. better error messages. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7906 ec53bebd-3082-4978-b11e-865c3cabbd6b --- kdc/connect.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/kdc/connect.c b/kdc/connect.c index 923a5a08f..f7104cd41 100644 --- a/kdc/connect.c +++ b/kdc/connect.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-1999 Kungliga Tekniska Högskolan + * Copyright (c) 1997-2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -35,15 +35,25 @@ RCSID("$Id$"); +/* + * a tuple describing on what to listen + */ + struct port_desc{ int family; int type; int port; }; +/* the current ones */ + static struct port_desc *ports; static int num_ports; +/* + * add `family, port, protocol' to the list with duplicate suppresion. + */ + static void add_port(int family, int port, const char *protocol) { @@ -63,12 +73,19 @@ add_port(int family, int port, const char *protocol) return; } ports = realloc(ports, (num_ports + 1) * sizeof(*ports)); + if (ports == NULL) + krb5_err (context, 1, errno, "realloc"); ports[num_ports].family = family; ports[num_ports].type = type; ports[num_ports].port = port; num_ports++; } +/* + * add a triple but with service -> port lookup + * (this prints warnings for stuff that does not exist) + */ + static void add_port_service(int family, const char *service, int port, const char *protocol) @@ -77,6 +94,11 @@ add_port_service(int family, const char *service, int port, add_port (family, port, protocol); } +/* + * add the port with service -> port lookup or string -> number + * (no warning is printed) + */ + static void add_port_string (int family, const char *port_str, const char *protocol) { @@ -96,6 +118,10 @@ add_port_string (int family, const char *port_str, const char *protocol) add_port (family, port, protocol); } +/* + * add the standard collection of ports for `family' + */ + static void add_standard_ports (int family) { @@ -113,6 +139,12 @@ add_standard_ports (int family) #endif } +/* + * parse the set of space-delimited ports in `str' and add them. + * "+" => all the standard ones + * otherwise it's port|service[/protocol] + */ + static void parse_ports(const char *str) { @@ -150,6 +182,10 @@ parse_ports(const char *str) free (str_copy); } +/* + * every socket we listen on + */ + struct descr { int s; int type; @@ -176,7 +212,7 @@ init_socket(struct descr *d, krb5_address *a, int family, int type, int port) ret = krb5_addr2sockaddr (a, sa, &sa_size, port); if (ret) { - krb5_warn(context, ret, "krb5_anyaddr"); + krb5_warn(context, ret, "krb5_addr2sockaddr"); close(d->s); d->s = -1; return; @@ -200,14 +236,23 @@ init_socket(struct descr *d, krb5_address *a, int family, int type, int port) d->type = type; if(bind(d->s, sa, sa_size) < 0){ - krb5_warn(context, errno, "bind(%d)", ntohs(port)); + char a_str[256]; + size_t len; + + krb5_print_address (a, a_str, sizeof(a_str), &len); + krb5_warn(context, errno, "bind %s/%d", a_str, ntohs(port)); close(d->s); d->s = -1; return; } if(type == SOCK_STREAM && listen(d->s, SOMAXCONN) < 0){ - krb5_warn(context, errno, "listen"); + char a_str[256]; + size_t len; + + krb5_print_address (a, a_str, sizeof(a_str), &len); + krb5_warn(context, errno, "listen %s/%d", a_str, ntohs(port)); close(d->s); + d->s = -1; return; } } @@ -226,9 +271,13 @@ init_sockets(struct descr **desc) int num = 0; krb5_addresses addresses; - ret = krb5_get_all_server_addrs (context, &addresses); - if (ret) - krb5_err (context, 1, ret, "krb5_get_all_server_addrs"); + if (explicit_addresses.len) { + addresses = explicit_addresses; + } else { + ret = krb5_get_all_server_addrs (context, &addresses); + if (ret) + krb5_err (context, 1, ret, "krb5_get_all_server_addrs"); + } parse_ports(port_str); d = malloc(addresses.len * num_ports * sizeof(*d)); if (d == NULL) @@ -262,7 +311,11 @@ init_sockets(struct descr **desc) return num; } - +/* + * handle the request in `buf, len', from `addr' (or `from' as a string), + * sending a reply in `reply'. + */ + static int process_request(unsigned char *buf, size_t len, @@ -711,7 +764,8 @@ loop(void) case 0: break; case -1: - krb5_warn(context, errno, "select"); + if (errno != EINTR) + krb5_warn(context, errno, "select"); break; default: for(i = 0; i < ndescr; i++) -- 2.11.4.GIT