Annotation of driverkit/libDriver/Kernel/devswAndVfssw.m, revision 1.1.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.