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