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