|
|
1.1 root 1: /*
2: * fifo_b.c -- Extra routines for handling typed fifos.
3: * Both fifo_b.c (boot fifo) and fifo_k.c (kernel fifo) are needed by the
4: * boot code.
5: */
6: #include <kernel/typed.h>
7:
8: #ifndef T_NULL
9: #define T_NULL ((char *)0)
10: #endif
11:
12: /* How long is an open fifo? */
13: long
14: fifo_len(ffp)
15: FIFO *ffp;
16: {
17: /* ffp->f_offset points at the terminating NUL space. */
18: return(sizeof(typed_space) +
19: ((char *) ffp->f_offset) - ((char *)ffp->f_space));
20: } /* fifo_len() */
21:
22: /* Write a typed space into a FIFO. */
23: typed_space *
24: fifo_write(ffp, space)
25: FIFO *ffp;
26: typed_space *space;
27: {
28: return (fifo_write_untyped(
29: ffp,
30: space->ts_data,
31: (int32) (space->ts_size - sizeof(typed_space)),
32: space->ts_type)
33: );
34: } /* fifo_write() */
35:
36: /* Write a chunk of data into an open fifo as a typed space.
37: * Takes a FIFO to be written to, ffp; a pointer to the data, datum; a
38: * size for the datum, size; and a type for the new space, type.
39: *
40: * Returns a pointer to the newly written space. Returns NULL if the
41: * new space could not be written.
42: *
43: * Note that while sizes throughout this package refer to TOTAL sizes
44: * including headers, the size argument here is ONLY for the datum.
45: *
46: * Only FIFOs of type T_FIFO_SIC are implimented.
47: */
48: typed_space *
49: fifo_write_untyped(ffp, datum, size, type)
50: FIFO *ffp;
51: char *datum;
52: long size;
53: space_type type;
54: {
55: long needed_space; /* Total space we need to add. */
56: typed_space *retval; /* Return the space we just wrote. */
57:
58: /* Write MUST be set. */
59: if (F_WRITE != F_WRITE & ffp->f_flags ) {
60: /* Write on closed ffp. */
61: return(T_NULL); /* This ffp is not open for writing. */
62: }
63:
64: /* From here to end of fifo_write_untyped() is really fifo_write_sic(). */
65:
66: /* Check to see that there is enough space for the new datum.
67: * We need space for another typed_space header, size bytes of
68: * data, and space for a terminating typed_space header.
69: */
70: needed_space = sizeof(typed_space) + size + sizeof(typed_space);
71:
72: if (ffp->f_space->ts_size <
73: ((char *)ffp->f_offset - (char *)ffp->f_space) + needed_space) {
74: /* Write on insufficient space. */
75: return(T_NULL); /* Insufficient space. */
76: }
77:
78: /* ASSERTION: There is enough space remaining in ffp->f_space for
79: * two more headers and the datum.
80: */
81:
82: retval = ffp->f_offset;
83:
84: /* Create the new header. */
85: ffp->f_offset->ts_size = sizeof(typed_space) + size;
86: ffp->f_offset->ts_type = type;
87:
88: /* Copy the datum in place. */
89: memcpy(ffp->f_offset->ts_data, datum, size);
90:
91: /* Advance the write pointer. */
92: ffp->f_offset += 1; /* Skip the header. */
93: (char *) ffp->f_offset += size; /* Skip the data. */
94:
95: /* Terminate the fifo. */
96: ffp->f_offset->ts_size = (int32) 0;
97: ffp->f_offset->ts_type = T_UNKNOWN;
98:
99: return(retval);
100: } /* fifo_write_untyped() */
101:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.