xref: /plan9/sys/src/cmd/fax/file.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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