131506Sminshall #include <stdio.h> 231454Sminshall 331615Sminshall #include <apilib/apilib.h> 431615Sminshall 531506Sminshall #include "tncomp.h" 631506Sminshall 731506Sminshall 831506Sminshall #include "../api/api.h" 931506Sminshall 1031506Sminshall #include "../ctlr/function.h" 1131506Sminshall #include "../ctlr/hostctlr.h" 1231506Sminshall #include "../ctlr/oia.h" 1331506Sminshall #include "../ctlr/screen.h" 1431506Sminshall 1531776Sminshall #include "../apilib/disp_asc.h" 1631776Sminshall #include "../apilib/astosc.h" 1731506Sminshall 1831506Sminshall #include "../general/general.h" 1931506Sminshall 2031506Sminshall ScreenImage Host[MAXSCREENSIZE]; 2131506Sminshall 2231506Sminshall static char 2331514Sminshall a_send_sequence[SEND_SEQUENCE_LENGTH+1], 2431514Sminshall a_ack_sequence[ACK_SEQUENCE_LENGTH+1], 2531514Sminshall a_checksum[CHECKSUM_LENGTH+1], 2631514Sminshall data_array[DATA_LENGTH+1]; 2731506Sminshall 2831506Sminshall static int 2931506Sminshall verbose, 3031514Sminshall blocks, 3131506Sminshall enter_index, 3231506Sminshall clear_index, 3331506Sminshall ScreenSize, 3431506Sminshall session_id; 3531506Sminshall 3631506Sminshall static unsigned int 3731506Sminshall send_sequence, 3831514Sminshall ack_sequence = -1, 3931506Sminshall checksum; 4031506Sminshall 4131506Sminshall api_perror(string) 4231506Sminshall char *string; 4331454Sminshall { 4431506Sminshall fprintf(stderr, "Error: [0x%x/0x%x:0x%x/0x%x] from %s.\n", 4531506Sminshall api_sup_fcn_id, api_sup_errno, 4631506Sminshall api_fcn_fcn_id, api_fcn_errno, string); 4731506Sminshall } 4831454Sminshall 4931506Sminshall 5031506Sminshall char * 5131506Sminshall session_type(type) 5231506Sminshall int type; 5331506Sminshall { 5431506Sminshall switch (type) { 5531506Sminshall case TYPE_WSCTL: 5631506Sminshall return "work station control"; 5731506Sminshall case TYPE_DFT: 5831506Sminshall return "distributed function terminal"; 5931506Sminshall case TYPE_CUT: 6031506Sminshall return "control unit terminal"; 6131506Sminshall case TYPE_NOTEPAD: 6231506Sminshall return "notepad"; 6331506Sminshall case TYPE_PC: 6431506Sminshall return "personal computer"; 6531506Sminshall default: 6631506Sminshall return "(UNKNOWN)"; 6731506Sminshall } 6831506Sminshall } 6931506Sminshall 7031506Sminshall static int 7131514Sminshall wait_for_ps_or_oia() 7231514Sminshall { 7331514Sminshall #if defined(unix) 7431514Sminshall return api_ps_or_oia_modified(); 7531514Sminshall #endif /* defined(unix) */ 7631514Sminshall } 7731514Sminshall 7831514Sminshall 7931514Sminshall static int 8031506Sminshall wait_for_unlock() 8131506Sminshall { 8231506Sminshall OIA oia; 8331506Sminshall ReadOiaGroupParms re; 8431514Sminshall static char zeroes[sizeof oia.input_inhibited] = { 0 }; 8531506Sminshall 8631506Sminshall do { 8731506Sminshall re.rc = re.function_id = 0; 8831506Sminshall re.session_id = session_id; 8931506Sminshall re.oia_buffer = (char far *) &oia; 9031506Sminshall re.oia_group_number = API_OIA_ALL_GROUPS; 9131506Sminshall if (api_read_oia_group(&re) == -1) { 9231506Sminshall api_perror("api_read_oia_group"); 9331506Sminshall return -1; 9431506Sminshall } else if (verbose) { 9531506Sminshall if (IsOiaReady3274(&oia)) { 9631506Sminshall printf("3274 ready, "); 9731506Sminshall } 9831506Sminshall if (IsOiaMyJob(&oia)) { 9931506Sminshall printf("my job, "); 10031506Sminshall } 10131506Sminshall if (IsOiaInsert(&oia)) { 10231506Sminshall printf("insert mode, "); 10331506Sminshall } 10431506Sminshall if (IsOiaSystemLocked(&oia)) { 10531506Sminshall printf("system locked, "); 10631506Sminshall } 10731506Sminshall if (IsOiaTWait(&oia)) { 10831506Sminshall printf("terminal wait, "); 10931506Sminshall } 11031506Sminshall printf("are some bits from the OIA.\n"); 11131454Sminshall } 11231514Sminshall /* We turned this on, so turn it off now */ 11331514Sminshall ResetOiaApiInhibit(&oia); 11431514Sminshall if (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)) { 11531514Sminshall if (wait_for_ps_or_oia() == -1) { 11631514Sminshall return -1; 11731514Sminshall } 11831514Sminshall } 11931514Sminshall } while (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)); 12031506Sminshall return 0; 12131506Sminshall } 12231506Sminshall 12331506Sminshall static int 12431506Sminshall initialize() 12531506Sminshall { 12631506Sminshall QuerySessionIdParms id; 12731506Sminshall QuerySessionParametersParms pa; 12831506Sminshall QuerySessionCursorParms cu; 12931506Sminshall ConnectToKeyboardParms conn; 13031506Sminshall DisableInputParms disable; 13131506Sminshall NameArray namearray; 13231506Sminshall 13331506Sminshall if (api_init() == 0) { 13431506Sminshall fprintf(stderr, "API function not available.\n"); 13531506Sminshall return -1; 13631454Sminshall } 13731506Sminshall 13831506Sminshall id.rc = 0; 13931506Sminshall id.function_id = 0; 14031506Sminshall id.option_code = ID_OPTION_BY_NAME; 14131506Sminshall id.data_code = 'E'; 14231506Sminshall id.name_array = &namearray; 14331506Sminshall namearray.length = sizeof namearray; 14431506Sminshall if (api_query_session_id(&id)) { 14531506Sminshall api_perror("api_query_session_id"); 14631506Sminshall } else if (namearray.number_matching_session == 0) { 14731506Sminshall fprintf(stderr, "query_session_id: No matching sessions!\n"); 14831506Sminshall return -1; 14931506Sminshall } else if (verbose) { 15031506Sminshall printf("Session short name 0x%x, type is ", 15131506Sminshall namearray.name_array_element.short_name); 15231506Sminshall printf("%s", session_type(namearray.name_array_element.type)); 15331506Sminshall printf(", session ID is: 0x%x\n", 15431506Sminshall namearray.name_array_element.session_id); 15531506Sminshall } 15631506Sminshall session_id = namearray.name_array_element.session_id; 15731506Sminshall 15831506Sminshall pa.rc = pa.function_id = 0; 15931506Sminshall pa.session_id = session_id; 16031506Sminshall if (api_query_session_parameters(&pa) == -1) { 16131506Sminshall api_perror("api_query_session_parameters"); 16231506Sminshall return -1; 16331506Sminshall } else if (verbose) { 16431506Sminshall printf("Session type %s, ", session_type(pa.session_type)); 16531506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) { 16631506Sminshall printf(" has EAB, "); 16731506Sminshall } 16831506Sminshall if (pa.session_characteristics&CHARACTERISTIC_PSS) { 16931506Sminshall printf(" has PSS, "); 17031506Sminshall } 17131506Sminshall printf("%d rows, %d columns ", pa.rows, pa.columns); 17231506Sminshall if (pa.presentation_space) { 17331506Sminshall printf("presentation space at 0x%x:0x%x.\n", 17431506Sminshall FP_SEG(pa.presentation_space), FP_OFF(pa.presentation_space)); 17531506Sminshall } else { 17631506Sminshall printf("(no direct presentation space access).\n"); 17731506Sminshall } 17831506Sminshall } 17931506Sminshall ScreenSize = pa.rows*pa.columns; 18031506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) { 18131506Sminshall fprintf(stderr, 18231506Sminshall "tncomp utilities not designed to work with extended attribute buffers.\n"); 18331506Sminshall return -1; 18431506Sminshall } 18531506Sminshall 18631506Sminshall if (verbose) { 18731506Sminshall cu.rc = cu.function_id = 0; 18831506Sminshall cu.session_id = session_id; 18931506Sminshall if (api_query_session_cursor(&cu) == -1) { 19031506Sminshall api_perror("api_query_session_cursor"); 19131506Sminshall } else { 19231506Sminshall printf("cursor"); 19331506Sminshall if (cu.cursor_type&CURSOR_INHIBITED_AUTOSCROLL) { 19431506Sminshall printf(" inhibited autoscroll"); 19531506Sminshall } 19631506Sminshall if (cu.cursor_type&CURSOR_INHIBITED) { 19731506Sminshall printf(" inhibited"); 19831506Sminshall } 19931506Sminshall if (cu.cursor_type&CURSOR_BLINKING) { 20031506Sminshall printf(" blinking"); 20131506Sminshall } else { 20231506Sminshall printf(" not blinking"); 20331506Sminshall } 20431506Sminshall if (cu.cursor_type&CURSOR_BOX) { 20531506Sminshall printf(" box "); 20631506Sminshall } else { 20731506Sminshall printf(" not box "); 20831506Sminshall } 20931506Sminshall printf("at row %d, column %d.\n", 21031506Sminshall cu.row_address, cu.column_address); 21131506Sminshall } 21231506Sminshall } 21331506Sminshall 21431506Sminshall conn.rc = conn.function_id = 0; 21531506Sminshall conn.session_id = session_id; 21631506Sminshall conn.event_queue_id = conn.input_queue_id = 0; 21731506Sminshall conn.intercept_options = 0; 21831506Sminshall if (api_connect_to_keyboard(&conn) == -1) { 21931506Sminshall api_perror("api_connect_to_keyboard"); 22031506Sminshall } else if (verbose) { 22131506Sminshall if (conn.first_connection_identifier) { 22231506Sminshall printf("First keyboard connection.\n"); 22331506Sminshall } else { 22431506Sminshall printf("Not first keyboard connection.\n"); 22531506Sminshall } 22631506Sminshall } 22731506Sminshall 22831506Sminshall disable.rc = disable.function_id = 0; 22931506Sminshall disable.session_id = session_id; 23031506Sminshall disable.connectors_task_id = 0; 23131506Sminshall if (api_disable_input(&disable) == -1) { 23231506Sminshall api_perror("api_disable_input"); 23331506Sminshall return -1; 23431506Sminshall } else if (verbose) { 23531506Sminshall printf("Disabled.\n"); 23631506Sminshall } 23731506Sminshall 23831506Sminshall if ((enter_index = ascii_to_index("ENTER")) == -1) { 23931506Sminshall return -1; 24031506Sminshall } 24131506Sminshall if ((clear_index = ascii_to_index("CLEAR")) == -1) { 24231506Sminshall return -1; 24331506Sminshall } 24431506Sminshall 24531506Sminshall return 0; /* all ok */ 24631454Sminshall } 24731454Sminshall 24831506Sminshall static int 24931506Sminshall send_key(index) 25031506Sminshall int index; 25131506Sminshall { 25231506Sminshall WriteKeystrokeParms wr; 25331506Sminshall extern struct astosc astosc[]; 25431454Sminshall 25531506Sminshall wait_for_unlock(); 25631506Sminshall 25731506Sminshall wr.rc = wr.function_id = 0; 25831506Sminshall wr.session_id = session_id; 25931506Sminshall wr.connectors_task_id = 0; 26031506Sminshall wr.options = OPTION_SINGLE_KEYSTROKE; 26131506Sminshall wr.number_of_keys_sent = 0; 26231506Sminshall wr.keystroke_specifier.keystroke_entry.scancode = astosc[index].scancode; 26331506Sminshall wr.keystroke_specifier.keystroke_entry.shift_state 26431506Sminshall = astosc[index].shiftstate; 26531506Sminshall if (api_write_keystroke(&wr) == -1) { 26631506Sminshall api_perror("api_write_keystroke"); 26731506Sminshall return -1; 26831506Sminshall } else if (wr.number_of_keys_sent != 1) { 26931506Sminshall fprintf(stderr, "write_keystroke claims to have sent %d keystrokes.\n", 27031506Sminshall wr.number_of_keys_sent); 27131506Sminshall return -1; 27231506Sminshall } else if (verbose) { 27331506Sminshall printf("Keystroke sent.\n"); 27431506Sminshall } 27531514Sminshall if (wait_for_ps_or_oia() == -1) { 27631514Sminshall return -1; 27731514Sminshall } 27831506Sminshall return 0; 27931506Sminshall } 28031506Sminshall 28131506Sminshall static int 28231506Sminshall terminate() 28331506Sminshall { 28431506Sminshall EnableInputParms enable; 28531506Sminshall DisconnectFromKeyboardParms disc; 28631506Sminshall 28731506Sminshall enable.rc = enable.function_id = 0; 28831506Sminshall enable.session_id = session_id; 28931506Sminshall enable.connectors_task_id = 0; 29031506Sminshall if (api_enable_input(&enable) == -1) { 29131506Sminshall api_perror("api_enable"); 29231506Sminshall return -1; 29331506Sminshall } else if (verbose) { 29431506Sminshall printf("Enabled.\n"); 29531506Sminshall } 29631506Sminshall 29731506Sminshall disc.rc = disc.function_id = 0; 29831506Sminshall disc.session_id = session_id; 29931506Sminshall disc.connectors_task_id = 0; 30031506Sminshall if (api_disconnect_from_keyboard(&disc) == -1) { 30131506Sminshall api_perror("api_disconnect_from_keyboard"); 30231506Sminshall return -1; 30331506Sminshall } else if (verbose) { 30431506Sminshall printf("Disconnected from keyboard.\n"); 30531506Sminshall } 30631506Sminshall 30731506Sminshall (void) api_finish(); 30831506Sminshall 30931506Sminshall return 0; 31031506Sminshall } 31131506Sminshall 31231506Sminshall 31331506Sminshall static int 31431506Sminshall get_screen() 31531506Sminshall { 31631506Sminshall CopyStringParms copy; 31731506Sminshall /* Time copy services */ 31831506Sminshall 31931506Sminshall wait_for_unlock(); 32031506Sminshall 32131506Sminshall copy.copy_mode = 0; 32231506Sminshall copy.rc = copy.function_id = 0; 32331506Sminshall copy.source.session_id = session_id; 32431506Sminshall copy.source.buffer = 0; 32531506Sminshall copy.source.characteristics = 0; 32631506Sminshall copy.source.session_type = TYPE_DFT; 32731506Sminshall copy.source.begin = 0; 32831506Sminshall 32931506Sminshall copy.source_end = ScreenSize; 33031506Sminshall 33131506Sminshall copy.target.session_id = 0; 33231506Sminshall copy.target.buffer = (char *) &Host[0]; 33331506Sminshall copy.target.characteristics = 0; 33431506Sminshall copy.target.session_type = TYPE_DFT; 33531506Sminshall 33631506Sminshall if (api_copy_string(©) == -1) { 33731506Sminshall api_perror("api_copy_string"); 33831506Sminshall return -1; 33931506Sminshall } 34031506Sminshall return 0; 34131506Sminshall } 34231514Sminshall 34331514Sminshall 34431514Sminshall put_at(offset, from, length, attribute) 34531506Sminshall int offset; 34631506Sminshall char *from; 34731506Sminshall int length; 34831506Sminshall { 34931506Sminshall CopyStringParms copy; 35031506Sminshall 35131506Sminshall wait_for_unlock(); 35231506Sminshall 35331506Sminshall copy.copy_mode = 0; 35431506Sminshall copy.rc = copy.function_id = 0; 35531506Sminshall copy.source.session_id = 0; 35631506Sminshall copy.source.buffer = from; 35731506Sminshall copy.source.characteristics = 0; 35831506Sminshall copy.source.session_type = TYPE_DFT; 35931506Sminshall copy.source.begin = 0; 36031506Sminshall 36131506Sminshall copy.source_end = length-1; 36231506Sminshall 36331506Sminshall copy.target.session_id = session_id; 36431506Sminshall copy.target.buffer = 0; 36531506Sminshall copy.target.characteristics = 0; 36631506Sminshall copy.target.session_type = TYPE_DFT; 36731506Sminshall copy.target.begin = offset; 36831506Sminshall 36931506Sminshall if (api_copy_string(©) == -1) { 37031506Sminshall api_perror("api_copy_string"); 37131506Sminshall return -1; 37231506Sminshall } 37331506Sminshall return 0; 37431506Sminshall } 37531506Sminshall 37631506Sminshall static void 37731506Sminshall translate(input, output, table, length) 37831506Sminshall char *input, *output, table[]; 37931506Sminshall int length; 38031506Sminshall { 38131506Sminshall unsigned char *indices = (unsigned char *) input; 38231506Sminshall 38331506Sminshall while (length--) { 38431506Sminshall *output++ = table[*indices++]; 38531506Sminshall } 38631506Sminshall } 38731506Sminshall 38831506Sminshall static int 38931514Sminshall find_input_area(from) 39031514Sminshall int from; 39131506Sminshall { 39231776Sminshall #define FieldDec(p) (0) /* We don't really use this */ 39331506Sminshall register int i, attr; 39431506Sminshall 39531514Sminshall for (i = from; i < MAXSCREENSIZE; ) { 39631506Sminshall if (IsStartField(i)) { 39731506Sminshall attr = FieldAttributes(i); 39831506Sminshall i++; 39931506Sminshall if (!IsProtectedAttr(i, attr)) { 40031506Sminshall return i; 40131506Sminshall } 40231506Sminshall } else { 40331506Sminshall i++; 40431506Sminshall } 40531506Sminshall } 40631506Sminshall return -1; 40731506Sminshall } 40831506Sminshall 40931506Sminshall 41031506Sminshall static void 41131506Sminshall getascii(offset, to, length) 41231506Sminshall int offset; /* Where in screen */ 41331506Sminshall char *to; /* Where it goes to */ 41431506Sminshall int length; /* Where to put it */ 41531506Sminshall { 41631506Sminshall translate(Host+offset, to, disp_asc, length); 41731506Sminshall } 41831506Sminshall 41931506Sminshall static int 42031514Sminshall putascii(offset, from, length, before) 42131506Sminshall int offset; /* Where in screen */ 42231506Sminshall char *from; /* Where it comes from */ 42331506Sminshall int length; /* Where to put it */ 42431514Sminshall int before; /* How much else should go */ 42531506Sminshall { 42631506Sminshall translate(from, Host+offset, asc_disp, length); 42731514Sminshall if (put_at(offset-before, 42831514Sminshall (char *) Host+offset-before, length+before) == -1) { 42931506Sminshall return -1; 43031506Sminshall } 43131506Sminshall return 0; 43231506Sminshall } 43331506Sminshall 43431506Sminshall static int 43531506Sminshall ack() 43631506Sminshall { 43731514Sminshall static char ack_blanks[sizeof a_ack_sequence] = {0}; 43831514Sminshall 43931514Sminshall if (ack_blanks[0] == 0) { 44031514Sminshall int i; 44131514Sminshall 44231514Sminshall for (i = 0; i < sizeof ack_blanks; i++) { 44331514Sminshall ack_blanks[i] = ' '; 44431514Sminshall } 44531514Sminshall } 44631514Sminshall 44731514Sminshall memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence); 44831506Sminshall sprintf(a_ack_sequence, "%d", ack_sequence); 44931506Sminshall a_ack_sequence[strlen(a_ack_sequence)] = ' '; 45031514Sminshall Host[ACK_SEQUENCE-1] |= ATTR_MDT; 45131514Sminshall if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 1) == -1) { 45231506Sminshall return -1; 45331506Sminshall } 45431506Sminshall return 0; 45531506Sminshall } 45631514Sminshall 45731514Sminshall static int 45831514Sminshall formatted_correct() 45931514Sminshall { 46031514Sminshall if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) || 46131514Sminshall (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) || 46231514Sminshall (find_input_area(ACK_SEQUENCE) != CHECKSUM) || 46331514Sminshall (find_input_area(CHECKSUM) != DATA)) { 46431514Sminshall return -1; 46531514Sminshall } else { 46631514Sminshall return 0; 46731514Sminshall } 46831514Sminshall } 46931514Sminshall 47031514Sminshall 47131454Sminshall main(argc, argv) 47231454Sminshall int argc; 47331454Sminshall char *argv[]; 47431454Sminshall { 47531506Sminshall register int i; 47631454Sminshall int data_length, input_length; 47731454Sminshall char ascii[8]; /* Lots of room */ 47831454Sminshall FILE *outfile; 47931506Sminshall char *data; 480*31804Sminshall char *argv0 = argv[0]; 48131454Sminshall 48231777Sminshall argc--; 48331777Sminshall argv++; 48431506Sminshall /* Process any flags */ 485*31804Sminshall while (argc && (argv[0][0] == '-')) { 48631777Sminshall switch (argv[0][1]) { 48731506Sminshall case 'v': 48831506Sminshall verbose = 1; 48931514Sminshall break; 49031514Sminshall case 'b': 49131514Sminshall blocks = 1; 49231514Sminshall break; 49331506Sminshall } 49431777Sminshall argc--; 49531777Sminshall argv++; 49631506Sminshall } 49731506Sminshall 49831777Sminshall if ((argc) < 2) { 499*31804Sminshall fprintf(stderr, 500*31804Sminshall "usage: %s [-b] [-v] local.file remote.file [remote.options]\n", 501*31804Sminshall argv0); 50231454Sminshall exit(1); 50331454Sminshall } 50431454Sminshall 50531454Sminshall /* Open the local file */ 50631777Sminshall if ((outfile = fopen(argv[0], "w")) == NULL) { 50731454Sminshall perror("fopen"); 50831454Sminshall exit(2); 50931454Sminshall } 51031777Sminshall argc--; 51131777Sminshall argv++; 51231454Sminshall 51331506Sminshall if (initialize() == -1) { 51431506Sminshall return -1; 51531506Sminshall } 51631506Sminshall 51731454Sminshall /* build the command line */ 51831454Sminshall data = data_array; 51931506Sminshall strcpy(data, "TNCOMP SEND"); 52031454Sminshall data += strlen(data); 52131777Sminshall while (argc--) { 52231454Sminshall *data++ = ' '; 52331777Sminshall strcpy(data, argv[0]); 52431777Sminshall data += strlen(argv[0]); 52531777Sminshall argv++; 52631454Sminshall } 52731506Sminshall if (verbose) { 52831506Sminshall printf("%s\n", data_array); 52931506Sminshall } 53031506Sminshall if (get_screen() == -1) { 53131506Sminshall return -1; 53231506Sminshall } 53331506Sminshall data_length = strlen(data_array); 53431506Sminshall if ((i = find_input_area()) == -1) { /* Get an input area */ 53531506Sminshall if (send_key(clear_index) == -1) { 53631506Sminshall return -1; 53731506Sminshall } 53831514Sminshall if ((i = find_input_area(0)) == -1) { /* Try again */ 53931506Sminshall fprintf(stderr, "Unable to enter command line.\n"); 54031506Sminshall return -1; 54131506Sminshall } 54231506Sminshall } 54331514Sminshall if (i == 0) { 54431514Sminshall Host[ScreenSize-1] |= ATTR_MDT; 54531514Sminshall } else { 54631514Sminshall Host[i-1] |= ATTR_MDT; 54731514Sminshall } 54831514Sminshall if (putascii(i, data_array, data_length, 1) == -1) { 54931506Sminshall return -1; 55031506Sminshall } 55131506Sminshall if (send_key(enter_index) == -1) { 55231506Sminshall return -1; 55331506Sminshall } 55431506Sminshall do { 55531506Sminshall if (get_screen() == -1) { 55631506Sminshall return -1; 55731506Sminshall } 55831514Sminshall } while (formatted_correct() == -1); 55931454Sminshall 56031506Sminshall do { 56131514Sminshall if (get_screen() == -1) { 56231514Sminshall return -1; 56331514Sminshall } 56431506Sminshall /* For each screen */ 56531514Sminshall if (formatted_correct() == -1) { 56631514Sminshall fprintf(stderr, "Bad screen written by host.\n"); 56731514Sminshall return -1; 56831514Sminshall } 56931514Sminshall /* If MDT isn't reset in the sequence number, go around again */ 57031514Sminshall if (Host[ACK_SEQUENCE-1]&ATTR_MDT) { 57131514Sminshall if (wait_for_ps_or_oia() == -1) { 57231514Sminshall return -1; 57331514Sminshall } 57431514Sminshall continue; 57531514Sminshall } 57631514Sminshall getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH); 57731506Sminshall send_sequence = atoi(a_send_sequence); 57831514Sminshall getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH); 57931506Sminshall checksum = atoi(a_checksum); 58031514Sminshall getascii(DATA, data_array, DATA_LENGTH); 58131506Sminshall data = data_array; 58231506Sminshall if (send_sequence != (ack_sequence+1)) { 58331514Sminshall if (ack() == -1) { 58431514Sminshall return -1; 58531514Sminshall } 58631506Sminshall data = "1234"; /* Keep loop from failing */ 58731506Sminshall if (send_key(enter_index) == -1) { 58831506Sminshall return -1; 58931506Sminshall } 59031506Sminshall if (get_screen() == -1) { 59131506Sminshall return -1; 59231506Sminshall } 59331506Sminshall continue; 59431506Sminshall } 59531454Sminshall 59631514Sminshall data_length = DATA_LENGTH; 59731514Sminshall while (data_length && memcmp(data, " EOF", 4) 59831514Sminshall && memcmp(data, " ", 4)) { 59931506Sminshall memcpy(ascii, data, 4); 60031514Sminshall data += 4; 60131514Sminshall data_length -= 4; 60231506Sminshall ascii[4] = 0; 60331506Sminshall input_length = atoi(ascii); 60431514Sminshall /* CMS can't live with zero length records */ 60531514Sminshall if ((input_length > 1) || 60631514Sminshall ((input_length == 1) && (data[0] != ' '))) { 60731506Sminshall if (fwrite(data, sizeof (char), 60831514Sminshall input_length, outfile) == 0) { 60931506Sminshall perror("fwrite"); 61031506Sminshall exit(9); 61131506Sminshall } 61231454Sminshall } 61331506Sminshall fprintf(outfile, "\n"); 61431506Sminshall data += input_length; 61531506Sminshall data_length -= input_length; 61631454Sminshall } 61731514Sminshall 61831514Sminshall ack_sequence = send_sequence; 61931514Sminshall if (blocks) { 62031514Sminshall printf("#"); 62131514Sminshall fflush(stdout); 62231514Sminshall } 62331514Sminshall if (ack() == -1) { 62431506Sminshall return -1; 62531506Sminshall } 62631514Sminshall if (send_key(enter_index) == -1) { 62731506Sminshall return -1; 62831506Sminshall } 62931514Sminshall } while (memcmp(data, " EOF", 4)); 63031506Sminshall 63131514Sminshall if (blocks) { 63231514Sminshall printf("\n"); 63331514Sminshall } 63431506Sminshall if (terminate() == -1) { 63531506Sminshall return -1; 63631454Sminshall } 63731506Sminshall return 0; 63831454Sminshall } 639