(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
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'u':
|
case 'u': {
|
||||||
utmp_len = atoi(optarg);
|
char *eptr;
|
||||||
|
|
||||||
|
utmp_len = strtol(optarg, &eptr, 0);
|
||||||
|
if (optarg == eptr)
|
||||||
|
fprintf(stderr, "telnetd: unknown utmp len (%s)\n", optarg);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'U':
|
case 'U':
|
||||||
registerd_host_only = 1;
|
registerd_host_only = 1;
|
||||||
@@ -490,7 +495,6 @@ int
|
|||||||
getterminaltype(char *name, size_t name_sz)
|
getterminaltype(char *name, size_t name_sz)
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
void _gettermname();
|
|
||||||
|
|
||||||
settimer(baseline);
|
settimer(baseline);
|
||||||
#ifdef AUTHENTICATION
|
#ifdef AUTHENTICATION
|
||||||
@@ -629,7 +633,7 @@ getterminaltype(char *name, size_t name_sz)
|
|||||||
} /* end of getterminaltype */
|
} /* end of getterminaltype */
|
||||||
|
|
||||||
void
|
void
|
||||||
_gettermname()
|
_gettermname(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* If the client turned off the option,
|
* If the client turned off the option,
|
||||||
@@ -653,9 +657,9 @@ terminaltypeok(char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *hostname;
|
|
||||||
char host_name[MaxHostNameLen];
|
char host_name[MaxHostNameLen];
|
||||||
char remote_host_name[MaxHostNameLen];
|
char remote_host_name[MaxHostNameLen];
|
||||||
|
char remote_utmp_name[MaxHostNameLen];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get a pty, scan input lines.
|
* Get a pty, scan input lines.
|
||||||
@@ -663,12 +667,10 @@ char remote_host_name[MaxHostNameLen];
|
|||||||
static void
|
static void
|
||||||
doit(struct sockaddr *who, int who_len)
|
doit(struct sockaddr *who, int who_len)
|
||||||
{
|
{
|
||||||
char *host = NULL;
|
|
||||||
int level;
|
int level;
|
||||||
int ptynum;
|
int ptynum;
|
||||||
char user_name[256];
|
char user_name[256];
|
||||||
int error;
|
int error;
|
||||||
char host_addr[256];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find an available pty to use.
|
* Find an available pty to use.
|
||||||
@@ -693,43 +695,42 @@ doit(struct sockaddr *who, int who_len)
|
|||||||
}
|
}
|
||||||
#endif /* _SC_CRAY_SECURE_SYS */
|
#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,
|
NULL, 0,
|
||||||
registerd_host_only ? NI_NAMEREQD : 0);
|
registerd_host_only ? NI_NAMEREQD : 0);
|
||||||
if (error)
|
if (error)
|
||||||
fatal(net, "Couldn't resolve your address into a host name.\r\n\
|
fatal(net, "Couldn't resolve your address into a host name.\r\n\
|
||||||
Please contact your net administrator");
|
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));
|
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) */
|
/* 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 *domain = strchr(host_name, '.');
|
||||||
char *p = strchr(remote_host_name, '.');
|
char *p = strchr(remote_utmp_name, '.');
|
||||||
if (domain && p && (strcmp(p, domain) == 0))
|
if (domain != NULL && p != NULL && (strcmp(p, domain) == 0))
|
||||||
*p = 0; /* remove domain part */
|
*p = '\0'; /* remove domain part */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If hostname still doesn't fit utmp, use ipaddr.
|
* If hostname still doesn't fit utmp, use ipaddr.
|
||||||
*/
|
*/
|
||||||
if (strlen(remote_host_name) > abs(utmp_len))
|
if (strlen(remote_utmp_name) > utmp_len) {
|
||||||
strlcpy(remote_host_name,
|
error = getnameinfo (who, who_len,
|
||||||
host_addr,
|
remote_utmp_name,
|
||||||
sizeof(remote_host_name));
|
sizeof(remote_utmp_name),
|
||||||
|
NULL, 0,
|
||||||
|
NI_NUMERICHOST);
|
||||||
|
if (error)
|
||||||
|
fatal(net, "Couldn't get numeric address\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef AUTHENTICATION
|
#ifdef AUTHENTICATION
|
||||||
auth_encrypt_init(hostname, host, "TELNETD", 1);
|
auth_encrypt_init(host_name, remote_host_name, "TELNETD", 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
init_env();
|
init_env();
|
||||||
@@ -750,7 +751,8 @@ Please contact your net administrator");
|
|||||||
#endif /* _SC_CRAY_SECURE_SYS */
|
#endif /* _SC_CRAY_SECURE_SYS */
|
||||||
|
|
||||||
/* begin server processing */
|
/* 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*/
|
/*NOTREACHED*/
|
||||||
} /* end of doit */
|
} /* end of doit */
|
||||||
|
|
||||||
@@ -777,7 +779,8 @@ show_issue(void)
|
|||||||
* hand data to telnet receiver finite state machine.
|
* hand data to telnet receiver finite state machine.
|
||||||
*/
|
*/
|
||||||
void
|
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;
|
int on = 1;
|
||||||
char *he;
|
char *he;
|
||||||
@@ -960,7 +963,7 @@ my_telnet(int f, int p, char *host, int level, char *autoname)
|
|||||||
indefinitely */
|
indefinitely */
|
||||||
if(!startslave_called && (!encrypt_delay() || timeout > time(NULL))){
|
if(!startslave_called && (!encrypt_delay() || timeout > time(NULL))){
|
||||||
startslave_called = 1;
|
startslave_called = 1;
|
||||||
startslave(host, level, autoname);
|
startslave(host, utmp_host, level, autoname);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ncc < 0 && pcc < 0)
|
if (ncc < 0 && pcc < 0)
|
||||||
|
Reference in New Issue
Block a user