| 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) {
 | 
| 
 |