Annotation of driverkit/Config/ConfigUfs.c, 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:  * ConfigUfs.c - Unix File System routines used by ConfigScan.
        !            27:  *
        !            28:  * HISTORY
        !            29:  * 14-Apr-91    Doug Mitchell at NeXT
        !            30:  *      Created.
        !            31:  */
        !            32: 
        !            33: #import <bsd/sys/types.h>
        !            34: #import <driverkit/userConfigServer.h>
        !            35: #import "ConfigPrivate.h"
        !            36: #import "ConfigUtils.h"
        !            37: #import "ConfigScan.h"
        !            38: #import "ConfigUfs.h"
        !            39: #import <bsd/sys/dir.h>
        !            40: #import <bsd/libc.h>
        !            41: #include <sys/stat.h>
        !            42: 
        !            43: typedef struct {
        !            44:        file_id_t       fid;
        !            45:        filename_t      filename;
        !            46:        u_short         dev_revision;
        !            47: } exec_file_t;
        !            48:        
        !            49: 
        !            50: /*
        !            51:  * Search for an executable appropriate for handling device specified by
        !            52:  * dev_type and slot_id. Returns TRUE if executable found.
        !            53:  *
        !            54:  * This is totally UFS dependent. Maybe when we have an idea of what will
        !            55:  * replace UFS, we can make some of this more general.
        !            56:  */
        !            57: #define FAKE_FILE      0
        !            58: #if    FAKE_FILE
        !            59: filename_t some_file;
        !            60: file_id_t some_fid = 0;
        !            61: 
        !            62: boolean_t get_driver_file(
        !            63:        IODeviceType dev_type,
        !            64:        IOSlotId slot_id,
        !            65:        filename_t *filename,           // returned
        !            66:        file_id_t *fid)                 // returned
        !            67: {
        !            68:        xpr_common("get_driver_file\n", 1,2,3,4,5);
        !            69:        /*
        !            70:         * Fake a name for now.
        !            71:         */
        !            72:        if(dev_type == IO_SLOT_DEVICE_TYPE)
        !            73:                sprintf(some_file, "devs_%04X_0000", slot_id);
        !            74:        else
        !            75:                sprintf(some_file, "devr_%04X_0000", dev_type);
        !            76:        strncpy((char *)filename, (const char *)some_file, FILENAME_SIZE);
        !            77:        *fid = some_fid++;
        !            78:        xpr_common("...returning filename %s\n", 
        !            79:                IOCopyString(some_file), 2,3,4,5);
        !            80:        return(TRUE);
        !            81: }
        !            82: 
        !            83: #else  FAKE_FILE
        !            84: 
        !            85: static boolean_t no_driver_dir_note = FALSE;
        !            86: 
        !            87: boolean_t get_driver_file(
        !            88:        IODeviceType dev_type,
        !            89:        IOSlotId slot_id,
        !            90:        filename_t *filename,           // returned
        !            91:        file_id_t *fid)                 // returned
        !            92: {
        !            93:        exec_file_t     exec_file;
        !            94:        IODeviceTypeUn  dev_type_u;
        !            95:        filename_t      file_prefix;
        !            96:        int             prefix_length;
        !            97:        struct direct   **namelist;
        !            98:        int             i;
        !            99:        u_short         revision;
        !           100:        boolean_t       rtn;
        !           101:        struct stat     statbuf;
        !           102:        
        !           103:        xpr_common("get_driver_file: dev_type 0x%x  slot_id 0x%x\n", 
        !           104:                dev_type, slot_id, 3,4,5);
        !           105:        
        !           106:        /*
        !           107:         * Start out with a null file. 
        !           108:         */
        !           109:        dev_type_u.deviceType = dev_type;
        !           110:        xpr_common("dev_type_u.dev_type 0x%x  ir.dev_index 0x%x\n",
        !           111:                dev_type_u.deviceType, dev_type_u.deviceTypeIr.deviceIndex,
        !           112:                3,4,5);
        !           113:        exec_file.fid = FID_NULL;
        !           114:        exec_file.filename[0] = '\0';
        !           115:        exec_file.dev_revision = 0;
        !           116:        
        !           117:        /*
        !           118:         * Generate the filename portion which must match exactly.
        !           119:         */
        !           120:        if(dev_type == IO_SLOT_DEVICE_TYPE) {
        !           121:                sprintf(file_prefix, "devs_%08X_", slot_id);
        !           122:        }
        !           123:        else {
        !           124:                sprintf(file_prefix, "devr_%04X_", 
        !           125:                        (unsigned)dev_type_u.deviceTypeIr.deviceIndex);
        !           126:        }
        !           127:        prefix_length = strlen(file_prefix);
        !           128:        
        !           129:        /*
        !           130:         * stat DRIVER_PATH first to make sure it exists.
        !           131:         */
        !           132:        if(stat(DRIVER_PATH, &statbuf)) {
        !           133:                xpr_common("get_driver_file: %s NOT FOUND\n", 
        !           134:                        DRIVER_PATH,2,3,4,5);
        !           135:                if(!no_driver_dir_note) {
        !           136:                        no_driver_dir_note = TRUE;
        !           137:                        printf("Warning: %s does not exist\n", DRIVER_PATH);
        !           138:                }
        !           139:                return FALSE;
        !           140:        }
        !           141:        if((statbuf.st_mode & S_IFDIR) == 0) {
        !           142:                if(!no_driver_dir_note) {
        !           143:                        no_driver_dir_note = TRUE;
        !           144:                        printf("Warning: %s is not a directory\n",
        !           145:                                DRIVER_PATH);
        !           146:                }
        !           147:                return FALSE;
        !           148:        }
        !           149:        no_driver_dir_note = FALSE;
        !           150:        
        !           151:        /* 
        !           152:         * read in the DRIVER_PATH directory, check each entry. Each time
        !           153:         * we get a valid filename with a revision greater than the one
        !           154:         * we have, use that one.
        !           155:         */
        !           156:        scandir(DRIVER_PATH, &namelist, NULL, NULL);
        !           157:        for(i=0; namelist[i]; i++) {
        !           158:                if(strncmp(namelist[i]->d_name, file_prefix, prefix_length))
        !           159:                        continue;               // bad prefix
        !           160:                if(get_driver_rev(namelist[i]->d_name, &revision))
        !           161:                        continue;               // bad filename format
        !           162:                if(revision >= exec_file.dev_revision) {
        !           163:                        /*
        !           164:                         * Let's use this one.
        !           165:                         */
        !           166:                        exec_file.fid = namelist[i]->d_fileno;
        !           167:                        strcpy(exec_file.filename, namelist[i]->d_name);
        !           168:                        exec_file.dev_revision = revision;
        !           169:                }
        !           170:        }
        !           171:        if(exec_file.filename[0]) {
        !           172:                xpr_common("get_driver_file: returning filename %s\n", 
        !           173:                        IOCopyString(exec_file.filename), 2,3,4,5);
        !           174:                strcpy((char *)filename, exec_file.filename);
        !           175:                *fid = exec_file.fid;
        !           176:                rtn = TRUE;
        !           177:        }
        !           178:        else {
        !           179:                xpr_common("get_driver_file: DRIVER NOT FOUND\n", 1,2,3,4,5);
        !           180:                rtn = FALSE;
        !           181:        }
        !           182:        
        !           183:        /*
        !           184:         * Free the namelist we got with scandir().
        !           185:         */
        !           186:        for(i=0; namelist[i]; i++) {
        !           187:                free(namelist[i]);
        !           188:        }
        !           189:        free(namelist);
        !           190:        return(rtn);
        !           191: }
        !           192: 
        !           193: #endif FAKE_FILE
        !           194: 
        !           195: 

unix.superglobalmegacorp.com

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