8 faxsend(Modem *m, int argc, char *argv[])
10 int c, count, r, flow;
14 if((r = initfaxmodem(m)) != Eok)
17 /* telco just does the dialing */
23 r = seterror(m, Enoanswer);
33 sleep(1000); /* let the paper catch up */
35 m->valid &= ~(Vfhng|Vfet|Vfpts|Vftsi|Vfdcs);
36 if((r = openfaxfile(m, *argv)) != Eok)
39 verbose("sending geometry");
40 sprint(buf, "AT+FDT=%ld,%ld,%ld,%ld", m->df, m->vr, m->wd, m->ln);
41 if(command(m, buf) != Eok)
43 if(response(m, 20) != Rconnect){
44 r = seterror(m, Eincompatible);
49 * Write the data, stuffing DLE's.
50 * After each bufferfull check if the remote
51 * sent us anything, e.g. CAN to abort.
52 * This also flushes out the ^S/^Q characters
53 * which the driver insists on sending us.
54 * (Could fix the driver, of course...).
56 verbose("sending data");
61 while(count < sizeof(buf)-1){
62 if((c = Bgetc(m->bp)) < 0)
68 verbose("sending %d bytes", count);
69 if(count && write(m->fd, buf, count) < 0){
70 verbose("write failed: %r");
71 r = seterror(m, Esys);
75 * this does really rough flow control since the
76 * avanstar is even worse
78 verbose("flow control");
79 while((r = rawmchar(m, buf)) == Eok || flow){
88 verbose("%c", buf[0]);
89 if(write(m->fd, "\020\003", 2) < 0){
90 r = seterror(m, Esys);
103 verbose("%c", buf[0]);
104 r = seterror(m, Eproto);
115 * End of page, send DLE+ETX,
116 * get OK in response.
118 verbose("sending end of page");
119 if(write(m->fd, "\020\003", 2) < 0){
120 r = seterror(m, Esys);
123 verbose("waiting for OK");
124 if(response(m, 120) != Rok){
125 r = seterror(m, Enoresponse);
130 * Did you hear me? - IT'S THE END OF THE PAGE.
131 * Argument is 0 if more pages to follow.
132 * Should get back an FPTS with an indication
133 * as to whether the page was successfully
134 * transmitted or not.
136 sprint(buf, "AT+FET=%d", argc == 0? 2: 0);
137 if(command(m, buf) != Eok)
139 switch(response(m, 20)){
143 if(m->fhng == 0 && argc == 0)
145 r = seterror(m, Eproto);
148 r = seterror(m, Enoresponse);
152 if((m->valid & Vfpts) == 0 || m->fpts[0] != 1){
153 r = seterror(m, Eproto);