1/* 2 * kextlibs_main.h 3 * kext_tools 4 * 5 * Created by Nik Gervae on 5/03/08. 6 * Copyright 2008 Apple Inc. All rights reserved. 7 * 8 */ 9#ifndef _KEXTLIBS_MAIN_H 10#define _KEXTLIBS_MAIN_H 11 12#include <CoreFoundation/CoreFoundation.h> 13#include <IOKit/kext/OSKext.h> 14 15#include <getopt.h> 16#include <sysexits.h> 17 18#include <mach-o/arch.h> 19 20#include "kext_tools_util.h" 21 22#pragma mark Basic Types & Constants 23/******************************************************************************* 24* Constants 25*******************************************************************************/ 26enum { 27 kKextlibsExitOK = EX_OK, 28 kKextlibsExitUndefineds = 1, 29 kKextlibsExitMultiples = 2, 30 31 // don't actually exit with this, it's just a sentinel value 32 kKextlibsExitHelp = 33 33}; 34 35#pragma mark Command-line Option Definitions 36/******************************************************************************* 37* Command-line options. This data is used by getopt_long_only(). 38* 39* Options common to all kext tools are in kext_tools_util.h. 40*******************************************************************************/ 41 42#define kOptNameXML "xml" 43#define kOptNameCompatible "compatible-versions" 44#define kOptNameAllSymbols "all-symbols" 45#define kOptNameUndefSymbols "undef-symbols" 46#define kOptNameOnedefSymbols "onedef-symbols" 47#define kOptNameMultdefSymbols "multdef-symbols" 48#define kOptNameNonKPI "non-kpi" 49#define kOptNameUnsupported "unsupported" 50#define kOptNameLibraryRefs "library-references" 51 52#define kOptCompatible 'c' 53#define kOptSystemExtensions 'e' 54#define kOptRepository 'r' 55 56#define kOptChars "cehr:" 57 58/* Options with no single-letter variant. */ 59// Do not use -1, that's getopt() end-of-args return value 60// and can cause confusion 61#define kLongOptLongindexHack (-2) 62#define kLongOptXML (-3) 63#define kLongOptAllSymbols (-4) 64#define kLongOptUndefSymbols (-5) 65#define kLongOptOnedefSymbols (-6) 66#define kLongOptMultdefSymbols (-7) 67#define kLongOptNonKPI (-8) 68#define kLongOptUnsupported (-9) 69 70int longopt = 0; 71 72struct option sOptInfo[] = { 73 { kOptNameHelp, no_argument, NULL, kOptHelp }, 74 { kOptNameSystemExtensions, no_argument, NULL, kOptSystemExtensions }, 75 { kOptNameRepository, required_argument, NULL, kOptRepository }, 76 { kOptNameCompatible, no_argument, NULL, kOptCompatible }, 77 { kOptNameXML, no_argument, &longopt, kLongOptXML }, 78 { kOptNameAllSymbols, no_argument, &longopt, kLongOptAllSymbols }, 79 { kOptNameUndefSymbols, no_argument, &longopt, kLongOptUndefSymbols }, 80 { kOptNameOnedefSymbols, no_argument, &longopt, kLongOptOnedefSymbols }, 81 { kOptNameMultdefSymbols, no_argument, &longopt, kLongOptMultdefSymbols }, 82 { kOptNameNonKPI, no_argument, &longopt, kLongOptNonKPI }, 83 { kOptNameUnsupported, no_argument, &longopt, kLongOptUnsupported }, 84 85 { kOptNameQuiet, no_argument, NULL, kOptQuiet }, 86 { kOptNameVerbose, optional_argument, NULL, kOptVerbose }, 87 88 { NULL, 0, NULL, 0 } // sentinel to terminate list 89}; 90 91#pragma mark Tool Args Structure 92/******************************************************************************* 93* Tool Args Structure 94*******************************************************************************/ 95typedef struct { 96 Boolean flagSysKexts; 97 Boolean flagXML; 98 Boolean flagCompatible; 99 Boolean flagPrintUndefSymbols; 100 Boolean flagPrintOnedefSymbols; 101 Boolean flagPrintMultdefSymbols; 102 Boolean flagNonKPI; 103 Boolean flagAllowUnsupported; 104 CFMutableArrayRef repositoryURLs; // must release 105 char * kextName; // do not free; from argv 106 CFURLRef kextURL; // must release 107 OSKextRef theKext; 108} KextlibsArgs; 109 110typedef struct { 111 CFArrayRef libKexts; 112 CFDictionaryRef undefSymbols; 113 CFDictionaryRef onedefSymbols; 114 CFDictionaryRef multdefSymbols; 115 CFArrayRef multdefLibs; 116} KextlibsInfo; 117 118#pragma mark Function Prototypes 119/******************************************************************************* 120* Function Prototypes 121*******************************************************************************/ 122ExitStatus readArgs( 123 int argc, 124 char * const * argv, 125 KextlibsArgs * toolArgs); 126ExitStatus addRepository( 127 KextlibsArgs * toolArgs, 128 const char * optarg); 129ExitStatus printLibs( 130 KextlibsArgs * toolArgs, 131 const NXArchInfo * arch, 132 CFArrayRef libKexts, 133 Boolean trailingNewlineFlag); 134ExitStatus printProblems( 135 KextlibsArgs * toolArgs, 136 const NXArchInfo * arch, 137 CFDictionaryRef undefSymbols, 138 CFDictionaryRef onedefSymbols, 139 CFDictionaryRef multdefSymbols, 140 CFArrayRef multdefLibs, 141 Boolean printArchFlag, 142 Boolean trailingNewlineFlag); 143ExitStatus printResults( 144 KextlibsArgs * toolArgs, 145 const NXArchInfo * arch, 146 Boolean archSpecific, 147 CFArrayRef libKexts, 148 CFDictionaryRef undefSymbols, 149 CFDictionaryRef onedefSymbols, 150 CFDictionaryRef multdefSymbols, 151 CFArrayRef multdefLibs); 152void printUndefSymbol(const void * key, const void * value, void * context); 153void printOnedefSymbol(const void * key, const void * value, void * context); 154void printMultdefSymbol(const void * key, const void * value, void * context); 155 156static void usage(UsageLevel usageLevel); 157 158#endif /* _KEXTLIBS_MAIN_H */ 159