131887Sminshall /* 2*33812Sbostic * Copyright (c) 1988 Regents of the University of California. 3*33812Sbostic * All rights reserved. 431887Sminshall * 5*33812Sbostic * Redistribution and use in source and binary forms are permitted 6*33812Sbostic * provided that this notice is preserved and that due credit is given 7*33812Sbostic * to the University of California at Berkeley. The name of the University 8*33812Sbostic * may not be used to endorse or promote products derived from this 9*33812Sbostic * software without specific prior written permission. This software 10*33812Sbostic * is provided ``as is'' without express or implied warranty. 1131887Sminshall */ 1231887Sminshall 1331887Sminshall #ifndef lint 14*33812Sbostic char copyright[] = 15*33812Sbostic "@(#) Copyright (c) 1988 Regents of the University of California.\n\ 16*33812Sbostic All rights reserved.\n"; 17*33812Sbostic #endif /* not lint */ 1831887Sminshall 19*33812Sbostic #ifndef lint 20*33812Sbostic static char sccsid[] = "@(#)tnrecv.c 3.2 (Berkeley) 03/28/88"; 21*33812Sbostic #endif /* not lint */ 22*33812Sbostic 2331506Sminshall #include <stdio.h> 2431454Sminshall 2531876Sminshall #include <api/apilib.h> 2631615Sminshall 2731506Sminshall #include "tncomp.h" 2831506Sminshall 2931506Sminshall 3031876Sminshall #include "../ctlr/api.h" 3131506Sminshall #include "../ctlr/function.h" 3231506Sminshall #include "../ctlr/hostctlr.h" 3331506Sminshall #include "../ctlr/oia.h" 3431506Sminshall #include "../ctlr/screen.h" 3531506Sminshall 3631876Sminshall #include "../api/disp_asc.h" 3731876Sminshall #include "../api/astosc.h" 3831506Sminshall 3931506Sminshall #include "../general/general.h" 4031506Sminshall 4131506Sminshall ScreenImage Host[MAXSCREENSIZE]; 4231506Sminshall 4331506Sminshall static char 4431514Sminshall a_send_sequence[SEND_SEQUENCE_LENGTH+1], 4531514Sminshall a_ack_sequence[ACK_SEQUENCE_LENGTH+1], 4631514Sminshall a_checksum[CHECKSUM_LENGTH+1], 4731514Sminshall data_array[DATA_LENGTH+1]; 4831506Sminshall 4931506Sminshall static int 5031506Sminshall verbose, 5131514Sminshall blocks, 5231506Sminshall enter_index, 5331506Sminshall clear_index, 5431506Sminshall ScreenSize, 5531506Sminshall session_id; 5631506Sminshall 5731506Sminshall static unsigned int 5831506Sminshall send_sequence, 5931514Sminshall ack_sequence = -1, 6031506Sminshall checksum; 6131506Sminshall 6231506Sminshall api_perror(string) 6331506Sminshall char *string; 6431454Sminshall { 6531506Sminshall fprintf(stderr, "Error: [0x%x/0x%x:0x%x/0x%x] from %s.\n", 6631506Sminshall api_sup_fcn_id, api_sup_errno, 6731506Sminshall api_fcn_fcn_id, api_fcn_errno, string); 6831506Sminshall } 6931454Sminshall 7031506Sminshall 7131506Sminshall char * 7231506Sminshall session_type(type) 7331506Sminshall int type; 7431506Sminshall { 7531506Sminshall switch (type) { 7631506Sminshall case TYPE_WSCTL: 7731506Sminshall return "work station control"; 7831506Sminshall case TYPE_DFT: 7931506Sminshall return "distributed function terminal"; 8031506Sminshall case TYPE_CUT: 8131506Sminshall return "control unit terminal"; 8231506Sminshall case TYPE_NOTEPAD: 8331506Sminshall return "notepad"; 8431506Sminshall case TYPE_PC: 8531506Sminshall return "personal computer"; 8631506Sminshall default: 8731506Sminshall return "(UNKNOWN)"; 8831506Sminshall } 8931506Sminshall } 9031506Sminshall 9131506Sminshall static int 9231514Sminshall wait_for_ps_or_oia() 9331514Sminshall { 9431514Sminshall #if defined(unix) 9531514Sminshall return api_ps_or_oia_modified(); 9631514Sminshall #endif /* defined(unix) */ 9731514Sminshall } 9831514Sminshall 9931514Sminshall 10031514Sminshall static int 10131506Sminshall wait_for_unlock() 10231506Sminshall { 10331506Sminshall OIA oia; 10431506Sminshall ReadOiaGroupParms re; 10531514Sminshall static char zeroes[sizeof oia.input_inhibited] = { 0 }; 10631506Sminshall 10731506Sminshall do { 10831506Sminshall re.rc = re.function_id = 0; 10931506Sminshall re.session_id = session_id; 11031506Sminshall re.oia_buffer = (char far *) &oia; 11131506Sminshall re.oia_group_number = API_OIA_ALL_GROUPS; 11231506Sminshall if (api_read_oia_group(&re) == -1) { 11331506Sminshall api_perror("api_read_oia_group"); 11431506Sminshall return -1; 11531506Sminshall } else if (verbose) { 11631506Sminshall if (IsOiaReady3274(&oia)) { 11731506Sminshall printf("3274 ready, "); 11831506Sminshall } 11931506Sminshall if (IsOiaMyJob(&oia)) { 12031506Sminshall printf("my job, "); 12131506Sminshall } 12231506Sminshall if (IsOiaInsert(&oia)) { 12331506Sminshall printf("insert mode, "); 12431506Sminshall } 12531506Sminshall if (IsOiaSystemLocked(&oia)) { 12631506Sminshall printf("system locked, "); 12731506Sminshall } 12831506Sminshall if (IsOiaTWait(&oia)) { 12931506Sminshall printf("terminal wait, "); 13031506Sminshall } 13131506Sminshall printf("are some bits from the OIA.\n"); 13231454Sminshall } 13331514Sminshall /* We turned this on, so turn it off now */ 13431514Sminshall ResetOiaApiInhibit(&oia); 13531514Sminshall if (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)) { 13631514Sminshall if (wait_for_ps_or_oia() == -1) { 13731514Sminshall return -1; 13831514Sminshall } 13931514Sminshall } 14031514Sminshall } while (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)); 14131506Sminshall return 0; 14231506Sminshall } 14331506Sminshall 14431506Sminshall static int 14531506Sminshall initialize() 14631506Sminshall { 14731506Sminshall QuerySessionIdParms id; 14831506Sminshall QuerySessionParametersParms pa; 14931506Sminshall QuerySessionCursorParms cu; 15031506Sminshall ConnectToKeyboardParms conn; 15131506Sminshall DisableInputParms disable; 15231506Sminshall NameArray namearray; 15331506Sminshall 15431506Sminshall if (api_init() == 0) { 15531506Sminshall fprintf(stderr, "API function not available.\n"); 15631506Sminshall return -1; 15731454Sminshall } 15831506Sminshall 15931506Sminshall id.rc = 0; 16031506Sminshall id.function_id = 0; 16131506Sminshall id.option_code = ID_OPTION_BY_NAME; 16231506Sminshall id.data_code = 'E'; 16331506Sminshall id.name_array = &namearray; 16431506Sminshall namearray.length = sizeof namearray; 16531506Sminshall if (api_query_session_id(&id)) { 16631506Sminshall api_perror("api_query_session_id"); 16731506Sminshall } else if (namearray.number_matching_session == 0) { 16831506Sminshall fprintf(stderr, "query_session_id: No matching sessions!\n"); 16931506Sminshall return -1; 17031506Sminshall } else if (verbose) { 17131506Sminshall printf("Session short name 0x%x, type is ", 17231506Sminshall namearray.name_array_element.short_name); 17331506Sminshall printf("%s", session_type(namearray.name_array_element.type)); 17431506Sminshall printf(", session ID is: 0x%x\n", 17531506Sminshall namearray.name_array_element.session_id); 17631506Sminshall } 17731506Sminshall session_id = namearray.name_array_element.session_id; 17831506Sminshall 17931506Sminshall pa.rc = pa.function_id = 0; 18031506Sminshall pa.session_id = session_id; 18131506Sminshall if (api_query_session_parameters(&pa) == -1) { 18231506Sminshall api_perror("api_query_session_parameters"); 18331506Sminshall return -1; 18431506Sminshall } else if (verbose) { 18531506Sminshall printf("Session type %s, ", session_type(pa.session_type)); 18631506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) { 18731506Sminshall printf(" has EAB, "); 18831506Sminshall } 18931506Sminshall if (pa.session_characteristics&CHARACTERISTIC_PSS) { 19031506Sminshall printf(" has PSS, "); 19131506Sminshall } 19231506Sminshall printf("%d rows, %d columns ", pa.rows, pa.columns); 19331506Sminshall if (pa.presentation_space) { 19431506Sminshall printf("presentation space at 0x%x:0x%x.\n", 19531506Sminshall FP_SEG(pa.presentation_space), FP_OFF(pa.presentation_space)); 19631506Sminshall } else { 19731506Sminshall printf("(no direct presentation space access).\n"); 19831506Sminshall } 19931506Sminshall } 20031506Sminshall ScreenSize = pa.rows*pa.columns; 20131506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) { 20231506Sminshall fprintf(stderr, 20331506Sminshall "tncomp utilities not designed to work with extended attribute buffers.\n"); 20431506Sminshall return -1; 20531506Sminshall } 20631506Sminshall 20731506Sminshall if (verbose) { 20831506Sminshall cu.rc = cu.function_id = 0; 20931506Sminshall cu.session_id = session_id; 21031506Sminshall if (api_query_session_cursor(&cu) == -1) { 21131506Sminshall api_perror("api_query_session_cursor"); 21231506Sminshall } else { 21331506Sminshall printf("cursor"); 21431506Sminshall if (cu.cursor_type&CURSOR_INHIBITED_AUTOSCROLL) { 21531506Sminshall printf(" inhibited autoscroll"); 21631506Sminshall } 21731506Sminshall if (cu.cursor_type&CURSOR_INHIBITED) { 21831506Sminshall printf(" inhibited"); 21931506Sminshall } 22031506Sminshall if (cu.cursor_type&CURSOR_BLINKING) { 22131506Sminshall printf(" blinking"); 22231506Sminshall } else { 22331506Sminshall printf(" not blinking"); 22431506Sminshall } 22531506Sminshall if (cu.cursor_type&CURSOR_BOX) { 22631506Sminshall printf(" box "); 22731506Sminshall } else { 22831506Sminshall printf(" not box "); 22931506Sminshall } 23031506Sminshall printf("at row %d, column %d.\n", 23131506Sminshall cu.row_address, cu.column_address); 23231506Sminshall } 23331506Sminshall } 23431506Sminshall 23531506Sminshall conn.rc = conn.function_id = 0; 23631506Sminshall conn.session_id = session_id; 23731506Sminshall conn.event_queue_id = conn.input_queue_id = 0; 23831506Sminshall conn.intercept_options = 0; 23931506Sminshall if (api_connect_to_keyboard(&conn) == -1) { 24031506Sminshall api_perror("api_connect_to_keyboard"); 24131506Sminshall } else if (verbose) { 24231506Sminshall if (conn.first_connection_identifier) { 24331506Sminshall printf("First keyboard connection.\n"); 24431506Sminshall } else { 24531506Sminshall printf("Not first keyboard connection.\n"); 24631506Sminshall } 24731506Sminshall } 24831506Sminshall 24931506Sminshall disable.rc = disable.function_id = 0; 25031506Sminshall disable.session_id = session_id; 25131506Sminshall disable.connectors_task_id = 0; 25231506Sminshall if (api_disable_input(&disable) == -1) { 25331506Sminshall api_perror("api_disable_input"); 25431506Sminshall return -1; 25531506Sminshall } else if (verbose) { 25631506Sminshall printf("Disabled.\n"); 25731506Sminshall } 25831506Sminshall 25931506Sminshall if ((enter_index = ascii_to_index("ENTER")) == -1) { 26031506Sminshall return -1; 26131506Sminshall } 26231506Sminshall if ((clear_index = ascii_to_index("CLEAR")) == -1) { 26331506Sminshall return -1; 26431506Sminshall } 26531506Sminshall 26631506Sminshall return 0; /* all ok */ 26731454Sminshall } 26831454Sminshall 26931506Sminshall static int 27031506Sminshall send_key(index) 27131506Sminshall int index; 27231506Sminshall { 27331506Sminshall WriteKeystrokeParms wr; 27431506Sminshall extern struct astosc astosc[]; 27531454Sminshall 27631506Sminshall wait_for_unlock(); 27731506Sminshall 27831506Sminshall wr.rc = wr.function_id = 0; 27931506Sminshall wr.session_id = session_id; 28031506Sminshall wr.connectors_task_id = 0; 28131506Sminshall wr.options = OPTION_SINGLE_KEYSTROKE; 28231506Sminshall wr.number_of_keys_sent = 0; 28331506Sminshall wr.keystroke_specifier.keystroke_entry.scancode = astosc[index].scancode; 28431506Sminshall wr.keystroke_specifier.keystroke_entry.shift_state 28531506Sminshall = astosc[index].shiftstate; 28631506Sminshall if (api_write_keystroke(&wr) == -1) { 28731506Sminshall api_perror("api_write_keystroke"); 28831506Sminshall return -1; 28931506Sminshall } else if (wr.number_of_keys_sent != 1) { 29031506Sminshall fprintf(stderr, "write_keystroke claims to have sent %d keystrokes.\n", 29131506Sminshall wr.number_of_keys_sent); 29231506Sminshall return -1; 29331506Sminshall } else if (verbose) { 29431506Sminshall printf("Keystroke sent.\n"); 29531506Sminshall } 29631514Sminshall if (wait_for_ps_or_oia() == -1) { 29731514Sminshall return -1; 29831514Sminshall } 29931506Sminshall return 0; 30031506Sminshall } 30131506Sminshall 30231506Sminshall static int 30331506Sminshall terminate() 30431506Sminshall { 30531506Sminshall EnableInputParms enable; 30631506Sminshall DisconnectFromKeyboardParms disc; 30731506Sminshall 30831506Sminshall enable.rc = enable.function_id = 0; 30931506Sminshall enable.session_id = session_id; 31031506Sminshall enable.connectors_task_id = 0; 31131506Sminshall if (api_enable_input(&enable) == -1) { 31231506Sminshall api_perror("api_enable"); 31331506Sminshall return -1; 31431506Sminshall } else if (verbose) { 31531506Sminshall printf("Enabled.\n"); 31631506Sminshall } 31731506Sminshall 31831506Sminshall disc.rc = disc.function_id = 0; 31931506Sminshall disc.session_id = session_id; 32031506Sminshall disc.connectors_task_id = 0; 32131506Sminshall if (api_disconnect_from_keyboard(&disc) == -1) { 32231506Sminshall api_perror("api_disconnect_from_keyboard"); 32331506Sminshall return -1; 32431506Sminshall } else if (verbose) { 32531506Sminshall printf("Disconnected from keyboard.\n"); 32631506Sminshall } 32731506Sminshall 32831506Sminshall (void) api_finish(); 32931506Sminshall 33031506Sminshall return 0; 33131506Sminshall } 33231506Sminshall 33331506Sminshall 33431506Sminshall static int 33531506Sminshall get_screen() 33631506Sminshall { 33731506Sminshall CopyStringParms copy; 33831506Sminshall /* Time copy services */ 33931506Sminshall 34031506Sminshall wait_for_unlock(); 34131506Sminshall 34231506Sminshall copy.copy_mode = 0; 34331506Sminshall copy.rc = copy.function_id = 0; 34431506Sminshall copy.source.session_id = session_id; 34531506Sminshall copy.source.buffer = 0; 34631506Sminshall copy.source.characteristics = 0; 34731506Sminshall copy.source.session_type = TYPE_DFT; 34831506Sminshall copy.source.begin = 0; 34931506Sminshall 35031506Sminshall copy.source_end = ScreenSize; 35131506Sminshall 35231506Sminshall copy.target.session_id = 0; 35331506Sminshall copy.target.buffer = (char *) &Host[0]; 35431506Sminshall copy.target.characteristics = 0; 35531506Sminshall copy.target.session_type = TYPE_DFT; 35631506Sminshall 35731506Sminshall if (api_copy_string(©) == -1) { 35831506Sminshall api_perror("api_copy_string"); 35931506Sminshall return -1; 36031506Sminshall } 36131506Sminshall return 0; 36231506Sminshall } 36331514Sminshall 36431514Sminshall 36531514Sminshall put_at(offset, from, length, attribute) 36631506Sminshall int offset; 36731506Sminshall char *from; 36831506Sminshall int length; 36931506Sminshall { 37031506Sminshall CopyStringParms copy; 37131506Sminshall 37231506Sminshall wait_for_unlock(); 37331506Sminshall 37431506Sminshall copy.copy_mode = 0; 37531506Sminshall copy.rc = copy.function_id = 0; 37631506Sminshall copy.source.session_id = 0; 37731506Sminshall copy.source.buffer = from; 37831506Sminshall copy.source.characteristics = 0; 37931506Sminshall copy.source.session_type = TYPE_DFT; 38031506Sminshall copy.source.begin = 0; 38131506Sminshall 38231506Sminshall copy.source_end = length-1; 38331506Sminshall 38431506Sminshall copy.target.session_id = session_id; 38531506Sminshall copy.target.buffer = 0; 38631506Sminshall copy.target.characteristics = 0; 38731506Sminshall copy.target.session_type = TYPE_DFT; 38831506Sminshall copy.target.begin = offset; 38931506Sminshall 39031506Sminshall if (api_copy_string(©) == -1) { 39131506Sminshall api_perror("api_copy_string"); 39231506Sminshall return -1; 39331506Sminshall } 39431506Sminshall return 0; 39531506Sminshall } 39631506Sminshall 39731506Sminshall static void 39831506Sminshall translate(input, output, table, length) 39931506Sminshall char *input, *output, table[]; 40031506Sminshall int length; 40131506Sminshall { 40231506Sminshall unsigned char *indices = (unsigned char *) input; 40331506Sminshall 40431506Sminshall while (length--) { 40531506Sminshall *output++ = table[*indices++]; 40631506Sminshall } 40731506Sminshall } 40831506Sminshall 40931506Sminshall static int 41031514Sminshall find_input_area(from) 41131514Sminshall int from; 41231506Sminshall { 41331776Sminshall #define FieldDec(p) (0) /* We don't really use this */ 41431506Sminshall register int i, attr; 41531506Sminshall 41631514Sminshall for (i = from; i < MAXSCREENSIZE; ) { 41731506Sminshall if (IsStartField(i)) { 41831506Sminshall attr = FieldAttributes(i); 41931506Sminshall i++; 42031506Sminshall if (!IsProtectedAttr(i, attr)) { 42131506Sminshall return i; 42231506Sminshall } 42331506Sminshall } else { 42431506Sminshall i++; 42531506Sminshall } 42631506Sminshall } 42731506Sminshall return -1; 42831506Sminshall } 42931506Sminshall 43031506Sminshall 43131506Sminshall static void 43231506Sminshall getascii(offset, to, length) 43331506Sminshall int offset; /* Where in screen */ 43431506Sminshall char *to; /* Where it goes to */ 43531506Sminshall int length; /* Where to put it */ 43631506Sminshall { 43731506Sminshall translate(Host+offset, to, disp_asc, length); 43831506Sminshall } 43931506Sminshall 44031506Sminshall static int 44131514Sminshall putascii(offset, from, length, before) 44231506Sminshall int offset; /* Where in screen */ 44331506Sminshall char *from; /* Where it comes from */ 44431506Sminshall int length; /* Where to put it */ 44531514Sminshall int before; /* How much else should go */ 44631506Sminshall { 44731506Sminshall translate(from, Host+offset, asc_disp, length); 44831514Sminshall if (put_at(offset-before, 44931514Sminshall (char *) Host+offset-before, length+before) == -1) { 45031506Sminshall return -1; 45131506Sminshall } 45231506Sminshall return 0; 45331506Sminshall } 45431506Sminshall 45531506Sminshall static int 45631506Sminshall ack() 45731506Sminshall { 45831514Sminshall static char ack_blanks[sizeof a_ack_sequence] = {0}; 45931514Sminshall 46031514Sminshall if (ack_blanks[0] == 0) { 46131514Sminshall int i; 46231514Sminshall 46331514Sminshall for (i = 0; i < sizeof ack_blanks; i++) { 46431514Sminshall ack_blanks[i] = ' '; 46531514Sminshall } 46631514Sminshall } 46731514Sminshall 46831514Sminshall memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence); 46931506Sminshall sprintf(a_ack_sequence, "%d", ack_sequence); 47031506Sminshall a_ack_sequence[strlen(a_ack_sequence)] = ' '; 47131514Sminshall Host[ACK_SEQUENCE-1] |= ATTR_MDT; 47231514Sminshall if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 1) == -1) { 47331506Sminshall return -1; 47431506Sminshall } 47531506Sminshall return 0; 47631506Sminshall } 47731514Sminshall 47831514Sminshall static int 47931514Sminshall formatted_correct() 48031514Sminshall { 48131514Sminshall if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) || 48231514Sminshall (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) || 48331514Sminshall (find_input_area(ACK_SEQUENCE) != CHECKSUM) || 48431514Sminshall (find_input_area(CHECKSUM) != DATA)) { 48531514Sminshall return -1; 48631514Sminshall } else { 48731514Sminshall return 0; 48831514Sminshall } 48931514Sminshall } 49031514Sminshall 49131514Sminshall 49231454Sminshall main(argc, argv) 49331454Sminshall int argc; 49431454Sminshall char *argv[]; 49531454Sminshall { 49631506Sminshall register int i; 49731454Sminshall int data_length, input_length; 49831454Sminshall char ascii[8]; /* Lots of room */ 49931454Sminshall FILE *outfile; 50031506Sminshall char *data; 50131804Sminshall char *argv0 = argv[0]; 50231454Sminshall 50331777Sminshall argc--; 50431777Sminshall argv++; 50531506Sminshall /* Process any flags */ 50631804Sminshall while (argc && (argv[0][0] == '-')) { 50731777Sminshall switch (argv[0][1]) { 50831506Sminshall case 'v': 50931506Sminshall verbose = 1; 51031514Sminshall break; 51131514Sminshall case 'b': 51231514Sminshall blocks = 1; 51331514Sminshall break; 51431506Sminshall } 51531777Sminshall argc--; 51631777Sminshall argv++; 51731506Sminshall } 51831506Sminshall 51931777Sminshall if ((argc) < 2) { 52031804Sminshall fprintf(stderr, 52131804Sminshall "usage: %s [-b] [-v] local.file remote.file [remote.options]\n", 52231804Sminshall argv0); 52331454Sminshall exit(1); 52431454Sminshall } 52531454Sminshall 52631454Sminshall /* Open the local file */ 52731777Sminshall if ((outfile = fopen(argv[0], "w")) == NULL) { 52831454Sminshall perror("fopen"); 52931454Sminshall exit(2); 53031454Sminshall } 53131777Sminshall argc--; 53231777Sminshall argv++; 53331454Sminshall 53431506Sminshall if (initialize() == -1) { 53531506Sminshall return -1; 53631506Sminshall } 53731506Sminshall 53831454Sminshall /* build the command line */ 53931454Sminshall data = data_array; 54031506Sminshall strcpy(data, "TNCOMP SEND"); 54131454Sminshall data += strlen(data); 54231777Sminshall while (argc--) { 54331454Sminshall *data++ = ' '; 54431777Sminshall strcpy(data, argv[0]); 54531777Sminshall data += strlen(argv[0]); 54631777Sminshall argv++; 54731454Sminshall } 54831506Sminshall if (verbose) { 54931506Sminshall printf("%s\n", data_array); 55031506Sminshall } 55131506Sminshall if (get_screen() == -1) { 55231506Sminshall return -1; 55331506Sminshall } 55431506Sminshall data_length = strlen(data_array); 55531877Sminshall if ((i = find_input_area(0)) == -1) { /* Get an input area */ 55631506Sminshall if (send_key(clear_index) == -1) { 55731506Sminshall return -1; 55831506Sminshall } 55931514Sminshall if ((i = find_input_area(0)) == -1) { /* Try again */ 56031506Sminshall fprintf(stderr, "Unable to enter command line.\n"); 56131506Sminshall return -1; 56231506Sminshall } 56331506Sminshall } 56431514Sminshall if (i == 0) { 56531514Sminshall Host[ScreenSize-1] |= ATTR_MDT; 56631514Sminshall } else { 56731514Sminshall Host[i-1] |= ATTR_MDT; 56831514Sminshall } 56931514Sminshall if (putascii(i, data_array, data_length, 1) == -1) { 57031506Sminshall return -1; 57131506Sminshall } 57231506Sminshall if (send_key(enter_index) == -1) { 57331506Sminshall return -1; 57431506Sminshall } 57531506Sminshall do { 57631506Sminshall if (get_screen() == -1) { 57731506Sminshall return -1; 57831506Sminshall } 57931514Sminshall } while (formatted_correct() == -1); 58031454Sminshall 58131506Sminshall do { 58231514Sminshall if (get_screen() == -1) { 58331514Sminshall return -1; 58431514Sminshall } 58531506Sminshall /* For each screen */ 58631514Sminshall if (formatted_correct() == -1) { 58731514Sminshall fprintf(stderr, "Bad screen written by host.\n"); 58831514Sminshall return -1; 58931514Sminshall } 59031514Sminshall /* If MDT isn't reset in the sequence number, go around again */ 59131514Sminshall if (Host[ACK_SEQUENCE-1]&ATTR_MDT) { 59231514Sminshall if (wait_for_ps_or_oia() == -1) { 59331514Sminshall return -1; 59431514Sminshall } 59531514Sminshall continue; 59631514Sminshall } 59731514Sminshall getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH); 59831506Sminshall send_sequence = atoi(a_send_sequence); 59931514Sminshall getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH); 60031506Sminshall checksum = atoi(a_checksum); 60131514Sminshall getascii(DATA, data_array, DATA_LENGTH); 60231506Sminshall data = data_array; 60331506Sminshall if (send_sequence != (ack_sequence+1)) { 60431514Sminshall if (ack() == -1) { 60531514Sminshall return -1; 60631514Sminshall } 60731506Sminshall data = "1234"; /* Keep loop from failing */ 60831506Sminshall if (send_key(enter_index) == -1) { 60931506Sminshall return -1; 61031506Sminshall } 61131506Sminshall if (get_screen() == -1) { 61231506Sminshall return -1; 61331506Sminshall } 61431506Sminshall continue; 61531506Sminshall } 61631454Sminshall 61731514Sminshall data_length = DATA_LENGTH; 61831514Sminshall while (data_length && memcmp(data, " EOF", 4) 61931514Sminshall && memcmp(data, " ", 4)) { 62031506Sminshall memcpy(ascii, data, 4); 62131514Sminshall data += 4; 62231514Sminshall data_length -= 4; 62331506Sminshall ascii[4] = 0; 62431506Sminshall input_length = atoi(ascii); 62531514Sminshall /* CMS can't live with zero length records */ 62631514Sminshall if ((input_length > 1) || 62731514Sminshall ((input_length == 1) && (data[0] != ' '))) { 62831506Sminshall if (fwrite(data, sizeof (char), 62931514Sminshall input_length, outfile) == 0) { 63031506Sminshall perror("fwrite"); 63131506Sminshall exit(9); 63231506Sminshall } 63331454Sminshall } 63431506Sminshall fprintf(outfile, "\n"); 63531506Sminshall data += input_length; 63631506Sminshall data_length -= input_length; 63731454Sminshall } 63831514Sminshall 63931514Sminshall ack_sequence = send_sequence; 64031514Sminshall if (blocks) { 64131514Sminshall printf("#"); 64231514Sminshall fflush(stdout); 64331514Sminshall } 64431514Sminshall if (ack() == -1) { 64531506Sminshall return -1; 64631506Sminshall } 64731514Sminshall if (send_key(enter_index) == -1) { 64831506Sminshall return -1; 64931506Sminshall } 65031514Sminshall } while (memcmp(data, " EOF", 4)); 65131506Sminshall 65231514Sminshall if (blocks) { 65331514Sminshall printf("\n"); 65431514Sminshall } 65531506Sminshall if (terminate() == -1) { 65631506Sminshall return -1; 65731454Sminshall } 65831506Sminshall return 0; 65931454Sminshall } 660