xref: /plan9/sys/src/cmd/fax/fax2modem.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 
5 #include "modem.h"
6 
7 int
initfaxmodem(Modem * m)8 initfaxmodem(Modem *m)
9 {
10 	m->fax = 1;
11 	m->phase = 'A';
12 	m->valid = 0;
13 
14 	return Eok;
15 }
16 
17 static int
parameters(long a[],char * s)18 parameters(long a[], char *s)
19 {
20 	char *p;
21 	int i;
22 
23 	i = 0;
24 	if((p = strchr(s, ':')) == 0)
25 		return 0;
26 	p++;
27 	while(s = strchr(p, ',')){
28 		a[i++] = strtol(p, 0, 10);
29 		p = s+1;
30 	}
31 	if(p)
32 		a[i++] = strtol(p, 0, 10);
33 
34 	return i;
35 }
36 
37 int
fcon(Modem * m)38 fcon(Modem *m)
39 {
40 	verbose("fcon: %s", m->response);
41 	if(m->fax == 0 || m->phase != 'A')
42 		return Rrerror;
43 	m->phase = 'B';
44 	return Rcontinue;
45 }
46 
47 int
ftsi(Modem * m)48 ftsi(Modem *m)
49 {
50 	char *p, *q;
51 
52 	verbose("ftsi: %s", m->response);
53 	if((p = strchr(m->response, '"')) == 0 || (q = strrchr(p+1, '"')) == 0)
54 		return Rrerror;
55 	while(*++p == ' ')
56 		;
57 	*q = 0;
58 	if((m->valid &  Vftsi) == 0){
59 		strncpy(m->ftsi, p, sizeof(m->ftsi)-1);
60 		m->valid |= Vftsi;
61 	}
62 	return Rcontinue;
63 }
64 
65 int
fdcs(Modem * m)66 fdcs(Modem *m)
67 {
68 	verbose("fdcs: %s", m->response);
69 	parameters(m->fdcs, m->response);
70 	m->valid |= Vfdcs;
71 	return Rcontinue;
72 }
73 
74 int
fcfr(Modem * m)75 fcfr(Modem *m)
76 {
77 	verbose("fcfr: %s", m->response);
78 	if(m->fax == 0)
79 		return Rrerror;
80 	/* ???? */
81 	return Rcontinue;
82 }
83 
84 int
fpts(Modem * m)85 fpts(Modem *m)
86 {
87 	verbose("fpts: %s", m->response);
88 	if(m->fax == 0)
89 		return Rrerror;
90 	parameters(m->fpts, m->response);
91 	m->valid |= Vfpts;
92 	return Rcontinue;
93 }
94 
95 int
fet(Modem * m)96 fet(Modem *m)
97 {
98 	char *p;
99 
100 	verbose("fet: %s", m->response);
101 	if(m->fax == 0 || (p = strchr(m->response, ':')) == 0)
102 		return Rrerror;
103 	m->fet = strtol(p+1, 0, 10);
104 	m->valid |= Vfet;
105 	return Rcontinue;
106 }
107 
108 int
fhng(Modem * m)109 fhng(Modem *m)
110 {
111 	char *p;
112 
113 	verbose("fhng: %s", m->response);
114 	if(m->fax == 0 || (p = strchr(m->response, ':')) == 0)
115 		return Rrerror;
116 	m->fhng = strtol(p+1, 0, 10);
117 	m->valid |= Vfhng;
118 	return Rhangup;
119 }
120