I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again. https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?l... <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.” How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace? Following is my code and console output (from macOS 10.12.2). James Foster CODE: - (void)installHelperTool; { OSStatus status = AuthorizationCreate(...); // handle errors NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P " "GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); CFErrorRef cfError = nil; if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) { NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString); NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); } else { AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]); } } CONSOLE: default 14:25:04.368568 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0) default 14:25:04.889238 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.385444 -0800 GemStone existing: <string>1.3.3.9</string> default 14:25:04.900905 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.397113 -0800 GemStone replacement: <string>1.4.0</string> default 14:25:04.398426 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0) default 14:25:04.408694 -0800 GemStone SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0). default 14:25:04.923798 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.419988 -0800 GemStone now found: <string>1.3.3.9</string>
According to Damien Sorresso, BSD Engineering, Apple Inc. (see https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html), "ServiceManagement will check the CFBundleVersion of the tool and, if it's the same ..., will not overwrite it." I've updated my code to show the CFBundleVersion of the tool both before and after a "successful" invocation of SMJobBless(). Is there anything I can do to get this to work? 2017-01-27 09:10... existing: <string>84</string> 2017-01-27 09:10... replacement: <string>E6</string> 2017-01-27 09:10... SMJobBless(com.GemTalk.GemStone.Helper,...) returned true... 2017-01-27 09:10... now found: <string>84</string>
On Jan 25, 2017, at 4:48 PM, James Foster <james.foster@gemtalksystems.com> wrote:
I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again.
https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?l... <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.”
How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace?
Following is my code and console output (from macOS 10.12.2).
James Foster
CODE:
- (void)installHelperTool; { OSStatus status = AuthorizationCreate(...); // handle errors
NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P " "GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); CFErrorRef cfError = nil; if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) { NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString); NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); } else { AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]); } }
CONSOLE:
default 14:25:04.368568 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0) default 14:25:04.889238 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.385444 -0800 GemStone existing: <string>1.3.3.9</string> default 14:25:04.900905 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.397113 -0800 GemStone replacement: <string>1.4.0</string> default 14:25:04.398426 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0) default 14:25:04.408694 -0800 GemStone SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0). default 14:25:04.923798 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.419988 -0800 GemStone now found: <string>1.3.3.9</string>
Hello James, If I remember correctly, you need special keys in your tool and app info plist files with codesigning designated requirements. Did you verify that these designated requirements verify correctly against the actual tool and app you are using while testing? Regards, Thomas
On 27 Jan 2017, at 20:31, James Foster <james.foster@gemtalksystems.com> wrote:
According to Damien Sorresso, BSD Engineering, Apple Inc. (see https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html <https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html>), "ServiceManagement will check the CFBundleVersion of the tool and, if it's the same ..., will not overwrite it."
I've updated my code to show the CFBundleVersion of the tool both before and after a "successful" invocation of SMJobBless(). Is there anything I can do to get this to work?
2017-01-27 09:10... existing: <string>84</string> 2017-01-27 09:10... replacement: <string>E6</string> 2017-01-27 09:10... SMJobBless(com.GemTalk.GemStone.Helper,...) returned true... 2017-01-27 09:10... now found: <string>84</string>
On Jan 25, 2017, at 4:48 PM, James Foster <james.foster@gemtalksystems.com <mailto:james.foster@gemtalksystems.com>> wrote:
I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again.
https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?l... <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.”
How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace?
Following is my code and console output (from macOS 10.12.2).
James Foster
CODE:
- (void)installHelperTool; { OSStatus status = AuthorizationCreate(...); // handle errors
NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P " "GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); CFErrorRef cfError = nil; if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) { NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString); NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); } else { AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]); } }
CONSOLE:
default 14:25:04.368568 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0) default 14:25:04.889238 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.385444 -0800 GemStone existing: <string>1.3.3.9</string> default 14:25:04.900905 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.397113 -0800 GemStone replacement: <string>1.4.0</string> default 14:25:04.398426 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0) default 14:25:04.408694 -0800 GemStone SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0). default 14:25:04.923798 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.419988 -0800 GemStone now found: <string>1.3.3.9</string>
_______________________________________________ launchd-dev mailing list launchd-dev@lists.macosforge.org https://lists.macosforge.org/mailman/listinfo/launchd-dev
Hi James, "E6" is not a valid CFBundleVersion. CFBundleVersions are very specifically tuples consisting solely of three numeric elements as proscribed in https://developer.apple.com/library/content/documentation/General/Reference/... <https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364> The daemon which backs SMJobBless() is strict in this regard. Because the version was invalid, it assumed a version of "0.0.0", and chose not to perform the update. -damien
On 27 Jan, 2017, at 11:31, James Foster <james.foster@gemtalksystems.com> wrote:
According to Damien Sorresso, BSD Engineering, Apple Inc. (see https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html <https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html>), "ServiceManagement will check the CFBundleVersion of the tool and, if it's the same ..., will not overwrite it."
I've updated my code to show the CFBundleVersion of the tool both before and after a "successful" invocation of SMJobBless(). Is there anything I can do to get this to work?
2017-01-27 09:10... existing: <string>84</string> 2017-01-27 09:10... replacement: <string>E6</string> 2017-01-27 09:10... SMJobBless(com.GemTalk.GemStone.Helper,...) returned true... 2017-01-27 09:10... now found: <string>84</string>
On Jan 25, 2017, at 4:48 PM, James Foster <james.foster@gemtalksystems.com <mailto:james.foster@gemtalksystems.com>> wrote:
I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again.
https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?l... <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.”
How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace?
Following is my code and console output (from macOS 10.12.2).
James Foster
CODE:
- (void)installHelperTool; { OSStatus status = AuthorizationCreate(...); // handle errors
NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P " "GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); CFErrorRef cfError = nil; if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) { NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString); NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); } else { AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]); } }
CONSOLE:
default 14:25:04.368568 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0) default 14:25:04.889238 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.385444 -0800 GemStone existing: <string>1.3.3.9</string> default 14:25:04.900905 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.397113 -0800 GemStone replacement: <string>1.4.0</string> default 14:25:04.398426 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0) default 14:25:04.408694 -0800 GemStone SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0). default 14:25:04.923798 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.419988 -0800 GemStone now found: <string>1.3.3.9</string>
_______________________________________________ launchd-dev mailing list launchd-dev@lists.macosforge.org https://lists.macosforge.org/mailman/listinfo/launchd-dev
Hi Damien, Thanks very much. That seems to have done it! Some time ago I copied one of the many scripts out there that provides for auto-incrementing the build, and it defaulted to hex. I’ve switched to decimal and that works. James Foster
On Jan 27, 2017, at 12:09 PM, Damien Sorresso <dsorresso@apple.com> wrote:
Hi James,
"E6" is not a valid CFBundleVersion. CFBundleVersions are very specifically tuples consisting solely of three numeric elements as proscribed in
https://developer.apple.com/library/content/documentation/General/Reference/... <https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364>
The daemon which backs SMJobBless() is strict in this regard. Because the version was invalid, it assumed a version of "0.0.0", and chose not to perform the update. -damien
On 27 Jan, 2017, at 11:31, James Foster <james.foster@gemtalksystems.com <mailto:james.foster@gemtalksystems.com>> wrote:
According to Damien Sorresso, BSD Engineering, Apple Inc. (see https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html <https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html>), "ServiceManagement will check the CFBundleVersion of the tool and, if it's the same ..., will not overwrite it."
I've updated my code to show the CFBundleVersion of the tool both before and after a "successful" invocation of SMJobBless(). Is there anything I can do to get this to work?
2017-01-27 09:10... existing: <string>84</string> 2017-01-27 09:10... replacement: <string>E6</string> 2017-01-27 09:10... SMJobBless(com.GemTalk.GemStone.Helper,...) returned true... 2017-01-27 09:10... now found: <string>84</string>
On Jan 25, 2017, at 4:48 PM, James Foster <james.foster@gemtalksystems.com <mailto:james.foster@gemtalksystems.com>> wrote:
I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again.
https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?l... <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.”
How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace?
Following is my code and console output (from macOS 10.12.2).
James Foster
CODE:
- (void)installHelperTool; { OSStatus status = AuthorizationCreate(...); // handle errors
NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P " "GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); CFErrorRef cfError = nil; if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) { NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString); NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); } else { AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]); } }
CONSOLE:
default 14:25:04.368568 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0) default 14:25:04.889238 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.385444 -0800 GemStone existing: <string>1.3.3.9</string> default 14:25:04.900905 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.397113 -0800 GemStone replacement: <string>1.4.0</string> default 14:25:04.398426 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0) default 14:25:04.408694 -0800 GemStone SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0). default 14:25:04.923798 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.419988 -0800 GemStone now found: <string>1.3.3.9</string>
_______________________________________________ launchd-dev mailing list launchd-dev@lists.macosforge.org <mailto:launchd-dev@lists.macosforge.org> https://lists.macosforge.org/mailman/listinfo/launchd-dev
Glad it's working! -damien
On 27 Jan, 2017, at 15:14, James Foster <james.foster@gemtalksystems.com> wrote:
Hi Damien,
Thanks very much. That seems to have done it!
Some time ago I copied one of the many scripts out there that provides for auto-incrementing the build, and it defaulted to hex. I’ve switched to decimal and that works.
James Foster
On Jan 27, 2017, at 12:09 PM, Damien Sorresso <dsorresso@apple.com <mailto:dsorresso@apple.com>> wrote:
Hi James,
"E6" is not a valid CFBundleVersion. CFBundleVersions are very specifically tuples consisting solely of three numeric elements as proscribed in
https://developer.apple.com/library/content/documentation/General/Reference/... <https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364>
The daemon which backs SMJobBless() is strict in this regard. Because the version was invalid, it assumed a version of "0.0.0", and chose not to perform the update. -damien
On 27 Jan, 2017, at 11:31, James Foster <james.foster@gemtalksystems.com <mailto:james.foster@gemtalksystems.com>> wrote:
According to Damien Sorresso, BSD Engineering, Apple Inc. (see https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html <https://lists.macosforge.org/pipermail/launchd-dev/2010-October/000834.html>), "ServiceManagement will check the CFBundleVersion of the tool and, if it's the same ..., will not overwrite it."
I've updated my code to show the CFBundleVersion of the tool both before and after a "successful" invocation of SMJobBless(). Is there anything I can do to get this to work?
2017-01-27 09:10... existing: <string>84</string> 2017-01-27 09:10... replacement: <string>E6</string> 2017-01-27 09:10... SMJobBless(com.GemTalk.GemStone.Helper,...) returned true... 2017-01-27 09:10... now found: <string>84</string>
On Jan 25, 2017, at 4:48 PM, James Foster <james.foster@gemtalksystems.com <mailto:james.foster@gemtalksystems.com>> wrote:
I am attempting to replace a helper tool. Most of the time if I increment the version (of my application and of the helper tool) then the new tool will be installed. Sometimes it won't be installed and I have to delete the old one manually. The problem seems to occur about every dozen versions or so, and once it happens the replacement will not occur even if I change the version numbers again.
https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?l... <https://developer.apple.com/reference/servicemanagement/1431078-smjobbless?language=objc> states "If the job is already installed, success is returned.”
How does SMJobBless() determine that the job is already installed? What do I need to do, beyond creating an entirely new job name, to make it look different enough to replace?
Following is my code and console output (from macOS 10.12.2).
James Foster
CODE:
- (void)installHelperTool; { OSStatus status = AuthorizationCreate(...); // handle errors
NSLog(@"existing: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); NSLog(@"replacement: %@", [self system:@"/usr/bin/otool -P " "GemStone.app/Contents/Library/LaunchServices/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); CFErrorRef cfError = nil; if (SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)@kHelperIdentifier, authRef, &cfError)) { NSLog(@"SMJobBless(%s,...) returned true; attempting (%s).", kHelperIdentifier, kShortVersionString); NSLog(@"now found: %@", [self system:@"/usr/bin/otool -P " "/Library/PrivilegedHelperTools/com.GemTalk.GemStone.Helper | " "grep -A 1 VersionString | tail -1"]); } else { AppError(@"Helper tool installation failed: %@", [(__bridge NSError*) cfError localizedDescription]); } }
CONSOLE:
default 14:25:04.368568 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (13,0) default 14:25:04.889238 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.385444 -0800 GemStone existing: <string>1.3.3.9</string> default 14:25:04.900905 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.397113 -0800 GemStone replacement: <string>1.4.0</string> default 14:25:04.398426 -0800 authd Succeeded authorizing right 'com.apple.ServiceManagement.blesshelper' by client '/usr/libexec/smd' [251] for authorization created by '/Users/jfoster/Library/Developer/Xcode/DerivedData/GemStone-akfvfyaoddyaavgbcxnrdhnovoal/Build/Products/Debug/GemStone.app' [5626] (3,0) default 14:25:04.408694 -0800 GemStone SMJobBless(com.GemTalk.GemStone.Helper,...) returned true; attempting (1.4.0). default 14:25:04.923798 -0800 kernel AMFI: allowing exception handler for 'GemStone' (5626) because the process is not restricted. default 14:25:04.419988 -0800 GemStone now found: <string>1.3.3.9</string>
_______________________________________________ launchd-dev mailing list launchd-dev@lists.macosforge.org <mailto:launchd-dev@lists.macosforge.org> https://lists.macosforge.org/mailman/listinfo/launchd-dev <https://lists.macosforge.org/mailman/listinfo/launchd-dev>
participants (3)
-
Damien Sorresso
-
James Foster
-
Thomas