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(&copy) == -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(&copy) == -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