kextunload_main.h   [plain text]


/*
 * Copyright (c) 2008 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
#ifndef _KEXTUNLOAD_MAIN_H
#define _KEXTUNLOAD_MAIN_H

#include <IOKit/kext/OSKext.h>

#include <getopt.h>
#include <sysexits.h> 

#include "kext_tools_util.h"

#pragma mark Basic Types & Constants
/*******************************************************************************
* Constants
*******************************************************************************/
enum {
    kKextunloadExitOK = EX_OK,
    kKextunloadExitNotFound = 1,
    kKextunloadExitNotPrivileged = 2,
    kKextunloadExitPartialFailure = 3,
    
    // don't think we use it
    kKextunloadExitUnspecified = 11,

    // don't actually exit with this, it's just a sentinel value
    kKextunloadExitHelp = 33
};

#pragma mark Command-line Option Definitions
/*******************************************************************************
* Command-line options. This data is used by getopt_long_only().
*
* Options common to all kext tools are in kext_tools_util.h.
*******************************************************************************/

#define kOptNameClassName           "class"
#define kOptNamePersonalitiesOnly   "personalities-only"

// really old option letter for "module", same as bundle id
#define kOptClassName          'c'
#define kOptModule             'm'
#define kOptPersonalitiesOnly  'p'

#define kOptChars  "b:c:hm:pqr:v"

int longopt = 0;

struct option sOptInfo[] = {
    { kOptNameHelp,                  no_argument,        NULL, kOptHelp },

    { kOptNameBundleIdentifier,      required_argument,  NULL, kOptBundleIdentifier },

    { kOptNameClassName,             required_argument,  NULL, kOptClassName },
    { kOptNamePersonalitiesOnly,     no_argument,        NULL, kOptPersonalitiesOnly },

    { kOptNameQuiet,                 required_argument,  NULL, kOptQuiet },
    { kOptNameVerbose,               optional_argument,  NULL, kOptVerbose },

    { NULL, 0, NULL, 0 }  // sentinel to terminate list
};


#pragma mark Tool Args Structure
/*******************************************************************************
* Tool Args Structure
*******************************************************************************/
typedef struct {
    Boolean           unloadPersonalities;  // -p
    uint32_t          terminateOption;      // -p

    CFMutableArrayRef kextURLs;             // args
    CFMutableArrayRef kextBundleIDs;        // -b/-m -- array of C strings!
    CFMutableArrayRef kextClassNames;       // -c    -- array of C strings!
    
    CFMutableArrayRef kexts;                // any kexts created from URLs
} KextunloadArgs;

#pragma mark Function Prototypes
/*******************************************************************************
* Function Prototypes
*******************************************************************************/
ExitStatus   readArgs(
    int              argc,
    char * const *   argv,
    KextunloadArgs * toolArgs);
ExitStatus   checkArgs(KextunloadArgs * toolArgs);
ExitStatus   createKextsIfNecessary(KextunloadArgs * toolArgs);

ExitStatus terminateKextClasses(
    KextunloadArgs * toolArgs,
    Boolean * fatal);
ExitStatus unloadKextsByIdentifier(
    KextunloadArgs * toolArgs,
    Boolean * fatal);
ExitStatus unloadKextsByURL(
    KextunloadArgs * toolArgs,
    Boolean * fatal);
ExitStatus unloadKextWithIdentifier(
    CFStringRef      kextIdentifier,
    KextunloadArgs * toolArgs,
    Boolean        * fatal);

ExitStatus   formatKernResult(kern_return_t kernResult);
void         usage(UsageLevel usageLevel);

#endif /* _KEXTUNLOAD_MAIN_H */