home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer) / NeXT_Developer-3.3.iso / NextLibrary / Documentation / NextDev / Examples / DriverKit / UNIX / PostLoad.m next >
Encoding:
Text File  |  1995-02-01  |  2.1 KB  |  93 lines

  1. /*
  2.  * PostLoad program for serial driver. 
  3.  *
  4.  * The function of this ditty is to ask the loaded driver what its
  5.  * major number is, and to create the appropriate entries in /dev.
  6.  */
  7.  
  8. #import <driverkit/IODeviceMaster.h>
  9. #import "SccShared.h"
  10. #import <libc.h>
  11. #import <stdio.h>
  12. #import <driverkit/IODevice.h>
  13.  
  14. #define DEBUG_LOG    0
  15.  
  16. #define NTTYSCC 2    // there are 4 in ttyscc.m, but we only make room
  17.             //   for 2.
  18.         
  19. /*
  20.  * A list of nodes to create. One per minor number, with a letter appended
  21.  * to eaach indicating minor number. 
  22.  */
  23. typedef struct {
  24.     const char *name;
  25.     int minorNum;        /* in addition to 0..(NTTYSCC - 1) */
  26.     int mode;
  27. } ttyNode;
  28.  
  29. ttyNode nodeList[] = {
  30.     { "tty",    0,    (0666 | S_IFCHR)     },
  31.     { "ttyf",    32,    (0666 | S_IFCHR)    }, 
  32.     { "ttyd",    64,    (0666 | S_IFCHR)    },
  33.     { "ttydf",    96,    (0666 | S_IFCHR)    },
  34.     { NULL,        0,    0            },    
  35. };
  36.  
  37. int main(int argc, char **argv)
  38. {
  39.     id         deviceMaster = [IODeviceMaster new];
  40.     IOObjectNumber     objectNum;
  41.     IOString     kind;
  42.     IOReturn     rtn;
  43.     unsigned     array[1];
  44.     unsigned     count = 1;
  45.     int        minorNum;
  46.     
  47.     if(rtn = [deviceMaster lookUpByDeviceName:"com0"
  48.         objectNumber:&objectNum
  49.         deviceKind:&kind]) {
  50.         fprintf(stderr, "Error contacting com0 (%s)\n",
  51.             [IODevice stringFromReturn:rtn]);
  52.         exit(1);    
  53.     }
  54.     rtn = [deviceMaster getIntValues : array
  55.                forParameter : SCC_CDEVSW_ENTRY
  56.                objectNumber : objectNum
  57.                       count : &count];    // in/out
  58.     if(rtn || (count != 1)) {
  59.         fprintf(stderr, "Error performing %s (%s)\n",
  60.             SCC_CDEVSW_ENTRY, [IODevice stringFromReturn:rtn]);
  61.         exit(1);    
  62.     }
  63.     for(minorNum=0; minorNum<NTTYSCC; minorNum++) {
  64.         char         nodeName[20];
  65.         ttyNode     *node;
  66.         char        minorLetter[2];
  67.         int        dev;
  68.         
  69.         minorLetter[0] = 'a' + minorNum;
  70.         minorLetter[1] = '\0';
  71.         for(node=nodeList; node->name; node++) {
  72.             sprintf(nodeName, "/dev/%s%s", 
  73.                 node->name, minorLetter);
  74.             
  75.             /*
  76.              * First delete existing node, then create a new one. 
  77.              */
  78.             unlink(nodeName);
  79.             dev = makedev(array[0], (node->minorNum + minorNum));
  80.             if(mknod(nodeName, 
  81.                 node->mode, 
  82.                 dev)) {
  83.                 fprintf(stderr, "Can\'t create %s\n",
  84.                     nodeName);
  85.             }
  86.             if(DEBUG_LOG) {
  87.                 IOLog("Created %s\n", nodeName);
  88.             }
  89.         }
  90.     }
  91.     return 0;
  92. }
  93.