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

📄 cmd.c

📁 通讯程序源码
💻 C
字号:
/* * Pcomm script commands.  Since these will be executed from a forked * shell script, the commands, queries, and responses are sent thru an * IPC channel to Pcomm. */#include <stdio.h>#include <curses.h>#include "cmd.h"#include "config.h"#include "dial_dir.h"#include "extrnl.h"#include "modem.h"#include "param.h"#include "status.h"#include "xmodem.h"static void send_reply(), do_xfer(), cmode(), tmode();voidcmd_input(){	extern int fd;	int cmd, arg1, i, n, ret_code;	char buf[256], *s, arg2[256], *strchr(), *str_rep();	char *entry, *strtok(), ld_code;	void hang_up(), line_set(), pexit(), screen_dump();	if (ipc_read(status->cmd_ipc, buf, 256))		return;					/* parse the comand line */	if (sscanf(buf, "%d %d %s\n", &cmd, &arg1, arg2) != 3)		return;	ret_code = 0;	switch(cmd) {		case SET:		/* the SET command */			switch(arg1) {				case BAUD:						dir->baud[0] = (unsigned int) atoi(arg2);					line_set();					break;				case PARITY:					dir->parity[0] = arg2[0];					line_set();					break;				case DATA_BITS:					dir->data_bits[0] = atoi(arg2);					line_set();					break;				case STOP_BITS:					dir->stop_bits[0] = atoi(arg2);					line_set();					break;				case DUPLEX:					dir->duplex[0] = arg2[0];					line_set();					break;				case AUX:					dir->aux[0] = str_rep(dir->aux[0], arg2);					break;				case HOT_KEY:					param->hot_key = atoi(arg2);					break;				case ASCII_HOT:					param->ascii_hot = str_rep(param->ascii_hot, arg2);					break;				case FLOW_CTRL:					param->flow_ctrl = str_rep(param->flow_ctrl, arg2);					break;				case CR_IN:						param->cr_in = str_rep(param->cr_in, arg2);					break;				case CR_OUT:					param->cr_out = str_rep(param->cr_out, arg2);					break;				case LOGFILE:					param->logfile = str_rep(param->logfile, arg2);					break;				case DUMPFILE:					param->dumpfile = str_rep(param->dumpfile, arg2);					break;				case STRIP:						param->strip = str_rep(param->strip, arg2);					break;				case LOCAL_ECHO:						param->local_echo = str_rep(param->local_echo, arg2);					break;				case EXPAND:					param->expand = str_rep(param->expand, arg2);					break;				case CR_DELAY:					param->cr_delay = atoi(arg2);					break;				case PACE:					param->pace = str_rep(param->pace, arg2);					break;				case CR_UP:					param->cr_up = str_rep(param->cr_up, arg2);					break;				case LF_UP:					param->lf_up = str_rep(param->lf_up, arg2);					break;				case TIMER:					param->timer = atoi(arg2);					break;				case CR_DN:					param->cr_dn = str_rep(param->cr_dn, arg2);					break;				case LF_DN:						param->lf_dn = str_rep(param->lf_dn, arg2);					break;				default:					break;			}			break;		case QUERY:		/* the QUERY commands */			switch(arg1) {				case TTY_NAME:					if (modem->t_cur != -1)						send_reply(modem->tty[modem->t_cur]);					else						send_reply("NONE");					ret_code = 99;					break;				case MODEM_NAME:					if (modem->m_cur != -1)						send_reply(modem->mname[modem->m_cur]);					else						send_reply("NONE");					ret_code = 99;					break;				default:					break;			}			break;		case IF:		/* the IF commands */			switch(arg1) {				case CONNECTED:					if (status->connected)						ret_code = 1;					break;				case LOG_STATUS:					if (status->log_status)						ret_code = 1;					break;				case PRINTER_STATUS:					if (status->print_status)						ret_code = 1;					break;				default:					break;			}			break;		case DIAL:			cmode();			ld_code = '\0';			s = arg2;			if (strchr("+-@#", *s)) {				ld_code = *s;				s++;			}			if (arg1 == 1) {	/* manual dial */				dir->name[0] = str_rep(dir->number[0], s);				dir->number[0] = str_rep(dir->number[0], s);				dir->d_cur = 0;				dir->q_num[0] = 0;			}			else {				n = atoi(s);				if (n == 0 || n > NUM_DIR) {					tmode();					break;				}				dir->d_cur = n;				dir->q_num[0] = n;			}			dir->q_ld[0] = ld_code;			dir->q_num[1] = -1;			ret_code = dial_win(1);			tmode();			break;		case REDIAL:			cmode();			entry = strtok(arg2, " ");			for (i=0; i<NUM_QUEUE; i++) {				if (entry == NULL) {					dir->q_num[i] = -1;					break;				}				ld_code = '\0';				if (strchr("+-@#", *entry)) {					ld_code = *entry;					entry++;				}				n = atoi(entry);				if (n > NUM_DIR || *dir->number[n] == '\0')					continue;				dir->q_ld[i] = ld_code;				dir->q_num[i] = n;				entry = strtok((char *) NULL, " \t");			}			ret_code = dial_win(10);			tmode();			break;		case EXIT:			pexit();			break;		case CLEAR_SCREEN:			fixterm();			erase();			refresh();			resetterm();			break;		case CHG_DIR:			chdir(arg2);			break;		case HANG_UP:			hang_up(QUIET);			break;		case PRINTER:			status->print_status = arg1;			break;		case MODEM_BREAK:			tty_break(fd);			break;		case SEND:			do_xfer(arg1, UP_LOAD, arg2);			break;		case RECEIVE:			do_xfer(arg1, DOWN_LOAD, arg2);			break;		case SCREEN_DUMP:			screen_dump();			break;		case DATA_LOG:			status->log_status = arg1;			break;		default:			break;	}	if (ret_code != 99) {		sprintf(buf, "%d", ret_code);		send_reply(buf);	}	return;}/* * Send a string back to pcomm_cmd */static voidsend_reply(s)char *s;{	char buf[256];	sprintf(buf, "%254.254s\n", s);	if (ipc_write(status->cmd_ipc, buf, 256))		fprintf(stderr, "Can't write to IPC\n");	return;}/* * Put the screen in the "curses" mode */static voidcmode(){	void load_vs(), st_line();	fixterm();	load_vs();	st_line("");	return;}/* * Put the screen in the "terminal" mode */static voidtmode(){	extern int fd;	void term_mode();	if (fd != -1) {		touchwin(stdscr);		refresh();	}	resetterm();	term_mode();	return;}/* * Do the file transfers */static voiddo_xfer(type, up, files)int type, up;char *files;{	int n, is_batch, num_extrnl;	char buf[256], *strcpy(), *strcat();	void xfer_win(), xfer_ascii(), do_extrnl();	num_extrnl = (up == UP_LOAD) ? extrnl->up_entries : extrnl->dn_entries;		is_batch = 0;	switch(type) {		case MODEM7:		case YMODEM:		case YMODEM_G:		/* built-in batch protocols */			is_batch++;			/* FALLTHRU */		case XMODEM:		case XMODEM_1k:		/* non-batch built-ins */			cmode();			if (up == UP_LOAD || !is_batch)				xfer_win(files, up, type);			else				xfer_win("", up, type);			tmode();			break;		case XASCII:		/* ascii xfer, yuck! */			xfer_ascii(files, up);			break;		case EXT_1:		case EXT_2:		case EXT_3:		/* one of the externals */			n = type -NUM_INTERNAL -1;			if (n > num_extrnl)				break;			strcpy(buf, extrnl->command[up][n]);					/* see if we need to add files */			if (extrnl->prompt[up][n] == 'Y') {				strcat(buf, " ");				strcat(buf, files);			}			do_extrnl(buf);			break;		default:			break;	}	return;}

⌨️ 快捷键说明

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