try to write a useful string as host in utmp, using the same algoritm
as telnetd git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9661 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -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).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -35,6 +35,48 @@
|
|||||||
|
|
||||||
RCSID("$Id$");
|
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
|
void
|
||||||
prepare_utmp (struct utmp *utmp, char *tty,
|
prepare_utmp (struct utmp *utmp, char *tty,
|
||||||
const char *username, const char *hostname)
|
const char *username, const char *hostname)
|
||||||
@@ -60,7 +102,7 @@ prepare_utmp (struct utmp *utmp, char *tty,
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef HAVE_STRUCT_UTMP_UT_HOST
|
# 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
|
# endif
|
||||||
|
|
||||||
# ifdef HAVE_STRUCT_UTMP_UT_TYPE
|
# ifdef HAVE_STRUCT_UTMP_UT_TYPE
|
||||||
|
@@ -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));
|
strncpy(ut->ut_id, make_id(clean_tty), sizeof(ut->ut_id));
|
||||||
#endif
|
#endif
|
||||||
strncpy(ut->ut_user, user, sizeof(ut->ut_user));
|
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
|
#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN
|
||||||
ut->ut_syslen = strlen(host) + 1;
|
ut->ut_syslen = strlen(host) + 1;
|
||||||
if (ut->ut_syslen > sizeof(ut->ut_host))
|
if (ut->ut_syslen > sizeof(ut->ut_host))
|
||||||
|
Reference in New Issue
Block a user