4 void setspeed(int, int);
5 int getspeed(char*, int);
6 void godial(int, int, char*);
12 char msgbuf[128]; /* last message read */
22 typedef struct Msg Msg;
33 { "NO CARRIER", Failure, },
34 { "ERROR", Failure, },
35 { "NO DIALTONE", Failure, },
37 { "NO ANSWER", Failure, },
38 { "CONNECT", Success, },
45 punt("usage: hayes [-p] telno [device]");
49 main(int argc, char **argv)
71 data = open(argv[1], ORDWR);
73 fprint(2, "hayes: %r opening %s\n", argv[1]);
76 cname = malloc(strlen(argv[1])+4);
77 sprint(cname, "%sctl", argv[1]);
78 ctl = open(cname, ORDWR);
84 godial(data, ctl, argv[0]);
91 return write(fd, x, strlen(x));
95 godial(int data, int ctl, char *number)
101 /* get the modem's attention */
102 if(send(data, "\r+++\r") < 0)
103 punt("failed write");
108 if(send(data, "ATZ\r") < 0)
109 punt("failed write");
110 m = readmsg(data, 2);
112 punt("can't get modem's attention");
115 * Q0 = report result codes
116 * V1 = full word result codes
117 * W1 = negotiation progress codes enabled
119 * M1 = speaker on until on-line
121 if(send(data, "ATQ0V1E1M1\r") < 0)
122 punt("failed write");
123 m = readmsg(data, 2);
125 punt("can't get modem's attention");
126 if(send(data, "ATW1\r") < 0)
127 punt("failed write");
132 dialstr = malloc(6+strlen(number));
133 sprint(dialstr, "ATD%c%s\r", pulsed ? 'P' : 'T', number);
134 if(send(data, dialstr) < 0) {
136 punt("failed write");
139 m = readmsg(data, 60);
141 punt("dial failed: %s", msgbuf);
142 baud = getspeed(msgbuf, 9600);
144 fprint(2, "hayes: connected at %d baud\n", baud);
148 * read until we see a message or we time out
151 readmsg(int f, int secs)
160 len = sizeof(msgbuf) - 1;
161 for(start = time(0); time(0) <= start+secs;){
162 if((d = dirfstat(f)) == nil)
170 if(read(f, p, 1) <= 0)
172 if(*p == '\n' || *p == '\r' || len == 0){
174 if(verbose && p != msgbuf)
175 fprint(2, "%s\n", msgbuf);
176 for(pp = msgs; pp->text; pp++)
177 if(strncmp(pp->text, msgbuf, strlen(pp->text))==0)
181 len = sizeof(msgbuf) - 1;
187 strcpy(msgbuf, "No response from modem");
192 * get baud rate from a connect message
195 getspeed(char *msg, int speed)
200 p = msg + sizeof("CONNECT") - 1;
201 while(*p == ' ' || *p == '\t')
211 * set speed and RTS/CTS modem flow control
214 setspeed(int ctl, int baud)
220 sprint(buf, "b%d", baud);
221 write(ctl, buf, strlen(buf));
233 strcpy(buf, "hayes: ");
235 n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;