Annotation of Examples/DriverKit/SCSITape/PostLoad.tproj/PostLoad.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  *      Copyright (c) 1993 NeXT Computer, Inc.  All rights reserved. 
                      3:  *
                      4:  * Post-Load command for SCSITape.   Creates device nodes /dev/rst<n>,
                      5:  * /dev/nrst<n>, /dev/rxt<n>, and /dev/nrxt<n> for up to 4 SCSI tape
                      6:  * units.
                      7:  *
                      8:  * HISTORY
                      9:  * 20-Apr-93    Phillip Dibner at NeXT
                     10:  *      Created. 
                     11:  */
                     12: 
                     13: #import <driverkit/IODeviceMaster.h>
                     14: #import <driverkit/IODevice.h>
                     15: #import "SCSITapeTypes.h"
                     16: #import <errno.h>
                     17: #import <libc.h>
                     18: 
                     19: 
                     20: #define PATH_NAME_SIZE 10
                     21: #define DEV_STRING "/dev/"
                     22: #define INSTANCE_STRING "Instance="
                     23: #define ST_INIT_ERR_STRING "Error initializing SCSI Tape driver"
                     24: #define NTAPE_NAMES 4
                     25: 
                     26: #define DEV_MOD 020666
                     27: #define DEV_UMASK 0
                     28: 
                     29: char path [PATH_NAME_SIZE];
                     30: char *scsiTapeNames[] = {"rst", "nrst", "rxt", "nrxt"};
                     31: int scsiTapeDevFlags[] = {0, 1, 2, 3}; /* bit 0 = no rewind, bit 1 = Exabyte */
                     32: 
                     33: int
                     34: main(int argc, char **argv)
                     35: {
                     36:     IOReturn                   ret = IO_R_INVALID;
                     37:     IOObjectNumber             tag;
                     38:     IOString                   kind;
                     39:     int                                major, minor, iUnit, iRet = 0;
                     40:     unsigned int               count = 1;
                     41:     IODeviceMaster             *devMaster;
                     42:     int                                i;
                     43: 
                     44:     devMaster = [IODeviceMaster new];
                     45: 
                     46:     for (iUnit = 0; iUnit < NST; iUnit ++) {
                     47:        bzero (path, PATH_NAME_SIZE);
                     48:        sprintf (path, "%s%s%d", DEV_STRING, "st", iUnit);
                     49: 
                     50:        /*
                     51:         * Find this instance of the SCSI Tape driver
                     52:         */
                     53: 
                     54:        ret = [devMaster lookUpByDeviceName: path + strlen (DEV_STRING)
                     55:            objectNumber: &tag 
                     56:            deviceKind: &kind];
                     57: 
                     58: #ifdef DEBUG
                     59: printf (" unit %d, obj name %s\n", iUnit, path);
                     60: printf (" ret = %d\n", ret);
                     61: #endif DEBUG
                     62: 
                     63:        /*
                     64:         * Special work to do for the first SCSITape object
                     65:         */
                     66:        if (iUnit == 0) {
                     67: 
                     68:            /*
                     69:             * If we couldn't find the first one, we will return failure.
                     70:             */
                     71:            if (ret != IO_R_SUCCESS) {
                     72:                printf ("%s: couldn't find driver. Returned %d\n",
                     73:                    ST_INIT_ERR_STRING, ret);
                     74:                iRet = -1;
                     75:            } 
                     76: 
                     77:            /*
                     78:             * Query the object for its major device number
                     79:             */
                     80:            major = -1;
                     81:            ret = [devMaster getIntValues:&major 
                     82:                forParameter:"IOMajorDevice" objectNumber:tag
                     83:                count:&count];
                     84:            if (ret != IO_R_SUCCESS) {
                     85:                printf ("%s: couldn't get major number:  Returned %d.\n",
                     86:                    ST_INIT_ERR_STRING, ret);
                     87:                iRet = -1;
                     88:            }
                     89:        }
                     90: 
                     91:        /*
                     92:         * Remove old devs and create new ones for this unit.
                     93:         */
                     94:        for (i = 0; i < NTAPE_NAMES; i++) {
                     95: 
                     96:            bzero (path, PATH_NAME_SIZE);
                     97:            sprintf (path, "%s%s%d", DEV_STRING, scsiTapeNames [i], iUnit);
                     98: 
                     99:            if (unlink (path)) {
                    100:                if (errno != ENOENT) {
                    101:                    printf ("%s: could not delete old %s.  Errno is %d\n",
                    102:                        ST_INIT_ERR_STRING, path, errno);
                    103:                    iRet = -1; 
                    104:                }
                    105:            }
                    106: 
                    107: 
                    108:            /*
                    109:             * If we found this object, create new device nodes
                    110:             */
                    111:            if (ret == IO_R_SUCCESS) {
                    112:                minor = (iUnit << 3) | scsiTapeDevFlags [i];
                    113: 
                    114:                umask (DEV_UMASK);
                    115:                if (mknod(path, DEV_MOD, (major << 8) | minor)) {
                    116:                    printf ("%s: could not create %s.  Errno is %d\n",
                    117:                        ST_INIT_ERR_STRING, path, errno);
                    118:                    iRet = -1;
                    119:                }
                    120:            }
                    121:        }
                    122:     } /* for iUnit */
                    123:     return iRet;
                    124: }

unix.superglobalmegacorp.com

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