|
|
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) 1993 NeXT Computer, Inc. All rights reserved. ! 25: * ! 26: * Kernel level implementation of IOConfigTable. ! 27: * ! 28: * HISTORY ! 29: * 29-Jan-93 Doug Mitchell at NeXT ! 30: * Created. ! 31: */ ! 32: ! 33: #import <driverkit/IOConfigTable.h> ! 34: #import <driverkit/configTableKern.h> ! 35: #import <driverkit/configTablePrivate.h> ! 36: #import <driverkit/generalFuncs.h> ! 37: #if i386 ! 38: #import <machdep/i386/kernBootStruct.h> ! 39: #endif i386 ! 40: #import <string.h> ! 41: ! 42: /* ! 43: * This really should be static, but it has a prototype in <ansi/string.h>. ! 44: */ ! 45: char *strstr(const char *s1, const char *s2); ! 46: ! 47: /* ! 48: * The _private ivar is a char *. ! 49: */ ! 50: @implementation IOConfigTable ! 51: ! 52: - free ! 53: { ! 54: char *configData = (char *)_private; ! 55: ! 56: if(configData) { ! 57: IOFree(configData, strlen(configData)+1); ! 58: } ! 59: return [super free]; ! 60: } ! 61: ! 62: /* ! 63: * Obtain the system-wide configuration table. ! 64: */ ! 65: + newFromSystemConfig ! 66: { ! 67: #if i386 ! 68: KERNBOOTSTRUCT *bootstruct = KERNSTRUCT_ADDR; ! 69: return [self newForConfigData: &bootstruct->config[0]]; ! 70: #else i386 ! 71: /* ! 72: * FIXME - where is KERNBOOTSTRUCT? ! 73: */ ! 74: return nil; ! 75: #endif i386 ! 76: } ! 77: ! 78: /* ! 79: * Obtain value for specified string key. Returns null of key not ! 80: * found. ! 81: * The string here must eventually be freed (by the caller) via ! 82: * IOFree(buf, strlen(buf) + 1). This is kinda bogus... ! 83: */ ! 84: - (const char *)valueForStringKey:(const char *)key ! 85: { ! 86: const char *configData = (char *)_private; ! 87: const char *valueEnd; ! 88: const char *valueStart; ! 89: char *out; ! 90: int length; ! 91: ! 92: length = strlen(key); ! 93: { ! 94: char quotedkey[length + 3]; ! 95: ! 96: quotedkey[0] = '"'; ! 97: strcpy("edkey[1], key); ! 98: quotedkey[length + 1] = '"'; ! 99: quotedkey[length + 2] = 0; ! 100: ! 101: valueStart = strstr(configData, quotedkey); ! 102: if (valueStart == NULL) ! 103: return NULL; ! 104: ! 105: valueStart += (length + 2); // point past the quoted key ! 106: } ! 107: ! 108: /* ! 109: * ValueStart points just past the quoted key ! 110: */ ! 111: valueStart = strchr(valueStart, '"'); ! 112: valueStart++; ! 113: ! 114: /* ! 115: * valueStart points to the first character of the desired value. ! 116: */ ! 117: valueEnd = strchr(valueStart, '"'); ! 118: if (valueEnd != NULL) { ! 119: length = valueEnd - valueStart; ! 120: out = IOMalloc(length + 1); ! 121: strncpy(out, valueStart, length); ! 122: out[length] = '\0'; ! 123: return out; ! 124: } ! 125: else { ! 126: return NULL; ! 127: } ! 128: } ! 129: ! 130: ! 131: + (void)freeString : (const char *)string ! 132: { ! 133: IOFree((char *)string, strlen(string) + 1); ! 134: } ! 135: ! 136: - (void)freeString : (const char *)string ! 137: { ! 138: [IOConfigTable freeString:string]; ! 139: } ! 140: ! 141: ! 142: @end ! 143: ! 144: @implementation IOConfigTable(KernelPrivate) ! 145: ! 146: /* ! 147: * Create a new instance for specified IOConfigData text. ! 148: */ ! 149: + newForConfigData : (const char *)configData ! 150: { ! 151: IOConfigTable *configTable = [[self alloc] init]; ! 152: char *data; ! 153: int ssize = strlen(configData) + 1; ! 154: ! 155: if(ssize > IO_CONFIG_DATA_SIZE) { ! 156: ssize = IO_CONFIG_DATA_SIZE; ! 157: } ! 158: data = IOMalloc(ssize); ! 159: bcopy(configData, data, ssize-1); ! 160: data[ssize-1] = 0; ! 161: configTable->_private = data; ! 162: return configTable; ! 163: } ! 164: ! 165: @end ! 166: ! 167: /* ! 168: * Like strchr, but searches for a string. Returns pointer to start of ! 169: * the found string, else returns NULL. ! 170: */ ! 171: char *strstr(const char *s1, const char *s2) { ! 172: char c1; ! 173: const char c2 = *s2; ! 174: ! 175: while ((c1 = *s1++) != '\0') { ! 176: if (c1 == c2) { ! 177: const char *p1, *p2; ! 178: ! 179: p1 = s1; ! 180: p2 = &s2[1]; ! 181: while (*p1++ == (c1 = *p2++) && c1) { ! 182: continue; ! 183: } ! 184: if (c1 == '\0') { ! 185: return ((char *)s1) - 1; ! 186: } ! 187: } ! 188: } ! 189: return NULL; ! 190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.