📄 gaptelnet.c
字号:
#ifndef lintstatic char *rcsid = "$Header: gaptelnet.c,v 2.2 86/05/16 11:03:33 jqj Exp $";#endif/* * XNS User telnet program. *//* $Log: gaptelnet.c,v $ * Revision 2.2 86/05/16 11:03:33 jqj * fix to correspond to new semantics for enumerations (global) * * Revision 2.1 86/03/01 09:26:04 jqj * Accept data with datastream=0 for the sake of incorrectly implemented * servers (e.g. InterLisp-D). If unrecognized inband controls arrive, * don't choke. * * Revision 2.0 85/11/21 07:23:04 jqj * 4.3BSD standard release * * Revision 1.3 85/11/20 14:00:08 jqj * added symbolic entries for Gap connection types * * Revision 1.2 85/05/22 09:46:37 jqj * VAX 4.3beta baseline version * * Revision 1.2 85/05/22 09:46:37 jqj * Beta-test GAP telnet * * based on tcp/telnet: * static char *rcsid = "$Header: gaptelnet.c,v 2.2 86/05/16 11:03:33 jqj Exp $"; * static char sccsid[] = "@(#)telnet.c 4.24 (Berkeley) 7/20/83"; */#include <sys/types.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <netns/ns.h>#include <netns/idp.h>#include <netns/sp.h> /* for spphdr */#include <netns/spidp.h>#include <stdio.h>#include <ctype.h>#include <errno.h>#include <signal.h>#include <xnscourier/Clearinghouse2.h>#include "GAP3.h"#include "gapcontrols.h"#include <xnscourier/except.h>#include <xnscourier/CH.h>#define strip(x) ((x)&0177)char ttyobuf[BUFSIZ], *tfrontp = ttyobuf, *tbackp = ttyobuf;char netobuf[BUFSIZ], *nfrontp = netobuf, *nbackp = netobuf;int connected;CourierConnection *cconn;int net;FILE *logfile;int debug = 0;int crmod = 0;char *prompt;char escape = CTRL(]);char on = 1;char line[200];int margc;char *margv[20];jmp_buf toplevel;jmp_buf peerdied;extern int errno;int tn(), quit(), suspend(), bye(), help();int setescape(), status(), toggle(), setoptions();int setcrmod(), setdebug(), setlog();#define HELPINDENT (sizeof ("connect"))struct cmd { char *name; /* command name */ char *help; /* help string */ int (*handler)(); /* routine which executes command */};char openhelp[] = "connect to a site";char closehelp[] = "close current connection";char quithelp[] = "exit telnet";char zhelp[] = "suspend telnet";char debughelp[] = "toggle debugging";char escapehelp[] = "set escape character";char statushelp[] = "print status information";char helphelp[] = "print help information";char crmodhelp[] = "toggle mapping of received carriage returns";char loghelp[] = "toggle logging of session";struct cmd cmdtab[] = { { "open", openhelp, tn }, { "close", closehelp, bye }, { "quit", quithelp, quit }, { "z", zhelp, suspend }, { "escape", escapehelp, setescape }, { "status", statushelp, status },/* { "crmod", crmodhelp, setcrmod }, */ { "debug", debughelp, setdebug }, { "log", loghelp, setlog }, { "?", helphelp, help }, 0};struct sockaddr_ns sin;int intr(), deadpeer();char *control();struct cmd *getcmd();struct tchars otc;struct ltchars oltc;struct sgttyb ottyb;char *hostname;char hnamebuf[45];main(argc, argv) int argc; char *argv[];{ ioctl(0, TIOCGETP, (char *)&ottyb); ioctl(0, TIOCGETC, (char *)&otc); ioctl(0, TIOCGLTC, (char *)&oltc); setbuf(stdin, 0); setbuf(stdout, 0); prompt = argv[0]; if (argc > 1 && !strcmp(argv[1], "-d")) debug = SO_DEBUG, argv++, argc--; if (argc != 1) { if (setjmp(toplevel) != 0) exit(0); tn(argc, argv); } setjmp(toplevel); for (;;) command(1);}tn(argc, argv) int argc; char *argv[];{ register int c; register struct ns_addr *host; extern struct ns_addr *getXNSaddr(); Clearinghouse2_ObjectName hostoname, hdefault; LongCardinal servicetype; if (connected) { printf("?Already connected to %s\n", hostname); return; } if (argc < 2) { strcpy(line, "Connect "); printf("(to) "); gets(&line[strlen(line)]); makeargv(); argc = margc; argv = margv; } if (argc > 3) { printf("usage: %s host-name [service-type]\n", argv[0]); return; } if (argc == 2) servicetype = TTYService_sa; /* default to 1 */ else if (strcmp(argv[2],"sa") == 0) servicetype = TTYService_sa; else if (strncmp(argv[2],"re",2) == 0 || strcmp(argv[2],"exec") == 0) servicetype = TTYService_exec; else if (strcmp(argv[2],"its") == 0) servicetype = TTYService_its; else servicetype = atoi(argv[2]); CH_NameDefault(&hdefault); hostoname = CH_StringToName(argv[1], &hdefault); if ((host = CH_LookupAddrDN(hostoname,0,hnamebuf,sizeof(hnamebuf)))) { sin.sns_family = AF_NS; host->x_port = htons(IDPPORT_COURIER); bcopy(host, (caddr_t)&sin.sns_addr, sizeof(host)); /* hnamebuf is filled in by CH_LookupAddrDN */ hostname = hnamebuf; } else if ((host = getXNSaddr(argv[1]))) { sin.sns_family = AF_NS; bcopy(host, (caddr_t)&sin.sns_addr, sizeof(host)); strcpy(hnamebuf, argv[1]); hostname = hnamebuf; } else { printf("%s: unknown host\n", argv[1]); return; } cconn = CourierOpen(host); if(cconn == NULL) { fprintf(stderr,"Courier connection failed\n"); return; } net = *(int*)cconn; signal(SIGINT, intr); signal(SIGPIPE, deadpeer); printf("Trying...\n"); if (createsession(cconn,servicetype) < 0) return; connected++; call(status, "status", 0); sleep(1); if (setjmp(peerdied) == 0) telnet(net); fprintf(stderr, "\nConnection closed by foreign host.\n"); exit(1);}/* * create a session */createsession(cconn, servicetype) CourierConnection *cconn; LongCardinal servicetype;{ GAP3_SessionParameterObject pobj; GAP3_TransportObject tobjs[2]; GAP3_CommParamObject *cp; struct { Cardinal length; GAP3_TransportObject *sequence; } tobjlist; Authentication1_Credentials creds; Authentication1_Verifier verifier; pobj.designator = GAP3_oldTtyHost; /* 11 */ pobj.GAP3_oldTtyHost_case.charLength = GAP3_seven; pobj.GAP3_oldTtyHost_case.parity = GAP3_none; pobj.GAP3_oldTtyHost_case.stopBits = GAP3_oneStopBit; pobj.GAP3_oldTtyHost_case.frameTimeout = 20;/* tobjs[0].designator = GAP3_rs232c; cp = &tobjs[0].GAP3_rs232c_case.commParams; cp->accessDetail.designator = GAP3_directConn; cp->accessDetail.directConn_case.duplex = GAP3_fullduplex; cp->accessDetail.directConn_case.lineType = GAP3_asynchronous; cp->accessDetail.directConn_case.lineSpeed = GAP3_bps300; tobjs[0].rs232c_case.preemptOthers = GAP3_preemptInactive; tobjs[0].rs232c_case.preemptMe = GAP3_preemptInactive; tobjs[0].rs232c_case.phoneNumber = ""; tobjs[0].rs232c_case.line.designator = GAP3_reserveNeeded; tobjs[0].rs232c_case.line.reserveNeeded_case.lineNumber = 1;*/ tobjs[0].designator = GAP3_service; tobjs[0].GAP3_service_case.id = servicetype; /* 1 == SA */ tobjs[1].designator = GAP3_teletype; tobjlist.length = 2; tobjlist.sequence = tobjs; MakeSimpleCredsAndVerifier(0, 0, &creds, &verifier); DURING (void) GAP3_Create(cconn, NULL, pobj, tobjlist, 0, creds, verifier); HANDLER { char *msg; switch (Exception.Code) { case GAP3_mediumConnectFailed: msg = "medium connect failed"; break; case GAP3_illegalTransport: msg = "illegal transport type"; break; case GAP3_tooManyGateStreams: case GAP3_serviceTooBusy: msg = "insufficient resources"; break; case GAP3_serviceNotFound: msg = "service type not found"; break; case GAP3_userNotAuthenticated: case GAP3_userNotAuthorized: msg = "authentication problem"; break; case REJECT_ERROR: switch (CourierErrArgs(rejectionDetails,designator)){ case noSuchProgramNumber: msg = "server does not support GAP"; break; case noSuchVersionNumber: msg = "server does not support our GAP version"; break; default: msg = "connection rejected"; } break; case PROTOCOL_VIOLATION: msg = "protocol violation by remote server"; break; default: msg = "some random error"; break; } fprintf(stderr,"Error creating connection, %s\n", msg); return(-1); } END_HANDLER; return(0);}/* * Print status about the connection. *//*VARARGS*/status(){ if (connected) printf("Connected to %s.\n", hostname); else printf("No connection.\n"); printf("Escape character is '%s'.\n", control(escape)); fflush(stdout);}makeargv(){ register char *cp; register char **argp = margv; margc = 0; for (cp = line; *cp;) { while (isspace(*cp)) cp++; if (*cp == '\0') break; *argp++ = cp; margc += 1; while (*cp != '\0' && !isspace(*cp)) cp++; if (*cp == '\0') break; *cp++ = '\0'; } *argp++ = 0;}/*VARARGS*/suspend(){ register int save; save = mode(0); kill(0, SIGTSTP); /* reget parameters in case they were changed */ ioctl(0, TIOCGETP, (char *)&ottyb); ioctl(0, TIOCGETC, (char *)&otc); ioctl(0, TIOCGLTC, (char *)&oltc); (void) mode(save);}/*VARARGS*/bye(){ register char *op; (void) mode(0); if (connected) { sendoobdata(GAPCTLcleanup); setsockopt(net, NSPROTO_SPP, SO_HEADERS_ON_OUTPUT, &on, sizeof(on)); sppclose(net); printf("Connection closed.\n"); connected = 0; }}/*VARARGS*/quit(){ call(bye, "bye", 0); exit(0);}/* * Toggle debugging */setdebug(argc, argv){ debug = ~debug;}/* * Toggle logging */setlog(argc, argv) int argc; char *argv[];{ if (argc > 2) printf("Syntax: %s [filename]\n",argv[0]); else if (logfile != (FILE*) 0) { /* currently logging */ fclose(logfile); printf("Log file closed\n"); logfile = (FILE*) 0; if (argc == 2 && (logfile = fopen(argv[1],"a")) != (FILE*)0) printf("Logging to %s\n",argv[1]); } else { /* not currently logging */ if (argc == 1) printf("Logging already disabled\n"); else if (argc == 2 && (logfile = fopen(argv[1],"a")) != (FILE*)0 ) printf("Logging to %s\n",argv[1]); }}/* * Help command. */help(argc, argv) int argc; char *argv[];{ register struct cmd *c;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -