(doit, my_telnet): re-write code to keep track both of remote hostname
and utmp string to be used git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9659 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -289,9 +289,14 @@ main(int argc, char **argv)
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
utmp_len = atoi(optarg);
|
||||
case 'u': {
|
||||
char *eptr;
|
||||
|
||||
utmp_len = strtol(optarg, &eptr, 0);
|
||||
if (optarg == eptr)
|
||||
fprintf(stderr, "telnetd: unknown utmp len (%s)\n", optarg);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'U':
|
||||
registerd_host_only = 1;
|
||||
@@ -490,7 +495,6 @@ int
|
||||
getterminaltype(char *name, size_t name_sz)
|
||||
{
|
||||
int retval = -1;
|
||||
void _gettermname();
|
||||
|
||||
settimer(baseline);
|
||||
#ifdef AUTHENTICATION
|
||||
@@ -629,7 +633,7 @@ getterminaltype(char *name, size_t name_sz)
|
||||
} /* end of getterminaltype */
|
||||
|
||||
void
|
||||
_gettermname()
|
||||
_gettermname(void)
|
||||
{
|
||||
/*
|
||||
* If the client turned off the option,
|
||||
@@ -653,9 +657,9 @@ terminaltypeok(char *s)
|
||||
}
|
||||
|
||||
|
||||
char *hostname;
|
||||
char host_name[MaxHostNameLen];
|
||||
char remote_host_name[MaxHostNameLen];
|
||||
char remote_utmp_name[MaxHostNameLen];
|
||||
|
||||
/*
|
||||
* Get a pty, scan input lines.
|
||||
@@ -663,12 +667,10 @@ char remote_host_name[MaxHostNameLen];
|
||||
static void
|
||||
doit(struct sockaddr *who, int who_len)
|
||||
{
|
||||
char *host = NULL;
|
||||
int level;
|
||||
int ptynum;
|
||||
char user_name[256];
|
||||
int error;
|
||||
char host_addr[256];
|
||||
|
||||
/*
|
||||
* Find an available pty to use.
|
||||
@@ -693,43 +695,42 @@ doit(struct sockaddr *who, int who_len)
|
||||
}
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
|
||||
error = getnameinfo_verified (who, who_len, host_addr, sizeof(host_addr),
|
||||
error = getnameinfo_verified (who, who_len,
|
||||
remote_host_name,
|
||||
sizeof(remote_host_name),
|
||||
NULL, 0,
|
||||
registerd_host_only ? NI_NAMEREQD : 0);
|
||||
if (error)
|
||||
fatal(net, "Couldn't resolve your address into a host name.\r\n\
|
||||
Please contact your net administrator");
|
||||
|
||||
/*
|
||||
* We must make a copy because Kerberos is probably going
|
||||
* to also do a gethost* and overwrite the static data...
|
||||
*/
|
||||
strlcpy(remote_host_name, host_addr, sizeof(remote_host_name));
|
||||
host = remote_host_name;
|
||||
|
||||
/* XXX - should be k_gethostname? */
|
||||
gethostname(host_name, sizeof (host_name));
|
||||
hostname = host_name;
|
||||
|
||||
strlcpy (remote_utmp_name, remote_host_name, sizeof(remote_utmp_name));
|
||||
|
||||
/* Only trim if too long (and possible) */
|
||||
if (strlen(remote_host_name) > abs(utmp_len)) {
|
||||
if (strlen(remote_utmp_name) > utmp_len) {
|
||||
char *domain = strchr(host_name, '.');
|
||||
char *p = strchr(remote_host_name, '.');
|
||||
if (domain && p && (strcmp(p, domain) == 0))
|
||||
*p = 0; /* remove domain part */
|
||||
char *p = strchr(remote_utmp_name, '.');
|
||||
if (domain != NULL && p != NULL && (strcmp(p, domain) == 0))
|
||||
*p = '\0'; /* remove domain part */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If hostname still doesn't fit utmp, use ipaddr.
|
||||
*/
|
||||
if (strlen(remote_host_name) > abs(utmp_len))
|
||||
strlcpy(remote_host_name,
|
||||
host_addr,
|
||||
sizeof(remote_host_name));
|
||||
if (strlen(remote_utmp_name) > utmp_len) {
|
||||
error = getnameinfo (who, who_len,
|
||||
remote_utmp_name,
|
||||
sizeof(remote_utmp_name),
|
||||
NULL, 0,
|
||||
NI_NUMERICHOST);
|
||||
if (error)
|
||||
fatal(net, "Couldn't get numeric address\r\n");
|
||||
}
|
||||
|
||||
#ifdef AUTHENTICATION
|
||||
auth_encrypt_init(hostname, host, "TELNETD", 1);
|
||||
auth_encrypt_init(host_name, remote_host_name, "TELNETD", 1);
|
||||
#endif
|
||||
|
||||
init_env();
|
||||
@@ -750,7 +751,8 @@ Please contact your net administrator");
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
|
||||
/* begin server processing */
|
||||
my_telnet(net, ourpty, host, level, user_name);
|
||||
my_telnet(net, ourpty, remote_host_name, remote_utmp_name,
|
||||
level, user_name);
|
||||
/*NOTREACHED*/
|
||||
} /* end of doit */
|
||||
|
||||
@@ -777,7 +779,8 @@ show_issue(void)
|
||||
* hand data to telnet receiver finite state machine.
|
||||
*/
|
||||
void
|
||||
my_telnet(int f, int p, char *host, int level, char *autoname)
|
||||
my_telnet(int f, int p, const char *host, const char *utmp_host,
|
||||
int level, char *autoname)
|
||||
{
|
||||
int on = 1;
|
||||
char *he;
|
||||
@@ -960,7 +963,7 @@ my_telnet(int f, int p, char *host, int level, char *autoname)
|
||||
indefinitely */
|
||||
if(!startslave_called && (!encrypt_delay() || timeout > time(NULL))){
|
||||
startslave_called = 1;
|
||||
startslave(host, level, autoname);
|
||||
startslave(host, utmp_host, level, autoname);
|
||||
}
|
||||
|
||||
if (ncc < 0 && pcc < 0)
|
||||
|
Reference in New Issue
Block a user