Annotation of driverkit/libDriver/Kernel/devswAndVfssw.m, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: /*     Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved. 
        !            25:  *
        !            26:  * devswAndVfssw.m - Kernel-level functions to allow adding entries
        !            27:  *                  to cdevsw, bdevsw, and vfssw.
        !            28:  *
        !            29:  * HISTORY
        !            30:  * 20-Jan-93    Doug Mitchell at NeXT
        !            31:  *      Created. 
        !            32:  */
        !            33: 
        !            34: #import <driverkit/devsw.h>
        !            35: #import <bsd/sys/conf.h>
        !            36: #import <bsd/sys/systm.h>
        !            37: 
        !            38: #ifndef        NULL
        !            39: #define NULL   ((void *)0)
        !            40: #endif NULL
        !            41: 
        !            42: /*
        !            43:  * Empty devsw slots are explicitly set to actual stub functions in the 
        !            44:  * kernel.
        !            45:  */
        !            46: 
        !            47: static struct cdevsw no_cdev = NO_CDEVICE;
        !            48: static struct bdevsw no_bdev = NO_BDEVICE;
        !            49: 
        !            50: /*
        !            51:  * Add an entry to bdevsw. Returns the index into bdevsw at which the entry
        !            52:  * was created, or -1 of no space can be found.
        !            53:  */
        !            54:  
        !            55: int IOAddToBdevswAt(
        !            56:        int index,
        !            57:        IOSwitchFunc openFunc,
        !            58:        IOSwitchFunc closeFunc,
        !            59:        IOSwitchFunc strategyFunc,
        !            60:        IOSwitchFunc ioctlFunc,
        !            61:        IOSwitchFunc dumpFunc,
        !            62:        IOSwitchFunc psizeFunc,
        !            63:        BOOL isTape             // TRUE if device is a tape device
        !            64: )
        !            65: {
        !            66:        struct bdevsw *devsw;
        !            67: 
        !            68:        if (index == -1) {
        !            69:            devsw = bdevsw;
        !            70:            for(index=0; index<nblkdev; index++, devsw++) {
        !            71:                if(memcmp((char *)devsw, 
        !            72:                            (char *)&no_bdev, 
        !            73:                            sizeof(struct bdevsw)) == 0)
        !            74:                    break;
        !            75:            }
        !            76:        }
        !            77:        devsw = &bdevsw[index];
        !            78:        if ((index < 0) || (index >= nblkdev) ||
        !            79:            (memcmp((char *)devsw, 
        !            80:                          (char *)&no_bdev, 
        !            81:                          sizeof(struct bdevsw)) != 0)) {
        !            82:                return -1;
        !            83:        }
        !            84:        devsw->d_open     = openFunc;
        !            85:        devsw->d_close    = closeFunc;
        !            86:        devsw->d_strategy = (strategy_fcn_t *)strategyFunc;
        !            87:        devsw->d_ioctl    = ioctlFunc;
        !            88:        devsw->d_dump     = dumpFunc;
        !            89:        devsw->d_psize    = psizeFunc;
        !            90:        devsw->d_type    = 0;
        !            91:        if(isTape) {
        !            92:                /*
        !            93:                    * This is pure bullshit. This flag is 
        !            94:                    * defined in sys/buf.h, and is only used 
        !            95:                    * in ufs_vfsops.c, in the bdevsw flags!
        !            96:                    */
        !            97:                devsw->d_type |= D_TAPE;
        !            98:        }
        !            99:        return index;
        !           100: }
        !           101: 
        !           102: int IOAddToBdevsw(
        !           103:        IOSwitchFunc openFunc,
        !           104:        IOSwitchFunc closeFunc,
        !           105:        IOSwitchFunc strategyFunc,
        !           106:        IOSwitchFunc ioctlFunc,
        !           107:        IOSwitchFunc dumpFunc,
        !           108:        IOSwitchFunc psizeFunc,
        !           109:        BOOL isTape)            // TRUE if device is a tape device
        !           110: {
        !           111:        return IOAddToBdevswAt( -1,
        !           112:            openFunc,
        !           113:            closeFunc,
        !           114:            strategyFunc,
        !           115:            ioctlFunc,
        !           116:            dumpFunc,
        !           117:            psizeFunc,
        !           118:            isTape);
        !           119: }
        !           120:        
        !           121: /*
        !           122:  * Remove an entry from bdevsw, replace it with a null entry.
        !           123:  */
        !           124: void IORemoveFromBdevsw(int bdevswNumber)
        !           125: {
        !           126:        bdevsw[bdevswNumber] = no_bdev;
        !           127: }
        !           128: 
        !           129: /*
        !           130:  * Add an entry to cdevsw. Returns the index into cdevsw at which the entry
        !           131:  * was created, or -1 of no space can be found.
        !           132:  */
        !           133: int IOAddToCdevswAt(
        !           134:        int index,
        !           135:        IOSwitchFunc openFunc,
        !           136:        IOSwitchFunc closeFunc,
        !           137:        IOSwitchFunc readFunc,
        !           138:        IOSwitchFunc writeFunc,
        !           139:        IOSwitchFunc ioctlFunc,
        !           140:        IOSwitchFunc stopFunc,
        !           141:        IOSwitchFunc resetFunc,
        !           142:        IOSwitchFunc selectFunc,
        !           143:        IOSwitchFunc mmapFunc,
        !           144:        IOSwitchFunc getcFunc,
        !           145:        IOSwitchFunc putcFunc
        !           146: )
        !           147: {
        !           148:        struct cdevsw *devsw;
        !           149:        
        !           150:        if (index == -1) {
        !           151:            devsw = cdevsw;
        !           152:            for(index=0; index<nchrdev; index++, devsw++) {
        !           153:                if (memcmp((char *)devsw, 
        !           154:                          (char *)&no_cdev, 
        !           155:                          sizeof(struct cdevsw)) == 0)
        !           156:                    break;
        !           157:            }
        !           158:        }
        !           159:        devsw = &cdevsw[index];
        !           160:        if ((index < 0) || (index >= nchrdev) ||
        !           161:            (memcmp((char *)devsw, 
        !           162:                    (char *)&no_cdev, 
        !           163:                    sizeof(struct cdevsw)) != 0)) {
        !           164:                return -1;
        !           165:        }
        !           166:        devsw->d_open   = openFunc;
        !           167:        devsw->d_close  = closeFunc;
        !           168:        devsw->d_read   = readFunc;
        !           169:        devsw->d_write  = writeFunc;
        !           170:        devsw->d_ioctl  = ioctlFunc;
        !           171:        devsw->d_stop   = stopFunc;
        !           172:        devsw->d_reset  = resetFunc;
        !           173:        devsw->d_select = selectFunc;
        !           174:        devsw->d_mmap   = mmapFunc;
        !           175:        devsw->d_getc   = getcFunc;
        !           176:        devsw->d_putc   = (putc_fcn_t *)putcFunc;
        !           177:        return index;
        !           178: }
        !           179: 
        !           180: int IOAddToCdevsw(
        !           181:        IOSwitchFunc openFunc,
        !           182:        IOSwitchFunc closeFunc,
        !           183:        IOSwitchFunc readFunc,
        !           184:        IOSwitchFunc writeFunc,
        !           185:        IOSwitchFunc ioctlFunc,
        !           186:        IOSwitchFunc stopFunc,
        !           187:        IOSwitchFunc resetFunc,
        !           188:        IOSwitchFunc selectFunc,
        !           189:        IOSwitchFunc mmapFunc,
        !           190:        IOSwitchFunc getcFunc,
        !           191:        IOSwitchFunc putcFunc)
        !           192: {
        !           193:        return IOAddToCdevswAt( -1,
        !           194:            openFunc,
        !           195:            closeFunc,
        !           196:            readFunc,
        !           197:            writeFunc,
        !           198:            ioctlFunc,
        !           199:            stopFunc,
        !           200:            resetFunc,
        !           201:            selectFunc,
        !           202:            mmapFunc,
        !           203:            getcFunc,
        !           204:            putcFunc);
        !           205: }
        !           206:        
        !           207: /*
        !           208:  * Remove an entry from cdevsw, replace it with a null entry.
        !           209:  */
        !           210: void IORemoveFromCdevsw(int cdevswNumber)
        !           211: {
        !           212:        cdevsw[cdevswNumber] = no_cdev;
        !           213: }
        !           214: 
        !           215: #warning removed vfssw support
        !           216: #if 0
        !           217: 
        !           218: /*
        !           219:  * Add an entry to vfssw. Returns the index into vfssw at which the entry
        !           220:  * was created, or -1 of no space can be found.
        !           221:  */
        !           222: int IOAddToVfsswAt(
        !           223:     int index,
        !           224:     const char *vfsswName,
        !           225:     const struct vfsops *vfsswOps
        !           226: )
        !           227: {
        !           228:        struct vfssw *sw = &vfssw[index];
        !           229:        if ((index < 0) || (index >= (vfsNVFS - vfssw))
        !           230:             || (sw->vsw_name != NULL) || (sw->vsw_ops != NULL))
        !           231:            return -1;
        !           232:        sw->vsw_name = (char *)vfsswName;
        !           233:        sw->vsw_ops = (struct vfsops *)vfsswOps;
        !           234:        return index;
        !           235: }
        !           236: int IOAddToVfssw(
        !           237:        const char *vfsswName,
        !           238:        const struct vfsops *vfsswOps)
        !           239: {
        !           240:        int index;
        !           241:        struct vfssw *sw = vfssw;
        !           242:        
        !           243:        for(index=0; sw<vfsNVFS; index++, sw++) {
        !           244:                if((sw->vsw_name == NULL) && (sw->vsw_ops == NULL)) {
        !           245:                        return IOAddToVfsswAt(index, vfsswName, vfsswOps);
        !           246:                }
        !           247:        }
        !           248:        return -1;
        !           249: }
        !           250:        
        !           251: /*
        !           252:  * Remove an entry from vfssw, replace it with a null entry.
        !           253:  */
        !           254: void IORemoveFromVfssw(int vfsswNumber)
        !           255: {
        !           256:        vfssw[vfsswNumber].vsw_name = NULL;
        !           257:        vfssw[vfsswNumber].vsw_ops  = NULL;
        !           258: }
        !           259: 
        !           260: #endif
        !           261:        

unix.superglobalmegacorp.com

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