#import "SampleApp.h" #include #include @implementation SampleApp - (NSArray *) daemonFiles { int i; NSMutableArray *results = [[NSMutableArray alloc] init]; NSString *currentItemName; NSDirectoryEnumerator *lddir; NSString *dirname = @"/System/Library/LaunchDaemons"; lddir = [[NSFileManager defaultManager] enumeratorAtPath: dirname]; while (currentItemName = [lddir nextObject]) { BOOL isDir; NSString *errorString; [[NSFileManager defaultManager] fileExistsAtPath:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName] isDirectory:&isDir]; if (![[currentItemName lastPathComponent] hasPrefix:@"."] && !isDir) { NSData *xmlData; xmlData = [NSData dataWithContentsOfFile:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName]]; id plist = (id)CFPropertyListCreateFromXMLData( kCFAllocatorDefault, (CFDataRef)xmlData, kCFPropertyListMutableContainers, (CFStringRef *)&errorString); [results addObject:[plist objectForKey:@"Label"]]; } } dirname = @"/Library/LaunchDaemons"; lddir = [[NSFileManager defaultManager] enumeratorAtPath: dirname]; while (currentItemName = [lddir nextObject]) { BOOL isDir; NSString *errorString; [[NSFileManager defaultManager] fileExistsAtPath:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName] isDirectory:&isDir]; if (![[currentItemName lastPathComponent] hasPrefix:@"."] && !isDir) { NSData *xmlData; xmlData = [NSData dataWithContentsOfFile:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName]]; id plist = (id)CFPropertyListCreateFromXMLData( kCFAllocatorDefault, (CFDataRef)xmlData, kCFPropertyListMutableContainers, (CFStringRef *)&errorString); [results addObject:[plist objectForKey:@"Label"]]; } } return results; } - (NSString *) reverseLookup:(id) aString { int i; NSString *dirname = @"/System/Library/LaunchDaemons"; NSString *currentItemName; NSDirectoryEnumerator *lddir; lddir = [[NSFileManager defaultManager] enumeratorAtPath: dirname]; while (currentItemName = [lddir nextObject]) { BOOL isDir; NSString *errorString; [[NSFileManager defaultManager] fileExistsAtPath:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName] isDirectory:&isDir]; if (![[currentItemName lastPathComponent] hasPrefix:@"."] && !isDir) { NSData *xmlData; xmlData = [NSData dataWithContentsOfFile:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName]]; id plist = (id)CFPropertyListCreateFromXMLData( kCFAllocatorDefault, (CFDataRef)xmlData, kCFPropertyListMutableContainers, (CFStringRef *)&errorString); if ([[plist objectForKey:@"Label"] isEqualToString:aString]) return [[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName]; } } dirname = @"/Library/LaunchDaemons"; lddir = [[NSFileManager defaultManager] enumeratorAtPath: dirname]; while (currentItemName = [lddir nextObject]) { BOOL isDir; NSString *errorString; [[NSFileManager defaultManager] fileExistsAtPath:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName] isDirectory:&isDir]; if (![[currentItemName lastPathComponent] hasPrefix:@"."] && !isDir) { NSData *xmlData; xmlData = [NSData dataWithContentsOfFile:[[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName]]; id plist = (id)CFPropertyListCreateFromXMLData( kCFAllocatorDefault, (CFDataRef)xmlData, kCFPropertyListMutableContainers, (CFStringRef *)&errorString); if ([[plist objectForKey:@"Label"] isEqualToString:aString]) return [[dirname stringByAppendingString:@"/"] stringByAppendingString:currentItemName]; } } return @"Not Found"; } - (NSMutableArray *) getctl { char *cmd = [@"/bin/launchctl list" UTF8String]; FILE *fp = popen(cmd, "r"); if (fp == NULL) {NSLog(@"popen failed"); exit(1);} NSString *riz = @""; int c; int kBlockSize = 512; do { char buf[kBlockSize]; c = fread(buf, sizeof(char), kBlockSize, fp); if (c <= 0) break; buf[c] = '\0'; riz = [riz stringByAppendingString: [NSString stringWithCString:buf encoding:1]]; } while (1); int i; id st; NSArray *xarray = [riz componentsSeparatedByString:@"\n"]; NSMutableArray *outarray = [[NSMutableArray alloc] init]; for (i = 2; i < [xarray count]; i++) { st = [[xarray objectAtIndex:i] componentsSeparatedByString:@" "]; if ([st count] == 4) [outarray addObject:[st objectAtIndex:3]]; } return outarray; } - (int) numberOfRowsInTable: (UITable *)table { return [cells count]; } - (id)table:(id)fp8 cellForRow:(int)row column:(id)fp16 reusing:(id)fp20 { [cells objectAtIndex:row]; } - (id)table:(id)fp8 cellForRow:(int)row column:(id)fp16 { return [cells objectAtIndex:row]; } - (void) removeCell: (id) aCell { [cells removeObjectAtIndex:[cells indexOfObject:aCell]]; [table reloadData]; } - (void) setCellText: (NSString *) celltext forCell: (id) theCell { [theCell setTitle:celltext]; } - (void) deselectAll { int i; for (i = 0; i < [cells count]; i++) [[cells objectAtIndex:i] setSelected:NO]; } - (void) color: (id) acell { float rcolorComponents[4] = {1.0, 0.0, 0.0, 0.5}; float bcolorComponents[4] = {0.0, 0.0, 0.0, 1.0}; CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceRGB(); CGColorRef redColor = CGColorCreate(rgbSpace, rcolorComponents); CGColorRef blackColor = CGColorCreate(rgbSpace, bcolorComponents); CGColorSpaceRelease(rgbSpace); NSArray *ctls = [self getctl]; // partial BOOL match = NO; int j; for (j = 0; j < [ctls count]; j++) if ([[acell title] isEqualToString:[ctls objectAtIndex:j]]) match = YES; [acell setxEnabled:match]; [acell setHostapp:self]; if (match) [[acell titleTextLabel] setColor: blackColor]; else [[acell titleTextLabel] setColor: redColor]; } - (id) addCell: (id) theText { id acell; acell = [[EdCell alloc] init]; [self setCellText:theText forCell:acell]; [cells addObject:acell]; [self color:acell]; return acell; } - (void) initCells { id acell; int i; NSArray *daemons = [self daemonFiles]; for (i = 0; i < [daemons count]; i++) acell = [self addCell:[daemons objectAtIndex:i]]; } - (void) doConfirmedAction { char *cmd = [whichAction UTF8String]; FILE *fp = popen(cmd, "r"); if (fp == NULL) {NSLog(@"popen failed"); exit(1);} NSString *riz = @""; int c; int kBlockSize = 512; do { char buf[kBlockSize]; c = fread(buf, sizeof(char), kBlockSize, fp); if (c <= 0) break; buf[c] = '\0'; riz = [riz stringByAppendingString: [NSString stringWithCString:buf encoding:1]]; } while (1); NSLog(@"Results: %@", riz); [self color:whichCell]; } - (void) alertSheet:(id) sheet buttonClicked:(int) bnum { if (sheet == confirmalert) { [whichCell setSelected:NO]; [sheet dismiss]; if (bnum == 2) return; // action is confirmed. Do it. [self doConfirmedAction]; return; } if (bnum == 4) {[sheet dismiss]; return;} BOOL doload = (sheet == enablealert); NSString *ncmd; NSString *basecmd, *xpath; if (doload) { if (bnum == 1) basecmd = @"load"; if (bnum == 2) basecmd = @"load -w"; if (bnum == 3) basecmd = @"start"; } else { if (bnum == 1) basecmd = @"unload"; if (bnum == 2) basecmd = @"unload -w"; if (bnum == 3) basecmd = @"stop"; } if (bnum != 3) // need full path { xpath = [self reverseLookup:[whichCell title]]; } else { xpath = [whichCell title]; } whichAction = [NSString stringWithFormat:@"/bin/launchctl %@ %@", basecmd, xpath]; NSLog(whichAction); [sheet dismiss]; [confirmalert setTitle:@"Please confirm"]; [confirmalert setBodyText:whichAction]; [confirmalert presentSheetFromAboveView:mainView]; } - (void) performActionforCell: (id) theCell { id *sheet; whichCell = theCell; sheet = [theCell isxEnabled] ? disablealert : enablealert; [sheet presentSheetFromAboveView:mainView]; } - (void) applicationDidFinishLaunching: (id) unused { UIWindow *window; struct CGRect rect = [UIHardware fullScreenApplicationContentRect]; rect.origin.x = rect.origin.y = 0.0f; window = [[UIWindow alloc] initWithContentRect: rect]; mainView = [[UIView alloc] initWithFrame: rect]; table = [[UITable alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 480.0f - 45.0f)]; UITableColumn *col = [[UITableColumn alloc] initWithTitle: @"Items" identifier: @"Items" width: 320.0f]; bnav = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 480.0f - 45.0f, 320.0f, 45.0f)]; [bnav showButtonsWithLeftTitle:nil rightTitle:nil leftBack:NO]; [table addTableColumn: col]; [table setDataSource: self]; [table setDelegate: self]; cells = [[NSMutableArray alloc] init]; [self initCells]; [table reloadData]; [mainView addSubview:table]; [mainView addSubview:bnav]; NSMutableArray *ebuttons = [[NSMutableArray alloc] init]; [ebuttons addObject:[NSString stringWithString:@"load"]]; [ebuttons addObject:[NSString stringWithString:@"load -w"]]; [ebuttons addObject:[NSString stringWithString:@"start"]]; [ebuttons addObject:[NSString stringWithString:@"cancel"]]; NSMutableArray *dbuttons = [[NSMutableArray alloc] init]; [dbuttons addObject:[NSString stringWithString:@"unload"]]; [dbuttons addObject:[NSString stringWithString:@"unload -w"]]; [dbuttons addObject:[NSString stringWithString:@"stop"]]; [dbuttons addObject:[NSString stringWithString:@"cancel"]]; enablealert = [[UIAlertSheet alloc] initWithTitle:@"" buttons:ebuttons defaultButtonIndex:3 delegate:self context:self]; disablealert = [[UIAlertSheet alloc] initWithTitle:@"" buttons:dbuttons defaultButtonIndex:3 delegate:self context:self]; NSMutableArray *ynbuttons = [[NSMutableArray alloc] init]; [ynbuttons addObject:[NSString stringWithString:@"Do it!"]]; [ynbuttons addObject:[NSString stringWithString:@"Cancel"]]; confirmalert = [[UIAlertSheet alloc] initWithTitle:@"" buttons:ynbuttons defaultButtonIndex:1 delegate:self context:self]; [window orderFront: self]; [window makeKey: self]; [window _setHidden: NO]; [window setContentView: mainView]; } @end