1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier
5219b2ee8SDavid du Colombier #include "modem.h"
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier static long wd[5] = {
8219b2ee8SDavid du Colombier 1728, 2048, 2432, 1216, 864
9219b2ee8SDavid du Colombier };
10219b2ee8SDavid du Colombier
11219b2ee8SDavid du Colombier void
setpageid(char * pageid,char * spool,long time,int pid,int pageno)12219b2ee8SDavid du Colombier setpageid(char *pageid, char *spool, long time, int pid, int pageno)
13219b2ee8SDavid du Colombier {
14219b2ee8SDavid du Colombier sprint(pageid, "%s/%lud.%d.%3.3d", spool, time, pid, pageno);
15219b2ee8SDavid du Colombier }
16219b2ee8SDavid du Colombier
17219b2ee8SDavid du Colombier int
createfaxfile(Modem * m,char * spool)18219b2ee8SDavid du Colombier createfaxfile(Modem *m, char *spool)
19219b2ee8SDavid du Colombier {
20219b2ee8SDavid du Colombier setpageid(m->pageid, spool, m->time, m->pid, m->pageno);
21219b2ee8SDavid du Colombier verbose("openfaxfile: %s", m->pageid);
22219b2ee8SDavid du Colombier if((m->pagefd = create(m->pageid, OTRUNC|OWRITE, 0666)) < 0)
23219b2ee8SDavid du Colombier return seterror(m, Esys);
24219b2ee8SDavid du Colombier
25219b2ee8SDavid du Colombier fprint(m->pagefd, "TYPE=ccitt-g31\n");
26*7dd7cddfSDavid du Colombier fprint(m->pagefd, "WINDOW=0 0 %ld -1\n", wd[m->fdcs[2]]);
27219b2ee8SDavid du Colombier if(m->valid & Vftsi)
28219b2ee8SDavid du Colombier fprint(m->pagefd, "FTSI=%s\n", m->ftsi);
29219b2ee8SDavid du Colombier fprint(m->pagefd, "FDCS=%lud,%lud,%lud,%lud,%lud,%lud,%lud,%lud\n",
30219b2ee8SDavid du Colombier m->fdcs[0], m->fdcs[1], m->fdcs[2], m->fdcs[3],
31219b2ee8SDavid du Colombier m->fdcs[4], m->fdcs[5], m->fdcs[6], m->fdcs[7]);
32219b2ee8SDavid du Colombier fprint(m->pagefd, "\n");
33219b2ee8SDavid du Colombier
34219b2ee8SDavid du Colombier return Eok;
35219b2ee8SDavid du Colombier }
36219b2ee8SDavid du Colombier
37219b2ee8SDavid du Colombier enum
38219b2ee8SDavid du Colombier {
39219b2ee8SDavid du Colombier Gshdrsize= 0x40,
40219b2ee8SDavid du Colombier };
41219b2ee8SDavid du Colombier
42219b2ee8SDavid du Colombier int
gsopen(Modem * m)43219b2ee8SDavid du Colombier gsopen(Modem *m)
44219b2ee8SDavid du Colombier {
45219b2ee8SDavid du Colombier int n;
46219b2ee8SDavid du Colombier char bytes[Gshdrsize];
47219b2ee8SDavid du Colombier
48219b2ee8SDavid du Colombier /*
49219b2ee8SDavid du Colombier * Is this gs output
50219b2ee8SDavid du Colombier */
51219b2ee8SDavid du Colombier n = Bread(m->bp, bytes, Gshdrsize);
52219b2ee8SDavid du Colombier if(n != Gshdrsize)
53219b2ee8SDavid du Colombier return seterror(m, Esys);
54219b2ee8SDavid du Colombier if(bytes[0]!='\0' || strcmp(bytes+1, "PC Research, Inc")!=0){
55219b2ee8SDavid du Colombier Bseek(m->bp, 0, 0);
56219b2ee8SDavid du Colombier return seterror(m, Esys);
57219b2ee8SDavid du Colombier }
58219b2ee8SDavid du Colombier
59219b2ee8SDavid du Colombier m->valid |= Vtype;
60219b2ee8SDavid du Colombier if(bytes[0x1d])
61219b2ee8SDavid du Colombier m->vr = 1;
62219b2ee8SDavid du Colombier else
63219b2ee8SDavid du Colombier m->vr = 0;
64219b2ee8SDavid du Colombier m->wd = 0;
65219b2ee8SDavid du Colombier m->ln = 2;
66219b2ee8SDavid du Colombier m->df = 0;
67219b2ee8SDavid du Colombier return Eok;
68219b2ee8SDavid du Colombier }
69219b2ee8SDavid du Colombier
70219b2ee8SDavid du Colombier int
picopen(Modem * m)71219b2ee8SDavid du Colombier picopen(Modem *m)
72219b2ee8SDavid du Colombier {
73219b2ee8SDavid du Colombier char *p, *q;
74219b2ee8SDavid du Colombier int i, x;
75219b2ee8SDavid du Colombier
76219b2ee8SDavid du Colombier /*
77219b2ee8SDavid du Colombier * Look at the header. Every page should have a valid type.
78219b2ee8SDavid du Colombier * The first page should have WINDOW.
79219b2ee8SDavid du Colombier */
80219b2ee8SDavid du Colombier while(p = Brdline(m->bp, '\n')){
81*7dd7cddfSDavid du Colombier if(Blinelen(m->bp) == 1)
82219b2ee8SDavid du Colombier break;
83*7dd7cddfSDavid du Colombier p[Blinelen(m->bp)-1] = 0;
84219b2ee8SDavid du Colombier
85219b2ee8SDavid du Colombier verbose("openfaxfile: %s", p);
86219b2ee8SDavid du Colombier if(strcmp("TYPE=ccitt-g31", p) == 0)
87219b2ee8SDavid du Colombier m->valid |= Vtype;
88219b2ee8SDavid du Colombier /*
89219b2ee8SDavid du Colombier else if(m->pageno == 1 && strncmp("PHONE=", p, 6) == 0){
90219b2ee8SDavid du Colombier strcpy(m->number, p+6);
91219b2ee8SDavid du Colombier m->valid |= Vphone;
92219b2ee8SDavid du Colombier }
93219b2ee8SDavid du Colombier */
94219b2ee8SDavid du Colombier else if(m->pageno == 1 && strncmp("WINDOW=", p, 7) == 0){
95219b2ee8SDavid du Colombier p += 7;
96219b2ee8SDavid du Colombier verbose("openfaxfile: WINDOW: %s", p);
97219b2ee8SDavid du Colombier for(i = 0; i < 4; i++){
98219b2ee8SDavid du Colombier x = strtol(p, &q, 10);
99219b2ee8SDavid du Colombier if(i == 2)
100219b2ee8SDavid du Colombier m->wd = x;
101219b2ee8SDavid du Colombier if((p = q) == 0){
102219b2ee8SDavid du Colombier Bterm(m->bp);
103219b2ee8SDavid du Colombier return seterror(m, Eproto);
104219b2ee8SDavid du Colombier }
105219b2ee8SDavid du Colombier }
106219b2ee8SDavid du Colombier for(i = 0; i < 5; i++){
107219b2ee8SDavid du Colombier if(m->wd == wd[i]){
108219b2ee8SDavid du Colombier m->wd = i;
109219b2ee8SDavid du Colombier m->valid |= Vwd;
110219b2ee8SDavid du Colombier break;
111219b2ee8SDavid du Colombier }
112219b2ee8SDavid du Colombier }
113219b2ee8SDavid du Colombier if((m->valid & Vwd) == 0){
114219b2ee8SDavid du Colombier Bterm(m->bp);
115219b2ee8SDavid du Colombier return seterror(m, Eproto);
116219b2ee8SDavid du Colombier }
117219b2ee8SDavid du Colombier }
118219b2ee8SDavid du Colombier else if(m->pageno == 1 && strncmp("FDCS=", p, 5) == 0){
119219b2ee8SDavid du Colombier p += 5;
120219b2ee8SDavid du Colombier m->df = m->vr = m->wd = 0;
121219b2ee8SDavid du Colombier m->ln = 2;
122219b2ee8SDavid du Colombier for(i = 0; i < 5; i++){
123219b2ee8SDavid du Colombier x = strtol(p, &q, 10);
124219b2ee8SDavid du Colombier switch(i){
125219b2ee8SDavid du Colombier case 0:
126219b2ee8SDavid du Colombier m->vr = x;
127219b2ee8SDavid du Colombier break;
128219b2ee8SDavid du Colombier case 3:
129219b2ee8SDavid du Colombier m->ln = x;
130219b2ee8SDavid du Colombier break;
131219b2ee8SDavid du Colombier case 4:
132219b2ee8SDavid du Colombier m->df = x;
133219b2ee8SDavid du Colombier break;
134219b2ee8SDavid du Colombier }
135219b2ee8SDavid du Colombier if((p = q) == 0){
136219b2ee8SDavid du Colombier Bterm(m->bp);
137219b2ee8SDavid du Colombier return seterror(m, Eproto);
138219b2ee8SDavid du Colombier }
139219b2ee8SDavid du Colombier if(*p++ != ',')
140219b2ee8SDavid du Colombier break;
141219b2ee8SDavid du Colombier }
142219b2ee8SDavid du Colombier }
143219b2ee8SDavid du Colombier }
144219b2ee8SDavid du Colombier
145219b2ee8SDavid du Colombier verbose("openfaxfile: valid #%4.4ux", m->valid);
146219b2ee8SDavid du Colombier if((m->valid & (Vtype|Vwd)) != (Vtype|Vwd)){
147219b2ee8SDavid du Colombier Bterm(m->bp);
148219b2ee8SDavid du Colombier return seterror(m, Eproto);
149219b2ee8SDavid du Colombier }
150219b2ee8SDavid du Colombier
151219b2ee8SDavid du Colombier return Eok;
152219b2ee8SDavid du Colombier }
153219b2ee8SDavid du Colombier
154219b2ee8SDavid du Colombier int
openfaxfile(Modem * m,char * file)155219b2ee8SDavid du Colombier openfaxfile(Modem *m, char *file)
156219b2ee8SDavid du Colombier {
157219b2ee8SDavid du Colombier if((m->bp = Bopen(file, OREAD)) == 0)
158219b2ee8SDavid du Colombier return seterror(m, Esys);
159219b2ee8SDavid du Colombier m->valid &= ~(Vtype);
160219b2ee8SDavid du Colombier
161219b2ee8SDavid du Colombier if(gsopen(m) == Eok)
162219b2ee8SDavid du Colombier return Eok;
163219b2ee8SDavid du Colombier return picopen(m);
164219b2ee8SDavid du Colombier }
165