xref: /plan9/sys/src/cmd/fax/file.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <bio.h>
4*219b2ee8SDavid du Colombier 
5*219b2ee8SDavid du Colombier #include "modem.h"
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier static long wd[5] = {
8*219b2ee8SDavid du Colombier 	1728, 2048, 2432, 1216, 864
9*219b2ee8SDavid du Colombier };
10*219b2ee8SDavid du Colombier 
11*219b2ee8SDavid du Colombier void
12*219b2ee8SDavid du Colombier setpageid(char *pageid, char *spool, long time, int pid, int pageno)
13*219b2ee8SDavid du Colombier {
14*219b2ee8SDavid du Colombier 	sprint(pageid, "%s/%lud.%d.%3.3d", spool, time, pid, pageno);
15*219b2ee8SDavid du Colombier }
16*219b2ee8SDavid du Colombier 
17*219b2ee8SDavid du Colombier int
18*219b2ee8SDavid du Colombier createfaxfile(Modem *m, char *spool)
19*219b2ee8SDavid du Colombier {
20*219b2ee8SDavid du Colombier 	setpageid(m->pageid, spool, m->time, m->pid, m->pageno);
21*219b2ee8SDavid du Colombier 	verbose("openfaxfile: %s", m->pageid);
22*219b2ee8SDavid du Colombier 	if((m->pagefd = create(m->pageid, OTRUNC|OWRITE, 0666)) < 0)
23*219b2ee8SDavid du Colombier 		return seterror(m, Esys);
24*219b2ee8SDavid du Colombier 
25*219b2ee8SDavid du Colombier 	fprint(m->pagefd, "TYPE=ccitt-g31\n");
26*219b2ee8SDavid du Colombier 	fprint(m->pagefd, "WINDOW=0 0 %d -1\n", wd[m->fdcs[2]]);
27*219b2ee8SDavid du Colombier 	if(m->valid & Vftsi)
28*219b2ee8SDavid du Colombier 		fprint(m->pagefd, "FTSI=%s\n", m->ftsi);
29*219b2ee8SDavid du Colombier 	fprint(m->pagefd, "FDCS=%lud,%lud,%lud,%lud,%lud,%lud,%lud,%lud\n",
30*219b2ee8SDavid du Colombier 		m->fdcs[0], m->fdcs[1], m->fdcs[2], m->fdcs[3],
31*219b2ee8SDavid du Colombier 		m->fdcs[4], m->fdcs[5], m->fdcs[6], m->fdcs[7]);
32*219b2ee8SDavid du Colombier 	fprint(m->pagefd, "\n");
33*219b2ee8SDavid du Colombier 
34*219b2ee8SDavid du Colombier 	return Eok;
35*219b2ee8SDavid du Colombier }
36*219b2ee8SDavid du Colombier 
37*219b2ee8SDavid du Colombier enum
38*219b2ee8SDavid du Colombier {
39*219b2ee8SDavid du Colombier 	Gshdrsize=	0x40,
40*219b2ee8SDavid du Colombier };
41*219b2ee8SDavid du Colombier 
42*219b2ee8SDavid du Colombier int
43*219b2ee8SDavid du Colombier gsopen(Modem *m)
44*219b2ee8SDavid du Colombier {
45*219b2ee8SDavid du Colombier 	int n;
46*219b2ee8SDavid du Colombier 	char bytes[Gshdrsize];
47*219b2ee8SDavid du Colombier 
48*219b2ee8SDavid du Colombier 	/*
49*219b2ee8SDavid du Colombier 	 *  Is this gs output
50*219b2ee8SDavid du Colombier 	 */
51*219b2ee8SDavid du Colombier 	n = Bread(m->bp, bytes, Gshdrsize);
52*219b2ee8SDavid du Colombier 	if(n != Gshdrsize)
53*219b2ee8SDavid du Colombier 		return seterror(m, Esys);
54*219b2ee8SDavid du Colombier 	if(bytes[0]!='\0' || strcmp(bytes+1, "PC Research, Inc")!=0){
55*219b2ee8SDavid du Colombier 		Bseek(m->bp, 0, 0);
56*219b2ee8SDavid du Colombier 		return seterror(m, Esys);
57*219b2ee8SDavid du Colombier 	}
58*219b2ee8SDavid du Colombier 
59*219b2ee8SDavid du Colombier 	m->valid |= Vtype;
60*219b2ee8SDavid du Colombier 	if(bytes[0x1d])
61*219b2ee8SDavid du Colombier 		m->vr = 1;
62*219b2ee8SDavid du Colombier 	else
63*219b2ee8SDavid du Colombier 		m->vr = 0;
64*219b2ee8SDavid du Colombier 	m->wd = 0;
65*219b2ee8SDavid du Colombier 	m->ln = 2;
66*219b2ee8SDavid du Colombier 	m->df = 0;
67*219b2ee8SDavid du Colombier 	return Eok;
68*219b2ee8SDavid du Colombier }
69*219b2ee8SDavid du Colombier 
70*219b2ee8SDavid du Colombier int
71*219b2ee8SDavid du Colombier picopen(Modem *m)
72*219b2ee8SDavid du Colombier {
73*219b2ee8SDavid du Colombier 	char *p, *q;
74*219b2ee8SDavid du Colombier 	int i, x;
75*219b2ee8SDavid du Colombier 
76*219b2ee8SDavid du Colombier 	/*
77*219b2ee8SDavid du Colombier 	 * Look at the header. Every page should have a valid type.
78*219b2ee8SDavid du Colombier 	 * The first page should have WINDOW.
79*219b2ee8SDavid du Colombier 	 */
80*219b2ee8SDavid du Colombier 	while(p = Brdline(m->bp, '\n')){
81*219b2ee8SDavid du Colombier 		if(BLINELEN(m->bp) == 1)
82*219b2ee8SDavid du Colombier 			break;
83*219b2ee8SDavid du Colombier 		p[BLINELEN(m->bp)-1] = 0;
84*219b2ee8SDavid du Colombier 
85*219b2ee8SDavid du Colombier 		verbose("openfaxfile: %s", p);
86*219b2ee8SDavid du Colombier 		if(strcmp("TYPE=ccitt-g31", p) == 0)
87*219b2ee8SDavid du Colombier 			m->valid |= Vtype;
88*219b2ee8SDavid du Colombier 		/*
89*219b2ee8SDavid du Colombier 		else if(m->pageno == 1 && strncmp("PHONE=", p, 6) == 0){
90*219b2ee8SDavid du Colombier 			strcpy(m->number, p+6);
91*219b2ee8SDavid du Colombier 			m->valid |= Vphone;
92*219b2ee8SDavid du Colombier 		}
93*219b2ee8SDavid du Colombier 		 */
94*219b2ee8SDavid du Colombier 		else if(m->pageno == 1 && strncmp("WINDOW=", p, 7) == 0){
95*219b2ee8SDavid du Colombier 			p += 7;
96*219b2ee8SDavid du Colombier 			verbose("openfaxfile: WINDOW: %s", p);
97*219b2ee8SDavid du Colombier 			for(i = 0; i < 4; i++){
98*219b2ee8SDavid du Colombier 				x = strtol(p, &q, 10);
99*219b2ee8SDavid du Colombier 				if(i == 2)
100*219b2ee8SDavid du Colombier 					m->wd = x;
101*219b2ee8SDavid du Colombier 				if((p = q) == 0){
102*219b2ee8SDavid du Colombier 					Bterm(m->bp);
103*219b2ee8SDavid du Colombier 					return seterror(m, Eproto);
104*219b2ee8SDavid du Colombier 				}
105*219b2ee8SDavid du Colombier 			}
106*219b2ee8SDavid du Colombier 			for(i = 0; i < 5; i++){
107*219b2ee8SDavid du Colombier 				if(m->wd == wd[i]){
108*219b2ee8SDavid du Colombier 					m->wd = i;
109*219b2ee8SDavid du Colombier 					m->valid |= Vwd;
110*219b2ee8SDavid du Colombier 					break;
111*219b2ee8SDavid du Colombier 				}
112*219b2ee8SDavid du Colombier 			}
113*219b2ee8SDavid du Colombier 			if((m->valid & Vwd) == 0){
114*219b2ee8SDavid du Colombier 				Bterm(m->bp);
115*219b2ee8SDavid du Colombier 				return seterror(m, Eproto);
116*219b2ee8SDavid du Colombier 			}
117*219b2ee8SDavid du Colombier 		}
118*219b2ee8SDavid du Colombier 		else if(m->pageno == 1 && strncmp("FDCS=", p, 5) == 0){
119*219b2ee8SDavid du Colombier 			p += 5;
120*219b2ee8SDavid du Colombier 			m->df = m->vr = m->wd = 0;
121*219b2ee8SDavid du Colombier 			m->ln = 2;
122*219b2ee8SDavid du Colombier 			for(i = 0; i < 5; i++){
123*219b2ee8SDavid du Colombier 				x = strtol(p, &q, 10);
124*219b2ee8SDavid du Colombier 				switch(i){
125*219b2ee8SDavid du Colombier 				case 0:
126*219b2ee8SDavid du Colombier 					m->vr = x;
127*219b2ee8SDavid du Colombier 					break;
128*219b2ee8SDavid du Colombier 				case 3:
129*219b2ee8SDavid du Colombier 					m->ln = x;
130*219b2ee8SDavid du Colombier 					break;
131*219b2ee8SDavid du Colombier 				case 4:
132*219b2ee8SDavid du Colombier 					m->df = x;
133*219b2ee8SDavid du Colombier 					break;
134*219b2ee8SDavid du Colombier 				}
135*219b2ee8SDavid du Colombier 				if((p = q) == 0){
136*219b2ee8SDavid du Colombier 					Bterm(m->bp);
137*219b2ee8SDavid du Colombier 					return seterror(m, Eproto);
138*219b2ee8SDavid du Colombier 				}
139*219b2ee8SDavid du Colombier 				if(*p++ != ',')
140*219b2ee8SDavid du Colombier 					break;
141*219b2ee8SDavid du Colombier 			}
142*219b2ee8SDavid du Colombier 		}
143*219b2ee8SDavid du Colombier 	}
144*219b2ee8SDavid du Colombier 
145*219b2ee8SDavid du Colombier 	verbose("openfaxfile: valid #%4.4ux", m->valid);
146*219b2ee8SDavid du Colombier 	if((m->valid & (Vtype|Vwd)) != (Vtype|Vwd)){
147*219b2ee8SDavid du Colombier 		Bterm(m->bp);
148*219b2ee8SDavid du Colombier 		return seterror(m, Eproto);
149*219b2ee8SDavid du Colombier 	}
150*219b2ee8SDavid du Colombier 
151*219b2ee8SDavid du Colombier 	return Eok;
152*219b2ee8SDavid du Colombier }
153*219b2ee8SDavid du Colombier 
154*219b2ee8SDavid du Colombier int
155*219b2ee8SDavid du Colombier openfaxfile(Modem *m, char *file)
156*219b2ee8SDavid du Colombier {
157*219b2ee8SDavid du Colombier 	if((m->bp = Bopen(file, OREAD)) == 0)
158*219b2ee8SDavid du Colombier 		return seterror(m, Esys);
159*219b2ee8SDavid du Colombier 	m->valid &= ~(Vtype);
160*219b2ee8SDavid du Colombier 
161*219b2ee8SDavid du Colombier 	if(gsopen(m) == Eok)
162*219b2ee8SDavid du Colombier 		return Eok;
163*219b2ee8SDavid du Colombier 	return picopen(m);
164*219b2ee8SDavid du Colombier }
165