file.c 3.0 KB

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