diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3c7c864 --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +LIBTELNET_SRCS = \ + libtelnet/auth.c \ + libtelnet/enc_des.c \ + libtelnet/encrypt.c \ + libtelnet/genget.c \ + libtelnet/getent.c \ + libtelnet/kerberos.c \ + libtelnet/kerberos5.c \ + libtelnet/krb4encpwd.c \ + libtelnet/misc.c \ + libtelnet/read_password.c \ + libtelnet/rsaencpwd.c \ + libtelnet/sra.c +# libtelnet/pk.c + +TELNET_SRCS = \ + telnet/authenc.c \ + telnet/commands.c \ + telnet/main.c \ + telnet/network.c \ + telnet/ring.c \ + telnet/sys_bsd.c \ + telnet/telnet.c \ + telnet/terminal.c \ + telnet/utilities.c + +TELNETD_SRCS = \ + telnetd/authenc.c \ + telnetd/global.c \ + telnetd/slc.c \ + telnetd/state.c \ + telnetd/sys_term.c \ + telnetd/telnetd.c \ + telnetd/termstat.c \ + telnetd/utility.c + +HEADERS = \ + arpa/telnet.h \ + libtelnet/auth-proto.h \ + libtelnet/auth.h \ + libtelnet/enc-proto.h \ + libtelnet/encrypt.h \ + libtelnet/key-proto.h \ + libtelnet/misc-proto.h \ + libtelnet/misc.h \ + libtelnet/pk.h \ + telnet/baud.h \ + telnet/defines.h \ + telnet/externs.h \ + telnet/fdset.h \ + telnet/general.h \ + telnet/ring.h \ + telnet/types.h \ + telnetd/defs.h \ + telnetd/ext.h \ + telnetd/pathnames.h \ + telnetd/telnetd.h + +LIBTELNET_OBJS = $(LIBTELNET_SRCS:.c=.o) +TELNET_OBJS = $(TELNET_SRCS:.c=.o) +TELNETD_OBJS = $(TELNETD_SRCS:.c=.o) +OBJS = $(LIBTELNET_OBJS) $(TELNET_OBJS) $(TELNETD_OBJS) + +INCLUDES = -I libtelnet -I . +TELNET_DEFINES = -DTERMCAP -DKLUDGELINEMODE -DENV_HACK -DOPIE +TELNETD_DEFINES = -DDIAGNOSTICS -DOLD_ENVIRON -DENV_HACK -DSTREAMSPTY +DEFINES = $(TELNET_DEFINES) $(TELNETD_DEFINES) +LIBS = -ltermcap +# CFLAGS suitable for clang or GCC +CFLAGS = -std=c89 -funsigned-char -Wall -Wno-pointer-sign -Wno-unused-variable -Wno-string-plus-int + +.PHONY: all +all: telnet/telnet telnetd/telnetd + +telnet/telnet: $(TELNET_OBJS) $(LIBTELNET_OBJS) + $(CC) $(LIBS) $(TELNET_OBJS) $(LIBTELNET_OBJS) -o $@ + +telnetd/telnetd: $(TELNETD_OBJS) $(LIBTELNET_OBJS) + $(CC) $(LIBS) $(TELNETD_OBJS) $(LIBTELNET_OBJS) -o $@ + +$(OBJS): $(HEADERS) +%.o: %.c + $(CC) $(INCLUDES) \ + $(if $(findstring $<,$(TELNET_SRCS)),-I telnet $(TELNET_DEFINES)) \ + $(if $(findstring $<,$(TELNETD_SRCS)),-I telnetd $(TELNETD_DEFINES)) \ + $(CFLAGS) -c $< -o $@ + +.PHONY: clean +clean: + $(RM) $(OBJS) telnet/telnet telnetd/telnetd diff --git a/libtelnet/auth.c b/libtelnet/auth.c index 4642655..709709e 100644 --- a/libtelnet/auth.c +++ b/libtelnet/auth.c @@ -70,7 +70,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include "arpa/telnet.h" #include "encrypt.h" #include "auth.h" diff --git a/libtelnet/enc_des.c b/libtelnet/enc_des.c index 2f7fe6e..d99e330 100644 --- a/libtelnet/enc_des.c +++ b/libtelnet/enc_des.c @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$"); #ifdef ENCRYPTION # ifdef AUTHENTICATION -#include +#include "arpa/telnet.h" #include #include #include diff --git a/libtelnet/encrypt.c b/libtelnet/encrypt.c index f8e9194..df22b1c 100644 --- a/libtelnet/encrypt.c +++ b/libtelnet/encrypt.c @@ -65,7 +65,7 @@ static const char sccsid[] = "@(#)encrypt.c 8.2 (Berkeley) 5/30/95"; #include #define ENCRYPT_NAMES -#include +#include "arpa/telnet.h" #include #include #include diff --git a/libtelnet/kerberos.c b/libtelnet/kerberos.c index 2380c27..b3e3ee2 100644 --- a/libtelnet/kerberos.c +++ b/libtelnet/kerberos.c @@ -61,7 +61,7 @@ static const char sccsid[] = "@(#)kerberos.c 8.3 (Berkeley) 5/30/95"; #ifdef KRB4 #include -#include +#include "arpa/telnet.h" #include /* BSD wont include this in krb.h, so we do it here */ #include #include diff --git a/libtelnet/kerberos5.c b/libtelnet/kerberos5.c index ba8c9e9..a61398e 100644 --- a/libtelnet/kerberos5.c +++ b/libtelnet/kerberos5.c @@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$"); #ifdef KRB5 -#include +#include "arpa/telnet.h" #include #include #include diff --git a/libtelnet/krb4encpwd.c b/libtelnet/krb4encpwd.c index e0530f6..3e0b752 100644 --- a/libtelnet/krb4encpwd.c +++ b/libtelnet/krb4encpwd.c @@ -76,7 +76,7 @@ static char sccsid[] = "@(#)krb4encpwd.c 8.3 (Berkeley) 5/30/95"; #include #include -#include +#include "arpa/telnet.h" #include #include #include diff --git a/libtelnet/rsaencpwd.c b/libtelnet/rsaencpwd.c index fba0c6b..071d19d 100644 --- a/libtelnet/rsaencpwd.c +++ b/libtelnet/rsaencpwd.c @@ -75,7 +75,7 @@ static char sccsid[] = "@(#)rsaencpwd.c 8.3 (Berkeley) 5/30/95"; */ #include -#include +#include "arpa/telnet.h" #include #include #include diff --git a/libtelnet/sra.c b/libtelnet/sra.c index 4a75968..3b0541d 100644 --- a/libtelnet/sra.c +++ b/libtelnet/sra.c @@ -35,7 +35,7 @@ __FBSDID("$FreeBSD$"); #ifdef SRA #ifdef ENCRYPTION #include -#include +#include "arpa/telnet.h" #include #include #include diff --git a/telnet/authenc.c b/telnet/authenc.c index 85f389b..56159a9 100644 --- a/telnet/authenc.c +++ b/telnet/authenc.c @@ -42,11 +42,11 @@ __FBSDID("$FreeBSD$"); #ifdef AUTHENTICATION #ifdef ENCRYPTION #include -#include +#include "arpa/telnet.h" #include #include -#include -#include +#include "libtelnet/encrypt.h" +#include "libtelnet/misc.h" #include "general.h" #include "ring.h" diff --git a/telnet/commands.c b/telnet/commands.c index 74cce6d..00954e8 100644 --- a/telnet/commands.c +++ b/telnet/commands.c @@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include "arpa/telnet.h" #include #include "general.h" @@ -69,10 +69,10 @@ __FBSDID("$FreeBSD$"); #include "misc.h" #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif #include diff --git a/telnet/externs.h b/telnet/externs.h index d42bddd..dd0ce67 100644 --- a/telnet/externs.h +++ b/telnet/externs.h @@ -45,14 +45,11 @@ #define BSD 43 #endif -#ifndef USE_TERMIO -# if BSD > 43 || defined(SYSV_TERMIO) -# define USE_TERMIO -# endif -#endif - #include #include +#if !defined(USE_TERMIO) +# define USE_OLD_TTY +#endif #include #include #ifdef USE_TERMIO @@ -63,7 +60,7 @@ #endif #if defined(NO_CC_T) || !defined(USE_TERMIO) # if !defined(USE_TERMIO) -typedef char cc_t; +typedef unsigned char cc_t; # else typedef unsigned char cc_t; # endif @@ -214,7 +211,7 @@ extern int (*decrypt_input)(int); #define set_his_want_state_dont set_my_want_state_wont #define set_his_want_state_wont set_my_want_state_dont -#if defined(USE_TERMIO) +#if defined(USE_TERMIO) || defined(__STDC__) #define SIG_FUNC_RET void #else #define SIG_FUNC_RET int diff --git a/telnet/main.c b/telnet/main.c index 1ddec82..219257a 100644 --- a/telnet/main.c +++ b/telnet/main.c @@ -50,10 +50,10 @@ __FBSDID("$FreeBSD$"); #include "defines.h" #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif /* These values need to be the same as defined in libtelnet/kerberos5.c */ diff --git a/telnet/network.c b/telnet/network.c index b140d60..f6300ab 100644 --- a/telnet/network.c +++ b/telnet/network.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include "arpa/telnet.h" #include #include "ring.h" diff --git a/telnet/sys_bsd.c b/telnet/sys_bsd.c index 32f84bf..7a40156 100644 --- a/telnet/sys_bsd.c +++ b/telnet/sys_bsd.c @@ -53,7 +53,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include "arpa/telnet.h" #include "ring.h" #include "fdset.h" diff --git a/telnet/telnet.c b/telnet/telnet.c index 80f43b2..d611732 100644 --- a/telnet/telnet.c +++ b/telnet/telnet.c @@ -50,10 +50,9 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include -#include +#include "arpa/telnet.h" #include "ring.h" @@ -62,13 +61,19 @@ __FBSDID("$FreeBSD$"); #include "types.h" #include "general.h" +#ifdef USE_TERMIO +# include +#else +# include +#endif + #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif -#include +#include "libtelnet/misc.h" #define strip(x) ((my_want_state_is_wont(TELOPT_BINARY)) ? ((x)&0x7f) : (x)) diff --git a/telnet/terminal.c b/telnet/terminal.c index 596c2b8..fd67025 100644 --- a/telnet/terminal.c +++ b/telnet/terminal.c @@ -39,7 +39,7 @@ static const char sccsid[] = "@(#)terminal.c 8.2 (Berkeley) 2/16/95"; #include __FBSDID("$FreeBSD$"); -#include +#include "arpa/telnet.h" #include #include @@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$"); #include "types.h" #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif Ring ttyoring, ttyiring; diff --git a/telnet/utilities.c b/telnet/utilities.c index 8d1ea2a..47bd614 100644 --- a/telnet/utilities.c +++ b/telnet/utilities.c @@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$"); #define TELOPTS #define TELCMDS #define SLC_NAMES -#include +#include "arpa/telnet.h" #include #include #include @@ -61,10 +61,10 @@ __FBSDID("$FreeBSD$"); #include "externs.h" #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif FILE *NetTrace = 0; /* Not in bss, since needs to stay */ diff --git a/telnetd/authenc.c b/telnetd/authenc.c index 9377b52..6ec764b 100644 --- a/telnetd/authenc.c +++ b/telnetd/authenc.c @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); /* Above "#ifdef"s actually "or"'ed together. XXX MarkM */ #include "telnetd.h" -#include +#include "libtelnet/misc.h" int net_write(unsigned char *str, int len) diff --git a/telnetd/defs.h b/telnetd/defs.h index d727f36..537b602 100644 --- a/telnetd/defs.h +++ b/telnetd/defs.h @@ -68,7 +68,7 @@ #include -#include +#include "arpa/telnet.h" #include #ifdef __STDC__ diff --git a/telnetd/state.c b/telnetd/state.c index 9cad0c5..71e6f00 100644 --- a/telnetd/state.c +++ b/telnetd/state.c @@ -42,10 +42,10 @@ __FBSDID("$FreeBSD$"); #include #include "telnetd.h" #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif unsigned char doopt[] = { IAC, DO, '%', 'c', 0 }; diff --git a/telnetd/sys_term.c b/telnetd/sys_term.c index bdc43f6..7e8b8dc 100644 --- a/telnetd/sys_term.c +++ b/telnetd/sys_term.c @@ -41,16 +41,13 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include "telnetd.h" #include "pathnames.h" -#include "types.h" -#include "baud.h" #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif int cleanopen(char *); @@ -126,7 +123,6 @@ struct termios termbuf, termbuf2; /* pty control structure */ #endif /* USE_TERMIO */ #include -#include int cleanopen(char *); void scrub_env(void); @@ -809,7 +805,11 @@ getptyslave(void) # ifdef LINEMODE waslm = tty_linemode(); # endif +# ifdef USE_TERMIO erase = termbuf.c_cc[VERASE]; +# else + erase = termbuf.sg.sg_erase; +# endif /* * Make sure that we don't have a controlling tty, and @@ -855,8 +855,13 @@ getptyslave(void) */ tty_rspeed((def_rspeed > 0) ? def_rspeed : 9600); tty_tspeed((def_tspeed > 0) ? def_tspeed : 9600); - if (erase) + if (erase) { +# ifdef USE_TERMIO termbuf.c_cc[VERASE] = erase; +# else + termbuf.sg.sg_erase = erase; +# endif + } # ifdef LINEMODE if (waslm) tty_setlinemode(1); diff --git a/telnetd/telnetd.c b/telnetd/telnetd.c index 2d31903..1f40e06 100644 --- a/telnetd/telnetd.c +++ b/telnetd/telnetd.c @@ -44,20 +44,19 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include #include #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" int auth_level = 0; #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif -#include +#include "libtelnet/misc.h" char remote_hostname[MAXHOSTNAMELEN]; size_t utmp_len = sizeof(remote_hostname) - 1; @@ -658,10 +657,13 @@ terminaltypeok(char *s) * Get a pty, scan input lines. */ void -doit(struct sockaddr *who) +doit(struct sockaddr *who_) { int err_; /* XXX */ + char *host = NULL; + struct hostent *hp; int ptynum; + struct sockaddr_in *who; /* * Find an available pty to use. @@ -686,30 +688,51 @@ doit(struct sockaddr *who) #endif /* get name of connected client */ - if (realhostname_sa(remote_hostname, sizeof(remote_hostname) - 1, - who, who->sa_len) == HOSTNAME_INVALIDADDR && registerd_host_only) + if (who_->sa_family != AF_INET) + fatal(net, "Non-IPv4 addresses are not supported"); + who = (struct sockaddr_in *)who_; + hp = gethostbyaddr((char *)&who->sin_addr, sizeof (struct in_addr), + who->sin_family); + + if (hp == NULL && registerd_host_only) { fatal(net, "Couldn't resolve your address into a host name.\r\n\ - Please contact your net administrator"); - remote_hostname[sizeof(remote_hostname) - 1] = '\0'; + Please contact your net administrator"); + } else if (hp && + (strlen(hp->h_name) <= (unsigned int)((utmp_len < 0) ? -utmp_len + : utmp_len))) { + strncpy(remote_hostname, hp->h_name, + sizeof(remote_hostname)-1); + hp = gethostbyname(remote_hostname); + if (hp == NULL) + host = inet_ntoa(who->sin_addr); + else for (; ; hp->h_addr_list++) { + if (hp->h_addr_list[0] == NULL) { + /* End of list - ditch it */ + host = inet_ntoa(who->sin_addr); + break; + } + if (!bcmp(hp->h_addr_list[0], (caddr_t)&who->sin_addr, + sizeof(who->sin_addr))) { + host = hp->h_name; + break; /* OK! */ + } + } + } else { + host = inet_ntoa(who->sin_addr); + } + /* + * We must make a copy because Kerberos is probably going + * to also do a gethost* and overwrite the static data... + */ + strncpy(remote_hostname, host, sizeof(remote_hostname)-1); + remote_hostname[sizeof(remote_hostname)-1] = 0; + host = remote_hostname; - if (!isdigit(remote_hostname[0]) && strlen(remote_hostname) > utmp_len) - err_ = getnameinfo(who, who->sa_len, remote_hostname, - sizeof(remote_hostname), NULL, 0, - NI_NUMERICHOST); - /* XXX: do 'err_' check */ - - (void) gethostname(host_name, sizeof(host_name) - 1); - host_name[sizeof(host_name) - 1] = '\0'; + (void) gethostname(host_name, sizeof (host_name)); hostname = host_name; -#ifdef AUTHENTICATION -#ifdef ENCRYPTION -/* The above #ifdefs should actually be "or"'ed, not "and"'ed. - * This is a byproduct of needing "#ifdef" and not "#if defined()" - * for unifdef. XXX MarkM - */ - auth_encrypt_init(hostname, remote_hostname, "TELNETD", 1); -#endif +#if defined(AUTHENTICATION) || defined(ENCRYPTION) + auth_encrypt_init(hostname, host, "TELNETD", 1); #endif init_env(); @@ -720,7 +743,7 @@ doit(struct sockaddr *who) level = getterminaltype(user_name); setenv("TERM", terminaltype ? terminaltype : "network", 1); - telnet(net, pty, remote_hostname); /* begin server process */ + telnet(net, pty, host); /* begin server process */ /*NOTREACHED*/ } /* end of doit */ diff --git a/telnetd/termstat.c b/telnetd/termstat.c index 8842520..af4e138 100644 --- a/telnetd/termstat.c +++ b/telnetd/termstat.c @@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$"); #include "telnetd.h" #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif /* diff --git a/telnetd/utility.c b/telnetd/utility.c index 905fd3b..eaed5e9 100644 --- a/telnetd/utility.c +++ b/telnetd/utility.c @@ -48,10 +48,10 @@ __FBSDID("$FreeBSD$"); #include "telnetd.h" #ifdef AUTHENTICATION -#include +#include "libtelnet/auth.h" #endif #ifdef ENCRYPTION -#include +#include "libtelnet/encrypt.h" #endif /*