/ OSX / libsecurity_codesigning / lib / quarantine++.cpp
quarantine++.cpp
  1  /*
  2   * Copyright (c) 2011-2012 Apple Inc. All Rights Reserved.
  3   * 
  4   * @APPLE_LICENSE_HEADER_START@
  5   * 
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   * 
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   * 
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  //
 25  // xar++ - interface to XAR-format archive files
 26  //
 27  #include "quarantine++.h"
 28  
 29  
 30  namespace Security {
 31  namespace CodeSigning {
 32  
 33  
 34  //
 35  // Check the int result of a qtn API call.
 36  // If the error is "not quarantined," note in the object (no error).
 37  // Other qtn-specific errors are arbitrarily mapped to ENOSYS (this isn't
 38  // important enough to subclass CommonError).
 39  //
 40  void FileQuarantine::check(int err)
 41  {
 42  	switch (err) {
 43  	case 0:
 44  		mQuarantined = true;
 45  		break;
 46  	case QTN_NOT_QUARANTINED:
 47  		mQuarantined = false;
 48  		return;
 49  	default:	// some flavor of quarantine-not-available
 50  		UnixError::throwMe(err);
 51  	}
 52  }
 53  
 54  
 55  FileQuarantine::~FileQuarantine()
 56  {
 57  	if (mQtn)
 58  		qtn_file_free(mQtn);
 59  }
 60  
 61  
 62  FileQuarantine::FileQuarantine(const char *path)
 63  {
 64  	if (!(mQtn = qtn_file_alloc()))
 65  		UnixError::throwMe();
 66  	check(qtn_file_init_with_path(mQtn, path));
 67  }
 68  
 69  FileQuarantine::FileQuarantine(int fd)
 70  {
 71  	if (!(mQtn = qtn_file_alloc()))
 72  		UnixError::throwMe();
 73  	check(qtn_file_init_with_fd(mQtn, fd));
 74  }
 75  
 76  
 77  void FileQuarantine::setFlags(uint32_t flags)
 78  {
 79  	if (mQuarantined)
 80  		check(qtn_file_set_flags(mQtn, flags));
 81  }
 82  
 83  void FileQuarantine::setFlag(uint32_t flag)
 84  {
 85  	if (mQuarantined)
 86  		setFlags(flags() | flag);
 87  }
 88  
 89  void FileQuarantine::clearFlag(uint32_t flag)
 90  {
 91  	if (mQuarantined)
 92  		setFlags(flags() & ~flag);
 93  }
 94  
 95  void FileQuarantine::applyTo(const char *path)
 96  {
 97  	check(qtn_file_apply_to_path(mQtn, path));
 98  }
 99  
100  void FileQuarantine::applyTo(int fd)
101  {
102  	check(qtn_file_apply_to_fd(mQtn, fd));
103  }
104  
105  
106  } // end namespace CodeSigning
107  } // end namespace Security