From: Pekka Riikonen Date: Sun, 22 Apr 2007 18:24:50 +0000 (+0000) Subject: Added silc_net_listener_get_[ip|hostname] and X-Git-Tag: 1.2.beta1~387 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=2dc428dd37efd4e4f26d025269f8b67151805fa7;p=crypto.git Added silc_net_listener_get_[ip|hostname] and silc_net_get_error_string. --- diff --git a/lib/silcutil/silcnet.c b/lib/silcutil/silcnet.c index a6c0f927..66de46e0 100644 --- a/lib/silcutil/silcnet.c +++ b/lib/silcutil/silcnet.c @@ -41,6 +41,72 @@ SilcUInt16 *silc_net_listener_get_port(SilcNetListener listener, return ports; } +/* Return bound IP from listener */ + +char **silc_net_listener_get_ip(SilcNetListener listener, + SilcUInt32 *ip_count) +{ + char **ips = NULL, *ip; + int i, k; + + ips = silc_calloc(listener->socks_count, sizeof(*ips)); + if (!ips) + return NULL; + + for (i = 0, k = 0; i < listener->socks_count; i++) { + if (silc_net_check_local_by_sock(listener->socks[i], NULL, &ip)) + ips[k++] = ip; + } + + if (ip_count) + *ip_count = k; + + return ips; +} + +/* Return bound hostname from listener */ + +char **silc_net_listener_get_hostname(SilcNetListener listener, + SilcUInt32 *hostname_count) +{ + char **hs = NULL, *h; + int i, k; + + hs = silc_calloc(listener->socks_count, sizeof(*hs)); + if (!hs) + return NULL; + + for (i = 0, k = 0; i < listener->socks_count; i++) { + if (silc_net_check_local_by_sock(listener->socks[i], &h, NULL)) + hs[k++] = h; + } + + if (hostname_count) + *hostname_count = k; + + return hs; +} + +static const char *silc_net_error[] = { + "Ok", + "Unknown IP address", + "Unknown hostname", + "Destination unreachable", + "Connection refused", + "Connection timeout", + "System out of memory", + "Unexpected error", +}; + +/* Return error as string */ + +const char *silc_net_get_error_string(SilcNetStatus error) +{ + if (error < SILC_NET_OK || error > SILC_NET_ERROR) + return ""; + return silc_net_error[error]; +} + /* Accepts a connection from a particular socket */ int silc_net_accept_connection(int sock) diff --git a/lib/silcutil/silcnet.h b/lib/silcutil/silcnet.h index b2adca76..94b76220 100644 --- a/lib/silcutil/silcnet.h +++ b/lib/silcutil/silcnet.h @@ -156,6 +156,40 @@ silc_net_tcp_create_listener(const char **local_ip_addr, SilcUInt16 *silc_net_listener_get_port(SilcNetListener listener, SilcUInt32 *port_count); +/****f* silcutil/SilcNetAPI/silc_net_listener_get_ip + * + * SYNOPSIS + * + * char **silc_net_listener_get_ip(SilcNetListener listener, + * SilcUInt32 *ip_count); + * + * DESCRIPTION + * + * Returns the IP's to where the `listener' is bound. Returns an array + * of IP addresses of size of `port_count'. The caller must free the + * array and its strings with silc_free. + * + ***/ +char **silc_net_listener_get_ip(SilcNetListener listener, + SilcUInt32 *ip_count); + +/****f* silcutil/SilcNetAPI/silc_net_listener_get_hostname + * + * SYNOPSIS + * + * char **silc_net_listener_get_hostname(SilcNetListener listener, + * SilcUInt32 *hostname_count); + * + * DESCRIPTION + * + * Returns the hostnames to where the `listener' is bound. Returns an + * array of hostnames of size of `port_count'. The caller must free the + * array and its strings with silc_free. + * + ***/ +char **silc_net_listener_get_hostname(SilcNetListener listener, + SilcUInt32 *hostname_count); + /****f* silcutil/SilcNetAPI/silc_net_close_listener * * SYNOPSIS @@ -305,6 +339,19 @@ int silc_net_udp_send(SilcStream stream, const char *remote_ip_addr, int remote_port, const unsigned char *data, SilcUInt32 data_len); +/****f* silcutil/SilcNetAPI/silc_net_get_error_string + * + * SYNOPSIS + * + * const char silc_net_get_error_string(SilcNetStatus error); + * + * DESCRIPTION + * + * Return `error' as a string. + * + ***/ +const char *silc_net_get_error_string(SilcNetStatus error); + /****f* silcutil/SilcNetAPI/silc_net_close_connection * * SYNOPSIS