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