Annotation of coherent/b/STREAMS/coh.386/fifo.c, revision 1.1

1.1     ! root        1: /* $Header: /src386/STREAMS/coh.386/RCS/fifo.c,v 2.3 93/08/09 13:35:27 bin Exp Locker: bin $ */
        !             2: /*
        !             3:  * File:       fifo.c
        !             4:  *
        !             5:  * Purpose:    allow kernel to fetch data from real-mode bootstrap data area
        !             6:  *
        !             7:  * $Log:       fifo.c,v $
        !             8:  * Revision 2.3  93/08/09  13:35:27  bin
        !             9:  * Kernel 82 changes
        !            10:  * 
        !            11:  * Revision 2.3  93/07/26  14:59:42  nigel
        !            12:  * Nigel's R80
        !            13:  * 
        !            14:  * Revision 1.3  93/04/14  10:06:27  root
        !            15:  * r75
        !            16:  * 
        !            17:  * Revision 1.2  92/01/06  11:59:11  hal
        !            18:  * Compile with cc.mwc.
        !            19:  */
        !            20: 
        !            21: /*
        !            22:  * Includes.
        !            23:  */
        !            24: 
        !            25: #include <kernel/typed.h>
        !            26: 
        !            27: /*
        !            28:  * Definitions.
        !            29:  *     Constants.
        !            30:  *     Macros with argument lists.
        !            31:  *     Typedefs.
        !            32:  *     Enums.
        !            33:  */
        !            34: 
        !            35: typedef unsigned char uchar;
        !            36: typedef unsigned int  uint;
        !            37: typedef unsigned long ulong;
        !            38: 
        !            39: /*
        !            40:  * Functions.
        !            41:  *     Import Functions.
        !            42:  *     Export Functions.
        !            43:  *     Local Functions.
        !            44:  */
        !            45: FIFO * fifo_open();
        !            46: int fifo_close();
        !            47: typed_space * fifo_read();
        !            48: 
        !            49: /*
        !            50:  * Global Data.
        !            51:  *     Import Variables.
        !            52:  *     Export Variables.
        !            53:  *     Local Variables.
        !            54:  *
        !            55:  * Arguments are passed into the kernel through boot_gift.
        !            56:  * If you start getting "Not enough room for all arguments." messages
        !            57:  * at boot time, just increase the BG_LEN  to whatever you need.
        !            58:  * This structure is EXACTLY BG_LEN bytes long.
        !            59:  */
        !            60: TYPED_SPACE(boot_gift, BG_LEN, T_FIFO_SIC);
        !            61: 
        !            62: /*
        !            63:  * fifo_open()
        !            64:  *
        !            65:  * Open a typed space as a fifo.
        !            66:  *
        !            67:  * Takes a typed_space that is already allocated, and a mode.    The type of
        !            68:  * the typed space must be a FIFO.  Only T_FIFO_SIC has been implemented
        !            69:  * (static, in-core fifo).
        !            70:  *
        !            71:  * The mode indicates whether to open for reading or writing.
        !            72:  *  mode == 0 means read only.
        !            73:  *  mode == 1 means write only.
        !            74:  *  Other values are illegal.
        !            75:  *
        !            76:  * Returns a pointer to an initialized FIFO structure.  FIFO structures are
        !            77:  * allocated from a pre-allocated array.  Returns F_NULL if it can't open
        !            78:  * the fifo.
        !            79:  */
        !            80: FIFO *
        !            81: fifo_open(fifo_space, mode)
        !            82: typed_space *fifo_space;
        !            83: int mode;
        !            84: {
        !            85:        /* ff_table is a table of FIFO structures which can be allocated on
        !            86:         * demand.  It is functionally similiar to the file descriptor table
        !            87:         * in the kernel.
        !            88:         */
        !            89:        static FIFO ff_table[NFIFOS];
        !            90:        static int inited = 0;  /* Has ff_table been initialized?  */
        !            91: 
        !            92:        int i;          /* A handy counter.  */
        !            93:        FIFO *the_fifo; /* The fifo we are going to allocate.  */
        !            94: 
        !            95:        /* Initialize ff_table the first time we get called.  */
        !            96:        if (!inited) {
        !            97:                for (i = 0; i < NFIFOS; ++i) {
        !            98:                        ff_table[i].f_space = F_NULL;
        !            99:                        ff_table[i].f_flags = 0;
        !           100:                }
        !           101:                inited = 1;
        !           102:        }
        !           103: 
        !           104:        /* Check the type of the space we were passed.  */
        !           105:        switch (fifo_space->ts_type) {
        !           106:        case T_FIFO:    /* Overly general type, assuming SIC.  */
        !           107:                fifo_space->ts_type = T_FIFO_SIC;
        !           108:                break;
        !           109:        case T_FIFO_SIC:        /* Static In-core Fifo.  */
        !           110:                break;
        !           111:        case T_FIFO_DIC:        /* Dynamic In-core Fifo (can grow).  */
        !           112:                return(F_NULL); /* Unimplemented.  */
        !           113:        case T_FIFO_SP: /* Static Permanent Fifo (fixed size file). */
        !           114:                return(F_NULL); /* Unimplemented.  */
        !           115:        case T_FIFO_DP: /* Dynamic Permanent Fifo (ordinary file).  */
        !           116:                return(F_NULL); /* Unimplemented.  */
        !           117:        default:
        !           118:                return(F_NULL); /* Illegal type encountered.  */
        !           119:        }
        !           120: 
        !           121:        /* ASSERTION: fifo_space is a valid and implemented FIFO.  */
        !           122: 
        !           123:        /* Find the first free FIFO structure.  */
        !           124: 
        !           125:        /* This should be re-implemented using a malloc-based scheme.
        !           126:         * At the moment, the tertiary boot libraries do not include a
        !           127:         * malloc.
        !           128:         */
        !           129:        for (i = 0; (i < NFIFOS) && (0 != ff_table[i].f_flags); ++i) {
        !           130:                /* Do nothing else.  */
        !           131:        }
        !           132: 
        !           133:        if (NFIFOS == i) {
        !           134:                return(F_NULL); /* No more free fifo structs.  */
        !           135:        }
        !           136: 
        !           137:        the_fifo = &(ff_table[i]);
        !           138: 
        !           139:        /* ASSERTION: the_fifo points at a FIFO we can take.  */
        !           140: 
        !           141:        /* Initialize the FIFO struct.  */
        !           142:        the_fifo->f_space = fifo_space;
        !           143:        the_fifo->f_offset = fifo_space->ts_data;
        !           144: 
        !           145:        /* Initilize the flags.  */
        !           146:        switch(mode) {
        !           147:        case 0: /* read */
        !           148:                the_fifo->f_flags |= F_READ;
        !           149:                break;
        !           150:        case 1: /* write */
        !           151:                the_fifo->f_flags |= F_WRITE;
        !           152:                break;
        !           153:        default:
        !           154:                return(F_NULL); /* Illegal mode flag.  */
        !           155:        }
        !           156:                
        !           157:        return(the_fifo);
        !           158: } /* fifo_open() */
        !           159: 
        !           160: /*
        !           161:  * fifo_close()
        !           162:  *
        !           163:  * Finish with using a typed space as a fifo.
        !           164:  * Free up FIFO structure associated with a typed space.
        !           165:  * Returns 0 if ffp was not open, 1 otherwise.
        !           166:  */
        !           167: int
        !           168: fifo_close(ffp)
        !           169: FIFO *ffp;
        !           170: {
        !           171:        if (0 == ffp->f_flags) {
        !           172:                return(0);      /* This ffp is not open.  */
        !           173:        }
        !           174:        ffp->f_space = F_NULL;
        !           175:        ffp->f_offset = 0;
        !           176:        ffp->f_flags = 0;
        !           177: 
        !           178:        return(1);
        !           179: } /* fifo_close() */
        !           180: 
        !           181: /*
        !           182:  * fifo_read()
        !           183:  *
        !           184:  * Read a typed space from a fifo.
        !           185:  * Return a pointer to the next typed space in the fifo ffp.  Returns
        !           186:  * NULL on end of fifo.
        !           187:  *
        !           188:  * This read assumes that ffp->f_space has type T_FIFO_SIC.
        !           189:  */
        !           190: typed_space *
        !           191: fifo_read(ffp)
        !           192: register FIFO *ffp;
        !           193: {
        !           194:        typed_space *retval;
        !           195: 
        !           196:        /* Read MUST be set.  */
        !           197:        if (F_READ != F_READ & ffp->f_flags ) {
        !           198: printf(" fifo_read: READ not set ");
        !           199:                return 0;  /* This ffp is not open for reading.  */
        !           200:        }
        !           201: 
        !           202:        /* From here to the end of fifo_read is really fifo_read_sic().  */
        !           203: 
        !           204: 
        !           205:        /* Space of size 0 marks EOFIFO.  */
        !           206:        if ((long)0 == ffp->f_offset->ts_size) {
        !           207: printf(" fifo_read: space of size 0 ");
        !           208:                retval = 0;
        !           209:        } else {
        !           210:                /* Return the next space.  */
        !           211:                retval = ffp->f_offset;
        !           212:                /* Advance to the next space.  */
        !           213:                (char *) ffp->f_offset += ffp->f_offset->ts_size;
        !           214:        }
        !           215: 
        !           216:        return retval;
        !           217: } /* fifo_read() */
        !           218: 
        !           219: #ifdef TEST
        !           220: #include <stdio.h>
        !           221: 
        !           222: /* This is the typed space we will use for our FIFO operations.  */
        !           223: TYPED_SPACE(global_space, 128, T_FIFO_SIC);    /* Static In-Core Fifo.  */
        !           224: 
        !           225: void
        !           226: main()
        !           227: {
        !           228:        FIFO *ffp;              /* Fifo pointer for a handle.  */
        !           229:        char line[1024];        /* Place to put input lines.  */
        !           230:        long size;              /* Length for line.  (Sizes are all long.)  */
        !           231:        int i;
        !           232: 
        !           233:        typed_space *local_space;
        !           234: 
        !           235:        /* Open the fifo for writing.  */
        !           236:        if (F_NULL == (ffp = fifo_open(&global_space, 1))) {
        !           237:                fprintf(stderr, "Can't open global_space for writing.\n");
        !           238:                exit(1);
        !           239:        }
        !           240: 
        !           241:        do {
        !           242:                printf("Feed me: ");
        !           243:                gets(line);
        !           244:                size = (long) (strlen(line) + 1);
        !           245:        } while (fifo_write_untyped(ffp, line, size, T_STR_STR));
        !           246: 
        !           247:        if (0 == fifo_close(ffp)) {
        !           248:                fprintf(stderr, "Failed to close global_space.\n");
        !           249:                exit(1);
        !           250:        }
        !           251: 
        !           252:        printf("OK, global_space is now full.\n");
        !           253:        /* ASSERTION: We've filled global_space with strings.  */
        !           254: 
        !           255:        /* Open the fifo for reading.  */
        !           256:        if (F_NULL == (ffp = fifo_open(&global_space, 0))) {
        !           257:                fprintf(stderr, "Can't open global_space for reading.\n");
        !           258:                exit(1);
        !           259:        }
        !           260: 
        !           261:        /* Dump the contents of this FIFO.  */
        !           262:        for (i = 1; (local_space = fifo_read(ffp)); ++i) {
        !           263:                printf("%d: size: %ld: type: 0x%x\n", i,
        !           264:                        local_space->ts_size,
        !           265:                        local_space->ts_type);
        !           266: 
        !           267:                /* Assume everything is a NUL terminated string.  */
        !           268:                printf("datum: %s\n\n", local_space->ts_data);
        !           269:                printf("Hit <RETURN>");
        !           270:                gets(line);
        !           271:        }
        !           272: 
        !           273: 
        !           274:        /* Rewind the file, and dump it out again.  */
        !           275:        printf("Rewinding.\n");
        !           276:        if (0 == fifo_rewind(ffp)) {
        !           277:                fprintf("Can't rewind global_space.\n");
        !           278:                exit(1);
        !           279:        }
        !           280: 
        !           281:        for (i = 1; (local_space = fifo_read(ffp)); ++i) {
        !           282:                printf("%d: size: %ld: type: 0x%x\n", i,
        !           283:                        local_space->ts_size,
        !           284:                        local_space->ts_type);
        !           285: 
        !           286:                /* Assume everything is a NUL terminated string.  */
        !           287:                printf("datum: %s\n\n", local_space->ts_data);
        !           288:        }
        !           289: 
        !           290:        if (0 == fifo_close(ffp)) {
        !           291:                fprintf(stderr, "Failed to close global_space.\n");
        !           292:                exit(1);
        !           293:        }
        !           294: 
        !           295:        exit(0);
        !           296: } /* main() */
        !           297: 
        !           298: #endif /* TEST */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.