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

📄 hayes.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>void setspeed(int, int);int getspeed(char*, int);void godial(int, int, char*);int readmsg(int, int);void punt(char*, ...);int pulsed;int verbose;char msgbuf[128];		/* last message read */enum{	Ok,	Success,	Failure,	Noise,};typedef struct Msg	Msg;struct Msg{	char	*text;	int	type;};Msg msgs[] ={	{ "OK",			Ok, },	{ "NO CARRIER", 	Failure, },	{ "ERROR",		Failure, },	{ "NO DIALTONE",	Failure, },	{ "BUSY",		Failure, },	{ "NO ANSWER",		Failure, },	{ "CONNECT",		Success, },	{ 0,			0 },};voidusage(void){	punt("usage: hayes [-p] telno [device]");}voidmain(int argc, char **argv){	int data = -1;	int ctl = -1;	char *cname;	ARGBEGIN{	case 'p':		pulsed = 1;		break;	case 'v':		verbose = 1;		break;	default:		usage();	}ARGEND	switch(argc){	case 1:		data = 1;		break;	case 2:		data = open(argv[1], ORDWR);		if(data < 0){			fprint(2, "hayes: %r opening %s\n", argv[1]);			exits("hayes");		}		cname = malloc(strlen(argv[1])+4);		sprint(cname, "%sctl", argv[1]);		ctl = open(cname, ORDWR);		free(cname);		break;	default:		usage();	}	godial(data, ctl, argv[0]);	exits(0);}intsend(int fd, char *x){	return write(fd, x, strlen(x));}voidgodial(int data, int ctl, char *number){	char *dialstr;	int m;	int baud;	/* get the modem's attention */	if(send(data, "\r+++\r") < 0)		punt("failed write");	readmsg(data, 2);	sleep(1000);	/* initialize */	if(send(data, "ATZ\r") < 0)		punt("failed write");	m = readmsg(data, 2);	if(m < 0)		punt("can't get modem's attention");	/*	 *	Q0 = report result codes	 * 	V1 = full word result codes	 *	W1 = negotiation progress codes enabled	 *	E1 = echo commands	 *	M1 = speaker on until on-line	 */	if(send(data, "ATQ0V1E1M1\r") < 0)		punt("failed write");	m = readmsg(data, 2);	if(m != Ok)		punt("can't get modem's attention");	if(send(data, "ATW1\r") < 0)		punt("failed write");	readmsg(data, 2);	sleep(1000);	/* godial */	dialstr = malloc(6+strlen(number));	sprint(dialstr, "ATD%c%s\r", pulsed ? 'P' : 'T', number);	if(send(data, dialstr) < 0) {		free(dialstr);		punt("failed write");	}	free(dialstr);	m = readmsg(data, 60);	if(m != Success)		punt("dial failed: %s", msgbuf);	baud = getspeed(msgbuf, 9600);	setspeed(ctl, baud);	fprint(2, "hayes: connected at %d baud\n", baud);}/* *  read until we see a message or we time out */intreadmsg(int f, int secs){	ulong start;	char *p;	int len;	Dir *d;	Msg *pp;	p = msgbuf;	len = sizeof(msgbuf) - 1;	for(start = time(0); time(0) <= start+secs;){		if((d = dirfstat(f)) == nil)			punt("failed read");		if(d->length == 0){			free(d);			sleep(100);			continue;		}		free(d);		if(read(f, p, 1) <= 0)			punt("failed read");		if(*p == '\n' || *p == '\r' || len == 0){			*p = 0;			if(verbose && p != msgbuf)				fprint(2, "%s\n", msgbuf);			for(pp = msgs; pp->text; pp++)				if(strncmp(pp->text, msgbuf, strlen(pp->text))==0)					return pp->type;			start = time(0);			p = msgbuf;			len = sizeof(msgbuf) - 1;			continue;		}		len--;		p++;	}	strcpy(msgbuf, "No response from modem");	return Noise;}/* *  get baud rate from a connect message */intgetspeed(char *msg, int speed){	char *p;	int s;	p = msg + sizeof("CONNECT") - 1;	while(*p == ' ' || *p == '\t')		p++;	s = atoi(p);	if(s <= 0)		return speed;	else		return s;}/* *  set speed and RTS/CTS modem flow control */voidsetspeed(int ctl, int baud){	char buf[32];	if(ctl < 0)		return;	sprint(buf, "b%d", baud);	write(ctl, buf, strlen(buf));	write(ctl, "m1", 2);}voidpunt(char *fmt, ...){	char buf[256];	va_list arg;	int n;	strcpy(buf, "hayes: ");	va_start(arg, fmt);	n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;	va_end(arg);	buf[n] = '\n';	write(2, buf, n+1);	exits("hayes");}

⌨️ 快捷键说明

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