Unloading Launch Daemon app using Cocoa Application
Unloading Launch Daemon app using Cocoa Application
- Subject: Unloading Launch Daemon app using Cocoa Application
- From: JanakiRam <email@hidden>
- Date: Thu, 20 Mar 2008 22:02:33 +0530
Hi All,
I'm implementing the cocoa application using objective-c. Now my
requirement is to restart my launchd daemon service.
I've tried using authorization services to perform the previlaged
unload of daemon , but didn't succeed in this.
Please help me to solve this.Thanks in Advance.
Note : Attaching the sample code for your reference.
*returnCode = [blAuth
unloadLaunchctlProcess:@"/Library/LaunchDaemons/com.mycompany.cocoadaemon.plist"];
*
*
//============================================================================
// - (void)unloadLaunchctlProcess:(NSString *)commandFromPS
//============================================================================
// unloads the launchctl process specified in (NSString *)commandFromPS
using launchctl
// The more specific (ie., closer to matching the actual listing in ps)
// commandFromPS is the better your accuracy will be, esp. when multiple
// versions of the process exist.
//
- (BOOL)unloadLaunchctlProcess:(NSString *)commandFromPS {*
* if( ![self isAuthenticated:[NSArray arrayWithObject:commandFromPS]] ) {
[self authenticate:[NSArray arrayWithObject:commandFromPS]];
}
return [self executeCommand:@"/bin/launchctl" withArgs:[NSArray
arrayWithObjects:@"unload",@"-w",commandFromPS,nil]];
} *
//============================================================================
// - (BOOL)isAuthenticated:(NSArray *)forCommands
//============================================================================
// Find outs if the user has the appropriate authorization rights for the
// commands listed in (NSArray *)forCommands.
// This should be called each time you need to know whether the user
// is authorized, since the AuthorizationRef can be invalidated elsewhere,
or
// may expire after a short period of time.
//
- (BOOL)isAuthenticated:(NSArray *)forCommands {
AuthorizationRights rights;
AuthorizationRights *authorizedRights;
AuthorizationFlags flags;
int numItems = [forCommands count];
AuthorizationItem *items = malloc( sizeof(AuthorizationItem) * numItems );
char paths[20][128]; // only handles upto 20 commands with paths upto 128
characters in length
OSStatus err = 0;
BOOL authorized = NO;
int i = 0;
if(authorizationRef==NULL) {
rights.count=0;
rights.items = NULL;
flags = kAuthorizationFlagDefaults;
err = AuthorizationCreate(&rights, kAuthorizationEmptyEnvironment, flags,
&authorizationRef);
}
if( numItems < 1 ) {
return authorized;
}
while( i < numItems && i < 20 ) {
[[forCommands objectAtIndex:i] getCString:paths[i]];
items[i].name = kAuthorizationRightExecute;
items[i].value = paths[i];
items[i].valueLength = [[forCommands objectAtIndex:i] cStringLength];
items[i].flags = 0;
i++;
}
rights.count = numItems;
rights.items = items;
flags = kAuthorizationFlagExtendRights;
err = AuthorizationCopyRights(authorizationRef, &rights,
kAuthorizationEmptyEnvironment, flags, &authorizedRights);
authorized = (errAuthorizationSuccess==err);
if(authorized)
AuthorizationFreeItemSet(authorizedRights);
free(items);
return authorized;
}
//============================================================================
// - (BOOL)fetchPassword:(NSArray *)forCommands
//============================================================================
// Adds rights for commands specified in (NSArray *)forCommands.
// Commands should be passed as a NSString comtaining the path to the
executable.
// Returns YES if rights were gained
//
- (BOOL)fetchPassword:(NSArray *)forCommands {
NSLog(@"fetchPassword for (%@)",forCommands);
AuthorizationRights rights;
AuthorizationRights *authorizedRights;
AuthorizationFlags flags;
int numItems = [forCommands count];
AuthorizationItem *items = malloc( sizeof(AuthorizationItem) * numItems );
char paths[20][128];
OSStatus err = 0;
BOOL authorized = NO;
int i = 0;
if( numItems < 1 )
return authorized;
while( i < numItems && i < 20 ) {
[[forCommands objectAtIndex:i] getCString:paths[i]];
items[i].name = kAuthorizationRightExecute;
items[i].value = paths[i];
items[i].valueLength = [[forCommands objectAtIndex:i] cStringLength];
items[i].flags = 0;
i++;
}
rights.count = numItems;
rights.items = items;
flags = kAuthorizationFlagInteractionAllowed |
kAuthorizationFlagExtendRights;
err = AuthorizationCopyRights(authorizationRef, &rights,
kAuthorizationEmptyEnvironment, flags, &authorizedRights);
authorized = (errAuthorizationSuccess == err);
if(authorized) {
AuthorizationFreeItemSet(authorizedRights);
}
free(items);
return authorized;
}
//============================================================================
// - (BOOL)authenticate:(NSArray *)forCommands
//============================================================================
// Authenticates the commands in the array (NSArray *)forCommands by calling
// fetchPassword.
//
- (BOOL)authenticate:(NSArray *)forCommands {
if( ![self isAuthenticated:forCommands] ) {
[self fetchPassword:forCommands];
}
return [self isAuthenticated:forCommands];
}
//============================================================================
// -(void)executeCommand:(NSString *)pathToCommand withArgs:(NSArray
*)arguments
//============================================================================
// Executes command in (NSString *)pathToCommand with the arguments listed
in
// (NSArray *)arguments as root.
// pathToCommand should be a string contain the path to the command
// (eg., /usr/bin/more), arguments should be an array of strings each
containing
// a single argument.
//
-(BOOL)executeCommand:(NSString *)pathToCommand withArgs:(NSArray
*)arguments {
char* args[30]; // can only handle 30 arguments to a given command
OSStatus err = 0;
int i = 0;
FILE * channel;
channel = NULL;
if(![self authenticate:[NSArray arrayWithObject:pathToCommand]])
return NO;
if( arguments == nil || [arguments count] < 1 ) {
err = AuthorizationExecuteWithPrivileges(authorizationRef, [pathToCommand
cString], 0, NULL, &channel);
}
else {
NSLog(@" [pathToCommand cString] is (%s)",[pathToCommand cString]);
while( i < [arguments count] && i < 19) {
args[i] = (char*)[[arguments objectAtIndex:i] cString];
NSLog(@" args[%d] is (%s)",i,args[i]);
i++;
}
args[i] = NULL;
err = AuthorizationExecuteWithPrivileges(authorizationRef,
[pathToCommand cString],
0, args, &channel);
}
if (err ==0) {
do {
char thisLine[1024];
Boolean success;
success = (fgets(thisLine, sizeof(thisLine), channel) != NULL);
char *cmd= (char *)[pathToCommand cString];
if (success ) {
NSLog(@": command [%s] output %s", cmd, thisLine);
} else {
NSLog(@" command [%s] has ended. EOF indicator [%d] -- thisLine is (%s)
\n", cmd, feof(channel),thisLine);
break;
}
} while (true);
fclose(channel);
}
if(err!=0) {
NSBeep();
NSLog(@"Error %d in AuthorizationExecuteWithPrivileges command for (%@)
with arguments (%@)",err,pathToCommand,arguments);
return NO;
}
else {
return YES;
}
}
-JanakiRam.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden