📄 tnrecv.c
字号:
disc.rc = disc.function_id = 0; disc.session_id = session_id; disc.connectors_task_id = 0; if (api_disconnect_from_keyboard(&disc) == -1) { api_perror("api_disconnect_from_keyboard"); return -1; } else if (verbose) { printf("Disconnected from keyboard.\n"); } (void) api_finish(); return 0;}static intget_screen(){ CopyStringParms copy; /* Time copy services */ wait_for_unlock(); copy.copy_mode = 0; copy.rc = copy.function_id = 0; copy.source.session_id = session_id; copy.source.buffer = 0; copy.source.characteristics = 0; copy.source.session_type = TYPE_DFT; copy.source.begin = 0; copy.source_end = ScreenSize; copy.target.session_id = 0; copy.target.buffer = (char *) &Host[0]; copy.target.characteristics = 0; copy.target.session_type = TYPE_DFT; if (api_copy_string(©) == -1) { api_perror("api_copy_string"); return -1; } return 0;}put_at(offset, from, length, attribute)int offset;char *from;int length;{ CopyStringParms copy; wait_for_unlock(); copy.copy_mode = 0; copy.rc = copy.function_id = 0; copy.source.session_id = 0; copy.source.buffer = from; copy.source.characteristics = 0; copy.source.session_type = TYPE_DFT; copy.source.begin = 0; copy.source_end = length-1; copy.target.session_id = session_id; copy.target.buffer = 0; copy.target.characteristics = 0; copy.target.session_type = TYPE_DFT; copy.target.begin = offset; if (api_copy_string(©) == -1) { api_perror("api_copy_string"); return -1; } return 0;}static voidtranslate(input, output, table, length)char *input, *output, table[];int length;{ unsigned char *indices = (unsigned char *) input; while (length--) { *output++ = table[*indices++]; }}static intfind_input_area(from)int from;{#define FieldDec(p) (0) /* We don't really use this */ register int i, attr; for (i = from; i < MAXSCREENSIZE; ) { if (IsStartField(i)) { attr = FieldAttributes(i); i++; if (!IsProtectedAttr(i, attr)) { return i; } } else { i++; } } return -1;}static voidgetascii(offset, to, length)int offset; /* Where in screen */char *to; /* Where it goes to */int length; /* Where to put it */{ translate(Host+offset, to, disp_asc, length);}static intputascii(offset, from, length, before)int offset; /* Where in screen */char *from; /* Where it comes from */int length; /* Where to put it */int before; /* How much else should go */{ translate(from, Host+offset, asc_disp, length); if (put_at(offset-before, (char *) Host+offset-before, length+before) == -1) { return -1; } return 0;}static intack(){ static char ack_blanks[sizeof a_ack_sequence] = {0}; if (ack_blanks[0] == 0) { int i; for (i = 0; i < sizeof ack_blanks; i++) { ack_blanks[i] = ' '; } } memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence); sprintf(a_ack_sequence, "%d", ack_sequence); a_ack_sequence[strlen(a_ack_sequence)] = ' '; if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 0) == -1) { return -1; } return 0;}static intformatted_correct(){ if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) || (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) || (find_input_area(ACK_SEQUENCE) != CHECKSUM) || (find_input_area(CHECKSUM) != DATA)) { return -1; } else { return 0; }}main(argc, argv)int argc;char *argv[];{ register int i; int data_length, input_length; char ascii[8]; /* Lots of room */ FILE *outfile; char *data; char *argv0 = argv[0]; argc--; argv++; /* Process any flags */ while (argc && (argv[0][0] == '-')) { switch (argv[0][1]) { case 'v': verbose = 1; break; case 'b': blocks = 1; break; } argc--; argv++; } if ((argc) < 2) { fprintf(stderr, "usage: %s [-b] [-v] local.file remote.file [remote.options]\n", argv0); exit(1); } /* Open the local file */ if ((outfile = fopen(argv[0], "w")) == NULL) { perror("fopen"); exit(2); } argc--; argv++; if (initialize() == -1) { return -1; } /* build the command line */ data = data_array; strcpy(data, "TNCOMP SEND"); data += strlen(data); while (argc--) { *data++ = ' '; strcpy(data, argv[0]); data += strlen(argv[0]); argv++; } if (verbose) { printf("%s\n", data_array); } if (get_screen() == -1) { return -1; } data_length = strlen(data_array); if ((i = find_input_area(0)) == -1) { /* Get an input area */ if (send_key(clear_index) == -1) { return -1; } if ((i = find_input_area(0)) == -1) { /* Try again */ fprintf(stderr, "Unable to enter command line.\n"); return -1; } } if (putascii(i, data_array, data_length, 0) == -1) { return -1; } if (send_key(enter_index) == -1) { return -1; } do { if (get_screen() == -1) { return -1; } } while (formatted_correct() == -1); do { if (get_screen() == -1) { return -1; } /* For each screen */ if (formatted_correct() == -1) { fprintf(stderr, "Bad screen written by host.\n"); return -1; } /* If MDT isn't reset in the sequence number, go around again */ if (Host[ACK_SEQUENCE-1]&ATTR_MDT) { if (wait_for_ps_or_oia() == -1) { return -1; } continue; } getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH); send_sequence = atoi(a_send_sequence); getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH); checksum = atoi(a_checksum); getascii(DATA, data_array, DATA_LENGTH); data = data_array; if (send_sequence != (ack_sequence+1)) { if (ack() == -1) { return -1; } data = "1234"; /* Keep loop from failing */ if (send_key(enter_index) == -1) { return -1; } if (get_screen() == -1) { return -1; } continue; } data_length = DATA_LENGTH; while (data_length && memcmp(data, " EOF", 4) && memcmp(data, " ", 4)) { memcpy(ascii, data, 4); data += 4; data_length -= 4; ascii[4] = 0; input_length = atoi(ascii); /* CMS can't live with zero length records */ if ((input_length > 1) || ((input_length == 1) && (data[0] != ' '))) { if (fwrite(data, sizeof (char), input_length, outfile) == 0) { perror("fwrite"); exit(9); } } fprintf(outfile, "\n"); data += input_length; data_length -= input_length; } ack_sequence = send_sequence; if (blocks) { printf("#"); fflush(stdout); } if (ack() == -1) { return -1; } if (send_key(enter_index) == -1) { return -1; } } while (memcmp(data, " EOF", 4)); if (blocks) { printf("\n"); } if (terminate() == -1) { return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -