-
Notifications
You must be signed in to change notification settings - Fork 1
/
DUDefaultInterface.m
141 lines (108 loc) · 3.41 KB
/
DUDefaultInterface.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
137
138
139
140
141
//
// DUDefaultInterface.m
// DNSUpdate2
//
// Created by jalon on Fri Nov 30 2001.
// Copyright (c) 2001-2003 Julien Jalon. All rights reserved.
//
#import "DUDefaultInterface.h"
#include <SystemConfiguration/SystemConfiguration.h>
static DUInterface *_duDefaultInterface=nil;
@implementation DUDefaultInterface
+ (DUInterface *)defaultInterface {
if(!_duDefaultInterface) {
_duDefaultInterface=[[self alloc] initWithName:@"Default Interface"];
}
return _duDefaultInterface;
}
- (void)cacheAddress {
NSString *ipAddress=nil;
SCDynamicStoreRef dynRef=SCDynamicStoreCreate(NULL, (CFStringRef)@"DNSUpdate daemon", NULL, NULL);
NSDictionary *objects;
NSArray *addresses;
NSString *currentInterface;
if(!dynRef) {
if([self isActive]) {
NSLog(@"\"%@\": can't contact system configuration",self);
[DUInterface setMustNotifyObservers];
}
[self setActive:NO];
interfaceError=DUIPCheckError;
cachedIP=nil;
return;
}
objects=(NSDictionary *)SCDynamicStoreCopyValue(dynRef,(CFStringRef)@"State:/Network/Global/IPv4");
if(!objects) {
if([self isActive]) {
NSLog(@"\"%@\": Can't locate Network configuration",self);
[DUInterface setMustNotifyObservers];
}
[self setActive:NO];
interfaceError=DUIPCheckError;
CFRelease(dynRef);
cachedIP=nil;
return;
}
currentInterface=[[objects objectForKey:@"PrimaryInterface"] copy];
if(!currentInterface) {
if([self isActive]) {
NSLog(@"\"%@\": Can't locate Primary Interface",self);
[DUInterface setMustNotifyObservers];
}
[self setActive:NO];
interfaceError=DUIPCheckError;
[objects release];
CFRelease(dynRef);
cachedIP=nil;
return;
}
[objects release];
objects=(NSDictionary *)SCDynamicStoreCopyValue(dynRef,(CFStringRef)[NSString stringWithFormat:@"State:/Network/Interface/%@/IPv4",currentInterface]);
[currentInterface release];
if(!objects) {
if([self isActive]) {
NSLog(@"\"%@\": Can't get Interface configuration",self);
[DUInterface setMustNotifyObservers];
}
[self setActive:NO];
interfaceError=DUIPCheckError;
CFRelease(dynRef);
cachedIP=nil;
return;
}
addresses=[objects objectForKey:@"Addresses"];
if(!addresses) {
if([self isActive]) {
NSLog(@"\"%@\": Can't get addresses",self);
[DUInterface setMustNotifyObservers];
}
[self setActive:NO];
interfaceError=DUIPCheckError;
[objects release];
CFRelease(dynRef);
cachedIP=nil;
return;
}
ipAddress=[[[addresses objectAtIndex:0] copy] autorelease];
if(!ipAddress) {
if([self isActive]) {
NSLog(@"\"%@\": Can't get address",self);
[DUInterface setMustNotifyObservers];
}
[self setActive:NO];
interfaceError=DUIPCheckError;
[objects release];
CFRelease(dynRef);
cachedIP=nil;
return;
}
if(![self isActive]) {
NSLog(@"Activate interface %@",[self getName]);
[DUInterface setMustNotifyObservers];
}
[self setActive:YES];
[objects release];
CFRelease(dynRef);
cachedIP=[ipAddress retain];
}
@end