summaryrefslogtreecommitdiff
path: root/common/gdm-address.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/gdm-address.c')
-rw-r--r--common/gdm-address.c122
1 files changed, 103 insertions, 19 deletions
diff --git a/common/gdm-address.c b/common/gdm-address.c
index b5cf08da..36cbbf34 100644
--- a/common/gdm-address.c
+++ b/common/gdm-address.c
@@ -174,46 +174,77 @@ gdm_address_equal (GdmAddress *a,
return FALSE;
}
-char *
-gdm_address_get_hostname (GdmAddress *address)
+gboolean
+gdm_address_get_hostname (GdmAddress *address,
+ char **hostnamep)
{
- char host [NI_MAXHOST];
+ char host [NI_MAXHOST];
+ int res;
+ gboolean ret;
+
+ g_return_val_if_fail (address != NULL || address->ss != NULL, FALSE);
- g_return_val_if_fail (address != NULL || address->ss != NULL, NULL);
+ ret = FALSE;
host [0] = '\0';
- getnameinfo ((const struct sockaddr *)address->ss,
- sizeof (struct sockaddr_storage),
- host, sizeof (host),
- NULL, 0,
- 0);
+ res = getnameinfo ((const struct sockaddr *)address->ss,
+ sizeof (struct sockaddr_storage),
+ host, sizeof (host),
+ NULL, 0,
+ 0);
+ if (res == 0) {
+ ret = TRUE;
+ goto done;
+ } else {
+ g_warning ("Unable lookup hostname: %s", gai_strerror (res));
+ gdm_address_debug (address);
+ }
- return g_strdup (host);
+ /* try numeric? */
+
+ done:
+ if (hostnamep != NULL) {
+ *hostnamep = g_strdup (host);
+ }
+
+ return ret;
}
-void
+gboolean
gdm_address_get_numeric_info (GdmAddress *address,
char **hostp,
char **servp)
{
- char host [NI_MAXHOST];
- char serv [NI_MAXSERV];
+ char host [NI_MAXHOST];
+ char serv [NI_MAXSERV];
+ int res;
+ gboolean ret;
+
+ g_return_val_if_fail (address != NULL || address->ss != NULL, FALSE);
- g_return_if_fail (address != NULL || address->ss != NULL);
+ ret = FALSE;
host [0] = '\0';
serv [0] = '\0';
- getnameinfo ((const struct sockaddr *)address->ss,
- sizeof (struct sockaddr_storage),
- host, sizeof (host),
- serv, sizeof (serv),
- NI_NUMERICHOST | NI_NUMERICSERV);
+ res = getnameinfo ((const struct sockaddr *)address->ss,
+ sizeof (struct sockaddr_storage),
+ host, sizeof (host),
+ serv, sizeof (serv),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (res != 0) {
+ g_warning ("Unable lookup numeric info: %s", gai_strerror (res));
+ } else {
+ ret = TRUE;
+ }
+
if (servp != NULL) {
*servp = g_strdup (serv);
}
if (hostp != NULL) {
*hostp = g_strdup (host);
}
+
+ return ret;
}
gboolean
@@ -351,4 +382,57 @@ gdm_address_free (GdmAddress *address)
g_free (address);
}
+/* for debugging */
+static const char *
+address_family_str (GdmAddress *address)
+{
+ const char *str;
+ switch (address->ss->ss_family) {
+ case AF_INET:
+ str = "inet";
+ break;
+ case AF_INET6:
+ str = "inet6";
+ break;
+ case AF_UNIX:
+ str = "unix";
+ break;
+ case AF_UNSPEC:
+ str = "unspecified";
+ break;
+ default:
+ str = "unknown";
+ break;
+ }
+ return str;
+}
+
+void
+gdm_address_debug (GdmAddress *address)
+{
+ char *hostname;
+ char *host;
+ char *port;
+ g_return_if_fail (address != NULL);
+
+ hostname = NULL;
+ host = NULL;
+ port = NULL;
+
+ gdm_address_get_hostname (address, &hostname);
+ gdm_address_get_numeric_info (address, &host, &port);
+
+ g_debug ("Address family:%d (%s) hostname:%s host:%s port:%s local:%d loopback:%d",
+ address->ss->ss_family,
+ address_family_str (address),
+ hostname,
+ host,
+ port,
+ gdm_address_is_local (address),
+ gdm_address_is_loopback (address));
+
+ g_free (hostname);
+ g_free (host);
+ g_free (port);
+}