diff --git a/appl/login/utmp_login.c b/appl/login/utmp_login.c index b5f6fed5c..3b31af0fc 100644 --- a/appl/login/utmp_login.c +++ b/appl/login/utmp_login.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997, 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -35,6 +35,48 @@ RCSID("$Id$"); +/* try to put something useful from hostname into dst, dst_sz: + * full name, first component or address */ + +void +shrink_hostname (const char *hostname, + char *dst, size_t dst_sz) +{ + char local_hostname[MaxHostNameLen]; + char *ld, *hd; + int ret; + struct addrinfo *ai; + + if (strlen(hostname) < dst_sz) { + strlcpy (dst, hostname, dst_sz); + return; + } + gethostname (local_hostname, sizeof(local_hostname)); + hd = strchr (hostname, '.'); + ld = strchr (local_hostname, '.'); + if (hd != NULL && ld != NULL && strcmp(hd, ld) == 0 + && hd - hostname < dst_sz) { + strlcpy (dst, hostname, dst_sz); + dst[hd - hostname] = '\0'; + return; + } + + ret = getaddrinfo (hostname, NULL, NULL, &ai); + if (ret) { + strncpy (dst, hostname, dst_sz); + return; + } + ret = getnameinfo (ai->ai_addr, ai->ai_addrlen, + dst, dst_sz, + NULL, 0, + NI_NUMERICHOST); + freeaddrinfo (ai); + if (ret) { + strncpy (dst, hostname, dst_sz); + return; + } +} + void prepare_utmp (struct utmp *utmp, char *tty, const char *username, const char *hostname) @@ -60,7 +102,7 @@ prepare_utmp (struct utmp *utmp, char *tty, # endif # ifdef HAVE_STRUCT_UTMP_UT_HOST - strncpy(utmp->ut_host, hostname, sizeof(utmp->ut_host)); + shrink_hostname (hostname, utmp->ut_host, sizeof(utmp->ut_host)); # endif # ifdef HAVE_STRUCT_UTMP_UT_TYPE diff --git a/appl/login/utmpx_login.c b/appl/login/utmpx_login.c index 97d57690e..6f6e30695 100644 --- a/appl/login/utmpx_login.c +++ b/appl/login/utmpx_login.c @@ -21,7 +21,7 @@ utmpx_update(struct utmpx *ut, char *line, const char *user, const char *host) strncpy(ut->ut_id, make_id(clean_tty), sizeof(ut->ut_id)); #endif strncpy(ut->ut_user, user, sizeof(ut->ut_user)); - strncpy(ut->ut_host, host, sizeof(ut->ut_host)); + shrink_hostname (host, ut->ut_host, sizeof(ut->ut_host)); #ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN ut->ut_syslen = strlen(host) + 1; if (ut->ut_syslen > sizeof(ut->ut_host))