Annotation of cci/usr/src/usr.bin/bsc/cmd/3270/em3277.c, revision 1.1

1.1     ! root        1: /*     D.L.Buck and Associates, Inc. - @(#)em3277.c    1.18 REL
        !             2:  *
        !             3:  *     COPYRIGHT NOTICE:
        !             4:  *             Copyright c 1984 - An unpublished work by 
        !             5:  *             D.L.Buck and Associates, Inc.
        !             6:  *
        !             7:  *     PROPRIETARY RIGHTS NOTICE:
        !             8:  *             All rights reserved. This document and program contains
        !             9:  *             proprietary information of D.L.Buck and Associates,Inc.
        !            10:  *             of San Jose, California, U.S.A., embodying confidential
        !            11:  *             information,  ideas, and expressions,  no part of which
        !            12:  *             may be reproduced, or transmitted in any form or by any
        !            13:  *             means,  electronic,  mechanical,  or otherwise, without
        !            14:  *             the written permission of D.L.Buck and Associates, Inc.
        !            15:  * NAME
        !            16:  *     em3277 - IBM 3277 terminal emulator
        !            17:  *
        !            18:  * SYNOPSIS
        !            19:  *     em3277 [-Ttermtype] [<hostname>]
        !            20:  *
        !            21:  * DESCRIPTION
        !            22:  *     em3277 is the controlling utility of the IBM 3277 synchronous
        !            23:  *     terminal emulation routines, emsetup() and emulate().
        !            24:  *
        !            25:  * ALGORITHM
        !            26:  *     I. Initialization
        !            27:  *             A. Process control parameters
        !            28:  *                     1. -Ttermtype
        !            29:  *                     2. hostname - specifies control unit interface to
        !            30:  *                        emulate
        !            31:  *                     3. If no termtype specified, take through the
        !            32:  *                        environment (TERM=termtype)
        !            33:  *
        !            34:  *             B. Get host configuration parameters
        !            35:  *             C. Call connect installation exit
        !            36:  *             D. Open the comm device
        !            37:  *             E. Set device parameters
        !            38:  *
        !            39:  *     II. Emulate 3277 terminal
        !            40:  *             A. Call emsetup() routine
        !            41:  *                     1. sets up the terminal characteristics for emulation,
        !            42:  *                        does the termcap keyboard mapping, and initializes
        !            43:  *                        the virtual screen used by the curses package to
        !            44:  *                        manipulate the cursor and the screen image.
        !            45:  *             B. Call emulate()
        !            46:  *                     1. the actual emulating utility
        !            47:  *
        !            48:  *     III. Disconnect
        !            49:  *             A. Call disconnect installation exit
        !            50:  *             B. Close the comm device
        !            51:  *             C. Call the cleanup routine
        !            52:  */
        !            53: 
        !            54: #include "local.h"
        !            55: #include <bsc/bscio.h>
        !            56: #include <em.h>
        !            57: #include <sys/time.h>
        !            58: #include <errno.h>
        !            59: extern char *sys_errlist[];
        !            60: extern int errno;
        !            61: 
        !            62: #define libpath "/usr/lib/bscbatch/"
        !            63: #define spoolpath "/usr/spool/bscbatch/"
        !            64: #define YES 1
        !            65: #define NO 0
        !            66: 
        !            67: static char sccsid[] = "@(#)em3277.c   1.18 REL";
        !            68: 
        !            69: /* statistics-keeping variables */
        !            70: int tb_ctr = 0;                /* transmitted blocks counter */
        !            71: int rb_ctr = 0;                /* received blocks counter */
        !            72: struct tbuffer         {
        !            73:        long utime;
        !            74:        long stime;
        !            75:        long cutime;
        !            76:        long cstime;
        !            77: } rspbuf;
        !            78: 
        !            79: /* initial status messages */
        !            80: char astsptpt[] = {'%','R',0x02,'2',' '};      /* ascii, point-to-point */
        !            81: char estsptpt[] = {0x6c,0xd9,0x02,0xc2,0x40};  /*ebcdic, point-to-point */
        !            82: char astsmpt[] = {'%','R',0x02,0,0,'T',' '};   /* ascii, multipoint */
        !            83: char estsmpt[] = {0x6c,0xd9,0x02,0,0,0x4a,0x40};/*ebcdic, multipoint */
        !            84: 
        !            85: char adnavail[] = {'%','R',0x02,0,0,' ','&'};  /* ascii, dev. not available */
        !            86: char ednavail[] = {0x6c,0xd9,0x02,0,0,0x40,0x50};/*ebcdic, dev. not available */
        !            87: 
        !            88: char hostname[20] = "3270";    /* contains host name */
        !            89: char user[20];                 /* user name */
        !            90: char pr_dest[20] = "/usr/ucb/lpr";     /* default print job destination */
        !            91: char ptype = 'p';              /* default print job destination type
        !            92:                                   (pipe) */
        !            93: char audname[80];              /* temp audit file pathname goes here */
        !            94: char new_audnm[80];            /* real audit pathname goes here */
        !            95: char auditlock[80];            /* audit lockfile pathname goes here */
        !            96: 
        !            97: char *strcpy();                        /* function copies one string to another */
        !            98: char *strcat();                        /* function appends one string to another */
        !            99: char *getenv();                        /* find string in environment */
        !           100: 
        !           101: int chk_hostid;
        !           102: int chk_termid;
        !           103: int primary = BSCPRIM;
        !           104: int rviab; 
        !           105: int pt_to_pt;
        !           106: int ascii;             /* ascii or ebcdic data? */
        !           107: int devfd;             /* bsc device file descriptor */
        !           108: int initflag = 0;
        !           109: long atol();           /* converts ascii to long */
        !           110: char devname[20];
        !           111: char *termtype;                /* terminal type */
        !           112: char ttype[20];                /* terminal type + .3277 (for special 3277 terminal
        !           113:                           entries) */
        !           114: int stationid;         /* subdevice id, translated appropriately */
        !           115: char termid;           /* cluster address (poll) */
        !           116: 
        !           117: FILE *fopen();         /* function opens files */
        !           118: FILE *popen();         /* initiate I/O to form a process */
        !           119: FILE *aud;             /* host AUDIT file pointer */
        !           120: 
        !           121: struct bscio gp;       /* get current bsc driver parameters in here */
        !           122: struct bscio sp;       /* use this to set parameters */
        !           123:        
        !           124: main(argc,argv)
        !           125: int argc; char *argv[];
        !           126: {
        !           127:        int more;               /* g/p var */
        !           128: 
        !           129:        char tbuf[2048];        /* buffer area for tgetent */
        !           130: 
        !           131:        char filename[50];      /* file name temp area */
        !           132:        char note[100];         /* msg to write to AUDIT file and mail */
        !           133: 
        !           134:        switch (--argc) {       /* process parameters */
        !           135:        case 2: /* -Ttermtype hostname */
        !           136:                ++argv;         /* skip first dummy param */
        !           137:                if (strlen(argv[0]) < 3 ||
        !           138:                        argv[0][0] != '-' || argv[0][1] != 'T') {
        !           139:                        fprintf(stderr,"em3277: unrecognized parameter <%s>\n",
        !           140:                                argv[0]);
        !           141:                        exit(1);
        !           142:                }
        !           143:                termtype = &argv[0][2]; /* save terminal type */
        !           144: 
        !           145:        case 1: /* hostname */
        !           146:                ++argv;
        !           147:                strcpy(hostname,argv[0]);       /* take given host name */
        !           148:                break;
        !           149: 
        !           150:        case 0: /* take defaults */
        !           151:                break;
        !           152: 
        !           153:        default:
        !           154:                fprintf(stderr,"em3277: too many parameters\n");
        !           155:                exit(1);
        !           156:        }
        !           157: 
        !           158:        if (termtype == (char *)0)
        !           159:                termtype = getenv("TERM");
        !           160: 
        !           161:        sprintf(ttype,"3270%s",termtype);
        !           162:        if (tgetent(tbuf,ttype) != 1)   {
        !           163:                if (tgetent(tbuf,termtype) != 1)        {
        !           164:                        if (termtype == (char *)0)
        !           165:                                sprintf(note,
        !           166:                                        "Terminal type unknown or not set\n");
        !           167:                        else
        !           168:                                sprintf(note,
        !           169:                                        "em3277: terminal type %s unknown\n",
        !           170:                                        termtype);
        !           171:                        fprintf(stderr,note);
        !           172:                        write_aud("E",note);
        !           173:                        exit(0);
        !           174:                }
        !           175:                strcpy(ttype,termtype);
        !           176:        }
        !           177:        else
        !           178:                termtype = ttype;
        !           179: 
        !           180:        /* get host configuration parameters */
        !           181:                sprintf(filename,"%s%s",libpath,hostname);
        !           182:                if (get_cnfig(filename))        exit (1);
        !           183:                
        !           184:        /* construct temp AUDIT pathname, open AUDIT file */
        !           185:                sprintf(audname,"%s%s/%s",spoolpath,hostname,"AUDIT");
        !           186:        /* construct default real AUDIT pathname */
        !           187:                sprintf(new_audnm,"%s%s/%s",spoolpath,hostname,"AUDIT");
        !           188:                if (access(audname,0) == 0)     {
        !           189:                        sprintf(auditlock,"%s%s/%s",spoolpath,hostname,"auditlock");
        !           190:                        if (creat(auditlock,0) < 0)
        !           191:                                em_audnm();
        !           192:                        else
        !           193:                                aud = fopen(audname,"a");
        !           194:                }
        !           195: 
        !           196: #ifndef DEBUG
        !           197:        do      {
        !           198:        /* write "ready for connect" msg to AUDIT */
        !           199:                sprintf (note,"Ready for connect via <%s>",
        !           200:                         devname);
        !           201:                write_aud("C",note);
        !           202: 
        !           203:        /* call connect installation exit */
        !           204:                if ((more = connect(hostname,devname)) != 0) {
        !           205:                /* skip this host if there were problems */
        !           206:                        sprintf(note,
        !           207:                        "Connection failed, <connect routine error code %d>",more);
        !           208:                        write_aud("C",note);
        !           209: 
        !           210:                /* tell user about it */
        !           211:                        fputs(note,stderr);
        !           212:                        cleanup();
        !           213:                        exit(more);
        !           214:                }
        !           215: 
        !           216:        /* open bsc device */
        !           217:                if ((devfd = open(devname,2)) == -1) {
        !           218:                        if (errno == EBUSY) {
        !           219:                                sprintf(note,
        !           220:                                "Open failed, device <%s> busy.",devname);
        !           221:                                write_aud("C", note);
        !           222:                                fprintf(stderr, "em3277 <%s>: %s\n",
        !           223:                                        hostname, note);
        !           224:                                continue;
        !           225:                        }
        !           226:                        /* update AUDIT file with the news */
        !           227:                        sprintf(note,
        !           228:                        "Connection failed, <%s> couldn't be opened: %s\n",
        !           229:                                devname,sys_errlist[errno]);
        !           230:                        fprintf(stderr,"em3277 <%s>: %s\n",hostname,note);
        !           231:                        write_aud("C",note);
        !           232:                        continue;
        !           233:                }
        !           234: 
        !           235:        /* set no-delay for reads on bsc device */
        !           236:                ioctl(devfd,BSCNDLY,0);
        !           237: 
        !           238:        /* set fast-ack */
        !           239:                ioctl(devfd,BSCFACK,0);
        !           240: 
        !           241:        /* write "connected" message to AUDIT file */
        !           242:                sprintf(note,"Connected to <%s>",devname);
        !           243:                write_aud("C",note);
        !           244: 
        !           245:        /* set device parameters */
        !           246:                ioctl(devfd,BSCSET,&sp);
        !           247:        /* get our station id if multipoint */
        !           248:                if (pt_to_pt == BSCMPT) {
        !           249:                        ioctl (devfd, BSCID, &stationid);
        !           250:                        /* Send status message: SOH % R STX ..... ETX */
        !           251:                        ioctl(devfd,BSCSOH,0);  /* set SOH mode */
        !           252:                        ioctl(devfd,BSCLAST,0); /* set LAST message flag */
        !           253:                        if (ascii) {
        !           254:                                astsmpt[3] = termid;            /* poll addr */
        !           255:                                astsmpt[4] = stationid;         /* stn addr */
        !           256:                                if (write(devfd, astsmpt, sizeof astsmpt) < 0)
        !           257:                                        ioctl(devfd,BSCGET,&gp);
        !           258:                        } else {
        !           259:                                estsmpt[3] = termid;            /* poll addr */
        !           260:                                estsmpt[4] = stationid;         /* stn addr */
        !           261:                                if (write (devfd, estsmpt, sizeof estsmpt) < 0)
        !           262:                                        ioctl(devfd,BSCGET,&gp);
        !           263:                        }
        !           264:                        if (gp.b_flags == BSCNDSR ||
        !           265:                            gp.b_flags == BSCTXTO ||
        !           266:                            gp.b_flags == BSCNBID)
        !           267:                                exit(1);
        !           268:                        ioctl(devfd,BSCNSOH,0); /* end SOH mode */
        !           269:                        ++tb_ctr;       /* increment tx block counter for
        !           270:                                           stats */
        !           271:                }
        !           272: #endif
        !           273:                /* EMULATE 3277 TERMINAL */
        !           274:                do_screen = 1;  /* cause display to be kept up to date */
        !           275:                if (emsetup(termtype))  {
        !           276:                        cleanup();
        !           277:                        exit(1);
        !           278:                }
        !           279:                emulate();
        !           280: Disconnect:
        !           281:                sprintf(note,"Disconnected <%s>",devname);
        !           282:                write_aud ("D", note);
        !           283:                disconnect(hostname,devname);
        !           284: 
        !           285:                close(devfd);           /* close bsc device */
        !           286:                break;
        !           287:        }       while (getnextopen() != -1);
        !           288: 
        !           289: /* end off curses routines, close audit file, unlink auditlock, exit */
        !           290:        cleanup();
        !           291:        write (1,"\n",1);       /* make screen look pretty */
        !           292: }
        !           293: 
        !           294: dev_navail()
        !           295: {
        !           296:        /* Send status msg : dev. not available */
        !           297:        ioctl (devfd, BSCID, &stationid);
        !           298:        ioctl(devfd,BSCSOH,0);  /* set SOH mode */
        !           299:        ioctl(devfd,BSCLAST,0); /* set LAST message flag */
        !           300:        if (ascii) {
        !           301:                adnavail[3] = termid;           /* poll addr */
        !           302:                adnavail[4] = stationid;        /* stn addr */
        !           303:                write(devfd, adnavail, sizeof adnavail);
        !           304:        } else {
        !           305:                ednavail[3] = termid;           /* poll addr */
        !           306:                ednavail[4] = stationid;        /* stn addr */
        !           307:                write (devfd, ednavail, sizeof ednavail);
        !           308:        }
        !           309:        ioctl(devfd,BSCNSOH,0); /* end SOH mode */
        !           310: }
        !           311: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.