version 1.22, 2013/10/26 21:33:29 |
version 1.23, 2014/07/19 23:50:38 |
|
|
#define OPTS_FORWARD_CREDS 0x00000002 |
#define OPTS_FORWARD_CREDS 0x00000002 |
#define OPTS_FORWARDABLE_CREDS 0x00000001 |
#define OPTS_FORWARDABLE_CREDS 0x00000001 |
|
|
#ifdef KRB5 |
|
#define FORWARD |
|
/* XXX ugly hack to setup dns-proxy stuff */ |
|
#define Authenticator asn1_Authenticator |
|
#include <kerberosV/krb5.h> |
|
#endif |
|
|
|
#ifdef KRB4 |
|
#include <kerberosIV/krb.h> |
|
#endif |
|
|
|
#ifdef FORWARD |
|
int forward_flags; |
|
static int default_forward=0; |
|
#endif |
|
|
|
int family = AF_UNSPEC; |
int family = AF_UNSPEC; |
int rtableid = -1; |
int rtableid = -1; |
|
|
|
|
init_telnet(); |
init_telnet(); |
|
|
init_sys(); |
init_sys(); |
|
|
#if defined(TN3270) |
|
init_3270(); |
|
#endif |
|
} |
} |
|
|
void |
void |
|
|
extern char *__progname; |
extern char *__progname; |
|
|
(void)fprintf(stderr, |
(void)fprintf(stderr, |
#if defined(TN3270) |
"usage: %s [-4678acDdEKLr] [-b hostalias] [-e escapechar] " |
"usage: %s [-d] [-n filename] [-t commandname] [sysname [port]]\n", |
"[-l user]\n" |
# else |
"\t[-n tracefile] [-V rtable] [host [port]]\n", |
"usage: %s [-468acdEFfKLrx] [-b hostalias] [-e escapechar] " |
|
"[-k realm]\n" |
|
"\t[-l user] [-n tracefile] [-V rtable] [-X authtype] " |
|
"[host [port]]\n", |
|
#endif |
|
__progname); |
__progname); |
|
|
exit(1); |
exit(1); |
} |
} |
|
|
|
|
#ifdef KRB5 |
|
static void |
|
krb5_init(void) |
|
{ |
|
krb5_context context; |
|
krb5_error_code ret; |
|
|
|
ret = krb5_init_context(&context); |
|
if (ret) |
|
return; |
|
|
|
#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) |
|
if (krb5_config_get_bool (context, NULL, |
|
"libdefaults", "forward", NULL)) { |
|
forward_flags |= OPTS_FORWARD_CREDS; |
|
default_forward=1; |
|
} |
|
if (krb5_config_get_bool (context, NULL, |
|
"libdefaults", "forwardable", NULL)) { |
|
forward_flags |= OPTS_FORWARDABLE_CREDS; |
|
default_forward=1; |
|
} |
|
#endif |
|
#ifdef ENCRYPTION |
|
if (krb5_config_get_bool (context, NULL, |
|
"libdefaults", "encrypt", NULL)) { |
|
encrypt_auto(1); |
|
decrypt_auto(1); |
|
wantencryption = 1; |
|
EncryptVerbose(1); |
|
} |
|
#endif |
|
|
|
krb5_free_context(context); |
|
} |
|
#endif |
|
|
|
/* |
/* |
* main. Parse arguments, invoke the protocol or command parser. |
* main. Parse arguments, invoke the protocol or command parser. |
*/ |
*/ |
|
|
int ch; |
int ch; |
char *user, *alias; |
char *user, *alias; |
const char *errstr; |
const char *errstr; |
#ifdef FORWARD |
|
extern int forward_flags; |
|
#endif /* FORWARD */ |
|
|
|
#ifdef KRB5 |
|
krb5_init(); |
|
#endif |
|
|
|
tninit(); /* Clear out things */ |
tninit(); /* Clear out things */ |
|
|
TerminalSaveState(); |
TerminalSaveState(); |
|
|
|
|
rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; |
rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; |
|
|
/* |
|
* if AUTHENTICATION and ENCRYPTION is set autologin will be |
|
* set to true after the getopt switch; unless the -K option is |
|
* passed |
|
*/ |
|
autologin = -1; |
autologin = -1; |
|
|
while ((ch = getopt(argc, argv, "4678DEKLS:X:ab:cde:fFk:l:n:rt:V:x")) |
while ((ch = getopt(argc, argv, "4678ab:cDdEe:KLl:n:rV:")) |
!= -1) { |
!= -1) { |
switch(ch) { |
switch(ch) { |
case '4': |
case '4': |
|
|
case '6': |
case '6': |
family = AF_INET6; |
family = AF_INET6; |
break; |
break; |
|
case '7': |
|
eight = 0; |
|
break; |
case '8': |
case '8': |
eight = 3; /* binary output and input */ |
eight = 3; /* binary output and input */ |
break; |
break; |
case '7': |
case 'a': |
eight = 0; |
autologin = 1; |
break; |
break; |
|
case 'b': |
|
alias = optarg; |
|
break; |
|
case 'c': |
|
skiprc = 1; |
|
break; |
case 'D': { |
case 'D': { |
/* sometimes we don't want a mangled display */ |
/* sometimes we don't want a mangled display */ |
char *p; |
char *p; |
|
|
env_define("DISPLAY", (unsigned char*)p); |
env_define("DISPLAY", (unsigned char*)p); |
break; |
break; |
} |
} |
|
case 'd': |
|
debug = 1; |
|
break; |
case 'E': |
case 'E': |
rlogin = escape = _POSIX_VDISABLE; |
rlogin = escape = _POSIX_VDISABLE; |
break; |
break; |
|
case 'e': |
|
set_escape_char(optarg); |
|
break; |
case 'K': |
case 'K': |
#ifdef AUTHENTICATION |
|
autologin = 0; |
autologin = 0; |
#endif |
|
break; |
break; |
case 'L': |
case 'L': |
eight |= 2; /* binary output only */ |
eight |= 2; /* binary output only */ |
break; |
break; |
case 'S': |
|
{ |
|
#ifdef HAS_GETTOS |
|
extern int tos; |
|
|
|
if ((tos = parsetos(optarg, "tcp")) < 0) |
|
fprintf(stderr, "%s%s%s%s\n", |
|
prompt, ": Bad TOS argument '", |
|
optarg, |
|
"; will try to use default TOS"); |
|
#else |
|
fprintf(stderr, |
|
"%s: Warning: -S ignored, no parsetos() support.\n", |
|
prompt); |
|
#endif |
|
} |
|
break; |
|
case 'X': |
|
#ifdef AUTHENTICATION |
|
auth_disable_name(optarg); |
|
#endif |
|
break; |
|
case 'a': |
|
autologin = 1; |
|
break; |
|
case 'c': |
|
skiprc = 1; |
|
break; |
|
case 'd': |
|
debug = 1; |
|
break; |
|
case 'e': |
|
set_escape_char(optarg); |
|
break; |
|
case 'f': |
|
#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) |
|
if ((forward_flags & OPTS_FORWARD_CREDS) && |
|
!default_forward) { |
|
fprintf(stderr, |
|
"%s: Only one of -f and -F allowed.\n", |
|
prompt); |
|
usage(); |
|
} |
|
forward_flags |= OPTS_FORWARD_CREDS; |
|
#else |
|
fprintf(stderr, |
|
"%s: Warning: -f ignored, no Kerberos V5 support.\n", |
|
prompt); |
|
#endif |
|
break; |
|
case 'F': |
|
#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) |
|
if ((forward_flags & OPTS_FORWARD_CREDS) && |
|
!default_forward) { |
|
fprintf(stderr, |
|
"%s: Only one of -f and -F allowed.\n", |
|
prompt); |
|
usage(); |
|
} |
|
forward_flags |= OPTS_FORWARD_CREDS; |
|
forward_flags |= OPTS_FORWARDABLE_CREDS; |
|
#else |
|
fprintf(stderr, |
|
"%s: Warning: -F ignored, no Kerberos V5 support.\n", |
|
prompt); |
|
#endif |
|
break; |
|
case 'k': |
|
#if defined(AUTHENTICATION) && defined(KRB4) |
|
{ |
|
extern char *dest_realm, dst_realm_buf[]; |
|
extern int dst_realm_sz; |
|
dest_realm = dst_realm_buf; |
|
(void)strncpy(dest_realm, optarg, dst_realm_sz); |
|
} |
|
#else |
|
fprintf(stderr, |
|
"%s: Warning: -k ignored, no Kerberos V4 support.\n", |
|
prompt); |
|
#endif |
|
break; |
|
case 'l': |
case 'l': |
autologin = -1; |
autologin = -1; |
user = optarg; |
user = optarg; |
break; |
break; |
case 'b': |
|
alias = optarg; |
|
break; |
|
case 'n': |
case 'n': |
#if defined(TN3270) && defined(unix) |
SetNetTrace(optarg); |
/* distinguish between "-n oasynch" and "-noasynch" */ |
|
if (argv[optind - 1][0] == '-' && argv[optind - 1][1] |
|
== 'n' && argv[optind - 1][2] == 'o') { |
|
if (!strcmp(optarg, "oasynch")) { |
|
noasynchtty = 1; |
|
noasynchnet = 1; |
|
} else if (!strcmp(optarg, "oasynchtty")) |
|
noasynchtty = 1; |
|
else if (!strcmp(optarg, "oasynchnet")) |
|
noasynchnet = 1; |
|
} else |
|
#endif /* defined(TN3270) && defined(unix) */ |
|
SetNetTrace(optarg); |
|
break; |
break; |
case 'r': |
case 'r': |
rlogin = '~'; |
rlogin = '~'; |
break; |
break; |
case 't': |
|
#if defined(TN3270) && defined(unix) |
|
(void)strlcpy(tline, optarg, sizeof tline); |
|
transcom = tline; |
|
#else |
|
fprintf(stderr, |
|
"%s: Warning: -t ignored, no TN3270 support.\n", |
|
prompt); |
|
#endif |
|
break; |
|
case 'V': |
case 'V': |
rtableid = (int)strtonum(optarg, 0, |
rtableid = (int)strtonum(optarg, 0, |
RT_TABLEID_MAX, &errstr); |
RT_TABLEID_MAX, &errstr); |
|
|
prompt, errstr, optarg); |
prompt, errstr, optarg); |
} |
} |
break; |
break; |
case 'x': |
|
#ifdef ENCRYPTION |
|
encrypt_auto(1); |
|
decrypt_auto(1); |
|
wantencryption = 1; |
|
EncryptVerbose(1); |
|
#else |
|
fprintf(stderr, |
|
"%s: Warning: -x ignored, no ENCRYPT support.\n", |
|
prompt); |
|
#endif |
|
break; |
|
case '?': |
case '?': |
default: |
default: |
usage(); |
usage(); |
|
|
} |
} |
} |
} |
|
|
if (autologin == -1) { |
|
#if defined(AUTHENTICATION) |
|
if(check_krb4_tickets() || check_krb5_tickets()) |
|
autologin = 1; |
|
#endif |
|
#if defined(ENCRYPTION) |
|
encrypt_auto(1); |
|
decrypt_auto(1); |
|
#endif |
|
} |
|
|
|
if (autologin == -1) |
if (autologin == -1) |
autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; |
autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; |
|
|
|
|
} |
} |
(void)setjmp(toplevel); |
(void)setjmp(toplevel); |
for (;;) { |
for (;;) { |
#ifdef TN3270 |
command(1, 0, 0); |
if (shell_active) |
|
shell_continue(); |
|
else |
|
#endif |
|
command(1, 0, 0); |
|
} |
} |
return 0; |
return 0; |
} |
} |