]> git.wincent.com - WOTest.git/blob - WOTestBundleInjector.m
Fix object-to-pointer comparisons on Leopard
[WOTest.git] / WOTestBundleInjector.m
1 //
2 //  WOTestBundleInjector.m
3 //  WOTest
4 //
5 //  Created by Wincent Colaiuta on 06 August 2006.
6 //  Copyright 2006-2007 Wincent Colaiuta.
7 //  This program is free software: you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License as published by
9 //  the Free Software Foundation, either version 3 of the License, or
10 //  (at your option) any later version.
11 //
12 //  This program is distributed in the hope that it will be useful,
13 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 //  GNU General Public License for more details.
16 //
17 //  You should have received a copy of the GNU General Public License
18 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 //
20
21 // class header
22 #import "WOTestBundleInjector.h"
23
24 // system headers
25 #import <libkern/OSAtomic.h>        /* OSAtomicIncrement32Barrier() */
26
27 // other headers
28 #import "WOEnumerate.h"
29
30 @implementation WOTestBundleInjector
31
32 + (void)load
33 {
34     // do this once only
35     static int32_t initialized = 0;
36     if (OSAtomicIncrement32Barrier(&initialized) != 1)
37         return;
38         
39     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
40     char *inject = getenv("WOTestInjectBundle");
41     if (inject)
42     {
43         NSArray *bundles = [[NSString stringWithUTF8String:inject] componentsSeparatedByString:@":"];
44         WO_ENUMERATE(bundles, bundlePath)
45         {
46             NSString *path = [bundlePath stringByStandardizingPath];
47             if (![path isAbsolutePath])
48             {
49                 NSLog(@"WOTestBundleInjector: skipping bundle \"%@\" (absolute path required)", bundlePath);
50                 continue;
51             }
52             NSBundle *bundle = [NSBundle bundleWithPath:path];
53             if (!bundle)
54                 NSLog(@"WOTestBundleInjector: unable to get bundle for path \"%@\"", bundlePath);
55             else if ([bundle isLoaded])
56                 NSLog(@"WOTestBundleInjector: skipping bundle \"%@\" (already loaded)", bundlePath);
57             else if ([bundle load])
58                 NSLog(@"WOTestBundleInjector: bundle \"%@\" loaded", bundlePath);
59             else
60                 // Note that you can't "load" application bundles this way, trying will wind up here
61                 // not even with low-level functions like NSCreateObjectFileImageFromFile() and NSCreateObjectFileImageFromMemory()
62                 // the docs for those functions say "you must build the Mach-O executable file using the -bundle linker option"
63                 // dlopen() successfully loads application executables but the symbols aren't visible even with the RTLD_NOW flag
64                 // CFBundle probably has the same limitations as well, altough haven't tested this
65                 NSLog(@"WOTestBundleInjector: failed to load bundle \"%@\"", bundlePath);
66         }
67     }
68     [pool release];
69 }
70
71 @end