Bring the FreeBSD changes to the virgin sources.

git-svn-id: http://svn0.us-east.freebsd.org/base/head/contrib/telnet@29181 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
This commit is contained in:
markm 1997-09-07 07:02:53 +00:00
parent 0e15f670a1
commit 6ba4d9bbdb
33 changed files with 472 additions and 267 deletions

View File

@ -33,8 +33,8 @@
* @(#)telnet.h 8.2 (Berkeley) 12/15/93 * @(#)telnet.h 8.2 (Berkeley) 12/15/93
*/ */
#ifndef _TELNET_H_ #ifndef _ARPA_TELNET_H_
#define _TELNET_H_ #define _ARPA_TELNET_H_
/* /*
* Definitions for the TELNET protocol. * Definitions for the TELNET protocol.
@ -66,7 +66,8 @@
char *telcmds[] = { char *telcmds[] = {
"EOF", "SUSP", "ABORT", "EOR", "EOF", "SUSP", "ABORT", "EOR",
"SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
"EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0, "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC",
0
}; };
#else #else
extern char *telcmds[]; extern char *telcmds[];
@ -135,7 +136,7 @@ char *telopts[NTELOPTS+1] = {
"3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW", "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
"LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION", "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
"ENCRYPT", "NEW-ENVIRON", "ENCRYPT", "NEW-ENVIRON",
0, 0
}; };
#define TELOPT_FIRST TELOPT_BINARY #define TELOPT_FIRST TELOPT_BINARY
#define TELOPT_LAST TELOPT_NEW_ENVIRON #define TELOPT_LAST TELOPT_NEW_ENVIRON
@ -196,8 +197,20 @@ char *telopts[NTELOPTS+1] = {
#define SLC_XOFF 16 #define SLC_XOFF 16
#define SLC_FORW1 17 #define SLC_FORW1 17
#define SLC_FORW2 18 #define SLC_FORW2 18
#define SLC_MCL 19
#define SLC_MCR 20
#define SLC_MCWL 21
#define SLC_MCWR 22
#define SLC_MCBOL 23
#define SLC_MCEOL 24
#define SLC_INSRT 25
#define SLC_OVER 26
#define SLC_ECR 27
#define SLC_EWR 28
#define SLC_EBOL 29
#define SLC_EEOL 30
#define NSLC 18 #define NSLC 30
/* /*
* For backwards compatability, we define SLC_NAMES to be the * For backwards compatability, we define SLC_NAMES to be the
@ -205,7 +218,12 @@ char *telopts[NTELOPTS+1] = {
*/ */
#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \ #define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
"ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \ "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
"LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0, "LNEXT", "XON", "XOFF", "FORW1", "FORW2", \
"MCL", "MCR", "MCWL", "MCWR", "MCBOL", \
"MCEOL", "INSRT", "OVER", "ECR", "EWR", \
"EBOL", "EEOL", \
0
#ifdef SLC_NAMES #ifdef SLC_NAMES
char *slc_names[] = { char *slc_names[] = {
SLC_NAMELIST SLC_NAMELIST
@ -268,7 +286,8 @@ extern char *slc_names[];
#ifdef AUTH_NAMES #ifdef AUTH_NAMES
char *authtype_names[] = { char *authtype_names[] = {
"NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0, "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK",
0
}; };
#else #else
extern char *authtype_names[]; extern char *authtype_names[];
@ -286,7 +305,7 @@ extern char *authtype_names[];
#define ENCRYPT_START 3 /* Am starting to send encrypted */ #define ENCRYPT_START 3 /* Am starting to send encrypted */
#define ENCRYPT_END 4 /* Am ending encrypted */ #define ENCRYPT_END 4 /* Am ending encrypted */
#define ENCRYPT_REQSTART 5 /* Request you start encrypting */ #define ENCRYPT_REQSTART 5 /* Request you start encrypting */
#define ENCRYPT_REQEND 6 /* Request you send encrypting */ #define ENCRYPT_REQEND 6 /* Request you end encrypting */
#define ENCRYPT_ENC_KEYID 7 #define ENCRYPT_ENC_KEYID 7
#define ENCRYPT_DEC_KEYID 8 #define ENCRYPT_DEC_KEYID 8
#define ENCRYPT_CNT 9 #define ENCRYPT_CNT 9
@ -300,10 +319,11 @@ extern char *authtype_names[];
char *encrypt_names[] = { char *encrypt_names[] = {
"IS", "SUPPORT", "REPLY", "START", "END", "IS", "SUPPORT", "REPLY", "START", "END",
"REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID", "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
0, 0
}; };
char *enctype_names[] = { char *enctype_names[] = {
"ANY", "DES_CFB64", "DES_OFB64", 0, "ANY", "DES_CFB64", "DES_OFB64",
0
}; };
#else #else
extern char *encrypt_names[]; extern char *encrypt_names[];

View File

@ -75,6 +75,10 @@ void auth_finished P((Authenticator *, int));
int auth_wait P((char *)); int auth_wait P((char *));
void auth_disable_name P((char *)); void auth_disable_name P((char *));
void auth_gen_printsub P((unsigned char *, int, unsigned char *, int)); void auth_gen_printsub P((unsigned char *, int, unsigned char *, int));
void auth_name P((unsigned char *, int));
void auth_printsub P((unsigned char *, int, unsigned char *, int));
int auth_sendname P((unsigned char *, int));
void auth_encrypt_user P((char *));
#ifdef KRB4 #ifdef KRB4
int kerberos4_init P((Authenticator *, int)); int kerberos4_init P((Authenticator *, int));

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)auth.c 8.3 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)auth.c 8.3 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
/* /*
@ -64,6 +64,7 @@ static char sccsid[] = "@(#)auth.c 8.3 (Berkeley) 5/30/95";
#include <arpa/telnet.h> #include <arpa/telnet.h>
#ifdef __STDC__ #ifdef __STDC__
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#endif #endif
#ifdef NO_STRING_H #ifdef NO_STRING_H
#include <strings.h> #include <strings.h>
@ -106,6 +107,9 @@ static unsigned char _auth_send_data[256];
static unsigned char *auth_send_data; static unsigned char *auth_send_data;
static int auth_send_cnt = 0; static int auth_send_cnt = 0;
int auth_onoff(char *type, int on);
void auth_encrypt_user(char *name);
/* /*
* Authentication types supported. Plese note that these are stored * Authentication types supported. Plese note that these are stored
* in priority order, i.e. try the first one first. * in priority order, i.e. try the first one first.
@ -500,7 +504,7 @@ auth_is(data, cnt)
return; return;
} }
if (ap = findauthenticator(data[0], data[1])) { if ((ap = findauthenticator(data[0], data[1]))) {
if (ap->is) if (ap->is)
(*ap->is)(ap, data+2, cnt-2); (*ap->is)(ap, data+2, cnt-2);
} else if (auth_debug_mode) } else if (auth_debug_mode)
@ -518,7 +522,7 @@ auth_reply(data, cnt)
if (cnt < 2) if (cnt < 2)
return; return;
if (ap = findauthenticator(data[0], data[1])) { if ((ap = findauthenticator(data[0], data[1]))) {
if (ap->reply) if (ap->reply)
(*ap->reply)(ap, data+2, cnt-2); (*ap->reply)(ap, data+2, cnt-2);
} else if (auth_debug_mode) } else if (auth_debug_mode)
@ -531,7 +535,6 @@ auth_name(data, cnt)
unsigned char *data; unsigned char *data;
int cnt; int cnt;
{ {
Authenticator *ap;
unsigned char savename[256]; unsigned char savename[256];
if (cnt < 1) { if (cnt < 1) {

View File

@ -79,11 +79,17 @@ void encrypt_send_end P((void));
void encrypt_wait P((void)); void encrypt_wait P((void));
void encrypt_send_support P((void)); void encrypt_send_support P((void));
void encrypt_send_keyid P((int, unsigned char *, int, int)); void encrypt_send_keyid P((int, unsigned char *, int, int));
void encrypt_start P((unsigned char *, int));
void encrypt_end P((void));
void encrypt_support P((unsigned char *, int));
void encrypt_request_start P((unsigned char *, int));
void encrypt_request_end P((void));
void encrypt_enc_keyid P((unsigned char *, int));
void encrypt_dec_keyid P((unsigned char *, int));
void encrypt_printsub P((unsigned char *, int, unsigned char *, int));
int net_write P((unsigned char *, int)); int net_write P((unsigned char *, int));
#ifdef TELENTD #ifndef TELENTD
void encrypt_wait P((void));
#else
int encrypt_cmd P((int, char **)); int encrypt_cmd P((int, char **));
void encrypt_display P((void)); void encrypt_display P((void));
#endif #endif
@ -117,9 +123,4 @@ void ofb64_session P((Session_Key *, int));
int ofb64_keyid P((int, unsigned char *, int *)); int ofb64_keyid P((int, unsigned char *, int *));
void ofb64_printsub P((unsigned char *, int, unsigned char *, int)); void ofb64_printsub P((unsigned char *, int, unsigned char *, int));
int des_new_random_key P((Block));
void des_set_random_generator_seed P((Block));
void des_key_sched P((Block, Schedule));
void des_ecb_encrypt P((Block, Block, Schedule, int));
int des_string_to_key P((char *, Block));
#endif /* ENCRYPTION */ #endif /* ENCRYPTION */

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)enc_des.c 8.3 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)enc_des.c 8.3 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#ifdef ENCRYPTION #ifdef ENCRYPTION
@ -44,6 +44,8 @@ static char sccsid[] = "@(#)enc_des.c 8.3 (Berkeley) 5/30/95";
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#include <des.h>
#include <string.h>
#include "encrypt.h" #include "encrypt.h"
#include "key-proto.h" #include "key-proto.h"
#include "misc-proto.h" #include "misc-proto.h"
@ -180,7 +182,6 @@ fb64_start(fbp, dir, server)
int dir; int dir;
int server; int server;
{ {
Block b;
int x; int x;
unsigned char *p; unsigned char *p;
register int state; register int state;
@ -215,8 +216,8 @@ fb64_start(fbp, dir, server)
/* /*
* Create a random feed and send it over. * Create a random feed and send it over.
*/ */
des_new_random_key(fbp->temp_feed); des_new_random_key((Block *)fbp->temp_feed);
des_ecb_encrypt(fbp->temp_feed, fbp->temp_feed, des_ecb_encrypt((Block *)fbp->temp_feed, (Block *)fbp->temp_feed,
fbp->krbdes_sched, 1); fbp->krbdes_sched, 1);
p = fbp->fb_feed + 3; p = fbp->fb_feed + 3;
*p++ = ENCRYPT_IS; *p++ = ENCRYPT_IS;
@ -264,9 +265,7 @@ fb64_is(data, cnt, fbp)
int cnt; int cnt;
struct fb *fbp; struct fb *fbp;
{ {
int x;
unsigned char *p; unsigned char *p;
Block b;
register int state = fbp->state[DIR_DECRYPT-1]; register int state = fbp->state[DIR_DECRYPT-1];
if (cnt-- < 1) if (cnt-- < 1)
@ -356,9 +355,6 @@ fb64_reply(data, cnt, fbp)
int cnt; int cnt;
struct fb *fbp; struct fb *fbp;
{ {
int x;
unsigned char *p;
Block b;
register int state = fbp->state[DIR_ENCRYPT-1]; register int state = fbp->state[DIR_ENCRYPT-1];
if (cnt-- < 1) if (cnt-- < 1)
@ -428,10 +424,10 @@ fb64_session(key, server, fbp)
fb64_stream_key(fbp->krbdes_key, &fbp->streams[DIR_DECRYPT-1]); fb64_stream_key(fbp->krbdes_key, &fbp->streams[DIR_DECRYPT-1]);
if (fbp->once == 0) { if (fbp->once == 0) {
des_set_random_generator_seed(fbp->krbdes_key); des_set_random_generator_seed((Block *)fbp->krbdes_key);
fbp->once = 1; fbp->once = 1;
} }
des_key_sched(fbp->krbdes_key, fbp->krbdes_sched); des_key_sched((Block *)fbp->krbdes_key, fbp->krbdes_sched);
/* /*
* Now look to see if krbdes_start() was was waiting for * Now look to see if krbdes_start() was was waiting for
* the key to show up. If so, go ahead an call it now * the key to show up. If so, go ahead an call it now
@ -552,7 +548,7 @@ fb64_stream_iv(seed, stp)
memmove((void *)stp->str_iv, (void *)seed, sizeof(Block)); memmove((void *)stp->str_iv, (void *)seed, sizeof(Block));
memmove((void *)stp->str_output, (void *)seed, sizeof(Block)); memmove((void *)stp->str_output, (void *)seed, sizeof(Block));
des_key_sched(stp->str_ikey, stp->str_sched); des_key_sched((Block *)stp->str_ikey, stp->str_sched);
stp->str_index = sizeof(Block); stp->str_index = sizeof(Block);
} }
@ -563,7 +559,7 @@ fb64_stream_key(key, stp)
register struct stinfo *stp; register struct stinfo *stp;
{ {
memmove((void *)stp->str_ikey, (void *)key, sizeof(Block)); memmove((void *)stp->str_ikey, (void *)key, sizeof(Block));
des_key_sched(key, stp->str_sched); des_key_sched((Block *)key, stp->str_sched);
memmove((void *)stp->str_output, (void *)stp->str_iv, sizeof(Block)); memmove((void *)stp->str_output, (void *)stp->str_iv, sizeof(Block));
@ -604,7 +600,7 @@ cfb64_encrypt(s, c)
while (c-- > 0) { while (c-- > 0) {
if (index == sizeof(Block)) { if (index == sizeof(Block)) {
Block b; Block b;
des_ecb_encrypt(stp->str_output, b, stp->str_sched, 1); des_ecb_encrypt((Block *)stp->str_output, (Block *)b, stp->str_sched, 1);
memmove((void *)stp->str_feed, (void *)b, sizeof(Block)); memmove((void *)stp->str_feed, (void *)b, sizeof(Block));
index = 0; index = 0;
} }
@ -638,7 +634,7 @@ cfb64_decrypt(data)
index = stp->str_index++; index = stp->str_index++;
if (index == sizeof(Block)) { if (index == sizeof(Block)) {
Block b; Block b;
des_ecb_encrypt(stp->str_output, b, stp->str_sched, 1); des_ecb_encrypt((Block *)stp->str_output, (Block *)b, stp->str_sched, 1);
memmove((void *)stp->str_feed, (void *)b, sizeof(Block)); memmove((void *)stp->str_feed, (void *)b, sizeof(Block));
stp->str_index = 1; /* Next time will be 1 */ stp->str_index = 1; /* Next time will be 1 */
index = 0; /* But now use 0 */ index = 0; /* But now use 0 */
@ -680,7 +676,7 @@ ofb64_encrypt(s, c)
while (c-- > 0) { while (c-- > 0) {
if (index == sizeof(Block)) { if (index == sizeof(Block)) {
Block b; Block b;
des_ecb_encrypt(stp->str_feed, b, stp->str_sched, 1); des_ecb_encrypt((Block *)stp->str_feed, (Block *)b, stp->str_sched, 1);
memmove((void *)stp->str_feed, (void *)b, sizeof(Block)); memmove((void *)stp->str_feed, (void *)b, sizeof(Block));
index = 0; index = 0;
} }
@ -711,7 +707,7 @@ ofb64_decrypt(data)
index = stp->str_index++; index = stp->str_index++;
if (index == sizeof(Block)) { if (index == sizeof(Block)) {
Block b; Block b;
des_ecb_encrypt(stp->str_feed, b, stp->str_sched, 1); des_ecb_encrypt((Block *)stp->str_feed, (Block *)b, stp->str_sched, 1);
memmove((void *)stp->str_feed, (void *)b, sizeof(Block)); memmove((void *)stp->str_feed, (void *)b, sizeof(Block));
stp->str_index = 1; /* Next time will be 1 */ stp->str_index = 1; /* Next time will be 1 */
index = 0; /* But now use 0 */ index = 0; /* But now use 0 */

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)encrypt.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)encrypt.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
/* /*
@ -58,6 +58,7 @@ static char sccsid[] = "@(#)encrypt.c 8.2 (Berkeley) 5/30/95";
#ifdef ENCRYPTION #ifdef ENCRYPTION
#define ENCRYPT_NAMES #define ENCRYPT_NAMES
#include <stdio.h>
#include <arpa/telnet.h> #include <arpa/telnet.h>
#include "encrypt.h" #include "encrypt.h"
@ -79,6 +80,18 @@ static char sccsid[] = "@(#)encrypt.c 8.2 (Berkeley) 5/30/95";
void (*encrypt_output) P((unsigned char *, int)); void (*encrypt_output) P((unsigned char *, int));
int (*decrypt_input) P((int)); int (*decrypt_input) P((int));
int EncryptType(char *type, char *mode);
int EncryptStart(char *mode);
int EncryptStop(char *mode);
int EncryptStartInput(void);
int EncryptStartOutput(void);
int EncryptStopInput(void);
int EncryptStopOutput(void);
int Ambiguous(char **s);
int isprefix(char *s1, char *s2);
char **genget(char *name, char **table, int stlen);
int encrypt_debug_mode = 0; int encrypt_debug_mode = 0;
static int decrypt_mode = 0; static int decrypt_mode = 0;
static int encrypt_mode = 0; static int encrypt_mode = 0;
@ -174,6 +187,8 @@ static struct key_info {
{ { 0 }, 0, DIR_DECRYPT, &decrypt_mode, finddecryption }, { { 0 }, 0, DIR_DECRYPT, &decrypt_mode, finddecryption },
}; };
static void encrypt_keyid(struct key_info *kp, unsigned char *keyid, int len);
void void
encrypt_init(name, server) encrypt_init(name, server)
char *name; char *name;
@ -248,10 +263,10 @@ EncryptDisable(type, mode)
if (isprefix(type, "help") || isprefix(type, "?")) { if (isprefix(type, "help") || isprefix(type, "?")) {
printf("Usage: encrypt disable <type> [input|output]\n"); printf("Usage: encrypt disable <type> [input|output]\n");
encrypt_list_types(); encrypt_list_types();
} else if ((ep = (Encryptions *)genget(type, encryptions, } else if ((ep = (Encryptions *)genget(type, (char **)encryptions,
sizeof(Encryptions))) == 0) { sizeof(Encryptions))) == 0) {
printf("%s: invalid encryption type\n", type); printf("%s: invalid encryption type\n", type);
} else if (Ambiguous(ep)) { } else if (Ambiguous((char **)ep)) {
printf("Ambiguous type '%s'\n", type); printf("Ambiguous type '%s'\n", type);
} else { } else {
if ((mode == 0) || (isprefix(mode, "input") ? 1 : 0)) { if ((mode == 0) || (isprefix(mode, "input") ? 1 : 0)) {
@ -283,10 +298,10 @@ EncryptType(type, mode)
if (isprefix(type, "help") || isprefix(type, "?")) { if (isprefix(type, "help") || isprefix(type, "?")) {
printf("Usage: encrypt type <type> [input|output]\n"); printf("Usage: encrypt type <type> [input|output]\n");
encrypt_list_types(); encrypt_list_types();
} else if ((ep = (Encryptions *)genget(type, encryptions, } else if ((ep = (Encryptions *)genget(type, (char **)encryptions,
sizeof(Encryptions))) == 0) { sizeof(Encryptions))) == 0) {
printf("%s: invalid encryption type\n", type); printf("%s: invalid encryption type\n", type);
} else if (Ambiguous(ep)) { } else if (Ambiguous((char **)ep)) {
printf("Ambiguous type '%s'\n", type); printf("Ambiguous type '%s'\n", type);
} else { } else {
if ((mode == 0) || isprefix(mode, "input")) { if ((mode == 0) || isprefix(mode, "input")) {
@ -559,7 +574,7 @@ encrypt_is(data, cnt)
} else { } else {
ret = (*ep->is)(data, cnt); ret = (*ep->is)(data, cnt);
if (encrypt_debug_mode) if (encrypt_debug_mode)
printf("(*ep->is)(%x, %d) returned %s(%d)\n", data, cnt, printf("(*ep->is)(%p, %d) returned %s(%d)\n", data, cnt,
(ret < 0) ? "FAIL " : (ret < 0) ? "FAIL " :
(ret == 0) ? "SUCCESS " : "MORE_TO_DO ", ret); (ret == 0) ? "SUCCESS " : "MORE_TO_DO ", ret);
} }
@ -603,7 +618,7 @@ encrypt_reply(data, cnt)
} else { } else {
ret = (*ep->reply)(data, cnt); ret = (*ep->reply)(data, cnt);
if (encrypt_debug_mode) if (encrypt_debug_mode)
printf("(*ep->reply)(%x, %d) returned %s(%d)\n", printf("(*ep->reply)(%p, %d) returned %s(%d)\n",
data, cnt, data, cnt,
(ret < 0) ? "FAIL " : (ret < 0) ? "FAIL " :
(ret == 0) ? "SUCCESS " : "MORE_TO_DO ", ret); (ret == 0) ? "SUCCESS " : "MORE_TO_DO ", ret);
@ -641,7 +656,7 @@ encrypt_start(data, cnt)
return; return;
} }
if (ep = finddecryption(decrypt_mode)) { if ((ep = finddecryption(decrypt_mode))) {
decrypt_input = ep->input; decrypt_input = ep->input;
if (encrypt_verbose) if (encrypt_verbose)
printf("[ Input is now decrypted with type %s ]\r\n", printf("[ Input is now decrypted with type %s ]\r\n",
@ -725,6 +740,7 @@ encrypt_request_start(data, cnt)
static unsigned char str_keyid[(MAXKEYLEN*2)+5] = { IAC, SB, TELOPT_ENCRYPT }; static unsigned char str_keyid[(MAXKEYLEN*2)+5] = { IAC, SB, TELOPT_ENCRYPT };
void
encrypt_enc_keyid(keyid, len) encrypt_enc_keyid(keyid, len)
unsigned char *keyid; unsigned char *keyid;
int len; int len;
@ -732,6 +748,7 @@ encrypt_enc_keyid(keyid, len)
encrypt_keyid(&ki[1], keyid, len); encrypt_keyid(&ki[1], keyid, len);
} }
void
encrypt_dec_keyid(keyid, len) encrypt_dec_keyid(keyid, len)
unsigned char *keyid; unsigned char *keyid;
int len; int len;
@ -739,13 +756,13 @@ encrypt_dec_keyid(keyid, len)
encrypt_keyid(&ki[0], keyid, len); encrypt_keyid(&ki[0], keyid, len);
} }
void
encrypt_keyid(kp, keyid, len) encrypt_keyid(kp, keyid, len)
struct key_info *kp; struct key_info *kp;
unsigned char *keyid; unsigned char *keyid;
int len; int len;
{ {
Encryptions *ep; Encryptions *ep;
unsigned char *strp, *cp;
int dir = kp->dir; int dir = kp->dir;
register int ret = 0; register int ret = 0;
@ -942,7 +959,6 @@ encrypt_send_request_end()
void void
encrypt_wait() encrypt_wait()
{ {
register int encrypt, decrypt;
if (encrypt_debug_mode) if (encrypt_debug_mode)
printf(">>>%s: in encrypt_wait\r\n", Name); printf(">>>%s: in encrypt_wait\r\n", Name);
if (!havesessionkey || !(I_SUPPORT_ENCRYPT & remote_supports_decrypt)) if (!havesessionkey || !(I_SUPPORT_ENCRYPT & remote_supports_decrypt))

View File

@ -62,7 +62,7 @@
typedef unsigned char Block[8]; typedef unsigned char Block[8];
typedef unsigned char *BlockT; typedef unsigned char *BlockT;
typedef struct { Block _; } Schedule[16]; typedef struct { Block __; } Schedule[16];
#define VALIDKEY(key) ( key[0] | key[1] | key[2] | key[3] | \ #define VALIDKEY(key) ( key[0] | key[1] | key[2] | key[3] | \
key[4] | key[5] | key[6] | key[7]) key[4] | key[5] | key[6] | key[7])

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)genget.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)genget.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
@ -49,7 +49,6 @@ static char sccsid[] = "@(#)genget.c 8.2 (Berkeley) 5/30/95";
isprefix(s1, s2) isprefix(s1, s2)
register char *s1, *s2; register char *s1, *s2;
{ {
register int n = 0;
char *os1; char *os1;
register char c1, c2; register char c1, c2;
@ -99,7 +98,7 @@ genget(name, table, stlen)
*/ */
int int
Ambiguous(s) Ambiguous(s)
char *s; char **s;
{ {
return((char **)s == &ambiguous); return(s == &ambiguous);
} }

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)kerberos.c 8.3 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)kerberos.c 8.3 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
/* /*
@ -75,19 +75,12 @@ static char sccsid[] = "@(#)kerberos.c 8.3 (Berkeley) 5/30/95";
#include "misc.h" #include "misc.h"
int kerberos4_cksum P((unsigned char *, int)); int kerberos4_cksum P((unsigned char *, int));
int krb_mk_req P((KTEXT, char *, char *, char *, u_long));
int krb_rd_req P((KTEXT, char *, char *, u_long, AUTH_DAT *, char *));
int krb_kntoln P((AUTH_DAT *, char *));
int krb_get_cred P((char *, char *, char *, CREDENTIALS *));
int krb_get_lrealm P((char *, int));
int kuserok P((AUTH_DAT *, char *)); int kuserok P((AUTH_DAT *, char *));
extern auth_debug_mode; extern auth_debug_mode;
static unsigned char str_data[1024] = { IAC, SB, TELOPT_AUTHENTICATION, 0, static unsigned char str_data[1024] = { IAC, SB, TELOPT_AUTHENTICATION, 0,
AUTHTYPE_KERBEROS_V4, }; AUTHTYPE_KERBEROS_V4, };
static unsigned char str_name[1024] = { IAC, SB, TELOPT_AUTHENTICATION,
TELQUAL_NAME, };
#define KRB_AUTH 0 /* Authentication data follows */ #define KRB_AUTH 0 /* Authentication data follows */
#define KRB_REJECT 1 /* Rejected (reason might follow) */ #define KRB_REJECT 1 /* Rejected (reason might follow) */
@ -102,7 +95,7 @@ static char name[ANAME_SZ];
static AUTH_DAT adat = { 0 }; static AUTH_DAT adat = { 0 };
#ifdef ENCRYPTION #ifdef ENCRYPTION
static Block session_key = { 0 }; static Block session_key = { 0 };
static Schedule sched; static des_key_schedule sched;
static Block challenge = { 0 }; static Block challenge = { 0 };
#endif /* ENCRYPTION */ #endif /* ENCRYPTION */
@ -167,9 +160,6 @@ kerberos4_send(ap)
Authenticator *ap; Authenticator *ap;
{ {
KTEXT_ST auth; KTEXT_ST auth;
#ifdef ENCRYPTION
Block enckey;
#endif /* ENCRYPTION */
char instance[INST_SZ]; char instance[INST_SZ];
char *realm; char *realm;
char *krb_realmofhost(); char *krb_realmofhost();
@ -187,7 +177,7 @@ kerberos4_send(ap)
memset(instance, 0, sizeof(instance)); memset(instance, 0, sizeof(instance));
if (realm = krb_get_phost(RemoteHostName)) if ((realm = krb_get_phost(RemoteHostName)))
strncpy(instance, realm, sizeof(instance)); strncpy(instance, realm, sizeof(instance));
instance[sizeof(instance)-1] = '\0'; instance[sizeof(instance)-1] = '\0';
@ -198,11 +188,11 @@ kerberos4_send(ap)
printf("Kerberos V4: no realm for %s\r\n", RemoteHostName); printf("Kerberos V4: no realm for %s\r\n", RemoteHostName);
return(0); return(0);
} }
if (r = krb_mk_req(&auth, KRB_SERVICE_NAME, instance, realm, 0L)) { if ((r = krb_mk_req(&auth, KRB_SERVICE_NAME, instance, realm, 0L))) {
printf("mk_req failed: %s\r\n", krb_err_txt[r]); printf("mk_req failed: %s\r\n", krb_err_txt[r]);
return(0); return(0);
} }
if (r = krb_get_cred(KRB_SERVICE_NAME, instance, realm, &cred)) { if ((r = krb_get_cred(KRB_SERVICE_NAME, instance, realm, &cred))) {
printf("get_cred failed: %s\r\n", krb_err_txt[r]); printf("get_cred failed: %s\r\n", krb_err_txt[r]);
return(0); return(0);
} }
@ -226,11 +216,11 @@ kerberos4_send(ap)
if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) { if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) {
register int i; register int i;
des_key_sched(cred.session, sched); des_key_sched(&cred.session, sched);
des_init_random_number_generator(cred.session); des_init_random_number_generator(&cred.session);
des_new_random_key(session_key); des_new_random_key(&session_key);
des_ecb_encrypt(session_key, session_key, sched, 0); des_ecb_encrypt(&session_key, &session_key, sched, 0);
des_ecb_encrypt(session_key, challenge, sched, 0); des_ecb_encrypt(&session_key, &challenge, sched, 0);
/* /*
* Increment the challenge by 1, and encrypt it for * Increment the challenge by 1, and encrypt it for
* later comparison. * later comparison.
@ -242,7 +232,7 @@ kerberos4_send(ap)
if (x < 256) /* if no overflow, all done */ if (x < 256) /* if no overflow, all done */
break; break;
} }
des_ecb_encrypt(challenge, challenge, sched, 1); des_ecb_encrypt(&challenge, &challenge, sched, 1);
} }
#endif /* ENCRYPTION */ #endif /* ENCRYPTION */
@ -288,8 +278,8 @@ kerberos4_is(ap, data, cnt)
printf("\r\n"); printf("\r\n");
} }
instance[0] = '*'; instance[1] = 0; instance[0] = '*'; instance[1] = 0;
if (r = krb_rd_req(&auth, KRB_SERVICE_NAME, if ((r = krb_rd_req(&auth, KRB_SERVICE_NAME,
instance, 0, &adat, "")) { instance, 0, &adat, ""))) {
if (auth_debug_mode) if (auth_debug_mode)
printf("Kerberos failed him as %s\r\n", name); printf("Kerberos failed him as %s\r\n", name);
Data(ap, KRB_REJECT, (void *)krb_err_txt[r], -1); Data(ap, KRB_REJECT, (void *)krb_err_txt[r], -1);
@ -327,15 +317,15 @@ kerberos4_is(ap, data, cnt)
* Initialize the random number generator since it's * Initialize the random number generator since it's
* used later on by the encryption routine. * used later on by the encryption routine.
*/ */
des_init_random_number_generator(session_key); des_init_random_number_generator(&session_key);
des_key_sched(session_key, sched); des_key_sched(&session_key, sched);
memmove((void *)datablock, (void *)data, sizeof(Block)); memmove((void *)datablock, (void *)data, sizeof(Block));
/* /*
* Take the received encrypted challenge, and encrypt * Take the received encrypted challenge, and encrypt
* it again to get a unique session_key for the * it again to get a unique session_key for the
* ENCRYPT option. * ENCRYPT option.
*/ */
des_ecb_encrypt(datablock, session_key, sched, 1); des_ecb_encrypt(&datablock, &session_key, sched, 1);
skey.type = SK_DES; skey.type = SK_DES;
skey.length = 8; skey.length = 8;
skey.data = session_key; skey.data = session_key;
@ -344,7 +334,7 @@ kerberos4_is(ap, data, cnt)
* Now decrypt the received encrypted challenge, * Now decrypt the received encrypted challenge,
* increment by one, re-encrypt it and send it back. * increment by one, re-encrypt it and send it back.
*/ */
des_ecb_encrypt(datablock, challenge, sched, 0); des_ecb_encrypt(&datablock, &challenge, sched, 0);
for (r = 7; r >= 0; r--) { for (r = 7; r >= 0; r--) {
register int t; register int t;
t = (unsigned int)challenge[r] + 1; t = (unsigned int)challenge[r] + 1;
@ -352,7 +342,7 @@ kerberos4_is(ap, data, cnt)
if (t < 256) /* if no overflow, all done */ if (t < 256) /* if no overflow, all done */
break; break;
} }
des_ecb_encrypt(challenge, challenge, sched, 1); des_ecb_encrypt(&challenge, &challenge, sched, 1);
Data(ap, KRB_RESPONSE, (void *)challenge, sizeof(challenge)); Data(ap, KRB_RESPONSE, (void *)challenge, sizeof(challenge));
#endif /* ENCRYPTION */ #endif /* ENCRYPTION */
break; break;
@ -397,7 +387,7 @@ kerberos4_reply(ap, data, cnt)
#else /* ENCRYPTION */ #else /* ENCRYPTION */
Data(ap, KRB_CHALLENGE, (void *)session_key, Data(ap, KRB_CHALLENGE, (void *)session_key,
sizeof(session_key)); sizeof(session_key));
des_ecb_encrypt(session_key, session_key, sched, 1); des_ecb_encrypt(&session_key, &session_key, sched, 1);
skey.type = SK_DES; skey.type = SK_DES;
skey.length = 8; skey.length = 8;
skey.data = session_key; skey.data = session_key;

View File

@ -115,7 +115,6 @@ static AUTH_DAT adat = { 0 };
#ifdef ENCRYPTION #ifdef ENCRYPTION
static Block session_key = { 0 }; static Block session_key = { 0 };
#endif /* ENCRYPTION */ #endif /* ENCRYPTION */
static Schedule sched;
static char challenge[REALM_SZ]; static char challenge[REALM_SZ];
static int static int

View File

@ -32,10 +32,14 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/4/93"; static const char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/4/93";
#endif /* not lint */ #endif /* not lint */
#include <stdio.h>
#include <stdlib.h>
#include "misc.h" #include "misc.h"
#include "auth.h"
#include "encrypt.h"
char *RemoteHostName; char *RemoteHostName;
char *LocalHostName; char *LocalHostName;

View File

@ -101,7 +101,6 @@ static unsigned char str_name[1024] = { IAC, SB, TELOPT_AUTHENTICATION,
#ifdef ENCRYPTION #ifdef ENCRYPTION
static Block session_key = { 0 }; static Block session_key = { 0 };
#endif /* ENCRYPTION */ #endif /* ENCRYPTION */
static Schedule sched;
static Block challenge = { 0 }; static Block challenge = { 0 };

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)authenc.c 8.1 (Berkeley) 6/6/93"; static const char sccsid[] = "@(#)authenc.c 8.1 (Berkeley) 6/6/93";
#endif /* not lint */ #endif /* not lint */
#if defined(AUTHENTICATION) || defined(ENCRYPTION) #if defined(AUTHENTICATION) || defined(ENCRYPTION)
@ -101,7 +101,7 @@ telnet_gets(prompt, result, length, echo)
if (echo) { if (echo) {
printf("%s", prompt); printf("%s", prompt);
res = fgets(result, length, stdin); res = fgets(result, length, stdin);
} else if (res = getpass(prompt)) { } else if ((res = getpass(prompt))) {
strncpy(result, res, length); strncpy(result, res, length);
res = result; res = result;
} }

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)commands.c 8.4 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)commands.c 8.4 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#if defined(unix) #if defined(unix)
@ -56,6 +56,8 @@ static char sccsid[] = "@(#)commands.c 8.4 (Berkeley) 5/30/95";
#include <pwd.h> #include <pwd.h>
#include <varargs.h> #include <varargs.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/telnet.h> #include <arpa/telnet.h>
@ -67,6 +69,13 @@ static char sccsid[] = "@(#)commands.c 8.4 (Berkeley) 5/30/95";
#include "defines.h" #include "defines.h"
#include "types.h" #include "types.h"
#if defined(AUTHENTICATION)
#include <libtelnet/auth.h>
#endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
#if !defined(CRAY) && !defined(sysV88) #if !defined(CRAY) && !defined(sysV88)
#include <netinet/in_systm.h> #include <netinet/in_systm.h>
# if (defined(vax) || defined(tahoe) || defined(hp300)) && !defined(ultrix) # if (defined(vax) || defined(tahoe) || defined(hp300)) && !defined(ultrix)
@ -93,7 +102,11 @@ extern int isprefix();
extern char **genget(); extern char **genget();
extern int Ambiguous(); extern int Ambiguous();
static call(); static int help(int argc, char *argv[]);
static int call();
static void cmdrc(char *m1, char *m2);
int quit(void);
typedef struct { typedef struct {
char *name; /* command name */ char *name; /* command name */
@ -107,6 +120,37 @@ static char saveline[256];
static int margc; static int margc;
static char *margv[20]; static char *margv[20];
#if defined(SKEY)
#include <sys/wait.h>
#define PATH_SKEY "/usr/bin/key"
int
skey_calc(argc, argv)
int argc;
char **argv;
{
int status;
if(argc != 3) {
printf("%s sequence challenge\n", argv[0]);
return;
}
switch(fork()) {
case 0:
execv(PATH_SKEY, argv);
exit (1);
case -1:
perror("fork");
break;
default:
(void) wait(&status);
if (WIFEXITED(status))
return (WEXITSTATUS(status));
return (0);
}
}
#endif
static void static void
makeargv() makeargv()
{ {
@ -121,7 +165,7 @@ makeargv()
margc++; margc++;
cp++; cp++;
} }
while (c = *cp) { while ((c = *cp)) {
register int inquote = 0; register int inquote = 0;
while (isspace(c)) while (isspace(c))
c = *++cp; c = *++cp;
@ -164,7 +208,7 @@ makeargv()
* Todo: 1. Could take random integers (12, 0x12, 012, 0b1). * Todo: 1. Could take random integers (12, 0x12, 012, 0b1).
*/ */
static static int
special(s) special(s)
register char *s; register char *s;
{ {
@ -293,7 +337,6 @@ sendcmd(argc, argv)
{ {
int count; /* how many bytes we are going to need to send */ int count; /* how many bytes we are going to need to send */
int i; int i;
int question = 0; /* was at least one argument a question */
struct sendlist *s; /* pointer to current command */ struct sendlist *s; /* pointer to current command */
int success = 0; int success = 0;
int needconnect = 0; int needconnect = 0;
@ -499,7 +542,7 @@ togdebug()
} }
#else /* NOT43 */ #else /* NOT43 */
if (debug) { if (debug) {
if (net > 0 && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) if (net > 0 && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 1) < 0)
perror("setsockopt (SO_DEBUG)"); perror("setsockopt (SO_DEBUG)");
} else } else
printf("Cannot turn off socket debugging\n"); printf("Cannot turn off socket debugging\n");
@ -1082,7 +1125,7 @@ unsetcmd(argc, argv)
#ifdef KLUDGELINEMODE #ifdef KLUDGELINEMODE
extern int kludgelinemode; extern int kludgelinemode;
static int static void
dokludgemode() dokludgemode()
{ {
kludgelinemode = 1; kludgelinemode = 1;
@ -1139,7 +1182,7 @@ dolmmode(bit, on)
} }
int int
setmode(bit) setmod(bit)
{ {
return dolmmode(bit, 1); return dolmmode(bit, 1);
} }
@ -1171,17 +1214,17 @@ static struct modelist ModeList[] = {
#endif #endif
{ "", "", 0 }, { "", "", 0 },
{ "", "These require the LINEMODE option to be enabled", 0 }, { "", "These require the LINEMODE option to be enabled", 0 },
{ "isig", "Enable signal trapping", setmode, 1, MODE_TRAPSIG }, { "isig", "Enable signal trapping", setmod, 1, MODE_TRAPSIG },
{ "+isig", 0, setmode, 1, MODE_TRAPSIG }, { "+isig", 0, setmod, 1, MODE_TRAPSIG },
{ "-isig", "Disable signal trapping", clearmode, 1, MODE_TRAPSIG }, { "-isig", "Disable signal trapping", clearmode, 1, MODE_TRAPSIG },
{ "edit", "Enable character editing", setmode, 1, MODE_EDIT }, { "edit", "Enable character editing", setmod, 1, MODE_EDIT },
{ "+edit", 0, setmode, 1, MODE_EDIT }, { "+edit", 0, setmod, 1, MODE_EDIT },
{ "-edit", "Disable character editing", clearmode, 1, MODE_EDIT }, { "-edit", "Disable character editing", clearmode, 1, MODE_EDIT },
{ "softtabs", "Enable tab expansion", setmode, 1, MODE_SOFT_TAB }, { "softtabs", "Enable tab expansion", setmod, 1, MODE_SOFT_TAB },
{ "+softtabs", 0, setmode, 1, MODE_SOFT_TAB }, { "+softtabs", 0, setmod, 1, MODE_SOFT_TAB },
{ "-softtabs", "Disable character editing", clearmode, 1, MODE_SOFT_TAB }, { "-softtabs", "Disable character editing", clearmode, 1, MODE_SOFT_TAB },
{ "litecho", "Enable literal character echo", setmode, 1, MODE_LIT_ECHO }, { "litecho", "Enable literal character echo", setmod, 1, MODE_LIT_ECHO },
{ "+litecho", 0, setmode, 1, MODE_LIT_ECHO }, { "+litecho", 0, setmod, 1, MODE_LIT_ECHO },
{ "-litecho", "Disable literal character echo", clearmode, 1, MODE_LIT_ECHO }, { "-litecho", "Disable literal character echo", clearmode, 1, MODE_LIT_ECHO },
{ "help", 0, modehelp, 0 }, { "help", 0, modehelp, 0 },
#ifdef KLUDGELINEMODE #ifdef KLUDGELINEMODE
@ -1435,7 +1478,7 @@ extern int shell();
#endif /* !defined(TN3270) */ #endif /* !defined(TN3270) */
/*VARARGS*/ /*VARARGS*/
static static int
bye(argc, argv) bye(argc, argv)
int argc; /* Number of arguments */ int argc; /* Number of arguments */
char *argv[]; /* arguments */ char *argv[]; /* arguments */
@ -1465,6 +1508,7 @@ bye(argc, argv)
} }
/*VARARGS*/ /*VARARGS*/
int
quit() quit()
{ {
(void) call(bye, "bye", "fromquit", 0); (void) call(bye, "bye", "fromquit", 0);
@ -1530,7 +1574,7 @@ getslc(name)
genget(name, (char **) SlcList, sizeof(struct slclist)); genget(name, (char **) SlcList, sizeof(struct slclist));
} }
static static int
slccmd(argc, argv) slccmd(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -1627,6 +1671,7 @@ getenvcmd(name)
genget(name, (char **) EnvList, sizeof(struct envlist)); genget(name, (char **) EnvList, sizeof(struct envlist));
} }
int
env_cmd(argc, argv) env_cmd(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -1693,7 +1738,7 @@ env_init()
extern char *strchr(); extern char *strchr();
for (epp = environ; *epp; epp++) { for (epp = environ; *epp; epp++) {
if (cp = strchr(*epp, '=')) { if ((cp = strchr(*epp, '='))) {
*cp = '\0'; *cp = '\0';
ep = env_define((unsigned char *)*epp, ep = env_define((unsigned char *)*epp,
(unsigned char *)cp+1); (unsigned char *)cp+1);
@ -1738,7 +1783,7 @@ env_define(var, value)
{ {
register struct env_lst *ep; register struct env_lst *ep;
if (ep = env_find(var)) { if ((ep = env_find(var))) {
if (ep->var) if (ep->var)
free(ep->var); free(ep->var);
if (ep->value) if (ep->value)
@ -1764,7 +1809,7 @@ env_undefine(var)
{ {
register struct env_lst *ep; register struct env_lst *ep;
if (ep = env_find(var)) { if ((ep = env_find(var))) {
ep->prev->next = ep->next; ep->prev->next = ep->next;
if (ep->next) if (ep->next)
ep->next->prev = ep->prev; ep->next->prev = ep->prev;
@ -1782,7 +1827,7 @@ env_export(var)
{ {
register struct env_lst *ep; register struct env_lst *ep;
if (ep = env_find(var)) if ((ep = env_find(var)))
ep->export = 1; ep->export = 1;
} }
@ -1792,7 +1837,7 @@ env_unexport(var)
{ {
register struct env_lst *ep; register struct env_lst *ep;
if (ep = env_find(var)) if ((ep = env_find(var)))
ep->export = 0; ep->export = 0;
} }
@ -1842,10 +1887,10 @@ env_default(init, welldefined)
if (init) { if (init) {
nep = &envlisthead; nep = &envlisthead;
return; return(NULL);
} }
if (nep) { if (nep) {
while (nep = nep->next) { while ((nep = nep->next)) {
if (nep->export && (nep->welldefined == welldefined)) if (nep->export && (nep->welldefined == welldefined))
return(nep->var); return(nep->var);
} }
@ -1859,7 +1904,7 @@ env_getvalue(var)
{ {
register struct env_lst *ep; register struct env_lst *ep;
if (ep = env_find(var)) if ((ep = env_find(var)))
return(ep->value); return(ep->value);
return(NULL); return(NULL);
} }
@ -1949,6 +1994,7 @@ auth_help()
return 0; return 0;
} }
int
auth_cmd(argc, argv) auth_cmd(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -2055,6 +2101,7 @@ EncryptHelp()
return 0; return 0;
} }
int
encrypt_cmd(argc, argv) encrypt_cmd(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -2142,7 +2189,7 @@ filestuff(fd)
* Print status about the connection. * Print status about the connection.
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
static static int
status(argc, argv) status(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -2215,6 +2262,7 @@ status(argc, argv)
/* /*
* Function that gets called when SIGINFO is received. * Function that gets called when SIGINFO is received.
*/ */
void
ayt_status() ayt_status()
{ {
(void) call(status, "status", "notmuch", 0); (void) call(status, "status", "notmuch", 0);
@ -2313,10 +2361,15 @@ tn(argc, argv)
} else { } else {
#endif #endif
temp = inet_addr(hostp); temp = inet_addr(hostp);
if (temp != (unsigned long) -1) { if (temp != INADDR_NONE) {
sin.sin_addr.s_addr = temp; sin.sin_addr.s_addr = temp;
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
(void) strcpy(_hostname, hostp); host = gethostbyaddr((char *)&temp, sizeof(temp), AF_INET);
if (host)
(void) strncpy(_hostname, host->h_name, sizeof(_hostname));
else
(void) strncpy(_hostname, hostp, sizeof(_hostname));
_hostname[sizeof(_hostname)-1] = '\0';
hostname = _hostname; hostname = _hostname;
} else { } else {
host = gethostbyname(hostp); host = gethostbyname(hostp);
@ -2437,8 +2490,8 @@ tn(argc, argv)
user = getenv("USER"); user = getenv("USER");
if (user == NULL || if (user == NULL ||
(pw = getpwnam(user)) && pw->pw_uid != getuid()) { ((pw = getpwnam(user)) && pw->pw_uid != getuid())) {
if (pw = getpwuid(getuid())) if ((pw = getpwuid(getuid())))
user = pw->pw_name; user = pw->pw_name;
else else
user = NULL; user = NULL;
@ -2483,12 +2536,13 @@ static char
#if defined(unix) #if defined(unix)
zhelp[] = "suspend telnet", zhelp[] = "suspend telnet",
#endif /* defined(unix) */ #endif /* defined(unix) */
#if defined(SKEY)
skeyhelp[] = "compute response to s/key challenge",
#endif
shellhelp[] = "invoke a subshell", shellhelp[] = "invoke a subshell",
envhelp[] = "change environment variables ('environ ?' for more)", envhelp[] = "change environment variables ('environ ?' for more)",
modestring[] = "try to enter line or character mode ('mode ?' for more)"; modestring[] = "try to enter line or character mode ('mode ?' for more)";
static int help();
static Command cmdtab[] = { static Command cmdtab[] = {
{ "close", closehelp, bye, 1 }, { "close", closehelp, bye, 1 },
{ "logout", logouthelp, logout, 1 }, { "logout", logouthelp, logout, 1 },
@ -2521,7 +2575,10 @@ static Command cmdtab[] = {
#endif #endif
{ "environ", envhelp, env_cmd, 0 }, { "environ", envhelp, env_cmd, 0 },
{ "?", helphelp, help, 0 }, { "?", helphelp, help, 0 },
0 #if defined(SKEY)
{ "skey", skeyhelp, skey_calc, 0 },
#endif
{ 0, 0, 0, 0 }
}; };
static char crmodhelp[] = "deprecated command -- use 'toggle crmod' instead"; static char crmodhelp[] = "deprecated command -- use 'toggle crmod' instead";
@ -2531,7 +2588,7 @@ static Command cmdtab2[] = {
{ "help", 0, help, 0 }, { "help", 0, help, 0 },
{ "escape", escapehelp, setescape, 0 }, { "escape", escapehelp, setescape, 0 },
{ "crmod", crmodhelp, togcrmod, 0 }, { "crmod", crmodhelp, togcrmod, 0 },
0 { 0, 0, 0, 0 }
}; };
@ -2540,7 +2597,7 @@ static Command cmdtab2[] = {
*/ */
/*VARARGS1*/ /*VARARGS1*/
static static int
call(va_alist) call(va_alist)
va_dcl va_dcl
{ {
@ -2566,7 +2623,7 @@ getcmd(name)
{ {
Command *cm; Command *cm;
if (cm = (Command *) genget(name, (char **) cmdtab, sizeof(Command))) if ((cm = (Command *) genget(name, (char **) cmdtab, sizeof(Command))))
return cm; return cm;
return (Command *) genget(name, (char **) cmdtab2, sizeof(Command)); return (Command *) genget(name, (char **) cmdtab2, sizeof(Command));
} }
@ -2655,7 +2712,7 @@ command(top, tbuf, cnt)
/* /*
* Help command. * Help command.
*/ */
static static int
help(argc, argv) help(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -2669,9 +2726,8 @@ help(argc, argv)
printf("%-*s\t%s\n", HELPINDENT, c->name, printf("%-*s\t%s\n", HELPINDENT, c->name,
c->help); c->help);
} }
return 0;
} }
while (--argc > 0) { else while (--argc > 0) {
register char *arg; register char *arg;
arg = *++argv; arg = *++argv;
c = getcmd(arg); c = getcmd(arg);
@ -2682,12 +2738,13 @@ help(argc, argv)
else else
printf("%s\n", c->help); printf("%s\n", c->help);
} }
return 0; return(0);
} }
static char *rcname = 0; static char *rcname = 0;
static char rcbuf[128]; static char rcbuf[128];
void
cmdrc(m1, m2) cmdrc(m1, m2)
char *m1, *m2; char *m1, *m2;
{ {
@ -2706,7 +2763,7 @@ cmdrc(m1, m2)
if (rcname == 0) { if (rcname == 0) {
rcname = getenv("HOME"); rcname = getenv("HOME");
if (rcname) if (rcname && (strlen(rcname) + 10) < sizeof(rcbuf))
strcpy(rcbuf, rcname); strcpy(rcbuf, rcname);
else else
rcbuf[0] = '\0'; rcbuf[0] = '\0';
@ -2881,7 +2938,7 @@ sourceroute(arg, cpp, lenp)
for (c = 0;;) { for (c = 0;;) {
if (c == ':') if (c == ':')
cp2 = 0; cp2 = 0;
else for (cp2 = cp; c = *cp2; cp2++) { else for (cp2 = cp; (c = *cp2); cp2++) {
if (c == ',') { if (c == ',') {
*cp2++ = '\0'; *cp2++ = '\0';
if (*cp2 == '@') if (*cp2 == '@')
@ -2899,7 +2956,7 @@ sourceroute(arg, cpp, lenp)
if ((tmp = inet_addr(cp)) != -1) { if ((tmp = inet_addr(cp)) != -1) {
sin_addr.s_addr = tmp; sin_addr.s_addr = tmp;
} else if (host = gethostbyname(cp)) { } else if ((host = gethostbyname(cp))) {
#if defined(h_addr) #if defined(h_addr)
memmove((caddr_t)&sin_addr, memmove((caddr_t)&sin_addr,
host->h_addr_list[0], host->h_length); host->h_addr_list[0], host->h_length);

View File

@ -145,7 +145,8 @@ extern int
#endif /* defined(TN3270) */ #endif /* defined(TN3270) */
termdata, /* Print out terminal data flow */ termdata, /* Print out terminal data flow */
#endif /* defined(unix) */ #endif /* defined(unix) */
debug; /* Debug level */ debug, /* Debug level */
clienteof; /* Client received EOF */
extern cc_t escape; /* Escape to command mode */ extern cc_t escape; /* Escape to command mode */
extern cc_t rlogin; /* Rlogin mode escape character */ extern cc_t rlogin; /* Rlogin mode escape character */
@ -245,6 +246,7 @@ extern jmp_buf
extern void extern void
command P((int, char *, int)), command P((int, char *, int)),
Dump P((int, unsigned char *, int)), Dump P((int, unsigned char *, int)),
ExitString P((char *, int)),
init_3270 P((void)), init_3270 P((void)),
printoption P((char *, int, int)), printoption P((char *, int, int)),
printsub P((int, unsigned char *, int)), printsub P((int, unsigned char *, int)),
@ -290,7 +292,14 @@ extern void
slc_add_reply P((int, int, int)), slc_add_reply P((int, int, int)),
slc_end_reply P((void)); slc_end_reply P((void));
extern int extern int
slc_update P((void)); NetClose P((int)),
netflush P((void)),
SetSockOpt P((int, int, int, int)),
slc_update P((void)),
telrcv P((void)),
TerminalWrite P((char *, int)),
TerminalAutoFlush P((void)),
ttyflush P((int));
extern void extern void
env_opt P((unsigned char *, int)), env_opt P((unsigned char *, int)),

View File

@ -32,21 +32,29 @@
*/ */
#ifndef lint #ifndef lint
static char copyright[] = static const char copyright[] =
"@(#) Copyright (c) 1988, 1990, 1993\n\ "@(#) Copyright (c) 1988, 1990, 1993\n\
The Regents of the University of California. All rights reserved.\n"; The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)main.c 8.3 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include "ring.h" #include "ring.h"
#include "externs.h" #include "externs.h"
#include "defines.h" #include "defines.h"
#if defined(AUTHENTICATION)
#include <libtelnet/auth.h>
#endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
/* These values need to be the same as defined in libtelnet/kerberos5.c */ /* These values need to be the same as defined in libtelnet/kerberos5.c */
/* Either define them in both places, or put in some common header file. */ /* Either define them in both places, or put in some common header file. */
#define OPTS_FORWARD_CREDS 0x00000002 #define OPTS_FORWARD_CREDS 0x00000002
@ -56,6 +64,12 @@ static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 5/30/95";
#define FORWARD #define FORWARD
#endif #endif
void init_terminal(void);
void init_network(void);
void init_telnet(void);
void init_sys(void);
void init_3270(void);
/* /*
* Initialize variables. * Initialize variables.
*/ */
@ -109,7 +123,7 @@ usage()
* main. Parse arguments, invoke the protocol or command parser. * main. Parse arguments, invoke the protocol or command parser.
*/ */
int
main(argc, argv) main(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
@ -129,7 +143,7 @@ main(argc, argv)
TerminalSaveState(); TerminalSaveState();
if (prompt = strrchr(argv[0], '/')) if ((prompt = strrchr(argv[0], '/')))
++prompt; ++prompt;
else else
prompt = argv[0]; prompt = argv[0];
@ -319,4 +333,5 @@ main(argc, argv)
#endif #endif
command(1, 0, 0); command(1, 0, 0);
} }
return 0;
} }

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)network.c 8.2 (Berkeley) 12/15/93"; static const char sccsid[] = "@(#)network.c 8.2 (Berkeley) 12/15/93";
#endif /* not lint */ #endif /* not lint */
#include <sys/types.h> #include <sys/types.h>
@ -42,6 +42,7 @@ static char sccsid[] = "@(#)network.c 8.2 (Berkeley) 12/15/93";
#include <errno.h> #include <errno.h>
#include <arpa/telnet.h> #include <arpa/telnet.h>
#include <unistd.h>
#include "ring.h" #include "ring.h"

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)ring.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)ring.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
/* /*
@ -48,6 +48,7 @@ static char sccsid[] = "@(#)ring.c 8.2 (Berkeley) 5/30/95";
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <string.h>
#ifdef size_t #ifdef size_t
#undef size_t #undef size_t
@ -99,6 +100,7 @@ static u_long ring_clock = 0;
/* Buffer state transition routines */ /* Buffer state transition routines */
int
ring_init(ring, buffer, count) ring_init(ring, buffer, count)
Ring *ring; Ring *ring;
unsigned char *buffer; unsigned char *buffer;

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)sys_bsd.c 8.4 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)sys_bsd.c 8.4 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
/* /*
@ -48,6 +48,7 @@ static char sccsid[] = "@(#)sys_bsd.c 8.4 (Berkeley) 5/30/95";
#include <signal.h> #include <signal.h>
#include <errno.h> #include <errno.h>
#include <arpa/telnet.h> #include <arpa/telnet.h>
#include <unistd.h>
#include "ring.h" #include "ring.h"
@ -140,7 +141,7 @@ TerminalWrite(buf, n)
int int
TerminalRead(buf, n) TerminalRead(buf, n)
unsigned char *buf; char *buf;
int n; int n;
{ {
return read(tin, buf, n); return read(tin, buf, n);
@ -1051,7 +1052,7 @@ process_rings(netin, netout, netex, ttyin, ttyout, poll)
} }
# endif /* defined(TN3270) */ # endif /* defined(TN3270) */
/* I don't like this, does it ever happen? */ /* I don't like this, does it ever happen? */
printf("sleep(5) from telnet, after select\r\n"); printf("sleep(5) from telnet, after select: %s\r\n", strerror(errno));
sleep(5); sleep(5);
} }
return 0; return 0;

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)telnet.c 8.4 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)telnet.c 8.4 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include <sys/types.h> #include <sys/types.h>
@ -49,6 +49,10 @@ static char sccsid[] = "@(#)telnet.c 8.4 (Berkeley) 5/30/95";
#include <ctype.h> #include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <termcap.h>
#include "ring.h" #include "ring.h"
#include "defines.h" #include "defines.h"
@ -56,6 +60,13 @@ static char sccsid[] = "@(#)telnet.c 8.4 (Berkeley) 5/30/95";
#include "types.h" #include "types.h"
#include "general.h" #include "general.h"
#if defined(AUTHENTICATION)
#include <libtelnet/auth.h>
#endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
#include <libtelnet/misc.h>
#define strip(x) ((my_want_state_is_wont(TELOPT_BINARY)) ? ((x)&0x7f) : (x)) #define strip(x) ((my_want_state_is_wont(TELOPT_BINARY)) ? ((x)&0x7f) : (x))
@ -104,7 +115,8 @@ int
donelclchars, /* the user has set "localchars" */ donelclchars, /* the user has set "localchars" */
donebinarytoggle, /* the user has put us in binary */ donebinarytoggle, /* the user has put us in binary */
dontlecho, /* do we suppress local echoing right now? */ dontlecho, /* do we suppress local echoing right now? */
globalmode; globalmode,
clienteof = 0;
char *prompt = 0; char *prompt = 0;
@ -856,7 +868,7 @@ suboption()
TerminalSpeeds(&ispeed, &ospeed); TerminalSpeeds(&ispeed, &ospeed);
sprintf((char *)temp, "%c%c%c%c%d,%d%c%c", IAC, SB, TELOPT_TSPEED, sprintf((char *)temp, "%c%c%c%c%ld,%ld%c%c", IAC, SB, TELOPT_TSPEED,
TELQUAL_IS, ospeed, ispeed, IAC, SE); TELQUAL_IS, ospeed, ispeed, IAC, SE);
len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */
@ -1212,7 +1224,7 @@ slc_init()
#define initfunc(func, flags) { \ #define initfunc(func, flags) { \
spcp = &spc_data[func]; \ spcp = &spc_data[func]; \
if (spcp->valp = tcval(func)) { \ if ((spcp->valp = tcval(func))) { \
spcp->val = *spcp->valp; \ spcp->val = *spcp->valp; \
spcp->mylevel = SLC_VARIABLE|flags; \ spcp->mylevel = SLC_VARIABLE|flags; \
} else { \ } else { \
@ -1620,12 +1632,12 @@ env_opt_add(ep)
if (ep == NULL || *ep == '\0') { if (ep == NULL || *ep == '\0') {
/* Send user defined variables first. */ /* Send user defined variables first. */
env_default(1, 0); env_default(1, 0);
while (ep = env_default(0, 0)) while ((ep = env_default(0, 0)))
env_opt_add(ep); env_opt_add(ep);
/* Now add the list of well know variables. */ /* Now add the list of well know variables. */
env_default(1, 1); env_default(1, 1);
while (ep = env_default(0, 1)) while ((ep = env_default(0, 1)))
env_opt_add(ep); env_opt_add(ep);
return; return;
} }
@ -1655,7 +1667,7 @@ env_opt_add(ep)
else else
*opt_replyp++ = ENV_USERVAR; *opt_replyp++ = ENV_USERVAR;
for (;;) { for (;;) {
while (c = *ep++) { while ((c = *ep++)) {
switch(c&0xff) { switch(c&0xff) {
case IAC: case IAC:
*opt_replyp++ = IAC; *opt_replyp++ = IAC;
@ -1669,7 +1681,7 @@ env_opt_add(ep)
} }
*opt_replyp++ = c; *opt_replyp++ = c;
} }
if (ep = vp) { if ((ep = vp)) {
#ifdef OLD_ENVIRON #ifdef OLD_ENVIRON
if (telopt_environ == TELOPT_OLD_ENVIRON) if (telopt_environ == TELOPT_OLD_ENVIRON)
*opt_replyp++ = old_env_value; *opt_replyp++ = old_env_value;
@ -2184,9 +2196,9 @@ Scheduler(block)
ttyout = ring_full_count(&ttyoring); ttyout = ring_full_count(&ttyoring);
#if defined(TN3270) #if defined(TN3270)
ttyin = ring_empty_count(&ttyiring) && (shell_active == 0); ttyin = ring_empty_count(&ttyiring) && (clienteof == 0) && (shell_active == 0);
#else /* defined(TN3270) */ #else /* defined(TN3270) */
ttyin = ring_empty_count(&ttyiring); ttyin = ring_empty_count(&ttyiring) && (clienteof == 0);
#endif /* defined(TN3270) */ #endif /* defined(TN3270) */
#if defined(TN3270) #if defined(TN3270)

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)terminal.c 8.2 (Berkeley) 2/16/95"; static const char sccsid[] = "@(#)terminal.c 8.2 (Berkeley) 2/16/95";
#endif /* not lint */ #endif /* not lint */
#include <arpa/telnet.h> #include <arpa/telnet.h>
@ -43,6 +43,10 @@ static char sccsid[] = "@(#)terminal.c 8.2 (Berkeley) 2/16/95";
#include "externs.h" #include "externs.h"
#include "types.h" #include "types.h"
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
Ring ttyoring, ttyiring; Ring ttyoring, ttyiring;
unsigned char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ]; unsigned char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)tn3270.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)tn3270.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include <sys/types.h> #include <sys/types.h>

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)utilities.c 8.3 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)utilities.c 8.3 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#define TELOPTS #define TELOPTS
@ -40,7 +40,9 @@ static char sccsid[] = "@(#)utilities.c 8.3 (Berkeley) 5/30/95";
#define SLC_NAMES #define SLC_NAMES
#include <arpa/telnet.h> #include <arpa/telnet.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h>
#include <ctype.h> #include <ctype.h>
@ -54,6 +56,13 @@ static char sccsid[] = "@(#)utilities.c 8.3 (Berkeley) 5/30/95";
#include "externs.h" #include "externs.h"
#if defined(AUTHENTICATION)
#include <libtelnet/auth.h>
#endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
FILE *NetTrace = 0; /* Not in bss, since needs to stay */ FILE *NetTrace = 0; /* Not in bss, since needs to stay */
int prettydump; int prettydump;
@ -134,7 +143,6 @@ Dump(direction, buffer, length)
# define min(x,y) ((x<y)? x:y) # define min(x,y) ((x<y)? x:y)
unsigned char *pThis; unsigned char *pThis;
int offset; int offset;
extern pettydump;
offset = 0; offset = 0;
@ -819,7 +827,6 @@ printsub(direction, pointer, length)
break; break;
default: default:
def_case:
if (isprint(pointer[i]) && pointer[i] != '"') { if (isprint(pointer[i]) && pointer[i] != '"') {
if (noquote) { if (noquote) {
putc('"', NetTrace); putc('"', NetTrace);

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)authenc.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)authenc.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#if defined(AUTHENTICATION) || defined(ENCRYPTION) #if defined(AUTHENTICATION) || defined(ENCRYPTION)

View File

@ -45,9 +45,7 @@ extern int uselinemode; /* what linemode to use (on/off) */
extern int editmode; /* edit modes in use */ extern int editmode; /* edit modes in use */
extern int useeditmode; /* edit modes to use */ extern int useeditmode; /* edit modes to use */
extern int alwayslinemode; /* command line option */ extern int alwayslinemode; /* command line option */
# ifdef KLUDGELINEMODE
extern int lmodetype; /* Client support for linemode */ extern int lmodetype; /* Client support for linemode */
# endif /* KLUDGELINEMODE */
#endif /* LINEMODE */ #endif /* LINEMODE */
extern int flowmode; /* current flow control state */ extern int flowmode; /* current flow control state */
extern int restartany; /* restart output on any character state */ extern int restartany; /* restart output on any character state */
@ -233,7 +231,11 @@ extern int needtermstat;
# ifdef ultrix # ifdef ultrix
# define DEFAULT_IM "\r\n\r\nULTRIX (%h) (%t)\r\n\r\r\n\r" # define DEFAULT_IM "\r\n\r\nULTRIX (%h) (%t)\r\n\r\r\n\r"
# else # else
# ifdef __FreeBSD__
# define DEFAULT_IM "\r\n\r\nFreeBSD (%h) (%t)\r\n\r\r\n\r"
# else
# define DEFAULT_IM "\r\n\r\n4.4 BSD UNIX (%h) (%t)\r\n\r\r\n\r" # define DEFAULT_IM "\r\n\r\n4.4 BSD UNIX (%h) (%t)\r\n\r\r\n\r"
# endif
# endif # endif
# endif # endif
# endif # endif

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)global.c 8.1 (Berkeley) 6/4/93"; static const char sccsid[] = "@(#)global.c 8.1 (Berkeley) 6/4/93";
#endif /* not lint */ #endif /* not lint */
/* /*

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)slc.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)slc.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include "telnetd.h" #include "telnetd.h"
@ -288,15 +288,15 @@ change_slc(func, flag, val)
register int hislevel, mylevel; register int hislevel, mylevel;
hislevel = flag & SLC_LEVELBITS; hislevel = flag & SLC_LEVELBITS;
mylevel = slctab[func].defset.flag & SLC_LEVELBITS; mylevel = slctab[(int)func].defset.flag & SLC_LEVELBITS;
/* /*
* If client is setting a function to NOSUPPORT * If client is setting a function to NOSUPPORT
* or DEFAULT, then we can easily and directly * or DEFAULT, then we can easily and directly
* accomodate the request. * accomodate the request.
*/ */
if (hislevel == SLC_NOSUPPORT) { if (hislevel == SLC_NOSUPPORT) {
slctab[func].current.flag = flag; slctab[(int)func].current.flag = flag;
slctab[func].current.val = (cc_t)_POSIX_VDISABLE; slctab[(int)func].current.val = (cc_t)_POSIX_VDISABLE;
flag |= SLC_ACK; flag |= SLC_ACK;
add_slc(func, flag, val); add_slc(func, flag, val);
return; return;
@ -309,13 +309,13 @@ change_slc(func, flag, val)
* default level of DEFAULT. * default level of DEFAULT.
*/ */
if (mylevel == SLC_DEFAULT) { if (mylevel == SLC_DEFAULT) {
slctab[func].current.flag = SLC_NOSUPPORT; slctab[(int)func].current.flag = SLC_NOSUPPORT;
} else { } else {
slctab[func].current.flag = slctab[func].defset.flag; slctab[(int)func].current.flag = slctab[(int)func].defset.flag;
} }
slctab[func].current.val = slctab[func].defset.val; slctab[(int)func].current.val = slctab[(int)func].defset.val;
add_slc(func, slctab[func].current.flag, add_slc(func, slctab[(int)func].current.flag,
slctab[func].current.val); slctab[(int)func].current.val);
return; return;
} }
@ -329,13 +329,13 @@ change_slc(func, flag, val)
* the place to put the new value, so change it, * the place to put the new value, so change it,
* otherwise, continue the negotiation. * otherwise, continue the negotiation.
*/ */
if (slctab[func].sptr) { if (slctab[(int)func].sptr) {
/* /*
* We can change this one. * We can change this one.
*/ */
slctab[func].current.val = val; slctab[(int)func].current.val = val;
*(slctab[func].sptr) = val; *(slctab[(int)func].sptr) = val;
slctab[func].current.flag = flag; slctab[(int)func].current.flag = flag;
flag |= SLC_ACK; flag |= SLC_ACK;
slcchange = 1; slcchange = 1;
add_slc(func, flag, val); add_slc(func, flag, val);
@ -355,22 +355,22 @@ change_slc(func, flag, val)
* our value as well. * our value as well.
*/ */
if (mylevel == SLC_DEFAULT) { if (mylevel == SLC_DEFAULT) {
slctab[func].current.flag = flag; slctab[(int)func].current.flag = flag;
slctab[func].current.val = val; slctab[(int)func].current.val = val;
flag |= SLC_ACK; flag |= SLC_ACK;
} else if (hislevel == SLC_CANTCHANGE && } else if (hislevel == SLC_CANTCHANGE &&
mylevel == SLC_CANTCHANGE) { mylevel == SLC_CANTCHANGE) {
flag &= ~SLC_LEVELBITS; flag &= ~SLC_LEVELBITS;
flag |= SLC_NOSUPPORT; flag |= SLC_NOSUPPORT;
slctab[func].current.flag = flag; slctab[(int)func].current.flag = flag;
} else { } else {
flag &= ~SLC_LEVELBITS; flag &= ~SLC_LEVELBITS;
flag |= mylevel; flag |= mylevel;
slctab[func].current.flag = flag; slctab[(int)func].current.flag = flag;
if (mylevel == SLC_CANTCHANGE) { if (mylevel == SLC_CANTCHANGE) {
slctab[func].current.val = slctab[(int)func].current.val =
slctab[func].defset.val; slctab[(int)func].defset.val;
val = slctab[func].current.val; val = slctab[(int)func].current.val;
} }
} }
add_slc(func, flag, val); add_slc(func, flag, val);

View File

@ -32,13 +32,16 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)state.c 8.5 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)state.c 8.5 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include "telnetd.h" #include "telnetd.h"
#if defined(AUTHENTICATION) #if defined(AUTHENTICATION)
#include <libtelnet/auth.h> #include <libtelnet/auth.h>
#endif #endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
unsigned char doopt[] = { IAC, DO, '%', 'c', 0 }; unsigned char doopt[] = { IAC, DO, '%', 'c', 0 };
unsigned char dont[] = { IAC, DONT, '%', 'c', 0 }; unsigned char dont[] = { IAC, DONT, '%', 'c', 0 };

View File

@ -32,7 +32,7 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)sys_term.c 8.4+1 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)sys_term.c 8.4+1 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include "telnetd.h" #include "telnetd.h"
@ -42,13 +42,17 @@ static char sccsid[] = "@(#)sys_term.c 8.4+1 (Berkeley) 5/30/95";
#include <libtelnet/auth.h> #include <libtelnet/auth.h>
#endif #endif
extern char *altlogin;
int cleanopen(char *line);
void scrub_env(void);
#if defined(CRAY) || defined(__hpux) #if defined(CRAY) || defined(__hpux)
# define PARENT_DOES_UTMP # define PARENT_DOES_UTMP
#endif #endif
int utmp_len = MAXHOSTNAMELEN;
#ifdef NEWINIT #ifdef NEWINIT
#include <initreq.h> #include <initreq.h>
int utmp_len = MAXHOSTNAMELEN; /* sizeof(init_request.host) */
#else /* NEWINIT*/ #else /* NEWINIT*/
# ifdef UTMPX # ifdef UTMPX
# include <utmpx.h> # include <utmpx.h>
@ -58,14 +62,23 @@ struct utmpx wtmp;
struct utmp wtmp; struct utmp wtmp;
# endif /* UTMPX */ # endif /* UTMPX */
int utmp_len = sizeof(wtmp.ut_host);
# ifndef PARENT_DOES_UTMP # ifndef PARENT_DOES_UTMP
#ifdef _PATH_WTMP
char wtmpf[] = _PATH_WTMP;
#else
char wtmpf[] = "/usr/adm/wtmp"; char wtmpf[] = "/usr/adm/wtmp";
#endif
#ifdef _PATH_UTMP
char utmpf[] = _PATH_UTMP;
#else
char utmpf[] = "/etc/utmp"; char utmpf[] = "/etc/utmp";
#endif
# else /* PARENT_DOES_UTMP */ # else /* PARENT_DOES_UTMP */
char wtmpf[] = "/etc/wtmp"; char wtmpf[] = "/etc/wtmp";
# endif /* PARENT_DOES_UTMP */ # endif /* PARENT_DOES_UTMP */
#include <libutil.h>
# ifdef CRAY # ifdef CRAY
#include <tmpdir.h> #include <tmpdir.h>
#include <sys/wait.h> #include <sys/wait.h>
@ -504,7 +517,7 @@ int *ptynum;
p2 = &line[14]; p2 = &line[14];
#endif #endif
for (cp = "pqrstuvwxyzPQRST"; *cp; cp++) { for (cp = "pqrsPQRS"; *cp; cp++) {
struct stat stb; struct stat stb;
*p1 = *cp; *p1 = *cp;
@ -516,8 +529,8 @@ int *ptynum;
*/ */
if (stat(line, &stb) < 0) if (stat(line, &stb) < 0)
break; break;
for (i = 0; i < 16; i++) { for (i = 0; i < 32; i++) {
*p2 = "0123456789abcdef"[i]; *p2 = "0123456789abcdefghijklmnopqrstuv"[i];
p = open(line, 2); p = open(line, 2);
if (p > 0) { if (p > 0) {
#ifndef __hpux #ifndef __hpux
@ -1065,10 +1078,11 @@ extern void utmp_sig_notify P((int));
* that is necessary. The return value is a file descriptor * that is necessary. The return value is a file descriptor
* for the slave side. * for the slave side.
*/ */
int void
getptyslave() getptyslave()
{ {
register int t = -1; register int t = -1;
char erase;
#if !defined(CRAY) || !defined(NEWINIT) #if !defined(CRAY) || !defined(NEWINIT)
# ifdef LINEMODE # ifdef LINEMODE
@ -1085,12 +1099,13 @@ getptyslave()
* if linemode was turned on * if linemode was turned on
* terminal window size * terminal window size
* terminal speed * terminal speed
* erase character
* so that we can re-set them if we need to. * so that we can re-set them if we need to.
*/ */
# ifdef LINEMODE # ifdef LINEMODE
waslm = tty_linemode(); waslm = tty_linemode();
# endif # endif
erase = termbuf.c_cc[VERASE];
/* /*
* Make sure that we don't have a controlling tty, and * Make sure that we don't have a controlling tty, and
@ -1176,6 +1191,8 @@ getptyslave()
# endif /* defined(USE_TERMIO) && !defined(CRAY) && (BSD <= 43) */ # endif /* defined(USE_TERMIO) && !defined(CRAY) && (BSD <= 43) */
tty_rspeed((def_rspeed > 0) ? def_rspeed : 9600); tty_rspeed((def_rspeed > 0) ? def_rspeed : 9600);
tty_tspeed((def_tspeed > 0) ? def_tspeed : 9600); tty_tspeed((def_tspeed > 0) ? def_tspeed : 9600);
if (erase)
termbuf.c_cc[VERASE] = erase;
# ifdef LINEMODE # ifdef LINEMODE
if (waslm) if (waslm)
tty_setlinemode(1); tty_setlinemode(1);
@ -1384,7 +1401,6 @@ startslave(host, autologin, autoname)
{ {
register int i; register int i;
long time(); long time();
char name[256];
#ifdef NEWINIT #ifdef NEWINIT
extern char *ptyip; extern char *ptyip;
struct init_request request; struct init_request request;
@ -1517,7 +1533,7 @@ init_env()
char **envp; char **envp;
envp = envinit; envp = envinit;
if (*envp = getenv("TZ")) if ((*envp = getenv("TZ")))
*envp++ -= 3; *envp++ -= 3;
#if defined(CRAY) || defined(__hpux) #if defined(CRAY) || defined(__hpux)
else else
@ -1542,9 +1558,8 @@ start_login(host, autologin, name)
int autologin; int autologin;
char *name; char *name;
{ {
register char *cp;
register char **argv; register char **argv;
char **addarg(); char **addarg(), *user;
extern char *getenv(); extern char *getenv();
#ifdef UTMPX #ifdef UTMPX
register int pid = getpid(); register int pid = getpid();
@ -1652,6 +1667,7 @@ start_login(host, autologin, name)
if (auth_level >= 0 && autologin == AUTH_VALID) { if (auth_level >= 0 && autologin == AUTH_VALID) {
# if !defined(NO_LOGIN_F) # if !defined(NO_LOGIN_F)
argv = addarg(argv, "-f"); argv = addarg(argv, "-f");
argv = addarg(argv, "--");
argv = addarg(argv, name); argv = addarg(argv, name);
# else # else
# if defined(LOGIN_R) # if defined(LOGIN_R)
@ -1724,12 +1740,14 @@ start_login(host, autologin, name)
pty = xpty; pty = xpty;
} }
# else # else
argv = addarg(argv, "--");
argv = addarg(argv, name); argv = addarg(argv, name);
# endif # endif
# endif # endif
} else } else
#endif #endif
if (getenv("USER")) { if (getenv("USER")) {
argv = addarg(argv, "--");
argv = addarg(argv, getenv("USER")); argv = addarg(argv, getenv("USER"));
#if defined(LOGIN_ARGS) && defined(NO_LOGIN_P) #if defined(LOGIN_ARGS) && defined(NO_LOGIN_P)
{ {
@ -1765,16 +1783,14 @@ start_login(host, autologin, name)
close(pty); close(pty);
#endif #endif
closelog(); closelog();
/*
* This sleep(1) is in here so that telnetd can
* finish up with the tty. There's a race condition
* the login banner message gets lost...
*/
sleep(1);
execv(_PATH_LOGIN, argv);
syslog(LOG_ERR, "%s: %m\n", _PATH_LOGIN); if (altlogin == NULL) {
fatalperror(net, _PATH_LOGIN); altlogin = _PATH_LOGIN;
}
execv(altlogin, argv);
syslog(LOG_ERR, "%s: %m\n", altlogin);
fatalperror(net, altlogin);
/*NOTREACHED*/ /*NOTREACHED*/
} }
@ -1818,14 +1834,20 @@ addarg(argv, val)
* Remove a few things from the environment that * Remove a few things from the environment that
* don't need to be there. * don't need to be there.
*/ */
void
scrub_env() scrub_env()
{ {
register char **cpp, **cpp2; register char **cpp, **cpp2;
for (cpp2 = cpp = environ; *cpp; cpp++) { for (cpp2 = cpp = environ; *cpp; cpp++) {
#ifdef __FreeBSD__
if (strncmp(*cpp, "LD_LIBRARY_PATH=", 16) &&
strncmp(*cpp, "LD_PRELOAD=", 11) &&
#else
if (strncmp(*cpp, "LD_", 3) && if (strncmp(*cpp, "LD_", 3) &&
strncmp(*cpp, "_RLD_", 5) && strncmp(*cpp, "_RLD_", 5) &&
strncmp(*cpp, "LIBPATH=", 8) && strncmp(*cpp, "LIBPATH=", 8) &&
#endif
strncmp(*cpp, "IFS=", 4)) strncmp(*cpp, "IFS=", 4))
*cpp2++ = *cpp; *cpp2++ = *cpp;
} }

View File

@ -48,6 +48,7 @@ protocol server
.Op Fl X Ar authtype .Op Fl X Ar authtype
.Op Fl a Ar authmode .Op Fl a Ar authmode
.Op Fl edebug .Op Fl edebug
.Op Fl P Ar loginprog
.Op Fl r Ns Ar lowpty-highpty .Op Fl r Ns Ar lowpty-highpty
.Op Fl u Ar len .Op Fl u Ar len
.Op Fl debug Op Ar port .Op Fl debug Op Ar port
@ -187,6 +188,11 @@ If
has been compiled with support for data encryption, then the has been compiled with support for data encryption, then the
.Fl edebug .Fl edebug
option may be used to enable encryption debugging code. option may be used to enable encryption debugging code.
.It Fl P Ar loginprog
Specifies an alternate
.Xr login 1
command to run to complete the login. The alternate command must
understand the same command arguments as the standard login.
.It Fl h .It Fl h
Disables the printing of host-specific information before Disables the printing of host-specific information before
login has been completed. login has been completed.
@ -532,9 +538,9 @@ the data stream.
.Pa /usr/ucb/bftp .Pa /usr/ucb/bftp
(if supported) (if supported)
.Sh "SEE ALSO" .Sh "SEE ALSO"
.Xr telnet 1 , .Xr bftp 1 ,
.Xr login 1 , .Xr login 1 ,
.Xr bftp 1 .Xr telnet 1
(if supported) (if supported)
.Sh STANDARDS .Sh STANDARDS
.Bl -tag -compact -width RFC-1572 .Bl -tag -compact -width RFC-1572

View File

@ -32,13 +32,13 @@
*/ */
#ifndef lint #ifndef lint
static char copyright[] = static const char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\ "@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n"; The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)telnetd.c 8.4 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)telnetd.c 8.4 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include "telnetd.h" #include "telnetd.h"
@ -75,6 +75,10 @@ struct socket_security ss;
#include <libtelnet/auth.h> #include <libtelnet/auth.h>
int auth_level = 0; int auth_level = 0;
#endif #endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
#include <libtelnet/misc.h>
#if defined(SecurID) #if defined(SecurID)
int require_SecurID = 0; int require_SecurID = 0;
#endif #endif
@ -101,8 +105,6 @@ char ptyibuf2[BUFSIZ];
unsigned char ctlbuf[BUFSIZ]; unsigned char ctlbuf[BUFSIZ];
struct strbuf strbufc, strbufd; struct strbuf strbufc, strbufd;
int readstream();
#else /* ! STREAMPTY */ #else /* ! STREAMPTY */
/* /*
@ -112,6 +114,13 @@ int readstream();
char ptyibuf[BUFSIZ], *ptyip = ptyibuf; char ptyibuf[BUFSIZ], *ptyip = ptyibuf;
char ptyibuf2[BUFSIZ]; char ptyibuf2[BUFSIZ];
# include <termcap.h>
int readstream(int p, char *ibuf, int bufsize);
void doit(struct sockaddr_in *who);
int terminaltypeok(char *s);
void startslave(char *host, int autologin, char *autoname);
#endif /* ! STREAMPTY */ #endif /* ! STREAMPTY */
int hostinfo = 1; /* do we print login banner? */ int hostinfo = 1; /* do we print login banner? */
@ -124,6 +133,7 @@ int lowpty = 0, highpty; /* low, high pty numbers */
int debug = 0; int debug = 0;
int keepalive = 1; int keepalive = 1;
char *progname; char *progname;
char *altlogin;
extern void usage P((void)); extern void usage P((void));
@ -133,7 +143,7 @@ extern void usage P((void));
* passed off to getopt(). * passed off to getopt().
*/ */
char valid_opts[] = { char valid_opts[] = {
'd', ':', 'h', 'k', 'n', 'S', ':', 'u', ':', 'U', 'd', ':', 'h', 'k', 'n', 'p', ':', 'S', ':', 'u', ':', 'U',
#ifdef AUTHENTICATION #ifdef AUTHENTICATION
'a', ':', 'X', ':', 'a', ':', 'X', ':',
#endif #endif
@ -301,6 +311,10 @@ main(argc, argv)
keepalive = 0; keepalive = 0;
break; break;
case 'p':
altlogin = optarg;
break;
#ifdef CRAY #ifdef CRAY
case 'r': case 'r':
{ {
@ -385,7 +399,7 @@ main(argc, argv)
usage(); usage();
/* NOT REACHED */ /* NOT REACHED */
} else if (argc == 1) { } else if (argc == 1) {
if (sp = getservbyname(*argv, "tcp")) { if ((sp = getservbyname(*argv, "tcp"))) {
sin.sin_port = sp->s_port; sin.sin_port = sp->s_port;
} else { } else {
sin.sin_port = atoi(*argv); sin.sin_port = atoi(*argv);
@ -699,12 +713,14 @@ getterminaltype(name)
* we have to just go with what we (might) have already gotten. * we have to just go with what we (might) have already gotten.
*/ */
if (his_state_is_will(TELOPT_TTYPE) && !terminaltypeok(terminaltype)) { if (his_state_is_will(TELOPT_TTYPE) && !terminaltypeok(terminaltype)) {
(void) strncpy(first, terminaltype, sizeof(first)); (void) strncpy(first, terminaltype, sizeof(first)-1);
first[sizeof(first)-1] = '\0';
for(;;) { for(;;) {
/* /*
* Save the unknown name, and request the next name. * Save the unknown name, and request the next name.
*/ */
(void) strncpy(last, terminaltype, sizeof(last)); (void) strncpy(last, terminaltype, sizeof(last)-1);
last[sizeof(last)-1] = '\0';
_gettermname(); _gettermname();
if (terminaltypeok(terminaltype)) if (terminaltypeok(terminaltype))
break; break;
@ -722,8 +738,10 @@ getterminaltype(name)
* the start of the list. * the start of the list.
*/ */
_gettermname(); _gettermname();
if (strncmp(first, terminaltype, sizeof(first)) != 0) if (strncmp(first, terminaltype, sizeof(first)) != 0) {
(void) strncpy(terminaltype, first, sizeof(first)); (void) strncpy(terminaltype, first, sizeof(terminaltype)-1);
terminaltype[sizeof(terminaltype)-1] = '\0';
}
break; break;
} }
} }
@ -780,24 +798,20 @@ char *hostname;
char host_name[MAXHOSTNAMELEN]; char host_name[MAXHOSTNAMELEN];
char remote_host_name[MAXHOSTNAMELEN]; char remote_host_name[MAXHOSTNAMELEN];
#ifndef convex
extern void telnet P((int, int));
#else
extern void telnet P((int, int, char *)); extern void telnet P((int, int, char *));
#endif
int level;
char user_name[256];
/* /*
* Get a pty, scan input lines. * Get a pty, scan input lines.
*/ */
void
doit(who) doit(who)
struct sockaddr_in *who; struct sockaddr_in *who;
{ {
char *host, *inet_ntoa(); char *host, *inet_ntoa();
int t;
struct hostent *hp; struct hostent *hp;
int level;
int ptynum; int ptynum;
char user_name[256];
/* /*
* Find an available pty to use. * Find an available pty to use.
@ -875,12 +889,6 @@ doit(who)
level = getterminaltype(user_name); level = getterminaltype(user_name);
setenv("TERM", terminaltype ? terminaltype : "network", 1); setenv("TERM", terminaltype ? terminaltype : "network", 1);
/*
* Start up the login process on the slave side of the terminal
*/
#ifndef convex
startslave(host, level, user_name);
#if defined(_SC_CRAY_SECURE_SYS) #if defined(_SC_CRAY_SECURE_SYS)
if (secflag) { if (secflag) {
if (setulvl(dv.dv_actlvl) < 0) if (setulvl(dv.dv_actlvl) < 0)
@ -890,10 +898,8 @@ doit(who)
} }
#endif /* _SC_CRAY_SECURE_SYS */ #endif /* _SC_CRAY_SECURE_SYS */
telnet(net, pty); /* begin server processing */ telnet(net, pty, host); /* begin server process */
#else
telnet(net, pty, host);
#endif
/*NOTREACHED*/ /*NOTREACHED*/
} /* end of doit */ } /* end of doit */
@ -917,15 +923,9 @@ Xterm_output(ibufp, obuf, icountp, ocount)
* hand data to telnet receiver finite state machine. * hand data to telnet receiver finite state machine.
*/ */
void void
#ifndef convex
telnet(f, p)
#else
telnet(f, p, host) telnet(f, p, host)
#endif
int f, p; int f, p;
#ifdef convex
char *host; char *host;
#endif
{ {
int on = 1; int on = 1;
#define TABBUFSIZ 512 #define TABBUFSIZ 512
@ -1162,9 +1162,12 @@ telnet(f, p, host)
{sprintf(nfrontp, "td: Entering processing loop\r\n"); {sprintf(nfrontp, "td: Entering processing loop\r\n");
nfrontp += strlen(nfrontp);}); nfrontp += strlen(nfrontp);});
#ifdef convex /*
startslave(host); * Startup the login process on the slave side of the terminal
#endif * now. We delay this until here to insure option negotiation
* is complete.
*/
startslave(host, level, user_name);
nfd = ((f > p) ? f : p) + 1; nfd = ((f > p) ? f : p) + 1;
for (;;) { for (;;) {

View File

@ -32,11 +32,15 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)termstat.c 8.2 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)termstat.c 8.2 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#include "telnetd.h" #include "telnetd.h"
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
/* /*
* local variables * local variables
*/ */
@ -143,25 +147,6 @@ localstat()
newmap = tty_isnewmap(); newmap = tty_isnewmap();
#endif /* defined(CRAY2) && defined(UNICOS5) */ #endif /* defined(CRAY2) && defined(UNICOS5) */
/*
* Check for state of BINARY options.
*/
if (tty_isbinaryin()) {
if (his_want_state_is_wont(TELOPT_BINARY))
send_do(TELOPT_BINARY, 1);
} else {
if (his_want_state_is_will(TELOPT_BINARY))
send_dont(TELOPT_BINARY, 1);
}
if (tty_isbinaryout()) {
if (my_want_state_is_wont(TELOPT_BINARY))
send_will(TELOPT_BINARY, 1);
} else {
if (my_want_state_is_will(TELOPT_BINARY))
send_wont(TELOPT_BINARY, 1);
}
/* /*
* Check for changes to flow control if client supports it. * Check for changes to flow control if client supports it.
*/ */
@ -181,6 +166,34 @@ localstat()
tty_setlinemode(uselinemode); tty_setlinemode(uselinemode);
} }
if (uselinemode) {
/*
* Check for state of BINARY options.
*
* We only need to do the binary dance if we are actually going
* to use linemode. As this confuses some telnet clients
* that don't support linemode, and doesn't gain us
* anything, we don't do it unless we're doing linemode.
* -Crh (henrich@msu.edu)
*/
if (tty_isbinaryin()) {
if (his_want_state_is_wont(TELOPT_BINARY))
send_do(TELOPT_BINARY, 1);
} else {
if (his_want_state_is_will(TELOPT_BINARY))
send_dont(TELOPT_BINARY, 1);
}
if (tty_isbinaryout()) {
if (my_want_state_is_wont(TELOPT_BINARY))
send_will(TELOPT_BINARY, 1);
} else {
if (my_want_state_is_will(TELOPT_BINARY))
send_wont(TELOPT_BINARY, 1);
}
}
#ifdef ENCRYPTION #ifdef ENCRYPTION
/* /*
* If the terminal is not echoing, but editing is enabled, * If the terminal is not echoing, but editing is enabled,
@ -479,7 +492,7 @@ clientstat(code, parm1, parm2)
ack = (useeditmode & MODE_ACK); ack = (useeditmode & MODE_ACK);
useeditmode &= ~MODE_ACK; useeditmode &= ~MODE_ACK;
if (changed = (useeditmode ^ editmode)) { if ((changed = (useeditmode ^ editmode))) {
/* /*
* This check is for a timing problem. If the * This check is for a timing problem. If the
* state of the tty has changed (due to the user * state of the tty has changed (due to the user

View File

@ -32,12 +32,22 @@
*/ */
#ifndef lint #ifndef lint
static char sccsid[] = "@(#)utility.c 8.4 (Berkeley) 5/30/95"; static const char sccsid[] = "@(#)utility.c 8.4 (Berkeley) 5/30/95";
#endif /* not lint */ #endif /* not lint */
#ifdef __FreeBSD__
#include <locale.h>
#endif
#define PRINTOPTIONS #define PRINTOPTIONS
#include "telnetd.h" #include "telnetd.h"
#if defined(AUTHENTICATION)
#include <libtelnet/auth.h>
#endif
#if defined(ENCRYPTION)
#include <libtelnet/encrypt.h>
#endif
/* /*
* utility functions performing io related tasks * utility functions performing io related tasks
*/ */
@ -93,6 +103,7 @@ stilloob(s)
do { do {
FD_ZERO(&excepts); FD_ZERO(&excepts);
FD_SET(s, &excepts); FD_SET(s, &excepts);
memset((char *)&timeout, 0, sizeof timeout);
value = select(s+1, (fd_set *)0, (fd_set *)0, &excepts, &timeout); value = select(s+1, (fd_set *)0, (fd_set *)0, &excepts, &timeout);
} while ((value == -1) && (errno == EINTR)); } while ((value == -1) && (errno == EINTR));
@ -433,12 +444,16 @@ putchr(cc)
*putlocation++ = cc; *putlocation++ = cc;
} }
#ifdef __FreeBSD__
static char fmtstr[] = { "%+" };
#else
/* /*
* This is split on two lines so that SCCS will not see the M * This is split on two lines so that SCCS will not see the M
* between two % signs and expand it... * between two % signs and expand it...
*/ */
static char fmtstr[] = { "%l:%M\ static char fmtstr[] = { "%l:%M\
%P on %A, %d %B %Y" }; %P on %A, %d %B %Y" };
#endif
void void
putf(cp, where) putf(cp, where)
@ -481,6 +496,9 @@ putf(cp, where)
break; break;
case 'd': case 'd':
#ifdef __FreeBSD__
setlocale(LC_TIME, "");
#endif
(void)time(&t); (void)time(&t);
(void)strftime(db, sizeof(db), fmtstr, localtime(&t)); (void)strftime(db, sizeof(db), fmtstr, localtime(&t));
putstr(db); putstr(db);
@ -939,7 +957,6 @@ printsub(direction, pointer, length)
break; break;
default: default:
def_case:
if (isprint(pointer[i]) && pointer[i] != '"') { if (isprint(pointer[i]) && pointer[i] != '"') {
if (noquote) { if (noquote) {
*nfrontp++ = '"'; *nfrontp++ = '"';
@ -1110,12 +1127,12 @@ printsub(direction, pointer, length)
break; break;
case ENCRYPT_ENC_KEYID: case ENCRYPT_ENC_KEYID:
sprintf(nfrontp, " ENC_KEYID", pointer[1]); sprintf(nfrontp, " ENC_KEYID");
nfrontp += strlen(nfrontp); nfrontp += strlen(nfrontp);
goto encommon; goto encommon;
case ENCRYPT_DEC_KEYID: case ENCRYPT_DEC_KEYID:
sprintf(nfrontp, " DEC_KEYID", pointer[1]); sprintf(nfrontp, " DEC_KEYID");
nfrontp += strlen(nfrontp); nfrontp += strlen(nfrontp);
goto encommon; goto encommon;