5 // Created by Claudio Bisegni on 25/06/07.
6 // Copyright 2007 INFN - National Institute of Nuclear Physics. All rights reserved.
13 @implementation TaskUtil
15 // -------------------------------------------------------------------------------
16 // executeTaskSearchingPath:
17 // -------------------------------------------------------------------------------
18 +(NSString*) executeTaskSearchingPath:(NSString*)unixCommand args:(NSArray*)args
20 NSString *commResult = nil;
21 NSString *commPath = [self searchExecutablePath:unixCommand];
23 commResult = [self executeTask:commPath
29 // -------------------------------------------------------------------------------
31 // -------------------------------------------------------------------------------
32 +(NSString*) searchExecutablePath:(NSString*)unixCommand
34 NSString *commPath = [self executeTask:@"/usr/bin/which" arguments:[NSArray arrayWithObjects:unixCommand, nil]];
38 // -------------------------------------------------------------------------------
40 // -------------------------------------------------------------------------------
41 +(NSString*) executeTask:(NSString*) taskName arguments:(NSArray *)args{
42 NSString *result = nil;
44 NSFileHandle *file = nil;
45 NSDictionary *environment = [NSDictionary dictionaryWithObjectsAndKeys: @"$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin",@"PATH",nil];
47 NSPipe *pipe = [NSPipe pipe];
48 NSTask *taskToRun = [[NSTask alloc] init];
50 [taskToRun setLaunchPath: taskName];
51 [taskToRun setArguments: args];
52 [taskToRun setEnvironment:environment];
53 [taskToRun setStandardOutput: pipe];
54 file = [pipe fileHandleForReading];
56 [taskToRun waitUntilExit];
57 status = [taskToRun terminationStatus];
59 NSData *data = [file readDataToEndOfFile];
60 // remove the \n character from unix command
61 if([data length] > 0){
62 NSData *realData = [NSData dataWithBytes:[data bytes]
63 length:[data length]-1];
66 result = [[NSString alloc] initWithData: realData
67 encoding: NSUTF8StringEncoding];
70 NSLog(@"Task failed.");
72 return [result autorelease];
76 // -------------------------------------------------------------------------------
78 // -------------------------------------------------------------------------------
79 +(int) executeTaskWithAuth:(NSString*) taskName arguments:(NSArray *)args helper:(NSString *)helper withAuthRef:(AuthorizationRef)authRef {
80 const char *rootHelperApp = [helper fileSystemRepresentation];
82 AuthorizationFlags flags = kAuthorizationFlagDefaults;
83 int count = [args count];
84 char **myArguments = calloc(count + 2, sizeof(char *));
87 myArguments[0] = strdup([taskName UTF8String]);
88 for(i=0;i < count;i++) {
89 const char *string = [[args objectAtIndex:i] UTF8String];
92 myArguments[1+i] = strdup(string);
94 myArguments[1+i] = NULL;
96 // should use SMJobBless but we need to sign things...
97 status = AuthorizationExecuteWithPrivileges(authRef, rootHelperApp, flags, myArguments, NULL);
100 while (myArguments[i] != NULL) {
101 free(myArguments[i]);
109 +(int) executeTaskWithAuth:(NSString*) taskName arguments:(NSArray *)args authExtForm:(NSData*)auth {
110 NSString *result = nil;
112 NSFileHandle *file = nil;
113 NSDictionary *environment = [NSDictionary dictionaryWithObjectsAndKeys: @"$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin",@"PATH",nil];
115 NSPipe *pipe = [NSPipe pipe];
116 NSPipe *pipeIn = [NSPipe pipe];
117 NSTask *taskToRun = [[NSTask alloc] init];
119 [taskToRun setLaunchPath: taskName];
120 [taskToRun setArguments: args];
121 [taskToRun setEnvironment:environment];
122 [taskToRun setStandardOutput: pipe];
123 [taskToRun setStandardInput: pipeIn];
124 file = [pipe fileHandleForReading];
125 //Write to standard in
128 NSFileHandle* taskInput = [[ taskToRun standardInput ] fileHandleForWriting ];
129 [taskInput writeData:auth];
130 [taskToRun waitUntilExit];
131 status = [taskToRun terminationStatus];
133 NSData *data = [file readDataToEndOfFile];
134 // remove the \n character from unix command
135 if([data length] > 0){
136 NSData *realData = [NSData dataWithBytes:[data bytes]
137 length:[data length]-1];
140 result = [[NSString alloc] initWithData: realData
141 encoding: NSUTF8StringEncoding];