Index: base/mac/mac_util.mm |
=================================================================== |
--- base/mac/mac_util.mm (revision 86429) |
+++ base/mac/mac_util.mm (working copy) |
@@ -8,6 +8,7 @@ |
#include "base/file_path.h" |
#include "base/logging.h" |
+#include "base/mac/foundation_util.h" |
#include "base/mac/scoped_cftyperef.h" |
#include "base/memory/scoped_nsobject.h" |
#include "base/sys_string_conversions.h" |
@@ -238,47 +239,29 @@ |
} |
} |
-bool SetFileBackupExclusion(const FilePath& file_path, bool exclude) { |
+bool SetFileBackupExclusion(const FilePath& file_path) { |
NSString* filePath = |
[NSString stringWithUTF8String:file_path.value().c_str()]; |
- |
- // If being asked to exclude something in a tmp directory, just lie and say it |
- // was done. TimeMachine will already ignore tmp directories. This keeps the |
- // temporary profiles used by unittests from being added to the exclude list. |
- // Otherwise, as /Library/Preferences/com.apple.TimeMachine.plist grows the |
- // bots slow down due to reading/writing all the temporary profiles used over |
- // time. |
- |
- NSString* tmpDir = NSTemporaryDirectory(); |
- // Make sure the temp dir is terminated with a slash |
- if (tmpDir && ![tmpDir hasSuffix:@"/"]) |
- tmpDir = [tmpDir stringByAppendingString:@"/"]; |
- // '/var' is a link to '/private/var', make sure to check both forms. |
- NSString* privateTmpDir = nil; |
- if ([tmpDir hasPrefix:@"/var/"]) |
- privateTmpDir = [@"/private" stringByAppendingString:tmpDir]; |
- |
- if ((tmpDir && [filePath hasPrefix:tmpDir]) || |
- (privateTmpDir && [filePath hasPrefix:privateTmpDir]) || |
- [filePath hasPrefix:@"/tmp/"] || |
- [filePath hasPrefix:@"/var/tmp/"] || |
- [filePath hasPrefix:@"/private/tmp/"] || |
- [filePath hasPrefix:@"/private/var/tmp/"]) { |
- return true; |
- } |
- |
NSURL* url = [NSURL fileURLWithPath:filePath]; |
- // Note that we always set CSBackupSetItemExcluded's excludeByPath param |
- // to true. This prevents a problem with toggling the setting: if the file |
- // is excluded with excludeByPath set to true then excludeByPath must |
- // also be true when un-excluding the file, otherwise the un-excluding |
- // will be ignored. |
- bool success = |
- CSBackupSetItemExcluded((CFURLRef)url, exclude, true) == noErr; |
- if (!success) |
+ // Do a pre-emptive unexclude by-path since by-path exclusions may have been |
+ // performed on this file in the past. |
+ CSBackupSetItemExcluded(base::mac::NSToCFCast(url), FALSE, TRUE); |
+ // When excludeByPath is true the application must be running with root |
+ // privileges (admin for 10.6 and earlier) but the URL does not have to |
+ // already exist. When excludeByPath is false the URL must already exist but |
+ // can be used in non-root (or admin as above) mode. We use false so that |
+ // non-root (or admin) users don't get their TimeMachine drive filled up with |
+ // unnecessary backups. |
+ OSStatus os_err = |
+ CSBackupSetItemExcluded(base::mac::NSToCFCast(url), TRUE, FALSE); |
+ if (os_err != noErr) { |
LOG(WARNING) << "Failed to set backup exclusion for file '" |
- << file_path.value().c_str() << "'. Continuing."; |
- return success; |
+ << file_path.value().c_str() << "' with error " |
+ << os_err << " (" << GetMacOSStatusErrorString(os_err) |
+ << ": " << GetMacOSStatusCommentString(os_err) |
+ << "). Continuing."; |
+ } |
+ return os_err == noErr; |
} |
void SetProcessName(CFStringRef process_name) { |