Monitor pac file with GCD instead of FSEventStreamCreate.
Old approach is not working on new version MacOS.
This commit is contained in:
@ -211,45 +211,34 @@ FSEventStreamRef fsEventStream;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onPACChange(
|
|
||||||
ConstFSEventStreamRef streamRef,
|
|
||||||
void *clientCallBackInfo,
|
|
||||||
size_t numEvents,
|
|
||||||
void *eventPaths,
|
|
||||||
const FSEventStreamEventFlags eventFlags[],
|
|
||||||
const FSEventStreamEventId eventIds[])
|
|
||||||
{
|
|
||||||
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
|
|
||||||
if ([defaults boolForKey:@"ShadowsocksOn"]) {
|
|
||||||
if ([[defaults stringForKey:@"ShadowsocksRunningMode"] isEqualToString:@"auto"]) {
|
|
||||||
[ProxyConfHelper disableProxy];
|
|
||||||
[ProxyConfHelper enablePACProxy];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void)startMonitorPAC {
|
+ (void)startMonitorPAC {
|
||||||
NSString* PACFilePath = [self getPACFilePath];
|
NSString* PACFilePath = [self getPACFilePath];
|
||||||
|
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
|
||||||
if (fsEventStream) {
|
int fileId = open([PACFilePath UTF8String], O_EVTONLY);
|
||||||
return;
|
__block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fileId,
|
||||||
}
|
DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE,
|
||||||
CFStringRef mypath = (__bridge CFStringRef)(PACFilePath);
|
queue);
|
||||||
CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL);
|
dispatch_source_set_event_handler(source, ^
|
||||||
void *callbackInfo = NULL; // could put stream-specific data here.
|
{
|
||||||
CFAbsoluteTime latency = 3.0; /* Latency in seconds */
|
unsigned long flags = dispatch_source_get_data(source);
|
||||||
|
if(flags & DISPATCH_VNODE_DELETE)
|
||||||
/* Create the stream, passing in a callback */
|
{
|
||||||
fsEventStream = FSEventStreamCreate(NULL,
|
dispatch_source_cancel(source);
|
||||||
&onPACChange,
|
} else {
|
||||||
callbackInfo,
|
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
|
||||||
pathsToWatch,
|
if ([defaults boolForKey:@"ShadowsocksOn"]) {
|
||||||
kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
|
if ([[defaults stringForKey:@"ShadowsocksRunningMode"] isEqualToString:@"auto"]) {
|
||||||
latency,
|
[ProxyConfHelper disableProxy];
|
||||||
kFSEventStreamCreateFlagNone /* Flags explained in reference */
|
[ProxyConfHelper enablePACProxy];
|
||||||
);
|
}
|
||||||
FSEventStreamScheduleWithRunLoop(fsEventStream, [[NSRunLoop mainRunLoop] getCFRunLoop], (__bridge CFStringRef)NSDefaultRunLoopMode);
|
}
|
||||||
FSEventStreamStart(fsEventStream);
|
}
|
||||||
|
});
|
||||||
|
dispatch_source_set_cancel_handler(source, ^(void)
|
||||||
|
{
|
||||||
|
close(fileId);
|
||||||
|
});
|
||||||
|
dispatch_resume(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
Reference in New Issue
Block a user