|
|
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(©) == -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(©) == -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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.