⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tnrecv.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
    disc.rc = disc.function_id = 0;    disc.session_id = session_id;    disc.connectors_task_id = 0;    if (api_disconnect_from_keyboard(&disc) == -1) {	api_perror("api_disconnect_from_keyboard");	return -1;    } else if (verbose) {	printf("Disconnected from keyboard.\n");    }    (void) api_finish();    return 0;}static intget_screen(){    CopyStringParms copy;    /* Time copy services */    wait_for_unlock();    copy.copy_mode = 0;    copy.rc = copy.function_id = 0;    copy.source.session_id = session_id;    copy.source.buffer = 0;    copy.source.characteristics = 0;    copy.source.session_type = TYPE_DFT;    copy.source.begin = 0;    copy.source_end = ScreenSize;    copy.target.session_id = 0;    copy.target.buffer = (char *) &Host[0];    copy.target.characteristics = 0;    copy.target.session_type = TYPE_DFT;    if (api_copy_string(&copy) == -1) {	api_perror("api_copy_string");	return -1;    }    return 0;}put_at(offset, from, length, attribute)int	offset;char	*from;int	length;{    CopyStringParms copy;    wait_for_unlock();    copy.copy_mode = 0;    copy.rc = copy.function_id = 0;    copy.source.session_id = 0;    copy.source.buffer = from;    copy.source.characteristics = 0;    copy.source.session_type = TYPE_DFT;    copy.source.begin = 0;    copy.source_end = length-1;    copy.target.session_id = session_id;    copy.target.buffer = 0;    copy.target.characteristics = 0;    copy.target.session_type = TYPE_DFT;    copy.target.begin = offset;    if (api_copy_string(&copy) == -1) {	api_perror("api_copy_string");	return -1;    }    return 0;}static voidtranslate(input, output, table, length)char *input, *output, table[];int length;{    unsigned char *indices = (unsigned char *) input;    while (length--) {	*output++ = table[*indices++];    }}static intfind_input_area(from)int	from;{#define	FieldDec(p)	(0)		/* We don't really use this */    register int i, attr;    for (i = from; i < MAXSCREENSIZE; ) {	if (IsStartField(i)) {	    attr = FieldAttributes(i);	    i++;	    if (!IsProtectedAttr(i, attr)) {		return i;	    }	} else {	    i++;	}    }    return -1;}static voidgetascii(offset, to, length)int	offset;				/* Where in screen */char	*to;				/* Where it goes to */int	length;				/* Where to put it */{    translate(Host+offset, to, disp_asc, length);}static intputascii(offset, from, length, before)int	offset;				/* Where in screen */char	*from;				/* Where it comes from */int	length;				/* Where to put it */int	before;				/* How much else should go */{    translate(from, Host+offset, asc_disp, length);    if (put_at(offset-before,			(char *) Host+offset-before, length+before) == -1) {	return -1;    }    return 0;}static intack(){    static char ack_blanks[sizeof a_ack_sequence] = {0};    if (ack_blanks[0] == 0) {	int i;	for (i = 0; i < sizeof ack_blanks; i++) {	    ack_blanks[i] = ' ';	}    }    memcpy(a_ack_sequence, ack_blanks, sizeof a_ack_sequence);    sprintf(a_ack_sequence, "%d", ack_sequence);    a_ack_sequence[strlen(a_ack_sequence)] = ' ';    if (putascii(ACK_SEQUENCE, a_ack_sequence, ACK_SEQUENCE_LENGTH, 0) == -1) {	return -1;    }    return 0;}static intformatted_correct(){    if ((find_input_area(SEND_SEQUENCE-1) != SEND_SEQUENCE) ||	    (find_input_area(SEND_SEQUENCE) != ACK_SEQUENCE) ||	    (find_input_area(ACK_SEQUENCE) != CHECKSUM) ||	    (find_input_area(CHECKSUM) != DATA)) {	return -1;    } else {	return 0;    }}main(argc, argv)int	argc;char	*argv[];{    register int i;    int data_length, input_length;    char ascii[8];			/* Lots of room */    FILE *outfile;    char *data;    char *argv0 = argv[0];    argc--;    argv++;    /* Process any flags */    while (argc && (argv[0][0] == '-')) {	switch (argv[0][1]) {	case 'v':	    verbose = 1;	    break;	case 'b':	    blocks = 1;	    break;	}	argc--;	argv++;    }    if ((argc) < 2) {	fprintf(stderr,		"usage: %s [-b] [-v] local.file remote.file [remote.options]\n",			argv0);	exit(1);    }    /* Open the local file */    if ((outfile = fopen(argv[0], "w")) == NULL) {	perror("fopen");	exit(2);    }    argc--;    argv++;    if (initialize() == -1) {	return -1;    }    /* build the command line */    data = data_array;    strcpy(data, "TNCOMP SEND");    data += strlen(data);    while (argc--) {	*data++ = ' ';	strcpy(data, argv[0]);	data += strlen(argv[0]);	argv++;    }    if (verbose) {	printf("%s\n", data_array);    }    if (get_screen() == -1) {	return -1;    }    data_length = strlen(data_array);    if ((i = find_input_area(0)) == -1) {		/* Get an input area */	if (send_key(clear_index) == -1) {	    return -1;	}	if ((i = find_input_area(0)) == -1) {		/* Try again */	    fprintf(stderr, "Unable to enter command line.\n");	    return -1;	}    }    if (putascii(i, data_array, data_length, 0) == -1) {	return -1;    }    if (send_key(enter_index) == -1) {	return -1;    }    do {	if (get_screen() == -1) {	    return -1;	}    } while (formatted_correct() == -1);    do {	if (get_screen() == -1) {	    return -1;	}	/* For each screen */	if (formatted_correct() == -1) {	    fprintf(stderr, "Bad screen written by host.\n");	    return -1;	}	/* If MDT isn't reset in the sequence number, go around again */	if (Host[ACK_SEQUENCE-1]&ATTR_MDT) {	    if (wait_for_ps_or_oia() == -1) {		return -1;	    }	    continue;	}	getascii(SEND_SEQUENCE, a_send_sequence, SEND_SEQUENCE_LENGTH);	send_sequence = atoi(a_send_sequence);	getascii(CHECKSUM, a_checksum, CHECKSUM_LENGTH);	checksum = atoi(a_checksum);	getascii(DATA, data_array, DATA_LENGTH);	data = data_array;	if (send_sequence != (ack_sequence+1)) {	    if (ack() == -1) {		return -1;	    }	    data = "1234";		/* Keep loop from failing */	    if (send_key(enter_index) == -1) {		return -1;	    }	    if (get_screen() == -1) {		return -1;	    }	    continue;	}	data_length = DATA_LENGTH;	while (data_length && memcmp(data, " EOF", 4)						&& memcmp(data, "    ", 4)) {	    memcpy(ascii, data, 4);	    data += 4;	    data_length -= 4;	    ascii[4] = 0;	    input_length = atoi(ascii);	    /* CMS can't live with zero length records */	    if ((input_length > 1) ||			((input_length == 1) && (data[0] != ' '))) {		if (fwrite(data, sizeof (char),					input_length, outfile) == 0) {		    perror("fwrite");		    exit(9);		}	    }	    fprintf(outfile, "\n");	    data += input_length;	    data_length -= input_length;	}	ack_sequence = send_sequence;	if (blocks) {	    printf("#");	    fflush(stdout);	}	if (ack() == -1) {	    return -1;	}	if (send_key(enter_index) == -1) {	    return -1;	}    } while (memcmp(data, " EOF", 4));    if (blocks) {	printf("\n");    }    if (terminate() == -1) {	return -1;    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -