131887Sminshall /* 233812Sbostic * Copyright (c) 1988 Regents of the University of California. 333812Sbostic * All rights reserved. 431887Sminshall * 533812Sbostic * Redistribution and use in source and binary forms are permitted 634897Sbostic * provided that the above copyright notice and this paragraph are 734897Sbostic * duplicated in all such forms and that any documentation, 834897Sbostic * advertising materials, and other materials related to such 934897Sbostic * distribution and use acknowledge that the software was developed 1034897Sbostic * by the University of California, Berkeley. The name of the 1134897Sbostic * University may not be used to endorse or promote products derived 1234897Sbostic * from this software without specific prior written permission. 1334897Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434897Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534897Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1631887Sminshall */ 1731887Sminshall 1831887Sminshall #ifndef lint 1933812Sbostic char copyright[] = 2033812Sbostic "@(#) Copyright (c) 1988 Regents of the University of California.\n\ 2133812Sbostic All rights reserved.\n"; 2233812Sbostic #endif /* not lint */ 2331887Sminshall 2433812Sbostic #ifndef lint 25*38209Sminshall static char sccsid[] = "@(#)tnrecv.c 4.2 (Berkeley) 05/30/89"; 2633812Sbostic #endif /* not lint */ 2733812Sbostic 2831506Sminshall #include <stdio.h> 2931454Sminshall 3031876Sminshall #include <api/apilib.h> 3131615Sminshall 3231506Sminshall #include "tncomp.h" 3331506Sminshall 3431506Sminshall 3531876Sminshall #include "../ctlr/api.h" 3631506Sminshall #include "../ctlr/function.h" 3731506Sminshall #include "../ctlr/hostctlr.h" 3831506Sminshall #include "../ctlr/oia.h" 3931506Sminshall #include "../ctlr/screen.h" 4031506Sminshall 4131876Sminshall #include "../api/disp_asc.h" 4231876Sminshall #include "../api/astosc.h" 4331506Sminshall 4431506Sminshall #include "../general/general.h" 4531506Sminshall 4631506Sminshall ScreenImage Host[MAXSCREENSIZE]; 4731506Sminshall 4831506Sminshall static char 4931514Sminshall a_send_sequence[SEND_SEQUENCE_LENGTH+1], 5031514Sminshall a_ack_sequence[ACK_SEQUENCE_LENGTH+1], 5131514Sminshall a_checksum[CHECKSUM_LENGTH+1], 5231514Sminshall data_array[DATA_LENGTH+1]; 5331506Sminshall 5431506Sminshall static int 5531506Sminshall verbose, 5631514Sminshall blocks, 5731506Sminshall enter_index, 5831506Sminshall clear_index, 5931506Sminshall ScreenSize, 6031506Sminshall session_id; 6131506Sminshall 6231506Sminshall static unsigned int 6331506Sminshall send_sequence, 6431514Sminshall ack_sequence = -1, 6531506Sminshall checksum; 6631506Sminshall 6731506Sminshall api_perror(string) 6831506Sminshall char *string; 6931454Sminshall { 7031506Sminshall fprintf(stderr, "Error: [0x%x/0x%x:0x%x/0x%x] from %s.\n", 7131506Sminshall api_sup_fcn_id, api_sup_errno, 7231506Sminshall api_fcn_fcn_id, api_fcn_errno, string); 7331506Sminshall } 7431454Sminshall 7531506Sminshall 7631506Sminshall char * 7731506Sminshall session_type(type) 7831506Sminshall int type; 7931506Sminshall { 8031506Sminshall switch (type) { 8131506Sminshall case TYPE_WSCTL: 8231506Sminshall return "work station control"; 8331506Sminshall case TYPE_DFT: 8431506Sminshall return "distributed function terminal"; 8531506Sminshall case TYPE_CUT: 8631506Sminshall return "control unit terminal"; 8731506Sminshall case TYPE_NOTEPAD: 8831506Sminshall return "notepad"; 8931506Sminshall case TYPE_PC: 9031506Sminshall return "personal computer"; 9131506Sminshall default: 9231506Sminshall return "(UNKNOWN)"; 9331506Sminshall } 9431506Sminshall } 9531506Sminshall 9631506Sminshall static int 9731514Sminshall wait_for_ps_or_oia() 9831514Sminshall { 9931514Sminshall #if defined(unix) 10031514Sminshall return api_ps_or_oia_modified(); 10131514Sminshall #endif /* defined(unix) */ 10231514Sminshall } 10331514Sminshall 10431514Sminshall 10531514Sminshall static int 10631506Sminshall wait_for_unlock() 10731506Sminshall { 10831506Sminshall OIA oia; 10931506Sminshall ReadOiaGroupParms re; 11031514Sminshall static char zeroes[sizeof oia.input_inhibited] = { 0 }; 11131506Sminshall 11231506Sminshall do { 11331506Sminshall re.rc = re.function_id = 0; 11431506Sminshall re.session_id = session_id; 11531506Sminshall re.oia_buffer = (char far *) &oia; 11631506Sminshall re.oia_group_number = API_OIA_ALL_GROUPS; 11731506Sminshall if (api_read_oia_group(&re) == -1) { 11831506Sminshall api_perror("api_read_oia_group"); 11931506Sminshall return -1; 12031506Sminshall } else if (verbose) { 12131506Sminshall if (IsOiaReady3274(&oia)) { 12231506Sminshall printf("3274 ready, "); 12331506Sminshall } 12431506Sminshall if (IsOiaMyJob(&oia)) { 12531506Sminshall printf("my job, "); 12631506Sminshall } 12731506Sminshall if (IsOiaInsert(&oia)) { 12831506Sminshall printf("insert mode, "); 12931506Sminshall } 13031506Sminshall if (IsOiaSystemLocked(&oia)) { 13131506Sminshall printf("system locked, "); 13231506Sminshall } 13331506Sminshall if (IsOiaTWait(&oia)) { 13431506Sminshall printf("terminal wait, "); 13531506Sminshall } 13631506Sminshall printf("are some bits from the OIA.\n"); 13731454Sminshall } 13831514Sminshall /* We turned this on, so turn it off now */ 13931514Sminshall ResetOiaApiInhibit(&oia); 14031514Sminshall if (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)) { 14131514Sminshall if (wait_for_ps_or_oia() == -1) { 14231514Sminshall return -1; 14331514Sminshall } 14431514Sminshall } 14531514Sminshall } while (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)); 14631506Sminshall return 0; 14731506Sminshall } 14831506Sminshall 14931506Sminshall static int 15031506Sminshall initialize() 15131506Sminshall { 15231506Sminshall QuerySessionIdParms id; 15331506Sminshall QuerySessionParametersParms pa; 15431506Sminshall QuerySessionCursorParms cu; 15531506Sminshall ConnectToKeyboardParms conn; 15631506Sminshall DisableInputParms disable; 15731506Sminshall NameArray namearray; 15831506Sminshall 15931506Sminshall if (api_init() == 0) { 16031506Sminshall fprintf(stderr, "API function not available.\n"); 16131506Sminshall return -1; 16231454Sminshall } 16331506Sminshall 16431506Sminshall id.rc = 0; 16531506Sminshall id.function_id = 0; 16631506Sminshall id.option_code = ID_OPTION_BY_NAME; 16731506Sminshall id.data_code = 'E'; 16831506Sminshall id.name_array = &namearray; 16931506Sminshall namearray.length = sizeof namearray; 17031506Sminshall if (api_query_session_id(&id)) { 17131506Sminshall api_perror("api_query_session_id"); 17231506Sminshall } else if (namearray.number_matching_session == 0) { 17331506Sminshall fprintf(stderr, "query_session_id: No matching sessions!\n"); 17431506Sminshall return -1; 17531506Sminshall } else if (verbose) { 17631506Sminshall printf("Session short name 0x%x, type is ", 17731506Sminshall namearray.name_array_element.short_name); 17831506Sminshall printf("%s", session_type(namearray.name_array_element.type)); 17931506Sminshall printf(", session ID is: 0x%x\n", 18031506Sminshall namearray.name_array_element.session_id); 18131506Sminshall } 18231506Sminshall session_id = namearray.name_array_element.session_id; 18331506Sminshall 18431506Sminshall pa.rc = pa.function_id = 0; 18531506Sminshall pa.session_id = session_id; 18631506Sminshall if (api_query_session_parameters(&pa) == -1) { 18731506Sminshall api_perror("api_query_session_parameters"); 18831506Sminshall return -1; 18931506Sminshall } else if (verbose) { 19031506Sminshall printf("Session type %s, ", session_type(pa.session_type)); 19131506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) { 19231506Sminshall printf(" has EAB, "); 19331506Sminshall } 19431506Sminshall if (pa.session_characteristics&CHARACTERISTIC_PSS) { 19531506Sminshall printf(" has PSS, "); 19631506Sminshall } 19731506Sminshall printf("%d rows, %d columns ", pa.rows, pa.columns); 19831506Sminshall if (pa.presentation_space) { 19931506Sminshall printf("presentation space at 0x%x:0x%x.\n", 20031506Sminshall FP_SEG(pa.presentation_space), FP_OFF(pa.presentation_space)); 20131506Sminshall } else { 20231506Sminshall printf("(no direct presentation space access).\n"); 20331506Sminshall } 20431506Sminshall } 20531506Sminshall ScreenSize = pa.rows*pa.columns; 20631506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) { 20731506Sminshall fprintf(stderr, 20831506Sminshall "tncomp utilities not designed to work with extended attribute buffers.\n"); 20931506Sminshall return -1; 21031506Sminshall } 21131506Sminshall 21231506Sminshall if (verbose) { 21331506Sminshall cu.rc = cu.function_id = 0; 21431506Sminshall cu.session_id = session_id; 21531506Sminshall if (api_query_session_cursor(&cu) == -1) { 21631506Sminshall api_perror("api_query_session_cursor"); 21731506Sminshall } else { 21831506Sminshall printf("cursor"); 21931506Sminshall if (cu.cursor_type&CURSOR_INHIBITED_AUTOSCROLL) { 22031506Sminshall printf(" inhibited autoscroll"); 22131506Sminshall } 22231506Sminshall if (cu.cursor_type&CURSOR_INHIBITED) { 22331506Sminshall printf(" inhibited"); 22431506Sminshall } 22531506Sminshall if (cu.cursor_type&CURSOR_BLINKING) { 22631506Sminshall printf(" blinking"); 22731506Sminshall } else { 22831506Sminshall printf(" not blinking"); 22931506Sminshall } 23031506Sminshall if (cu.cursor_type&CURSOR_BOX) { 23131506Sminshall printf(" box "); 23231506Sminshall } else { 23331506Sminshall printf(" not box "); 23431506Sminshall } 23531506Sminshall printf("at row %d, column %d.\n", 23631506Sminshall cu.row_address, cu.column_address); 23731506Sminshall } 23831506Sminshall } 23931506Sminshall 24031506Sminshall conn.rc = conn.function_id = 0; 24131506Sminshall conn.session_id = session_id; 24231506Sminshall conn.event_queue_id = conn.input_queue_id = 0; 24331506Sminshall conn.intercept_options = 0; 24431506Sminshall if (api_connect_to_keyboard(&conn) == -1) { 24531506Sminshall api_perror("api_connect_to_keyboard"); 24631506Sminshall } else if (verbose) { 24731506Sminshall if (conn.first_connection_identifier) { 24831506Sminshall printf("First keyboard connection.\n"); 24931506Sminshall } else { 25031506Sminshall printf("Not first keyboard connection.\n"); 25131506Sminshall } 25231506Sminshall } 25331506Sminshall 25431506Sminshall disable.rc = disable.function_id = 0; 25531506Sminshall disable.session_id = session_id; 25631506Sminshall disable.connectors_task_id = 0; 25731506Sminshall if (api_disable_input(&disable) == -1) { 25831506Sminshall api_perror("api_disable_input"); 25931506Sminshall return -1; 26031506Sminshall } else if (verbose) { 26131506Sminshall printf("Disabled.\n"); 26231506Sminshall } 26331506Sminshall 26431506Sminshall if ((enter_index = ascii_to_index("ENTER")) == -1) { 26531506Sminshall return -1; 26631506Sminshall } 26731506Sminshall if ((clear_index = ascii_to_index("CLEAR")) == -1) { 26831506Sminshall return -1; 26931506Sminshall } 27031506Sminshall 27131506Sminshall return 0; /* all ok */ 27231454Sminshall } 27331454Sminshall 27431506Sminshall static int 27531506Sminshall send_key(index) 27631506Sminshall int index; 27731506Sminshall { 27831506Sminshall WriteKeystrokeParms wr; 27931506Sminshall extern struct astosc astosc[]; 28031454Sminshall 28131506Sminshall wait_for_unlock(); 28231506Sminshall 28331506Sminshall wr.rc = wr.function_id = 0; 28431506Sminshall wr.session_id = session_id; 28531506Sminshall wr.connectors_task_id = 0; 28631506Sminshall wr.options = OPTION_SINGLE_KEYSTROKE; 28731506Sminshall wr.number_of_keys_sent = 0; 28831506Sminshall wr.keystroke_specifier.keystroke_entry.scancode = astosc[index].scancode; 28931506Sminshall wr.keystroke_specifier.keystroke_entry.shift_state 29031506Sminshall = astosc[index].shiftstate; 29131506Sminshall if (api_write_keystroke(&wr) == -1) { 29231506Sminshall api_perror("api_write_keystroke"); 29331506Sminshall return -1; 29431506Sminshall } else if (wr.number_of_keys_sent != 1) { 29531506Sminshall fprintf(stderr, "write_keystroke claims to have sent %d keystrokes.\n", 29631506Sminshall wr.number_of_keys_sent); 29731506Sminshall return -1; 29831506Sminshall } else if (verbose) { 29931506Sminshall printf("Keystroke sent.\n"); 30031506Sminshall } 30131514Sminshall if (wait_for_ps_or_oia() == -1) { 30231514Sminshall return -1; 30331514Sminshall } 30431506Sminshall return 0; 30531506Sminshall } 30631506Sminshall 30731506Sminshall static int 30831506Sminshall terminate() 30931506Sminshall { 31031506Sminshall EnableInputParms enable; 31131506Sminshall DisconnectFromKeyboardParms disc; 31231506Sminshall 31331506Sminshall enable.rc = enable.function_id = 0; 31431506Sminshall enable.session_id = session_id; 31531506Sminshall enable.connectors_task_id = 0; 31631506Sminshall if (api_enable_input(&enable) == -1) { 31731506Sminshall api_perror("api_enable"); 31831506Sminshall return -1; 31931506Sminshall } else if (verbose) { 32031506Sminshall printf("Enabled.\n"); 32131506Sminshall } 32231506Sminshall 32331506Sminshall disc.rc = disc.function_id = 0; 32431506Sminshall disc.session_id = session_id; 32531506Sminshall disc.connectors_task_id = 0; 32631506Sminshall if (api_disconnect_from_keyboard(&disc) == -1) { 32731506Sminshall api_perror("api_disconnect_from_keyboard"); 32831506Sminshall return -1; 32931506Sminshall } else if (verbose) { 33031506Sminshall printf("Disconnected from keyboard.\n"); 33131506Sminshall } 33231506Sminshall 33331506Sminshall (void) api_finish(); 33431506Sminshall 33531506Sminshall return 0; 33631506Sminshall } 33731506Sminshall 33831506Sminshall 33931506Sminshall static int 34031506Sminshall get_screen() 34131506Sminshall { 34231506Sminshall CopyStringParms copy; 34331506Sminshall /* Time copy services */ 34431506Sminshall 34531506Sminshall wait_for_unlock(); 34631506Sminshall 34731506Sminshall copy.copy_mode = 0; 34831506Sminshall copy.rc = copy.function_id = 0; 34931506Sminshall copy.source.session_id = session_id; 35031506Sminshall copy.source.buffer = 0; 35131506Sminshall copy.source.characteristics = 0; 35231506Sminshall copy.source.session_type = TYPE_DFT; 35331506Sminshall copy.source.begin = 0; 35431506Sminshall 35531506Sminshall copy.source_end = ScreenSize; 35631506Sminshall 35731506Sminshall copy.target.session_id = 0; 35831506Sminshall copy.target.buffer = (char *) &Host[0]; 35931506Sminshall copy.target.characteristics = 0; 36031506Sminshall copy.target.session_type = TYPE_DFT; 36131506Sminshall 36231506Sminshall if (api_copy_string(©) == -1) { 36331506Sminshall api_perror("api_copy_string"); 36431506Sminshall return -1; 36531506Sminshall } 36631506Sminshall return 0; 36731506Sminshall } 36831514Sminshall 36931514Sminshall 37031514Sminshall put_at(offset, from, length, attribute) 37131506Sminshall int offset; 37231506Sminshall char *from; 37331506Sminshall int length; 37431506Sminshall { 37531506Sminshall CopyStringParms copy; 37631506Sminshall 37731506Sminshall wait_for_unlock(); 37831506Sminshall 37931506Sminshall copy.copy_mode = 0; 38031506Sminshall copy.rc = copy.function_id = 0; 38131506Sminshall copy.source.session_id = 0; 38231506Sminshall copy.source.buffer = from; 38331506Sminshall copy.source.characteristics = 0; 38431506Sminshall copy.source.session_type = TYPE_DFT; 38531506Sminshall copy.source.begin = 0; 38631506Sminshall 38731506Sminshall copy.source_end = length-1; 38831506Sminshall 38931506Sminshall copy.target.session_id = session_id; 39031506Sminshall copy.target.buffer = 0; 39131506Sminshall copy.target.characteristics = 0; 39231506Sminshall copy.target.session_type = TYPE_DFT; 39331506Sminshall copy.target.begin = offset; 39431506Sminshall 39531506Sminshall if (api_copy_string(©) == -1) { 39631506Sminshall api_perror("api_copy_string"); 39731506Sminshall return -1; 39831506Sminshall } 39931506Sminshall return 0; 40031506Sminshall } 40131506Sminshall 40231506Sminshall static void 40331506Sminshall translate(input, output, table, length) 40431506Sminshall char *input, *output, table[]; 40531506Sminshall int length; 40631506Sminshall { 40731506Sminshall unsigned char *indices = (unsigned char *) input; 40831506Sminshall 40931506Sminshall while (length--) { 41031506Sminshall *output++ = table[*indices++]; 41131506Sminshall } 41231506Sminshall } 41331506Sminshall 41431506Sminshall static int 41531514Sminshall find_input_area(from) 41631514Sminshall int from; 41731506Sminshall { 41831776Sminshall #define FieldDec(p) (0) /* We don't really use this */ 41931506Sminshall register int i, attr; 42031506Sminshall 42131514Sminshall for (i = from; i < MAXSCREENSIZE; ) { 42231506Sminshall if (IsStartField(i)) { 42331506Sminshall attr = FieldAttributes(i); 42431506Sminshall i++; 42531506Sminshall if (!IsProtectedAttr(i, attr)) { 42631506Sminshall return i; 42731506Sminshall } 42831506Sminshall } else { 42931506Sminshall i++; 43031506Sminshall } 43131506Sminshall } 43231506Sminshall return -1; 43331506Sminshall } 43431506Sminshall 43531506Sminshall 43631506Sminshall static void 43731506Sminshall getascii(offset, to, length) 43831506Sminshall int offset; /* Where in screen */ 43931506Sminshall char *to; /* Where it goes to */ 44031506Sminshall int length; /* Where to put it */ 44131506Sminshall { 44231506Sminshall translate(Host+offset, to, disp_asc, length); 44331506Sminshall } 44431506Sminshall 44531506Sminshall static int 44631514Sminshall putascii(offset, from, length, before) 44731506Sminshall int offset; /* Where in screen */ 44831506Sminshall char *from; /* Where it comes from */ 44931506Sminshall int length; /* Where to put it */ 45031514Sminshall int before; /* How much else should go */ 45131506Sminshall { 45231506Sminshall translate(from, Host+offset, asc_disp, length); 45331514Sminshall if (put_at(offset-before, 45431514Sminshall (char *) Host+offset-before, length+before) == -1) { 45531506Sminshall return -1; 45631506Sminshall } 45731506Sminshall return 0; 45831506Sminshall } 45931506Sminshall 46031506Sminshall static int 46131506Sminshall ack() 46231506Sminshall { 46331514Sminshall static char ack_blanks[sizeof a_ack_sequence] = {0}; 46431514Sminshall 46531514Sminshall if (ack_blanks[0] == 0) { 46631514Sminshall int i; 46731514Sminshall 46831514Sminshall for (i = 0; i < sizeof ack_blanks; i++) { 46931514Sminshall ack_blanks[i] = ' '; 47031514Sminshall } 47131514Sminshall } 47231514Sminshall 47331514Sminshall memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence); 47431506Sminshall sprintf(a_ack_sequence, "%d", ack_sequence); 47531506Sminshall a_ack_sequence[strlen(a_ack_sequence)] = ' '; 476*38209Sminshall if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 0) == -1) { 47731506Sminshall return -1; 47831506Sminshall } 47931506Sminshall return 0; 48031506Sminshall } 48131514Sminshall 48231514Sminshall static int 48331514Sminshall formatted_correct() 48431514Sminshall { 48531514Sminshall if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) || 48631514Sminshall (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) || 48731514Sminshall (find_input_area(ACK_SEQUENCE) != CHECKSUM) || 48831514Sminshall (find_input_area(CHECKSUM) != DATA)) { 48931514Sminshall return -1; 49031514Sminshall } else { 49131514Sminshall return 0; 49231514Sminshall } 49331514Sminshall } 49431514Sminshall 49531514Sminshall 49631454Sminshall main(argc, argv) 49731454Sminshall int argc; 49831454Sminshall char *argv[]; 49931454Sminshall { 50031506Sminshall register int i; 50131454Sminshall int data_length, input_length; 50231454Sminshall char ascii[8]; /* Lots of room */ 50331454Sminshall FILE *outfile; 50431506Sminshall char *data; 50531804Sminshall char *argv0 = argv[0]; 50631454Sminshall 50731777Sminshall argc--; 50831777Sminshall argv++; 50931506Sminshall /* Process any flags */ 51031804Sminshall while (argc && (argv[0][0] == '-')) { 51131777Sminshall switch (argv[0][1]) { 51231506Sminshall case 'v': 51331506Sminshall verbose = 1; 51431514Sminshall break; 51531514Sminshall case 'b': 51631514Sminshall blocks = 1; 51731514Sminshall break; 51831506Sminshall } 51931777Sminshall argc--; 52031777Sminshall argv++; 52131506Sminshall } 52231506Sminshall 52331777Sminshall if ((argc) < 2) { 52431804Sminshall fprintf(stderr, 52531804Sminshall "usage: %s [-b] [-v] local.file remote.file [remote.options]\n", 52631804Sminshall argv0); 52731454Sminshall exit(1); 52831454Sminshall } 52931454Sminshall 53031454Sminshall /* Open the local file */ 53131777Sminshall if ((outfile = fopen(argv[0], "w")) == NULL) { 53231454Sminshall perror("fopen"); 53331454Sminshall exit(2); 53431454Sminshall } 53531777Sminshall argc--; 53631777Sminshall argv++; 53731454Sminshall 53831506Sminshall if (initialize() == -1) { 53931506Sminshall return -1; 54031506Sminshall } 54131506Sminshall 54231454Sminshall /* build the command line */ 54331454Sminshall data = data_array; 54431506Sminshall strcpy(data, "TNCOMP SEND"); 54531454Sminshall data += strlen(data); 54631777Sminshall while (argc--) { 54731454Sminshall *data++ = ' '; 54831777Sminshall strcpy(data, argv[0]); 54931777Sminshall data += strlen(argv[0]); 55031777Sminshall argv++; 55131454Sminshall } 55231506Sminshall if (verbose) { 55331506Sminshall printf("%s\n", data_array); 55431506Sminshall } 55531506Sminshall if (get_screen() == -1) { 55631506Sminshall return -1; 55731506Sminshall } 55831506Sminshall data_length = strlen(data_array); 55931877Sminshall if ((i = find_input_area(0)) == -1) { /* Get an input area */ 56031506Sminshall if (send_key(clear_index) == -1) { 56131506Sminshall return -1; 56231506Sminshall } 56331514Sminshall if ((i = find_input_area(0)) == -1) { /* Try again */ 56431506Sminshall fprintf(stderr, "Unable to enter command line.\n"); 56531506Sminshall return -1; 56631506Sminshall } 56731506Sminshall } 568*38209Sminshall if (putascii(i, data_array, data_length, 0) == -1) { 56931506Sminshall return -1; 57031506Sminshall } 57131506Sminshall if (send_key(enter_index) == -1) { 57231506Sminshall return -1; 57331506Sminshall } 57431506Sminshall do { 57531506Sminshall if (get_screen() == -1) { 57631506Sminshall return -1; 57731506Sminshall } 57831514Sminshall } while (formatted_correct() == -1); 57931454Sminshall 58031506Sminshall do { 58131514Sminshall if (get_screen() == -1) { 58231514Sminshall return -1; 58331514Sminshall } 58431506Sminshall /* For each screen */ 58531514Sminshall if (formatted_correct() == -1) { 58631514Sminshall fprintf(stderr, "Bad screen written by host.\n"); 58731514Sminshall return -1; 58831514Sminshall } 58931514Sminshall /* If MDT isn't reset in the sequence number, go around again */ 59031514Sminshall if (Host[ACK_SEQUENCE-1]&ATTR_MDT) { 59131514Sminshall if (wait_for_ps_or_oia() == -1) { 59231514Sminshall return -1; 59331514Sminshall } 59431514Sminshall continue; 59531514Sminshall } 59631514Sminshall getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH); 59731506Sminshall send_sequence = atoi(a_send_sequence); 59831514Sminshall getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH); 59931506Sminshall checksum = atoi(a_checksum); 60031514Sminshall getascii(DATA, data_array, DATA_LENGTH); 60131506Sminshall data = data_array; 60231506Sminshall if (send_sequence != (ack_sequence+1)) { 60331514Sminshall if (ack() == -1) { 60431514Sminshall return -1; 60531514Sminshall } 60631506Sminshall data = "1234"; /* Keep loop from failing */ 60731506Sminshall if (send_key(enter_index) == -1) { 60831506Sminshall return -1; 60931506Sminshall } 61031506Sminshall if (get_screen() == -1) { 61131506Sminshall return -1; 61231506Sminshall } 61331506Sminshall continue; 61431506Sminshall } 61531454Sminshall 61631514Sminshall data_length = DATA_LENGTH; 61731514Sminshall while (data_length && memcmp(data, " EOF", 4) 61831514Sminshall && memcmp(data, " ", 4)) { 61931506Sminshall memcpy(ascii, data, 4); 62031514Sminshall data += 4; 62131514Sminshall data_length -= 4; 62231506Sminshall ascii[4] = 0; 62331506Sminshall input_length = atoi(ascii); 62431514Sminshall /* CMS can't live with zero length records */ 62531514Sminshall if ((input_length > 1) || 62631514Sminshall ((input_length == 1) && (data[0] != ' '))) { 62731506Sminshall if (fwrite(data, sizeof (char), 62831514Sminshall input_length, outfile) == 0) { 62931506Sminshall perror("fwrite"); 63031506Sminshall exit(9); 63131506Sminshall } 63231454Sminshall } 63331506Sminshall fprintf(outfile, "\n"); 63431506Sminshall data += input_length; 63531506Sminshall data_length -= input_length; 63631454Sminshall } 63731514Sminshall 63831514Sminshall ack_sequence = send_sequence; 63931514Sminshall if (blocks) { 64031514Sminshall printf("#"); 64131514Sminshall fflush(stdout); 64231514Sminshall } 64331514Sminshall if (ack() == -1) { 64431506Sminshall return -1; 64531506Sminshall } 64631514Sminshall if (send_key(enter_index) == -1) { 64731506Sminshall return -1; 64831506Sminshall } 64931514Sminshall } while (memcmp(data, " EOF", 4)); 65031506Sminshall 65131514Sminshall if (blocks) { 65231514Sminshall printf("\n"); 65331514Sminshall } 65431506Sminshall if (terminate() == -1) { 65531506Sminshall return -1; 65631454Sminshall } 65731506Sminshall return 0; 65831454Sminshall } 659