binit.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. static Biobufhdr* wbufs[20];
  5. static int atexitflag;
  6. static
  7. void
  8. batexit(void)
  9. {
  10. Biobufhdr *bp;
  11. int i;
  12. for(i=0; i<nelem(wbufs); i++) {
  13. bp = wbufs[i];
  14. if(bp != 0) {
  15. wbufs[i] = 0;
  16. Bflush(bp);
  17. }
  18. }
  19. }
  20. static
  21. void
  22. deinstall(Biobufhdr *bp)
  23. {
  24. int i;
  25. for(i=0; i<nelem(wbufs); i++)
  26. if(wbufs[i] == bp)
  27. wbufs[i] = 0;
  28. }
  29. static
  30. void
  31. install(Biobufhdr *bp)
  32. {
  33. int i;
  34. deinstall(bp);
  35. for(i=0; i<nelem(wbufs); i++)
  36. if(wbufs[i] == 0) {
  37. wbufs[i] = bp;
  38. break;
  39. }
  40. if(atexitflag == 0) {
  41. atexitflag = 1;
  42. atexit(batexit);
  43. }
  44. }
  45. int
  46. Binits(Biobufhdr *bp, int f, int mode, uchar *p, int size)
  47. {
  48. p += Bungetsize; /* make room for Bungets */
  49. size -= Bungetsize;
  50. switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
  51. default:
  52. fprint(2, "Binits: unknown mode %d\n", mode);
  53. return Beof;
  54. case OREAD:
  55. bp->state = Bractive;
  56. bp->ocount = 0;
  57. break;
  58. case OWRITE:
  59. install(bp);
  60. bp->state = Bwactive;
  61. bp->ocount = -size;
  62. break;
  63. }
  64. bp->bbuf = p;
  65. bp->ebuf = p+size;
  66. bp->bsize = size;
  67. bp->icount = 0;
  68. bp->gbuf = bp->ebuf;
  69. bp->fid = f;
  70. bp->flag = 0;
  71. bp->rdline = 0;
  72. bp->offset = 0;
  73. bp->runesize = 0;
  74. return 0;
  75. }
  76. int
  77. Binit(Biobuf *bp, int f, int mode)
  78. {
  79. return Binits(bp, f, mode, bp->b, sizeof(bp->b));
  80. }
  81. Biobuf*
  82. Bopen(char *name, int mode)
  83. {
  84. Biobuf *bp;
  85. int f;
  86. switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
  87. default:
  88. fprint(2, "Bopen: unknown mode %#x\n", mode);
  89. return 0;
  90. case OREAD:
  91. f = open(name, mode);
  92. break;
  93. case OWRITE:
  94. f = create(name, mode, 0666);
  95. break;
  96. }
  97. if(f < 0)
  98. return 0;
  99. bp = malloc(sizeof(Biobuf));
  100. Binits(bp, f, mode, bp->b, sizeof(bp->b));
  101. bp->flag = Bmagic; /* mark bp open & malloced */
  102. return bp;
  103. }
  104. int
  105. Bterm(Biobufhdr *bp)
  106. {
  107. int r;
  108. deinstall(bp);
  109. r = Bflush(bp);
  110. if(bp->flag == Bmagic) {
  111. bp->flag = 0;
  112. close(bp->fid);
  113. bp->fid = -1; /* prevent accidents */
  114. free(bp);
  115. }
  116. /* otherwise opened with Binit(s) */
  117. return r;
  118. }