148759Sbostic /*-
2*62350Sbostic * Copyright (c) 1988, 1993
3*62350Sbostic * The Regents of the University of California. All rights reserved.
431887Sminshall *
548759Sbostic * %sccs.include.redist.c%
631887Sminshall */
731887Sminshall
831887Sminshall #ifndef lint
9*62350Sbostic static char copyright[] =
10*62350Sbostic "@(#) Copyright (c) 1988, 1993\n\
11*62350Sbostic The Regents of the University of California. All rights reserved.\n";
1233812Sbostic #endif /* not lint */
1331887Sminshall
1433812Sbostic #ifndef lint
15*62350Sbostic static char sccsid[] = "@(#)tnrecv.c 8.1 (Berkeley) 06/06/93";
1633812Sbostic #endif /* not lint */
1733812Sbostic
1831506Sminshall #include <stdio.h>
1931454Sminshall
2031876Sminshall #include <api/apilib.h>
2131615Sminshall
2231506Sminshall #include "tncomp.h"
2331506Sminshall
2431506Sminshall
2531876Sminshall #include "../ctlr/api.h"
2631506Sminshall #include "../ctlr/function.h"
2731506Sminshall #include "../ctlr/hostctlr.h"
2831506Sminshall #include "../ctlr/oia.h"
2931506Sminshall #include "../ctlr/screen.h"
3031506Sminshall
3131876Sminshall #include "../api/disp_asc.h"
3231876Sminshall #include "../api/astosc.h"
3331506Sminshall
3431506Sminshall #include "../general/general.h"
3531506Sminshall
3631506Sminshall ScreenImage Host[MAXSCREENSIZE];
3731506Sminshall
3831506Sminshall static char
3931514Sminshall a_send_sequence[SEND_SEQUENCE_LENGTH+1],
4031514Sminshall a_ack_sequence[ACK_SEQUENCE_LENGTH+1],
4131514Sminshall a_checksum[CHECKSUM_LENGTH+1],
4231514Sminshall data_array[DATA_LENGTH+1];
4331506Sminshall
4431506Sminshall static int
4531506Sminshall verbose,
4631514Sminshall blocks,
4731506Sminshall enter_index,
4831506Sminshall clear_index,
4931506Sminshall ScreenSize,
5031506Sminshall session_id;
5131506Sminshall
5231506Sminshall static unsigned int
5331506Sminshall send_sequence,
5431514Sminshall ack_sequence = -1,
5531506Sminshall checksum;
5631506Sminshall
api_perror(string)5731506Sminshall api_perror(string)
5831506Sminshall char *string;
5931454Sminshall {
6031506Sminshall fprintf(stderr, "Error: [0x%x/0x%x:0x%x/0x%x] from %s.\n",
6131506Sminshall api_sup_fcn_id, api_sup_errno,
6231506Sminshall api_fcn_fcn_id, api_fcn_errno, string);
6331506Sminshall }
6431454Sminshall
6531506Sminshall
6631506Sminshall char *
session_type(type)6731506Sminshall session_type(type)
6831506Sminshall int type;
6931506Sminshall {
7031506Sminshall switch (type) {
7131506Sminshall case TYPE_WSCTL:
7231506Sminshall return "work station control";
7331506Sminshall case TYPE_DFT:
7431506Sminshall return "distributed function terminal";
7531506Sminshall case TYPE_CUT:
7631506Sminshall return "control unit terminal";
7731506Sminshall case TYPE_NOTEPAD:
7831506Sminshall return "notepad";
7931506Sminshall case TYPE_PC:
8031506Sminshall return "personal computer";
8131506Sminshall default:
8231506Sminshall return "(UNKNOWN)";
8331506Sminshall }
8431506Sminshall }
8531506Sminshall
8631506Sminshall static int
wait_for_ps_or_oia()8731514Sminshall wait_for_ps_or_oia()
8831514Sminshall {
8931514Sminshall #if defined(unix)
9031514Sminshall return api_ps_or_oia_modified();
9131514Sminshall #endif /* defined(unix) */
9231514Sminshall }
9331514Sminshall
9431514Sminshall
9531514Sminshall static int
wait_for_unlock()9631506Sminshall wait_for_unlock()
9731506Sminshall {
9831506Sminshall OIA oia;
9931506Sminshall ReadOiaGroupParms re;
10031514Sminshall static char zeroes[sizeof oia.input_inhibited] = { 0 };
10131506Sminshall
10231506Sminshall do {
10331506Sminshall re.rc = re.function_id = 0;
10431506Sminshall re.session_id = session_id;
10531506Sminshall re.oia_buffer = (char far *) &oia;
10631506Sminshall re.oia_group_number = API_OIA_ALL_GROUPS;
10731506Sminshall if (api_read_oia_group(&re) == -1) {
10831506Sminshall api_perror("api_read_oia_group");
10931506Sminshall return -1;
11031506Sminshall } else if (verbose) {
11131506Sminshall if (IsOiaReady3274(&oia)) {
11231506Sminshall printf("3274 ready, ");
11331506Sminshall }
11431506Sminshall if (IsOiaMyJob(&oia)) {
11531506Sminshall printf("my job, ");
11631506Sminshall }
11731506Sminshall if (IsOiaInsert(&oia)) {
11831506Sminshall printf("insert mode, ");
11931506Sminshall }
12031506Sminshall if (IsOiaSystemLocked(&oia)) {
12131506Sminshall printf("system locked, ");
12231506Sminshall }
12331506Sminshall if (IsOiaTWait(&oia)) {
12431506Sminshall printf("terminal wait, ");
12531506Sminshall }
12631506Sminshall printf("are some bits from the OIA.\n");
12731454Sminshall }
12831514Sminshall /* We turned this on, so turn it off now */
12931514Sminshall ResetOiaApiInhibit(&oia);
13031514Sminshall if (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited)) {
13131514Sminshall if (wait_for_ps_or_oia() == -1) {
13231514Sminshall return -1;
13331514Sminshall }
13431514Sminshall }
13531514Sminshall } while (memcmp(zeroes, oia.input_inhibited, sizeof oia.input_inhibited));
13631506Sminshall return 0;
13731506Sminshall }
13831506Sminshall
13931506Sminshall static int
initialize()14031506Sminshall initialize()
14131506Sminshall {
14231506Sminshall QuerySessionIdParms id;
14331506Sminshall QuerySessionParametersParms pa;
14431506Sminshall QuerySessionCursorParms cu;
14531506Sminshall ConnectToKeyboardParms conn;
14631506Sminshall DisableInputParms disable;
14731506Sminshall NameArray namearray;
14831506Sminshall
14931506Sminshall if (api_init() == 0) {
15031506Sminshall fprintf(stderr, "API function not available.\n");
15131506Sminshall return -1;
15231454Sminshall }
15331506Sminshall
15431506Sminshall id.rc = 0;
15531506Sminshall id.function_id = 0;
15631506Sminshall id.option_code = ID_OPTION_BY_NAME;
15731506Sminshall id.data_code = 'E';
15831506Sminshall id.name_array = &namearray;
15931506Sminshall namearray.length = sizeof namearray;
16031506Sminshall if (api_query_session_id(&id)) {
16131506Sminshall api_perror("api_query_session_id");
16231506Sminshall } else if (namearray.number_matching_session == 0) {
16331506Sminshall fprintf(stderr, "query_session_id: No matching sessions!\n");
16431506Sminshall return -1;
16531506Sminshall } else if (verbose) {
16631506Sminshall printf("Session short name 0x%x, type is ",
16731506Sminshall namearray.name_array_element.short_name);
16831506Sminshall printf("%s", session_type(namearray.name_array_element.type));
16931506Sminshall printf(", session ID is: 0x%x\n",
17031506Sminshall namearray.name_array_element.session_id);
17131506Sminshall }
17231506Sminshall session_id = namearray.name_array_element.session_id;
17331506Sminshall
17431506Sminshall pa.rc = pa.function_id = 0;
17531506Sminshall pa.session_id = session_id;
17631506Sminshall if (api_query_session_parameters(&pa) == -1) {
17731506Sminshall api_perror("api_query_session_parameters");
17831506Sminshall return -1;
17931506Sminshall } else if (verbose) {
18031506Sminshall printf("Session type %s, ", session_type(pa.session_type));
18131506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) {
18231506Sminshall printf(" has EAB, ");
18331506Sminshall }
18431506Sminshall if (pa.session_characteristics&CHARACTERISTIC_PSS) {
18531506Sminshall printf(" has PSS, ");
18631506Sminshall }
18731506Sminshall printf("%d rows, %d columns ", pa.rows, pa.columns);
18831506Sminshall if (pa.presentation_space) {
18931506Sminshall printf("presentation space at 0x%x:0x%x.\n",
19031506Sminshall FP_SEG(pa.presentation_space), FP_OFF(pa.presentation_space));
19131506Sminshall } else {
19231506Sminshall printf("(no direct presentation space access).\n");
19331506Sminshall }
19431506Sminshall }
19531506Sminshall ScreenSize = pa.rows*pa.columns;
19631506Sminshall if (pa.session_characteristics&CHARACTERISTIC_EAB) {
19731506Sminshall fprintf(stderr,
19831506Sminshall "tncomp utilities not designed to work with extended attribute buffers.\n");
19931506Sminshall return -1;
20031506Sminshall }
20131506Sminshall
20231506Sminshall if (verbose) {
20331506Sminshall cu.rc = cu.function_id = 0;
20431506Sminshall cu.session_id = session_id;
20531506Sminshall if (api_query_session_cursor(&cu) == -1) {
20631506Sminshall api_perror("api_query_session_cursor");
20731506Sminshall } else {
20831506Sminshall printf("cursor");
20931506Sminshall if (cu.cursor_type&CURSOR_INHIBITED_AUTOSCROLL) {
21031506Sminshall printf(" inhibited autoscroll");
21131506Sminshall }
21231506Sminshall if (cu.cursor_type&CURSOR_INHIBITED) {
21331506Sminshall printf(" inhibited");
21431506Sminshall }
21531506Sminshall if (cu.cursor_type&CURSOR_BLINKING) {
21631506Sminshall printf(" blinking");
21731506Sminshall } else {
21831506Sminshall printf(" not blinking");
21931506Sminshall }
22031506Sminshall if (cu.cursor_type&CURSOR_BOX) {
22131506Sminshall printf(" box ");
22231506Sminshall } else {
22331506Sminshall printf(" not box ");
22431506Sminshall }
22531506Sminshall printf("at row %d, column %d.\n",
22631506Sminshall cu.row_address, cu.column_address);
22731506Sminshall }
22831506Sminshall }
22931506Sminshall
23031506Sminshall conn.rc = conn.function_id = 0;
23131506Sminshall conn.session_id = session_id;
23231506Sminshall conn.event_queue_id = conn.input_queue_id = 0;
23331506Sminshall conn.intercept_options = 0;
23431506Sminshall if (api_connect_to_keyboard(&conn) == -1) {
23531506Sminshall api_perror("api_connect_to_keyboard");
23631506Sminshall } else if (verbose) {
23731506Sminshall if (conn.first_connection_identifier) {
23831506Sminshall printf("First keyboard connection.\n");
23931506Sminshall } else {
24031506Sminshall printf("Not first keyboard connection.\n");
24131506Sminshall }
24231506Sminshall }
24331506Sminshall
24431506Sminshall disable.rc = disable.function_id = 0;
24531506Sminshall disable.session_id = session_id;
24631506Sminshall disable.connectors_task_id = 0;
24731506Sminshall if (api_disable_input(&disable) == -1) {
24831506Sminshall api_perror("api_disable_input");
24931506Sminshall return -1;
25031506Sminshall } else if (verbose) {
25131506Sminshall printf("Disabled.\n");
25231506Sminshall }
25331506Sminshall
25431506Sminshall if ((enter_index = ascii_to_index("ENTER")) == -1) {
25531506Sminshall return -1;
25631506Sminshall }
25731506Sminshall if ((clear_index = ascii_to_index("CLEAR")) == -1) {
25831506Sminshall return -1;
25931506Sminshall }
26031506Sminshall
26131506Sminshall return 0; /* all ok */
26231454Sminshall }
26331454Sminshall
26431506Sminshall static int
send_key(index)26531506Sminshall send_key(index)
26631506Sminshall int index;
26731506Sminshall {
26831506Sminshall WriteKeystrokeParms wr;
26931506Sminshall extern struct astosc astosc[];
27031454Sminshall
27131506Sminshall wait_for_unlock();
27231506Sminshall
27331506Sminshall wr.rc = wr.function_id = 0;
27431506Sminshall wr.session_id = session_id;
27531506Sminshall wr.connectors_task_id = 0;
27631506Sminshall wr.options = OPTION_SINGLE_KEYSTROKE;
27731506Sminshall wr.number_of_keys_sent = 0;
27831506Sminshall wr.keystroke_specifier.keystroke_entry.scancode = astosc[index].scancode;
27931506Sminshall wr.keystroke_specifier.keystroke_entry.shift_state
28031506Sminshall = astosc[index].shiftstate;
28131506Sminshall if (api_write_keystroke(&wr) == -1) {
28231506Sminshall api_perror("api_write_keystroke");
28331506Sminshall return -1;
28431506Sminshall } else if (wr.number_of_keys_sent != 1) {
28531506Sminshall fprintf(stderr, "write_keystroke claims to have sent %d keystrokes.\n",
28631506Sminshall wr.number_of_keys_sent);
28731506Sminshall return -1;
28831506Sminshall } else if (verbose) {
28931506Sminshall printf("Keystroke sent.\n");
29031506Sminshall }
29131514Sminshall if (wait_for_ps_or_oia() == -1) {
29231514Sminshall return -1;
29331514Sminshall }
29431506Sminshall return 0;
29531506Sminshall }
29631506Sminshall
29731506Sminshall static int
terminate()29831506Sminshall terminate()
29931506Sminshall {
30031506Sminshall EnableInputParms enable;
30131506Sminshall DisconnectFromKeyboardParms disc;
30231506Sminshall
30331506Sminshall enable.rc = enable.function_id = 0;
30431506Sminshall enable.session_id = session_id;
30531506Sminshall enable.connectors_task_id = 0;
30631506Sminshall if (api_enable_input(&enable) == -1) {
30731506Sminshall api_perror("api_enable");
30831506Sminshall return -1;
30931506Sminshall } else if (verbose) {
31031506Sminshall printf("Enabled.\n");
31131506Sminshall }
31231506Sminshall
31331506Sminshall disc.rc = disc.function_id = 0;
31431506Sminshall disc.session_id = session_id;
31531506Sminshall disc.connectors_task_id = 0;
31631506Sminshall if (api_disconnect_from_keyboard(&disc) == -1) {
31731506Sminshall api_perror("api_disconnect_from_keyboard");
31831506Sminshall return -1;
31931506Sminshall } else if (verbose) {
32031506Sminshall printf("Disconnected from keyboard.\n");
32131506Sminshall }
32231506Sminshall
32331506Sminshall (void) api_finish();
32431506Sminshall
32531506Sminshall return 0;
32631506Sminshall }
32731506Sminshall
32831506Sminshall
32931506Sminshall static int
get_screen()33031506Sminshall get_screen()
33131506Sminshall {
33231506Sminshall CopyStringParms copy;
33331506Sminshall /* Time copy services */
33431506Sminshall
33531506Sminshall wait_for_unlock();
33631506Sminshall
33731506Sminshall copy.copy_mode = 0;
33831506Sminshall copy.rc = copy.function_id = 0;
33931506Sminshall copy.source.session_id = session_id;
34031506Sminshall copy.source.buffer = 0;
34131506Sminshall copy.source.characteristics = 0;
34231506Sminshall copy.source.session_type = TYPE_DFT;
34331506Sminshall copy.source.begin = 0;
34431506Sminshall
34531506Sminshall copy.source_end = ScreenSize;
34631506Sminshall
34731506Sminshall copy.target.session_id = 0;
34831506Sminshall copy.target.buffer = (char *) &Host[0];
34931506Sminshall copy.target.characteristics = 0;
35031506Sminshall copy.target.session_type = TYPE_DFT;
35131506Sminshall
35231506Sminshall if (api_copy_string(©) == -1) {
35331506Sminshall api_perror("api_copy_string");
35431506Sminshall return -1;
35531506Sminshall }
35631506Sminshall return 0;
35731506Sminshall }
35831514Sminshall
35931514Sminshall
put_at(offset,from,length,attribute)36031514Sminshall put_at(offset, from, length, attribute)
36131506Sminshall int offset;
36231506Sminshall char *from;
36331506Sminshall int length;
36431506Sminshall {
36531506Sminshall CopyStringParms copy;
36631506Sminshall
36731506Sminshall wait_for_unlock();
36831506Sminshall
36931506Sminshall copy.copy_mode = 0;
37031506Sminshall copy.rc = copy.function_id = 0;
37131506Sminshall copy.source.session_id = 0;
37231506Sminshall copy.source.buffer = from;
37331506Sminshall copy.source.characteristics = 0;
37431506Sminshall copy.source.session_type = TYPE_DFT;
37531506Sminshall copy.source.begin = 0;
37631506Sminshall
37731506Sminshall copy.source_end = length-1;
37831506Sminshall
37931506Sminshall copy.target.session_id = session_id;
38031506Sminshall copy.target.buffer = 0;
38131506Sminshall copy.target.characteristics = 0;
38231506Sminshall copy.target.session_type = TYPE_DFT;
38331506Sminshall copy.target.begin = offset;
38431506Sminshall
38531506Sminshall if (api_copy_string(©) == -1) {
38631506Sminshall api_perror("api_copy_string");
38731506Sminshall return -1;
38831506Sminshall }
38931506Sminshall return 0;
39031506Sminshall }
39131506Sminshall
39231506Sminshall static void
translate(input,output,table,length)39331506Sminshall translate(input, output, table, length)
39431506Sminshall char *input, *output, table[];
39531506Sminshall int length;
39631506Sminshall {
39731506Sminshall unsigned char *indices = (unsigned char *) input;
39831506Sminshall
39931506Sminshall while (length--) {
40031506Sminshall *output++ = table[*indices++];
40131506Sminshall }
40231506Sminshall }
40331506Sminshall
40431506Sminshall static int
find_input_area(from)40531514Sminshall find_input_area(from)
40631514Sminshall int from;
40731506Sminshall {
40831776Sminshall #define FieldDec(p) (0) /* We don't really use this */
40931506Sminshall register int i, attr;
41031506Sminshall
41131514Sminshall for (i = from; i < MAXSCREENSIZE; ) {
41231506Sminshall if (IsStartField(i)) {
41331506Sminshall attr = FieldAttributes(i);
41431506Sminshall i++;
41531506Sminshall if (!IsProtectedAttr(i, attr)) {
41631506Sminshall return i;
41731506Sminshall }
41831506Sminshall } else {
41931506Sminshall i++;
42031506Sminshall }
42131506Sminshall }
42231506Sminshall return -1;
42331506Sminshall }
42431506Sminshall
42531506Sminshall
42631506Sminshall static void
getascii(offset,to,length)42731506Sminshall getascii(offset, to, length)
42831506Sminshall int offset; /* Where in screen */
42931506Sminshall char *to; /* Where it goes to */
43031506Sminshall int length; /* Where to put it */
43131506Sminshall {
43231506Sminshall translate(Host+offset, to, disp_asc, length);
43331506Sminshall }
43431506Sminshall
43531506Sminshall static int
putascii(offset,from,length,before)43631514Sminshall putascii(offset, from, length, before)
43731506Sminshall int offset; /* Where in screen */
43831506Sminshall char *from; /* Where it comes from */
43931506Sminshall int length; /* Where to put it */
44031514Sminshall int before; /* How much else should go */
44131506Sminshall {
44231506Sminshall translate(from, Host+offset, asc_disp, length);
44331514Sminshall if (put_at(offset-before,
44431514Sminshall (char *) Host+offset-before, length+before) == -1) {
44531506Sminshall return -1;
44631506Sminshall }
44731506Sminshall return 0;
44831506Sminshall }
44931506Sminshall
45031506Sminshall static int
ack()45131506Sminshall ack()
45231506Sminshall {
45331514Sminshall static char ack_blanks[sizeof a_ack_sequence] = {0};
45431514Sminshall
45531514Sminshall if (ack_blanks[0] == 0) {
45631514Sminshall int i;
45731514Sminshall
45831514Sminshall for (i = 0; i < sizeof ack_blanks; i++) {
45931514Sminshall ack_blanks[i] = ' ';
46031514Sminshall }
46131514Sminshall }
46231514Sminshall
46331514Sminshall memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence);
46431506Sminshall sprintf(a_ack_sequence, "%d", ack_sequence);
46531506Sminshall a_ack_sequence[strlen(a_ack_sequence)] = ' ';
46638209Sminshall if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 0) == -1) {
46731506Sminshall return -1;
46831506Sminshall }
46931506Sminshall return 0;
47031506Sminshall }
47131514Sminshall
47231514Sminshall static int
formatted_correct()47331514Sminshall formatted_correct()
47431514Sminshall {
47531514Sminshall if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) ||
47631514Sminshall (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) ||
47731514Sminshall (find_input_area(ACK_SEQUENCE) != CHECKSUM) ||
47831514Sminshall (find_input_area(CHECKSUM) != DATA)) {
47931514Sminshall return -1;
48031514Sminshall } else {
48131514Sminshall return 0;
48231514Sminshall }
48331514Sminshall }
48431514Sminshall
48531514Sminshall
main(argc,argv)48631454Sminshall main(argc, argv)
48731454Sminshall int argc;
48831454Sminshall char *argv[];
48931454Sminshall {
49031506Sminshall register int i;
49131454Sminshall int data_length, input_length;
49231454Sminshall char ascii[8]; /* Lots of room */
49331454Sminshall FILE *outfile;
49431506Sminshall char *data;
49531804Sminshall char *argv0 = argv[0];
49631454Sminshall
49731777Sminshall argc--;
49831777Sminshall argv++;
49931506Sminshall /* Process any flags */
50031804Sminshall while (argc && (argv[0][0] == '-')) {
50131777Sminshall switch (argv[0][1]) {
50231506Sminshall case 'v':
50331506Sminshall verbose = 1;
50431514Sminshall break;
50531514Sminshall case 'b':
50631514Sminshall blocks = 1;
50731514Sminshall break;
50831506Sminshall }
50931777Sminshall argc--;
51031777Sminshall argv++;
51131506Sminshall }
51231506Sminshall
51331777Sminshall if ((argc) < 2) {
51431804Sminshall fprintf(stderr,
51531804Sminshall "usage: %s [-b] [-v] local.file remote.file [remote.options]\n",
51631804Sminshall argv0);
51731454Sminshall exit(1);
51831454Sminshall }
51931454Sminshall
52031454Sminshall /* Open the local file */
52131777Sminshall if ((outfile = fopen(argv[0], "w")) == NULL) {
52231454Sminshall perror("fopen");
52331454Sminshall exit(2);
52431454Sminshall }
52531777Sminshall argc--;
52631777Sminshall argv++;
52731454Sminshall
52831506Sminshall if (initialize() == -1) {
52931506Sminshall return -1;
53031506Sminshall }
53131506Sminshall
53231454Sminshall /* build the command line */
53331454Sminshall data = data_array;
53431506Sminshall strcpy(data, "TNCOMP SEND");
53531454Sminshall data += strlen(data);
53631777Sminshall while (argc--) {
53731454Sminshall *data++ = ' ';
53831777Sminshall strcpy(data, argv[0]);
53931777Sminshall data += strlen(argv[0]);
54031777Sminshall argv++;
54131454Sminshall }
54231506Sminshall if (verbose) {
54331506Sminshall printf("%s\n", data_array);
54431506Sminshall }
54531506Sminshall if (get_screen() == -1) {
54631506Sminshall return -1;
54731506Sminshall }
54831506Sminshall data_length = strlen(data_array);
54931877Sminshall if ((i = find_input_area(0)) == -1) { /* Get an input area */
55031506Sminshall if (send_key(clear_index) == -1) {
55131506Sminshall return -1;
55231506Sminshall }
55331514Sminshall if ((i = find_input_area(0)) == -1) { /* Try again */
55431506Sminshall fprintf(stderr, "Unable to enter command line.\n");
55531506Sminshall return -1;
55631506Sminshall }
55731506Sminshall }
55838209Sminshall if (putascii(i, data_array, data_length, 0) == -1) {
55931506Sminshall return -1;
56031506Sminshall }
56131506Sminshall if (send_key(enter_index) == -1) {
56231506Sminshall return -1;
56331506Sminshall }
56431506Sminshall do {
56531506Sminshall if (get_screen() == -1) {
56631506Sminshall return -1;
56731506Sminshall }
56831514Sminshall } while (formatted_correct() == -1);
56931454Sminshall
57031506Sminshall do {
57131514Sminshall if (get_screen() == -1) {
57231514Sminshall return -1;
57331514Sminshall }
57431506Sminshall /* For each screen */
57531514Sminshall if (formatted_correct() == -1) {
57631514Sminshall fprintf(stderr, "Bad screen written by host.\n");
57731514Sminshall return -1;
57831514Sminshall }
57931514Sminshall /* If MDT isn't reset in the sequence number, go around again */
58031514Sminshall if (Host[ACK_SEQUENCE-1]&ATTR_MDT) {
58131514Sminshall if (wait_for_ps_or_oia() == -1) {
58231514Sminshall return -1;
58331514Sminshall }
58431514Sminshall continue;
58531514Sminshall }
58631514Sminshall getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH);
58731506Sminshall send_sequence = atoi(a_send_sequence);
58831514Sminshall getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH);
58931506Sminshall checksum = atoi(a_checksum);
59031514Sminshall getascii(DATA, data_array, DATA_LENGTH);
59131506Sminshall data = data_array;
59231506Sminshall if (send_sequence != (ack_sequence+1)) {
59331514Sminshall if (ack() == -1) {
59431514Sminshall return -1;
59531514Sminshall }
59631506Sminshall data = "1234"; /* Keep loop from failing */
59731506Sminshall if (send_key(enter_index) == -1) {
59831506Sminshall return -1;
59931506Sminshall }
60031506Sminshall if (get_screen() == -1) {
60131506Sminshall return -1;
60231506Sminshall }
60331506Sminshall continue;
60431506Sminshall }
60531454Sminshall
60631514Sminshall data_length = DATA_LENGTH;
60731514Sminshall while (data_length && memcmp(data, " EOF", 4)
60831514Sminshall && memcmp(data, " ", 4)) {
60931506Sminshall memcpy(ascii, data, 4);
61031514Sminshall data += 4;
61131514Sminshall data_length -= 4;
61231506Sminshall ascii[4] = 0;
61331506Sminshall input_length = atoi(ascii);
61431514Sminshall /* CMS can't live with zero length records */
61531514Sminshall if ((input_length > 1) ||
61631514Sminshall ((input_length == 1) && (data[0] != ' '))) {
61731506Sminshall if (fwrite(data, sizeof (char),
61831514Sminshall input_length, outfile) == 0) {
61931506Sminshall perror("fwrite");
62031506Sminshall exit(9);
62131506Sminshall }
62231454Sminshall }
62331506Sminshall fprintf(outfile, "\n");
62431506Sminshall data += input_length;
62531506Sminshall data_length -= input_length;
62631454Sminshall }
62731514Sminshall
62831514Sminshall ack_sequence = send_sequence;
62931514Sminshall if (blocks) {
63031514Sminshall printf("#");
63131514Sminshall fflush(stdout);
63231514Sminshall }
63331514Sminshall if (ack() == -1) {
63431506Sminshall return -1;
63531506Sminshall }
63631514Sminshall if (send_key(enter_index) == -1) {
63731506Sminshall return -1;
63831506Sminshall }
63931514Sminshall } while (memcmp(data, " EOF", 4));
64031506Sminshall
64131514Sminshall if (blocks) {
64231514Sminshall printf("\n");
64331514Sminshall }
64431506Sminshall if (terminate() == -1) {
64531506Sminshall return -1;
64631454Sminshall }
64731506Sminshall return 0;
64831454Sminshall }
649