fiss

Friedel's Initialization and Service Supervision
Log | Files | Refs | LICENSE

binit.c (2130B)


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