Annotation of 43BSDTahoe/ucb/tn3270/utilities/tnrecv.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that this notice is preserved and that due credit is given
                      7:  * to the University of California at Berkeley. The name of the University
                      8:  * may not be used to endorse or promote products derived from this
                      9:  * software without specific prior written permission. This software
                     10:  * is provided ``as is'' without express or implied warranty.
                     11:  */
                     12: 
                     13: #ifndef lint
                     14: char copyright[] =
                     15: "@(#) Copyright (c) 1988 Regents of the University of California.\n\
                     16:  All rights reserved.\n";
                     17: #endif /* not lint */
                     18: 
                     19: #ifndef lint
                     20: static char sccsid[] = "@(#)tnrecv.c   3.2 (Berkeley) 3/28/88";
                     21: #endif /* not lint */
                     22: 
                     23: #include <stdio.h>
                     24: 
                     25: #include <api/apilib.h>
                     26: 
                     27: #include "tncomp.h"
                     28: 
                     29: 
                     30: #include "../ctlr/api.h"
                     31: #include "../ctlr/function.h"
                     32: #include "../ctlr/hostctlr.h"
                     33: #include "../ctlr/oia.h"
                     34: #include "../ctlr/screen.h"
                     35: 
                     36: #include "../api/disp_asc.h"
                     37: #include "../api/astosc.h"
                     38: 
                     39: #include "../general/general.h"
                     40: 
                     41: ScreenImage Host[MAXSCREENSIZE];
                     42: 
                     43: static char
                     44:     a_send_sequence[SEND_SEQUENCE_LENGTH+1],
                     45:     a_ack_sequence[ACK_SEQUENCE_LENGTH+1],
                     46:     a_checksum[CHECKSUM_LENGTH+1],
                     47:     data_array[DATA_LENGTH+1];
                     48: 
                     49: static int
                     50:     verbose,
                     51:     blocks,
                     52:     enter_index,
                     53:     clear_index,
                     54:     ScreenSize,
                     55:     session_id;
                     56: 
                     57: static unsigned int
                     58:     send_sequence,
                     59:     ack_sequence = -1,
                     60:     checksum;
                     61: 
                     62: api_perror(string)
                     63: char *string;
                     64: {
                     65:     fprintf(stderr, "Error: [0x%x/0x%x:0x%x/0x%x] from %s.\n",
                     66:        api_sup_fcn_id, api_sup_errno,
                     67:        api_fcn_fcn_id, api_fcn_errno, string);
                     68: }
                     69: 
                     70: 
                     71: char *
                     72: session_type(type)
                     73: int    type;
                     74: {
                     75:     switch (type) {
                     76:     case TYPE_WSCTL:
                     77:        return "work station control";
                     78:     case TYPE_DFT:
                     79:        return "distributed function terminal";
                     80:     case TYPE_CUT:
                     81:        return "control unit terminal";
                     82:     case TYPE_NOTEPAD:
                     83:        return "notepad";
                     84:     case TYPE_PC:
                     85:        return "personal computer";
                     86:     default:
                     87:        return "(UNKNOWN)";
                     88:     }
                     89: }
                     90: 
                     91: static int
                     92: wait_for_ps_or_oia()
                     93: {
                     94: #if    defined(unix)
                     95:     return api_ps_or_oia_modified();
                     96: #endif /* defined(unix) */
                     97: }
                     98: 
                     99: 
                    100: static int
                    101: wait_for_unlock()
                    102: {
                    103:     OIA oia;
                    104:     ReadOiaGroupParms re;
                    105:     static char zeroes[sizeof oia.input_inhibited] = { 0 };
                    106: 
                    107:     do {
                    108:        re.rc = re.function_id = 0;
                    109:        re.session_id = session_id;
                    110:        re.oia_buffer = (char far *) &oia;
                    111:        re.oia_group_number = API_OIA_ALL_GROUPS;
                    112:        if (api_read_oia_group(&re) == -1) {
                    113:            api_perror("api_read_oia_group");
                    114:            return -1;
                    115:        } else if (verbose) {
                    116:            if (IsOiaReady3274(&oia)) {
                    117:                printf("3274 ready, ");
                    118:            }
                    119:            if (IsOiaMyJob(&oia)) {
                    120:                printf("my job, ");
                    121:            }
                    122:            if (IsOiaInsert(&oia)) {
                    123:                printf("insert mode, ");
                    124:            }
                    125:            if (IsOiaSystemLocked(&oia)) {
                    126:                printf("system locked, ");
                    127:            }
                    128:            if (IsOiaTWait(&oia)) {
                    129:                printf("terminal wait, ");
                    130:            }
                    131:            printf("are some bits from the OIA.\n");
                    132:        }
                    133:        /* We turned this on, so turn it off now */
                    134:        ResetOiaApiInhibit(&oia);
                    135:        if (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)) {
                    136:            if (wait_for_ps_or_oia() == -1) {
                    137:                return -1;
                    138:            }
                    139:        }
                    140:     } while (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited));
                    141:     return 0;
                    142: }
                    143: 
                    144: static int
                    145: initialize()
                    146: {
                    147:     QuerySessionIdParms id;
                    148:     QuerySessionParametersParms pa;
                    149:     QuerySessionCursorParms cu;
                    150:     ConnectToKeyboardParms conn;
                    151:     DisableInputParms disable;
                    152:     NameArray namearray;
                    153: 
                    154:     if (api_init() == 0) {
                    155:        fprintf(stderr, "API function not available.\n");
                    156:        return -1;
                    157:     }
                    158: 
                    159:     id.rc = 0;
                    160:     id.function_id = 0;
                    161:     id.option_code = ID_OPTION_BY_NAME;
                    162:     id.data_code = 'E';
                    163:     id.name_array = &namearray;
                    164:     namearray.length = sizeof namearray;
                    165:     if (api_query_session_id(&id)) {
                    166:        api_perror("api_query_session_id");
                    167:     } else if (namearray.number_matching_session == 0) {
                    168:        fprintf(stderr, "query_session_id:  No matching sessions!\n");
                    169:        return -1;
                    170:     } else if (verbose) {
                    171:        printf("Session short name 0x%x, type is ",
                    172:                                namearray.name_array_element.short_name);
                    173:        printf("%s", session_type(namearray.name_array_element.type));
                    174:        printf(", session ID is: 0x%x\n",
                    175:                                namearray.name_array_element.session_id);
                    176:     }
                    177:     session_id = namearray.name_array_element.session_id;
                    178: 
                    179:     pa.rc = pa.function_id = 0;
                    180:     pa.session_id = session_id;
                    181:     if (api_query_session_parameters(&pa) == -1) {
                    182:        api_perror("api_query_session_parameters");
                    183:        return -1;
                    184:     } else if (verbose) {
                    185:        printf("Session type %s, ", session_type(pa.session_type));
                    186:        if (pa.session_characteristics&CHARACTERISTIC_EAB) {
                    187:            printf(" has EAB, ");
                    188:        }
                    189:        if (pa.session_characteristics&CHARACTERISTIC_PSS) {
                    190:            printf(" has PSS, ");
                    191:        }
                    192:        printf("%d rows, %d columns ", pa.rows, pa.columns);
                    193:        if (pa.presentation_space) {
                    194:            printf("presentation space at 0x%x:0x%x.\n",
                    195:                FP_SEG(pa.presentation_space), FP_OFF(pa.presentation_space));
                    196:        } else {
                    197:            printf("(no direct presentation space access).\n");
                    198:        }
                    199:     }
                    200:     ScreenSize = pa.rows*pa.columns;
                    201:     if (pa.session_characteristics&CHARACTERISTIC_EAB) {
                    202:        fprintf(stderr,
                    203:     "tncomp utilities not designed to work with extended attribute buffers.\n");
                    204:        return -1;
                    205:     }
                    206: 
                    207:     if (verbose) {
                    208:        cu.rc = cu.function_id = 0;
                    209:        cu.session_id = session_id;
                    210:        if (api_query_session_cursor(&cu) == -1) {
                    211:            api_perror("api_query_session_cursor");
                    212:        } else {
                    213:            printf("cursor");
                    214:            if (cu.cursor_type&CURSOR_INHIBITED_AUTOSCROLL) {
                    215:                printf(" inhibited autoscroll");
                    216:            }
                    217:            if (cu.cursor_type&CURSOR_INHIBITED) {
                    218:                printf(" inhibited");
                    219:            }
                    220:            if (cu.cursor_type&CURSOR_BLINKING) {
                    221:                printf(" blinking");
                    222:            } else {
                    223:                printf(" not blinking");
                    224:            }
                    225:            if (cu.cursor_type&CURSOR_BOX) {
                    226:                printf(" box ");
                    227:            } else {
                    228:                printf(" not box ");
                    229:            }
                    230:            printf("at row %d, column %d.\n",
                    231:                                cu.row_address, cu.column_address);
                    232:        }
                    233:     }
                    234: 
                    235:     conn.rc = conn.function_id = 0;
                    236:     conn.session_id = session_id;
                    237:     conn.event_queue_id = conn.input_queue_id = 0;
                    238:     conn.intercept_options = 0;
                    239:     if (api_connect_to_keyboard(&conn) == -1) {
                    240:        api_perror("api_connect_to_keyboard");
                    241:     } else if (verbose) {
                    242:        if (conn.first_connection_identifier) {
                    243:            printf("First keyboard connection.\n");
                    244:        } else {
                    245:            printf("Not first keyboard connection.\n");
                    246:        }
                    247:     }
                    248: 
                    249:     disable.rc = disable.function_id = 0;
                    250:     disable.session_id = session_id;
                    251:     disable.connectors_task_id = 0;
                    252:     if (api_disable_input(&disable) == -1) {
                    253:        api_perror("api_disable_input");
                    254:        return -1;
                    255:     } else if (verbose) {
                    256:        printf("Disabled.\n");
                    257:     }
                    258: 
                    259:     if ((enter_index = ascii_to_index("ENTER")) == -1) {
                    260:        return -1;
                    261:     }
                    262:     if ((clear_index = ascii_to_index("CLEAR")) == -1) {
                    263:        return -1;
                    264:     }
                    265: 
                    266:     return 0;                          /* all ok */
                    267: }
                    268: 
                    269: static int
                    270: send_key(index)
                    271: int    index;
                    272: {
                    273:     WriteKeystrokeParms wr;
                    274:     extern struct astosc astosc[];
                    275: 
                    276:     wait_for_unlock();
                    277: 
                    278:     wr.rc = wr.function_id = 0;
                    279:     wr.session_id = session_id;
                    280:     wr.connectors_task_id = 0;
                    281:     wr.options = OPTION_SINGLE_KEYSTROKE;
                    282:     wr.number_of_keys_sent = 0;
                    283:     wr.keystroke_specifier.keystroke_entry.scancode = astosc[index].scancode;
                    284:     wr.keystroke_specifier.keystroke_entry.shift_state
                    285:                                                = astosc[index].shiftstate;
                    286:     if (api_write_keystroke(&wr) == -1) {
                    287:        api_perror("api_write_keystroke");
                    288:        return -1;
                    289:     } else if (wr.number_of_keys_sent != 1) {
                    290:        fprintf(stderr, "write_keystroke claims to have sent %d keystrokes.\n",
                    291:                    wr.number_of_keys_sent);
                    292:        return -1;
                    293:     } else if (verbose) {
                    294:        printf("Keystroke sent.\n");
                    295:     }
                    296:     if (wait_for_ps_or_oia() == -1) {
                    297:        return -1;
                    298:     }
                    299:     return 0;
                    300: }
                    301: 
                    302: static int
                    303: terminate()
                    304: {
                    305:     EnableInputParms enable;
                    306:     DisconnectFromKeyboardParms disc;
                    307: 
                    308:     enable.rc = enable.function_id = 0;
                    309:     enable.session_id = session_id;
                    310:     enable.connectors_task_id = 0;
                    311:     if (api_enable_input(&enable) == -1) {
                    312:        api_perror("api_enable");
                    313:        return -1;
                    314:     } else if (verbose) {
                    315:        printf("Enabled.\n");
                    316:     }
                    317: 
                    318:     disc.rc = disc.function_id = 0;
                    319:     disc.session_id = session_id;
                    320:     disc.connectors_task_id = 0;
                    321:     if (api_disconnect_from_keyboard(&disc) == -1) {
                    322:        api_perror("api_disconnect_from_keyboard");
                    323:        return -1;
                    324:     } else if (verbose) {
                    325:        printf("Disconnected from keyboard.\n");
                    326:     }
                    327: 
                    328:     (void) api_finish();
                    329: 
                    330:     return 0;
                    331: }
                    332: 
                    333: 
                    334: static int
                    335: get_screen()
                    336: {
                    337:     CopyStringParms copy;
                    338:     /* Time copy services */
                    339: 
                    340:     wait_for_unlock();
                    341: 
                    342:     copy.copy_mode = 0;
                    343:     copy.rc = copy.function_id = 0;
                    344:     copy.source.session_id = session_id;
                    345:     copy.source.buffer = 0;
                    346:     copy.source.characteristics = 0;
                    347:     copy.source.session_type = TYPE_DFT;
                    348:     copy.source.begin = 0;
                    349: 
                    350:     copy.source_end = ScreenSize;
                    351: 
                    352:     copy.target.session_id = 0;
                    353:     copy.target.buffer = (char *) &Host[0];
                    354:     copy.target.characteristics = 0;
                    355:     copy.target.session_type = TYPE_DFT;
                    356: 
                    357:     if (api_copy_string(&copy) == -1) {
                    358:        api_perror("api_copy_string");
                    359:        return -1;
                    360:     }
                    361:     return 0;
                    362: }
                    363: 
                    364: 
                    365: put_at(offset, from, length, attribute)
                    366: int    offset;
                    367: char   *from;
                    368: int    length;
                    369: {
                    370:     CopyStringParms copy;
                    371: 
                    372:     wait_for_unlock();
                    373: 
                    374:     copy.copy_mode = 0;
                    375:     copy.rc = copy.function_id = 0;
                    376:     copy.source.session_id = 0;
                    377:     copy.source.buffer = from;
                    378:     copy.source.characteristics = 0;
                    379:     copy.source.session_type = TYPE_DFT;
                    380:     copy.source.begin = 0;
                    381: 
                    382:     copy.source_end = length-1;
                    383: 
                    384:     copy.target.session_id = session_id;
                    385:     copy.target.buffer = 0;
                    386:     copy.target.characteristics = 0;
                    387:     copy.target.session_type = TYPE_DFT;
                    388:     copy.target.begin = offset;
                    389: 
                    390:     if (api_copy_string(&copy) == -1) {
                    391:        api_perror("api_copy_string");
                    392:        return -1;
                    393:     }
                    394:     return 0;
                    395: }
                    396: 
                    397: static void
                    398: translate(input, output, table, length)
                    399: char *input, *output, table[];
                    400: int length;
                    401: {
                    402:     unsigned char *indices = (unsigned char *) input;
                    403: 
                    404:     while (length--) {
                    405:        *output++ = table[*indices++];
                    406:     }
                    407: }
                    408: 
                    409: static int
                    410: find_input_area(from)
                    411: int    from;
                    412: {
                    413: #define        FieldDec(p)     (0)             /* We don't really use this */
                    414:     register int i, attr;
                    415: 
                    416:     for (i = from; i < MAXSCREENSIZE; ) {
                    417:        if (IsStartField(i)) {
                    418:            attr = FieldAttributes(i);
                    419:            i++;
                    420:            if (!IsProtectedAttr(i, attr)) {
                    421:                return i;
                    422:            }
                    423:        } else {
                    424:            i++;
                    425:        }
                    426:     }
                    427:     return -1;
                    428: }
                    429: 
                    430: 
                    431: static void
                    432: getascii(offset, to, length)
                    433: int    offset;                         /* Where in screen */
                    434: char   *to;                            /* Where it goes to */
                    435: int    length;                         /* Where to put it */
                    436: {
                    437:     translate(Host+offset, to, disp_asc, length);
                    438: }
                    439: 
                    440: static int
                    441: putascii(offset, from, length, before)
                    442: int    offset;                         /* Where in screen */
                    443: char   *from;                          /* Where it comes from */
                    444: int    length;                         /* Where to put it */
                    445: int    before;                         /* How much else should go */
                    446: {
                    447:     translate(from, Host+offset, asc_disp, length);
                    448:     if (put_at(offset-before,
                    449:                        (char *) Host+offset-before, length+before) == -1) {
                    450:        return -1;
                    451:     }
                    452:     return 0;
                    453: }
                    454: 
                    455: static int
                    456: ack()
                    457: {
                    458:     static char ack_blanks[sizeof a_ack_sequence] = {0};
                    459: 
                    460:     if (ack_blanks[0] == 0) {
                    461:        int i;
                    462: 
                    463:        for (i = 0; i < sizeof ack_blanks; i++) {
                    464:            ack_blanks[i] = ' ';
                    465:        }
                    466:     }
                    467: 
                    468:     memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence);
                    469:     sprintf(a_ack_sequence, "%d", ack_sequence);
                    470:     a_ack_sequence[strlen(a_ack_sequence)] = ' ';
                    471:     Host[ACK_SEQUENCE-1] |= ATTR_MDT;
                    472:     if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 1) == -1) {
                    473:        return -1;
                    474:     }
                    475:     return 0;
                    476: }
                    477: 
                    478: static int
                    479: formatted_correct()
                    480: {
                    481:     if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) ||
                    482:            (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) ||
                    483:            (find_input_area(ACK_SEQUENCE) != CHECKSUM) ||
                    484:            (find_input_area(CHECKSUM) != DATA)) {
                    485:        return -1;
                    486:     } else {
                    487:        return 0;
                    488:     }
                    489: }
                    490: 
                    491: 
                    492: main(argc, argv)
                    493: int    argc;
                    494: char   *argv[];
                    495: {
                    496:     register int i;
                    497:     int data_length, input_length;
                    498:     char ascii[8];                     /* Lots of room */
                    499:     FILE *outfile;
                    500:     char *data;
                    501:     char *argv0 = argv[0];
                    502: 
                    503:     argc--;
                    504:     argv++;
                    505:     /* Process any flags */
                    506:     while (argc && (argv[0][0] == '-')) {
                    507:        switch (argv[0][1]) {
                    508:        case 'v':
                    509:            verbose = 1;
                    510:            break;
                    511:        case 'b':
                    512:            blocks = 1;
                    513:            break;
                    514:        }
                    515:        argc--;
                    516:        argv++;
                    517:     }
                    518: 
                    519:     if ((argc) < 2) {
                    520:        fprintf(stderr,
                    521:                "usage: %s [-b] [-v] local.file remote.file [remote.options]\n",
                    522:                        argv0);
                    523:        exit(1);
                    524:     }
                    525: 
                    526:     /* Open the local file */
                    527:     if ((outfile = fopen(argv[0], "w")) == NULL) {
                    528:        perror("fopen");
                    529:        exit(2);
                    530:     }
                    531:     argc--;
                    532:     argv++;
                    533: 
                    534:     if (initialize() == -1) {
                    535:        return -1;
                    536:     }
                    537: 
                    538:     /* build the command line */
                    539:     data = data_array;
                    540:     strcpy(data, "TNCOMP SEND");
                    541:     data += strlen(data);
                    542:     while (argc--) {
                    543:        *data++ = ' ';
                    544:        strcpy(data, argv[0]);
                    545:        data += strlen(argv[0]);
                    546:        argv++;
                    547:     }
                    548:     if (verbose) {
                    549:        printf("%s\n", data_array);
                    550:     }
                    551:     if (get_screen() == -1) {
                    552:        return -1;
                    553:     }
                    554:     data_length = strlen(data_array);
                    555:     if ((i = find_input_area(0)) == -1) {              /* Get an input area */
                    556:        if (send_key(clear_index) == -1) {
                    557:            return -1;
                    558:        }
                    559:        if ((i = find_input_area(0)) == -1) {           /* Try again */
                    560:            fprintf(stderr, "Unable to enter command line.\n");
                    561:            return -1;
                    562:        }
                    563:     }
                    564:     if (i == 0) {
                    565:        Host[ScreenSize-1] |= ATTR_MDT;
                    566:     } else {
                    567:        Host[i-1] |= ATTR_MDT;
                    568:     }
                    569:     if (putascii(i, data_array, data_length, 1) == -1) {
                    570:        return -1;
                    571:     }
                    572:     if (send_key(enter_index) == -1) {
                    573:        return -1;
                    574:     }
                    575:     do {
                    576:        if (get_screen() == -1) {
                    577:            return -1;
                    578:        }
                    579:     } while (formatted_correct() == -1);
                    580: 
                    581:     do {
                    582:        if (get_screen() == -1) {
                    583:            return -1;
                    584:        }
                    585:        /* For each screen */
                    586:        if (formatted_correct() == -1) {
                    587:            fprintf(stderr, "Bad screen written by host.\n");
                    588:            return -1;
                    589:        }
                    590:        /* If MDT isn't reset in the sequence number, go around again */
                    591:        if (Host[ACK_SEQUENCE-1]&ATTR_MDT) {
                    592:            if (wait_for_ps_or_oia() == -1) {
                    593:                return -1;
                    594:            }
                    595:            continue;
                    596:        }
                    597:        getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH);
                    598:        send_sequence = atoi(a_send_sequence);
                    599:        getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH);
                    600:        checksum = atoi(a_checksum);
                    601:        getascii(DATA, data_array, DATA_LENGTH);
                    602:        data = data_array;
                    603:        if (send_sequence != (ack_sequence+1)) {
                    604:            if (ack() == -1) {
                    605:                return -1;
                    606:            }
                    607:            data = "1234";              /* Keep loop from failing */
                    608:            if (send_key(enter_index) == -1) {
                    609:                return -1;
                    610:            }
                    611:            if (get_screen() == -1) {
                    612:                return -1;
                    613:            }
                    614:            continue;
                    615:        }
                    616: 
                    617:        data_length = DATA_LENGTH;
                    618:        while (data_length && memcmp(data, " EOF", 4)
                    619:                                                && memcmp(data, "    ", 4)) {
                    620:            memcpy(ascii, data, 4);
                    621:            data += 4;
                    622:            data_length -= 4;
                    623:            ascii[4] = 0;
                    624:            input_length = atoi(ascii);
                    625:            /* CMS can't live with zero length records */
                    626:            if ((input_length > 1) ||
                    627:                        ((input_length == 1) && (data[0] != ' '))) {
                    628:                if (fwrite(data, sizeof (char),
                    629:                                        input_length, outfile) == 0) {
                    630:                    perror("fwrite");
                    631:                    exit(9);
                    632:                }
                    633:            }
                    634:            fprintf(outfile, "\n");
                    635:            data += input_length;
                    636:            data_length -= input_length;
                    637:        }
                    638: 
                    639:        ack_sequence = send_sequence;
                    640:        if (blocks) {
                    641:            printf("#");
                    642:            fflush(stdout);
                    643:        }
                    644:        if (ack() == -1) {
                    645:            return -1;
                    646:        }
                    647:        if (send_key(enter_index) == -1) {
                    648:            return -1;
                    649:        }
                    650:     } while (memcmp(data, " EOF", 4));
                    651: 
                    652:     if (blocks) {
                    653:        printf("\n");
                    654:     }
                    655:     if (terminate() == -1) {
                    656:        return -1;
                    657:     }
                    658:     return 0;
                    659: }

unix.superglobalmegacorp.com

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