-
Notifications
You must be signed in to change notification settings - Fork 1
/
DUMachBootstrapServer.m
136 lines (105 loc) · 3.18 KB
/
DUMachBootstrapServer.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//
// DUMachBootstrapServer.m
// DNSUpdate2
//
// Created by Julien Jalon on 16/04/06.
// Copyright 2006 __MyCompanyName__. All rights reserved.
//
#import "DUMachBootstrapServer.h"
#include <mach/mach_port.h>
#include <mach/task.h>
#include <mach/task_special_ports.h>
#include <servers/bootstrap.h>
typedef struct _DUMBSReserved {
mach_port_t bootstrapPort;
} DUMBSReserved;
#define _bootstrapPort (((DUMBSReserved *)du_reserved)->bootstrapPort)
@implementation DUMachBootstrapServer
+ (DUMachBootstrapServer *)defaultServer
{
static DUMachBootstrapServer* server = nil;
if(server == nil) {
server = [[DUMachBootstrapServer alloc] init];
}
return server;
}
- (id)init
{
self = [super init];
du_reserved = calloc(1, sizeof(DUMBSReserved));
_bootstrapPort = MACH_PORT_NULL;
mach_port_t bPort = MACH_PORT_NULL;
NSLog(@"Getting task bootstrap port");
if(task_get_bootstrap_port(mach_task_self(), &bPort)) {
NSLog(@"Can't get bootstrap port");
} else {
#if 0
NSLog(@"Getting priviledged bootstrap port");
if(bootstrap_parent(bPort, &_bootstrapPort)) {
NSLog(@"Can't get priviledged bootstrap port");
mach_port_deallocate(mach_task_self(), bPort);
_bootstrapPort = MACH_PORT_NULL;
}
#else
_bootstrapPort = bPort;
#endif
}
return self;
}
- (void)dealloc
{
if(du_reserved) {
if(_bootstrapPort != MACH_PORT_NULL) {
mach_port_deallocate(mach_task_self(), _bootstrapPort);
}
free(du_reserved);
}
[super dealloc];
}
- (NSPort *)portForName:(NSString *)name {
if(_bootstrapPort != MACH_PORT_NULL) {
return nil;
}
char cString[BOOTSTRAP_MAX_NAME_LEN+1];
if(![name canBeConvertedToEncoding:NSUTF8StringEncoding]) {
return nil;
}
if(![name getCString:cString maxLength:BOOTSTRAP_MAX_NAME_LEN encoding:NSUTF8StringEncoding]) {
return nil;
}
mach_port_t resultPort = MACH_PORT_NULL;
if(bootstrap_look_up(_bootstrapPort, cString, &resultPort)) {
NSLog(@"Can't get port named %@", name);
return nil;
}
return [[[NSMachPort alloc] initWithMachPort:resultPort] autorelease];
}
- (NSPort *)portForName:(NSString *)name host:(NSString *)host {
if((host == nil) || [host isEqual:@""]) {
return [self portForName:name];
}
return nil;
}
- (BOOL)registerPort:(NSPort *)port name:(NSString *)name {
NSLog(@"Registering port with name %@", name);
if(_bootstrapPort == MACH_PORT_NULL) {
return NO;
}
char cString[BOOTSTRAP_MAX_NAME_LEN+1];
if(![name canBeConvertedToEncoding:NSUTF8StringEncoding]) {
return NO;
}
if(![name getCString:cString maxLength:BOOTSTRAP_MAX_NAME_LEN encoding:NSUTF8StringEncoding]) {
return NO;
}
if(bootstrap_register(_bootstrapPort, cString, [(NSMachPort *)port machPort])) {
NSLog(@"Can't register port named %@", name);
return NO;
}
return YES;
}
- (BOOL)removePortForName:(NSString *)name {
NSLog(@"Removing port with name %@", name);
return NO;
}
@end