From 89caae2932adde71022cb5691ee1b73cd26a8286 Mon Sep 17 00:00:00 2001 From: Atsushi Murai Date: Mon, 1 Jun 1998 08:47:04 +0000 Subject: [PATCH] Trim a domain part for wtmp as same as showed by "netstat -r". Here is a some example for avoiding a confusion. It asssumes a logged host domain is "spec.co.jp". All example is longer than UT_HOSTNAMELEN value. 1) turbo.tama.spec.co.jp: 192.19.0.2 -> trubo.tama 2) turbo.tama.foo.co.jp : 192.19.0.2 -> 192.19.0.2 3) specgw.spec.co.jp : 202.32.13.1 -> specgw Submitted by: Atsushi Murai --- lib/libutil/libutil.h | 4 ++-- lib/libutil/logwtmp.c | 41 ++++++++++++++++++++++++++++++++++++++++- usr.bin/login/login.c | 6 +++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h index 513acee9ca3..4cacbee6400 100644 --- a/lib/libutil/libutil.h +++ b/lib/libutil/libutil.h @@ -18,7 +18,7 @@ * 5. Modifications may be freely made to this file providing the above * conditions are met. * - * $Id: libutil.h,v 1.13 1997/09/04 22:38:58 pst Exp $ + * $Id: libutil.h,v 1.14 1998/05/28 23:17:07 brian Exp $ */ #ifndef _LIBUTIL_H_ @@ -37,13 +37,13 @@ void login __P((struct utmp *_ut)); int login_tty __P((int _fd)); int logout __P((char *_line)); void logwtmp __P((const char *_line, const char *_name, const char *_host)); +void trimdomain __P((char *_fullhost, int _hostsize)); int openpty __P((int *_amaster, int *_aslave, char *_name, struct termios *_termp, struct winsize *_winp)); int forkpty __P((int *_amaster, char *_name, struct termios *_termp, struct winsize *_winp)); const char *uu_lockerr __P((int _uu_lockresult)); int uu_lock __P((const char *_ttyname)); -int uu_lock_txfr __P((const char *_ttyname, pid_t _pid)); int uu_unlock __P((const char *_ttyname)); int _secure_path __P((const char *_path, uid_t _uid, gid_t _gid)); __END_DECLS diff --git a/lib/libutil/logwtmp.c b/lib/libutil/logwtmp.c index de3c5d69d0c..531b715486c 100644 --- a/lib/libutil/logwtmp.c +++ b/lib/libutil/logwtmp.c @@ -36,10 +36,11 @@ static char sccsid[] = "@(#)logwtmp.c 8.1 (Berkeley) 6/4/93"; #else static const char rcsid[] = - "$Id: logwtmp.c,v 1.4 1997/08/13 20:42:18 steve Exp $"; + "$Id: logwtmp.c,v 1.5 1997/09/04 22:38:59 pst Exp $"; #endif #endif /* LIBC_SCCS and not lint */ +#include #include #include #include @@ -53,6 +54,37 @@ static const char rcsid[] = #include #include +void +trimdomain( char * fullhost, int hostsize ) +{ + static char domain[MAXHOSTNAMELEN + 1]; + static int first = 1; + char *s; + + if (first) { + first = 0; + if (gethostname(domain, MAXHOSTNAMELEN) == 0 && + (s = strchr(domain, '.'))) + (void) strcpy(domain, s + 1); + else + domain[0] = 0; + } + + if (domain[0]) { + s = fullhost; + while ((fullhost = strchr(fullhost, '.'))) { + if (!strcasecmp(fullhost + 1, domain)) { + if ( fullhost - s < hostsize ) { + *fullhost = '\0'; /* hit it and acceptable size*/ + } + break; + } else { + fullhost++; + } + } + } +} + void logwtmp(line, name, host) const char *line; @@ -61,7 +93,14 @@ logwtmp(line, name, host) { struct utmp ut; struct stat buf; + char fullhost[MAXHOSTNAMELEN + 1]; + char *whost = fullhost; int fd; + + strncpy( whost, host, MAXHOSTNAMELEN ); +fullhost[MAXHOSTNAMELEN] = '\0'; + trimdomain( whost, UT_HOSTSIZE ); + host = whost; if (strlen(host) > UT_HOSTSIZE) { struct hostent *hp = gethostbyname(host); diff --git a/usr.bin/login/login.c b/usr.bin/login/login.c index 17137f05d0a..0c6ee3a2d10 100644 --- a/usr.bin/login/login.c +++ b/usr.bin/login/login.c @@ -42,7 +42,7 @@ static char copyright[] = static char sccsid[] = "@(#)login.c 8.4 (Berkeley) 4/2/94"; #endif static const char rcsid[] = - "$Id: login.c,v 1.33 1998/04/30 16:48:20 peter Exp $"; + "$Id: login.c,v 1.34 1998/04/30 16:50:07 peter Exp $"; #endif /* not lint */ /* @@ -118,6 +118,7 @@ int klogin __P((struct passwd *, char *, char *, char *)); #endif extern void login __P((struct utmp *)); +extern void trimdomain __P((char *, int)); static void usage __P((void)); #define TTYGRPNAME "tty" /* name of group to own ttys */ @@ -213,6 +214,9 @@ main(argc, argv) if (domain && (p = strchr(optarg, '.')) && strcasecmp(p, domain) == 0) *p = 0; + + trimdomain(optarg, UT_HOSTSIZE ); + if (strlen(optarg) > UT_HOSTSIZE) { struct hostent *hp = gethostbyname(optarg);