|
|
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: /* ! 25: * sample driver. Exec'd by Config as devr_0999_0000. ! 26: */ ! 27: ! 28: #import <bsd/sys/types.h> ! 29: #import <mach/mach.h> ! 30: #import <servers/bootstrap.h> ! 31: #import <servers/netname.h> ! 32: #import <bsd/libc.h> ! 33: #import <mach/mach_error.h> ! 34: #import <bsd/syslog.h> ! 35: #import <driverkit/driverServer.h> ! 36: #import <driverkit/userConfigServer.h> ! 37: #import <bsd/sys/signal.h> ! 38: ! 39: int get_devr_port(port_t *port_array, int max_devices); ! 40: #ifdef notdef ! 41: void sigint(int foo); ! 42: #endif notdef ! 43: void sighup(int foo); ! 44: ! 45: #define NUM_DEVICES 10 ! 46: #define DEV_TYPE 0x0999 ! 47: ! 48: port_t config_port; ! 49: port_t driver_sig_port; ! 50: port_t dev_ports[NUM_DEVICES]; ! 51: port_t driver_port; ! 52: char *driver_name; ! 53: ! 54: #define print(x,a,b,c,d,e) syslog(LOG_ERR, x,a,b,c,d,e) ! 55: ! 56: int main(int argc, char **argv) ! 57: { ! 58: IOConfigReturn crtn; ! 59: kern_return_t krtn; ! 60: ! 61: print("driver %s: starting\n", argv[0], 2,3,4,5); ! 62: driver_name = argv[0]; ! 63: ! 64: /* ! 65: * sigint (signal 2) causes a device_destroy(). ! 66: * sighup (1) causes a driver_destroy() and clean exit. ! 67: */ ! 68: #ifdef notdef ! 69: signal(SIGINT, sigint); ! 70: #endif notdef ! 71: signal(SIGHUP, sighup); ! 72: ! 73: /* ! 74: * Get some ports. ! 75: */ ! 76: krtn = netname_look_up(name_server_port, ! 77: "", // hostname ! 78: CONFIG_SERVER_NAME, ! 79: &config_port); ! 80: if(krtn) { ! 81: print("%s: can't find %s: %s\n", ! 82: argv[0], CONFIG_SERVER_NAME, mach_error_string(krtn), ! 83: 4,5); ! 84: exit(1); ! 85: } ! 86: krtn = bootstrap_look_up(bootstrap_port, ! 87: SIG_PORT_NAME, ! 88: &driver_sig_port); ! 89: if(krtn) { ! 90: print("%s: can't find %s: %s\n", ! 91: argv[0], SIG_PORT_NAME, mach_error_string(krtn), 4,5); ! 92: exit(1); ! 93: } ! 94: port_allocate(task_self(), &driver_port); ! 95: if(get_devr_port(dev_ports, NUM_DEVICES)) { ! 96: /* ! 97: * Register with Config. ! 98: */ ! 99: crtn = IORegisterDriver(config_port, ! 100: driver_sig_port, ! 101: driver_port); ! 102: if(crtn) { ! 103: print("%s: IORegisterDriver: crtn = %d\n", ! 104: argv[0], crtn, 3,4,5); ! 105: exit(1); ! 106: } ! 107: } ! 108: ! 109: /* ! 110: * Sleep until killed. ! 111: */ ! 112: while(1) ! 113: sleep(1); ! 114: exit(0); ! 115: } ! 116: ! 117: /* ! 118: * look up all of our dev_ports. returns # of ports found. ! 119: */ ! 120: int get_devr_port(port_t *dev_ports, int max_devices) ! 121: { ! 122: int i; ! 123: name_array_t service_names; ! 124: unsigned int service_cnt; ! 125: name_array_t server_names; ! 126: unsigned int server_cnt; ! 127: bool_array_t service_active; ! 128: unsigned int service_active_cnt; ! 129: kern_return_t krtn; ! 130: int port_index = 0; ! 131: ! 132: krtn = bootstrap_info(bootstrap_port, ! 133: &service_names, ! 134: &service_cnt, ! 135: &server_names, ! 136: &server_cnt, ! 137: &service_active, ! 138: &service_active_cnt); ! 139: if (krtn != BOOTSTRAP_SUCCESS) { ! 140: print("%s: bootstrap_info: %s", ! 141: driver_name, mach_error_string(krtn), 3,4,5); ! 142: return(PORT_NULL); ! 143: } ! 144: ! 145: /* ! 146: * Search for devr_XXXX_XXXX. Later - versions and dev_index via ! 147: * dev_port_to_type(). ! 148: */ ! 149: print("%s: service_cnt %d\n", driver_name, service_cnt, 3,4,5); ! 150: for (i = 0; i < service_cnt; i++) { ! 151: #ifdef notdef ! 152: print("%s: service_name %s\n", driver_name, service_names[i], ! 153: 4,5); ! 154: #endif notdef ! 155: if(strncmp(service_names[i], ! 156: "dev_port_", strlen("dev_port_")) == 0) { ! 157: print("%s: port %s found\n", ! 158: driver_name, service_names[i], 3,4,5); ! 159: ! 160: /* ! 161: * Get the dev_port. ! 162: */ ! 163: krtn = bootstrap_look_up(bootstrap_port, ! 164: service_names[i], ! 165: &dev_ports[port_index]); ! 166: if(krtn) { ! 167: print("%s: bootstrap_look_up: %s", ! 168: driver_name, mach_error_string(krtn), ! 169: 3,4,5); ! 170: return(0); ! 171: } ! 172: else { ! 173: if(++port_index >= max_devices) { ! 174: print("%s: num_devices exceeded\n", ! 175: driver_name, 2,3,4,5); ! 176: return(port_index); ! 177: } ! 178: } ! 179: } ! 180: } ! 181: print("%s: %d dev_ports found\n", driver_name, port_index, 3,4,5); ! 182: return(port_index); ! 183: } ! 184: ! 185: #ifdef notdef ! 186: /* ! 187: * Destroy a dev_port. ! 188: * ! 189: * NOT SUPPORTED.... ! 190: */ ! 191: static int delete_dev = 0; ! 192: ! 193: void sigint(int foo) ! 194: { ! 195: config_return_t crtn; ! 196: ! 197: crtn = IODeleteDevice(config_port, ! 198: driver_sig_port, ! 199: dev_ports[delete_dev], ! 200: &crtn); ! 201: if(crtn) { ! 202: print("%s: crtn %d", driver_name, crtn, 3,4,5); ! 203: return; ! 204: } ! 205: dev_ports[delete_dev++] = PORT_NULL; ! 206: } ! 207: #endif notdef ! 208: ! 209: /* ! 210: * Destroy driver (without re-exec). ! 211: */ ! 212: void sighup(int foo) ! 213: { ! 214: IOConfigReturn crtn; ! 215: ! 216: crtn = IODeleteDriver(config_port, driver_sig_port); ! 217: if(crtn) { ! 218: print("%s IODeleteDriver: crtn %d", driver_name, crtn, 3,4,5); ! 219: return; ! 220: } ! 221: exit(0); ! 222: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.