(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
	 Assar Westerlund
					Assar Westerlund