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