Annotation of drvEIDE/EIDE.drvproj/PostLoad.tproj/PostLoad.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.0 (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: /*
                     25:  * Copyright 1997-1998 by Apple Computer, Inc., All rights reserved.
                     26:  * Copyright 1994-1997 NeXT Software, Inc., All rights reserved.
                     27:  *
                     28:  * Post-Load command for IDE disks.  Creates device nodes /dev/hd[0-3][a-h]
                     29:  * and /dev/rhd[0-3][a-h].
                     30:  * units.
                     31:  *
                     32:  * HISTORY
                     33:  * 30-Sep-94    Rakesh Dubey at NeXT
                     34:  *      Created from SCSI tape source. 
                     35:  */
                     36: 
                     37: #import <streams/streams.h>
                     38: #import <driverkit/IODeviceMaster.h>
                     39: #import <driverkit/IODevice.h>
                     40: #import <errno.h>
                     41: #import <libc.h>
                     42: 
                     43: #import <ata_extern.h>
                     44: 
                     45: #define PATH_NAME_SIZE                         10
                     46: #define DEV_STRING                     "/dev/"
                     47: #define IDE_INIT_ERR_STRING            "Error initializing IDE driver"
                     48: 
                     49: #define DEV_MOD_CHAR                   020640
                     50: #define DEV_MOD_BLOCK                  060640
                     51: 
                     52: #define DEV_UMASK                      0
                     53: 
                     54: #define NIDE_PARTITIONS                8
                     55: 
                     56: #define NIDE_DEVICES                   (MAX_IDE_DRIVES * MAX_IDE_CONTROLLERS)
                     57: 
                     58: static int makeNode(char *deviceName, int iUnit, int major, int num,
                     59:                        unsigned short mode);
                     60: 
                     61: int main(int argc, char **argv)
                     62: {
                     63:     IOReturn                   ret;
                     64:     IOObjectNumber             tag;
                     65:     IOString                   kind;
                     66:     unsigned int               count;
                     67:     IODeviceMaster             *devMaster;
                     68:     int                                blockMajor, characterMajor;
                     69:     int                                i, iUnit, iRet;
                     70:     char                       path[PATH_NAME_SIZE];
                     71: 
                     72:     iRet = 0;
                     73:     
                     74:     devMaster = [IODeviceMaster new];
                     75: 
                     76:     /*
                     77:      * The kernel creates first two. This needs some investigation. FIXME.
                     78:      */
                     79:     for (iUnit = 2; iUnit < NIDE_DEVICES; iUnit ++) {
                     80: 
                     81:        bzero(path, PATH_NAME_SIZE);
                     82:        sprintf(path, "%s%s%d", DEV_STRING, "hd", iUnit);
                     83: 
                     84:        /*
                     85:         * Find this instance of the IDE driver
                     86:         */
                     87: 
                     88:        ret = [devMaster lookUpByDeviceName: path + strlen(DEV_STRING)
                     89:            objectNumber: &tag 
                     90:            deviceKind: &kind];
                     91: 
                     92: #ifdef DEBUG
                     93: printf ("unit %d, obj name %s\n", iUnit, path);
                     94: printf ("ret = %d\n", ret);
                     95: #endif DEBUG
                     96: 
                     97:        /*
                     98:         * If this device does not exist then we don't want to create nodes
                     99:         * for it. This saves some time.
                    100:         */
                    101:        if (ret != IO_R_SUCCESS) {
                    102:            continue;
                    103:        }
                    104:        
                    105:        /*
                    106:         * Query the object for its major device number 
                    107:         */
                    108:        blockMajor = -1;
                    109:        ret = [devMaster getIntValues:&blockMajor
                    110:               forParameter:"BlockMajor" objectNumber:tag
                    111:               count:&count];
                    112:        if (ret != IO_R_SUCCESS) {
                    113:            printf("%s: couldn't get block major number:  Returned %d.\n",
                    114:                   IDE_INIT_ERR_STRING, ret);
                    115:            iRet = -1;
                    116:        }
                    117:        
                    118:        characterMajor = -1;
                    119:        ret = [devMaster getIntValues:&characterMajor
                    120:               forParameter:"CharacterMajor" objectNumber:tag
                    121:               count:&count];
                    122:        if (ret != IO_R_SUCCESS) {
                    123:            printf("%s: couldn't get char major number:  Returned %d.\n",
                    124:                   IDE_INIT_ERR_STRING, ret);
                    125:            iRet = -1;
                    126:        }
                    127:        
                    128:        /*
                    129:         * Remove old devs and create new ones for this unit.    
                    130:         */
                    131:        for (i = 0; i < NIDE_PARTITIONS; i++) {
                    132:            iRet = makeNode("hd", iUnit, blockMajor, i, DEV_MOD_BLOCK);
                    133:            iRet = makeNode("rhd", iUnit, characterMajor, i, DEV_MOD_CHAR);
                    134:        }
                    135:     }
                    136:     
                    137:     exit(iRet);
                    138: }
                    139: 
                    140: static int makeNode(char *deviceName, int iUnit, int major, int num,
                    141:                        unsigned short mode)
                    142: {
                    143:     int        iRet;
                    144:     int minor;
                    145:     char path[PATH_NAME_SIZE];
                    146:     
                    147:     iRet = -1;
                    148:     
                    149: #ifdef notdef
                    150: printf ("makeNode %s, iUnit %d num %d\n", deviceName, iUnit, num);
                    151: #endif notdef
                    152: 
                    153:     bzero(path, PATH_NAME_SIZE);
                    154:     sprintf(path, "%s%s%d%c", DEV_STRING, deviceName, iUnit, num + 'a');
                    155: 
                    156:     minor = iUnit * NIDE_PARTITIONS + num;
                    157:     
                    158:     if (unlink(path)) {
                    159:        if (errno != ENOENT) {
                    160:            printf("%s: could not delete old %s.  Errno is %d\n",
                    161:                IDE_INIT_ERR_STRING, path, errno);
                    162:            iRet = -1; 
                    163:        }
                    164:     }
                    165: 
                    166:     umask(DEV_UMASK);
                    167:     if (mknod(path, mode, (major << 8) | minor)) {
                    168:        printf("%s: could not create %s.  Errno is %d\n",
                    169:            IDE_INIT_ERR_STRING, path, errno);
                    170:        iRet = -1;
                    171:     }
                    172:     
                    173:     return iRet;
                    174: }

unix.superglobalmegacorp.com

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