(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