Add tests for cloning on Apple File System.

Will be skipped if run on another filesysetm.
diff --git a/regress/CMakeLists.txt b/regress/CMakeLists.txt
index d69386b..e2ce232 100644
--- a/regress/CMakeLists.txt
+++ b/regress/CMakeLists.txt
@@ -17,6 +17,8 @@
   tryopen
 )
 
+ADD_EXECUTABLE(can_clone_file can_clone_file.c)
+
 SET(ENV{srcdir} ${CMAKE_CURRENT_SOURCE_DIR})
 FOREACH(PROGRAM ${TEST_PROGRAMS})
   ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}.c)
@@ -87,11 +89,14 @@
 	add_from_zip_stored.test
 	add_stored.test
 	add_stored_in_memory.test
-	clone-add.test
-	clone-delete.test
-	clone-replace.test
 	buffer-fragment-read.test
 	buffer-fragment-write.test
+        clone-buffer-add.test
+        clone-buffer-delete.test
+        clone-buffer-replace.test
+        clone-fs-add.test
+        clone-fs-delete.test
+        clone-fs-replace.test
 	cm-default.test
 	count_entries.test
 	decrypt-correct-password-aes128.test
diff --git a/regress/NiHTest.pm b/regress/NiHTest.pm
index a19c95e..736ebae 100644
--- a/regress/NiHTest.pm
+++ b/regress/NiHTest.pm
@@ -84,6 +84,9 @@
 #	pipein COMMAND ARGS ...
 #	    pipe output of running COMMAND to program's stdin.
 #
+#   precheck COMMAND ARGS ...
+#		if COMMAND exits with non-zero status, skip test.
+#
 #	preload LIBRARY
 #	    pre-load LIBRARY before running program.
 #
@@ -159,6 +162,7 @@
 		mkdir => { type => 'string string' },
 		pipefile => { type => 'string', once => 1 },
 		pipein => { type => 'string', once => 1 },
+		precheck => { type => 'string...' },
 		preload => { type => 'string', once => 1 },
 		program => { type => 'string', once => 1 },
 		'return' => { type => 'int', once => 1, required => 1 },
@@ -443,6 +447,7 @@
 	$self->die("error in test case definition") unless $self->parse_case($testcase_file);
 
 	$self->check_features_requirement() if ($self->{test}->{features});
+	$self->run_precheck() if ($self->{test}->{precheck});
 
 	$self->end_test('SKIP') if ($self->{test}->{preload} && $^O eq 'darwin');
 }
@@ -1115,6 +1120,20 @@
 }
 
 
+sub run_precheck {
+	my ($self) = @_;
+
+	for my $precheck (@{$self->{test}->{precheck}}) {
+		unless (system(@{$precheck}) == 0) {
+			$self->print_test_result('SKIP', "precheck failed");
+			$self->end_test('SKIP');
+		}
+	}
+
+	return 1;
+}
+
+
 sub run_program {
 	my ($self) = @_;
 	goto &pipein_win32 if $^O eq 'MSWin32' && $self->{test}->{pipein};
diff --git a/regress/can_clone_file.c b/regress/can_clone_file.c
new file mode 100644
index 0000000..f6f720a
--- /dev/null
+++ b/regress/can_clone_file.c
@@ -0,0 +1,85 @@
+/*
+ can_clone_file.c -- does the current filesystem support cloning
+ Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "config.h"
+
+#ifdef HAVE_CLONEFILE
+#include <sys/attr.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <unistd.h>
+#endif
+
+int
+main(int argc, char *argv[])
+{
+#ifdef HAVE_CLONEFILE
+    struct statfs fs;
+    struct attrlist attribute_list;
+    struct {
+        uint32_t size;
+        vol_capabilities_attr_t capabilities;
+    } volume_attributes;
+
+    if (statfs(".", &fs) < 0) {
+        fprintf(stderr, "%s: can't get mount point of current directory: %s\n", argv[0], strerror(errno));
+        exit(1);
+    }
+
+    /* Not all volumes support clonefile().  A volume can be tested for
+       clonefile() support by using getattrlist(2) to get the volume
+       capabilities attribute ATTR_VOL_CAPABILITIES, and then testing the
+       VOL_CAP_INT_CLONE flag. */
+
+    memset(&attribute_list, 0, sizeof(attribute_list));
+    attribute_list.bitmapcount = ATTR_BIT_MAP_COUNT;
+    attribute_list.volattr = ATTR_VOL_INFO|ATTR_VOL_CAPABILITIES;
+    memset(&volume_attributes, 0, sizeof(volume_attributes));
+
+    if (getattrlist(fs.f_mntonname, &attribute_list, &volume_attributes, sizeof(volume_attributes), 0) < 0) {
+        fprintf(stderr, "%s: can't get volume capabilities of '%s': %s\n", argv[0], fs.f_mntonname, strerror(errno));
+        exit(1);
+    }
+
+    if (volume_attributes.capabilities.capabilities[VOL_CAPABILITIES_INTERFACES] & VOL_CAP_INT_CLONE) {
+        exit(0);
+    }
+#endif
+
+    exit(1);
+}
diff --git a/regress/clone-add.test b/regress/clone-buffer-add.test
similarity index 70%
rename from regress/clone-add.test
rename to regress/clone-buffer-add.test
index 42d0eaf..c66791b 100644
--- a/regress/clone-add.test
+++ b/regress/clone-buffer-add.test
@@ -1,4 +1,4 @@
-# test cloning archive, add new file
+# test cloning archive from buffer, add new file
 return 0
 args -mF 100 test.zzip  add new "A new file."  set_file_mtime 3 1512998132
 file test.zzip gap.zip gap-add.zip
diff --git a/regress/clone-delete.test b/regress/clone-buffer-delete.test
similarity index 60%
rename from regress/clone-delete.test
rename to regress/clone-buffer-delete.test
index 253d2e4..221f8d2 100644
--- a/regress/clone-delete.test
+++ b/regress/clone-buffer-delete.test
@@ -1,4 +1,4 @@
-# test cloning archive, deleteing a file
+# test cloning archive from buffer, deleteing a file
 return 0
 args -mF 100 test.zzip  delete 2
 file test.zzip gap.zip gap-delete.zip
diff --git a/regress/clone-replace.test b/regress/clone-buffer-replace.test
similarity index 72%
rename from regress/clone-replace.test
rename to regress/clone-buffer-replace.test
index 813d6bc..cb21f33 100644
--- a/regress/clone-replace.test
+++ b/regress/clone-buffer-replace.test
@@ -1,4 +1,4 @@
-# test cloning archive, replacing a file
+# test cloning archive from buffer, replacing a file
 return 0
 args -mF 100 test.zzip  replace_file_contents 2 "A changed file."  set_file_mtime 2 1512998082
 file test.zzip gap.zip gap-replace.zip
diff --git a/regress/clone-fs-add.test b/regress/clone-fs-add.test
new file mode 100644
index 0000000..f187cb7
--- /dev/null
+++ b/regress/clone-fs-add.test
@@ -0,0 +1,5 @@
+# test cloning archive from filesystem, add new file
+precheck ./can_clone_file
+return 0
+args test.zzip  add new "A new file."  set_file_mtime 3 1512998132
+file test.zzip gap.zip gap-add.zip
diff --git a/regress/clone-fs-delete.test b/regress/clone-fs-delete.test
new file mode 100644
index 0000000..b2e63cc
--- /dev/null
+++ b/regress/clone-fs-delete.test
@@ -0,0 +1,5 @@
+# test cloning archive from filesystem, deleteing a file
+precheck ./can_clone_file
+return 0
+args test.zzip  delete 2
+file test.zzip gap.zip gap-delete.zip
diff --git a/regress/clone-fs-replace.test b/regress/clone-fs-replace.test
new file mode 100644
index 0000000..3d3b8f3
--- /dev/null
+++ b/regress/clone-fs-replace.test
@@ -0,0 +1,5 @@
+# test cloning archive from filesystem, replacing a file
+precheck ./can_clone_file
+return 0
+args test.zzip  replace_file_contents 2 "A changed file."  set_file_mtime 2 1512998082
+file test.zzip gap.zip gap-replace.zip
diff --git a/xcode/libzip.xcodeproj/project.pbxproj b/xcode/libzip.xcodeproj/project.pbxproj
index ba3217c..546cb86 100644
--- a/xcode/libzip.xcodeproj/project.pbxproj
+++ b/xcode/libzip.xcodeproj/project.pbxproj
@@ -39,6 +39,7 @@
 			buildPhases = (
 			);
 			dependencies = (
+				4BFF2B531FE13002006EF3F3 /* PBXTargetDependency */,
 				4BD6CB6E19E71D0800710654 /* PBXTargetDependency */,
 				4BACD65515BC303B00920691 /* PBXTargetDependency */,
 				4BACD65715BC303B00920691 /* PBXTargetDependency */,
@@ -325,6 +326,7 @@
 		4BDC729615B1B25E00236D3C /* zip_utf-8.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724315B1B25E00236D3C /* zip_utf-8.c */; };
 		4BDC729B15B1B2C400236D3C /* zip.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729815B1B2A600236D3C /* zip.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4BDC729F15B1B4E900236D3C /* zipconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729E15B1B4E900236D3C /* zipconf.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4BFF2B551FE13033006EF3F3 /* can_clone_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */; };
 		736ED9BB1E3D6B6B00C36873 /* zip_source_winzip_aes_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */; };
 		736ED9BC1E3D6B6F00C36873 /* zip_source_winzip_aes_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9BA1E3D688C00C36873 /* zip_source_winzip_aes_encode.c */; };
 		736ED9BD1E3D6B7200C36873 /* zip_random_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B81E3D688C00C36873 /* zip_random_unix.c */; };
@@ -497,6 +499,13 @@
 			remoteGlobalIDString = 4BD6CB5F19E71CD100710654;
 			remoteInfo = hole;
 		};
+		4BFF2B521FE13002006EF3F3 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 4BFF2B451FE12FCA006EF3F3;
+			remoteInfo = can_clone_file;
+		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -590,6 +599,15 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		4BFF2B4D1FE12FCA006EF3F3 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 12;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
@@ -687,13 +705,16 @@
 		4B3A5F4C1DF96D83005A53A1 /* gladman-fcrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gladman-fcrypt.h"; sourceTree = "<group>"; };
 		4B3A5F4D1DF96D83005A53A1 /* zip_fseek.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_fseek.c; sourceTree = "<group>"; };
 		4B3A5F4E1DF96D83005A53A1 /* zip_ftell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_ftell.c; sourceTree = "<group>"; };
+		4B41A2651FE15E99005D8C91 /* clone-fs-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-add.test"; sourceTree = "<group>"; };
+		4B41A2661FE15FCE005D8C91 /* clone-fs-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-delete.test"; sourceTree = "<group>"; };
+		4B41A2671FE1604E005D8C91 /* clone-fs-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-replace.test"; sourceTree = "<group>"; };
 		4B51DDB21FDADEDF00C5CA85 /* INSTALL.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = INSTALL.md; sourceTree = "<group>"; };
 		4B51DDB31FDAE1DB00C5CA85 /* ziptool_regress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ziptool_regress.c; sourceTree = "<group>"; };
 		4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ziptool_regress; sourceTree = BUILT_PRODUCTS_DIR; };
 		4B77E61A1FDDCD3A006786BA /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
-		4B77E61B1FDEDEA4006786BA /* clone-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-delete.test"; sourceTree = "<group>"; };
-		4B77E61C1FDEDEA5006786BA /* clone-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-replace.test"; sourceTree = "<group>"; };
-		4B77E61D1FDEDEA5006786BA /* clone-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-add.test"; sourceTree = "<group>"; };
+		4B77E61B1FDEDEA4006786BA /* clone-buffer-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-delete.test"; sourceTree = "<group>"; };
+		4B77E61C1FDEDEA5006786BA /* clone-buffer-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-replace.test"; sourceTree = "<group>"; };
+		4B77E61D1FDEDEA5006786BA /* clone-buffer-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-add.test"; sourceTree = "<group>"; };
 		4B82CED319915F360097BC18 /* zip_file_set_mtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_mtime.c; sourceTree = "<group>"; };
 		4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_get_external_attributes.c; sourceTree = "<group>"; };
 		4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_external_attributes.c; sourceTree = "<group>"; };
@@ -978,6 +999,8 @@
 		4BFF2B341FDEEF8B006EF3F3 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
 		4BFF2B351FDEF277006EF3F3 /* cmake-config.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cmake-config.h.in"; sourceTree = "<group>"; };
 		4BFF2B361FDEF277006EF3F3 /* cmake-zipconf.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cmake-zipconf.h.in"; sourceTree = "<group>"; };
+		4BFF2B511FE12FCA006EF3F3 /* can_clone_file */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = can_clone_file; sourceTree = BUILT_PRODUCTS_DIR; };
+		4BFF2B541FE13033006EF3F3 /* can_clone_file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = can_clone_file.c; sourceTree = "<group>"; };
 		736ED9B71E3D688C00C36873 /* zip_file_set_encryption.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_encryption.c; sourceTree = "<group>"; };
 		736ED9B81E3D688C00C36873 /* zip_random_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_random_unix.c; sourceTree = "<group>"; };
 		736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_winzip_aes_decode.c; sourceTree = "<group>"; };
@@ -1090,6 +1113,13 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		4BFF2B4A1FE12FCA006EF3F3 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
@@ -1244,6 +1274,7 @@
 				4BACD57B15BC2AEF00920691 /* fread.c */,
 				4BC03F9A1FDD5617003C7B62 /* fseek.c */,
 				4BD6CB5E19E71B3B00710654 /* hole.c */,
+				4BFF2B541FE13033006EF3F3 /* can_clone_file.c */,
 				4BC03F9C1FDD5617003C7B62 /* malloc.c */,
 				4BC03F991FDD5617003C7B62 /* nonrandomopen.c */,
 				4BC03F9B1FDD5617003C7B62 /* nonrandomopentest.c */,
@@ -1277,9 +1308,12 @@
 				4BD35E4F1A33366200256CB7 /* add_stored.test */,
 				4BC03F8E1FDD55C4003C7B62 /* buffer-fragment-read.test */,
 				4BC03F941FDD55C5003C7B62 /* buffer-fragment-write.test */,
-				4B77E61D1FDEDEA5006786BA /* clone-add.test */,
-				4B77E61B1FDEDEA4006786BA /* clone-delete.test */,
-				4B77E61C1FDEDEA5006786BA /* clone-replace.test */,
+				4B77E61D1FDEDEA5006786BA /* clone-buffer-add.test */,
+				4B77E61B1FDEDEA4006786BA /* clone-buffer-delete.test */,
+				4B77E61C1FDEDEA5006786BA /* clone-buffer-replace.test */,
+				4B41A2651FE15E99005D8C91 /* clone-fs-add.test */,
+				4B41A2661FE15FCE005D8C91 /* clone-fs-delete.test */,
+				4B41A2671FE1604E005D8C91 /* clone-fs-replace.test */,
 				4BD35E501A33366200256CB7 /* cm-default.test */,
 				4BC03F9F1FDD5642003C7B62 /* count_entries.test */,
 				4BC03F921FDD55C4003C7B62 /* decrypt-correct-password-aes128.test */,
@@ -1421,6 +1455,7 @@
 				4BD6CB6C19E71CD100710654 /* hole */,
 				3D7E35371B3305FB00022624 /* in-memory */,
 				4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */,
+				4BFF2B511FE12FCA006EF3F3 /* can_clone_file */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -1818,6 +1853,23 @@
 			productReference = 4BDC71E015B182B200236D3C /* libzip_iOS.framework */;
 			productType = "com.apple.product-type.bundle";
 		};
+		4BFF2B451FE12FCA006EF3F3 /* can_clone_file */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4BFF2B4E1FE12FCA006EF3F3 /* Build configuration list for PBXNativeTarget "can_clone_file" */;
+			buildPhases = (
+				4BFF2B481FE12FCA006EF3F3 /* Sources */,
+				4BFF2B4A1FE12FCA006EF3F3 /* Frameworks */,
+				4BFF2B4D1FE12FCA006EF3F3 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = can_clone_file;
+			productName = tryopen;
+			productReference = 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */;
+			productType = "com.apple.product-type.tool";
+		};
 /* End PBXNativeTarget section */
 
 /* Begin PBXProject section */
@@ -1855,6 +1907,7 @@
 				4B01D70A15B2F4EB002D5007 /* zipcmp */,
 				3D7E35361B3305FB00022624 /* in-memory */,
 				4BACD5B515BC2DC900920691 /* add_from_filep */,
+				4BFF2B451FE12FCA006EF3F3 /* can_clone_file */,
 				4BACD5C415BC2DF200920691 /* fopen_unchanged */,
 				4BACD5D315BC2F3700920691 /* fread */,
 				4BD6CB5F19E71CD100710654 /* hole */,
@@ -2245,6 +2298,14 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		4BFF2B481FE12FCA006EF3F3 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4BFF2B551FE13033006EF3F3 /* can_clone_file.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
@@ -2363,6 +2424,11 @@
 			target = 4BD6CB5F19E71CD100710654 /* hole */;
 			targetProxy = 4BD6CB6D19E71D0800710654 /* PBXContainerItemProxy */;
 		};
+		4BFF2B531FE13002006EF3F3 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */;
+			targetProxy = 4BFF2B521FE13002006EF3F3 /* PBXContainerItemProxy */;
+		};
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */
@@ -2899,6 +2965,30 @@
 			};
 			name = Release;
 		};
+		4BFF2B4F1FE12FCA006EF3F3 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		4BFF2B501FE12FCA006EF3F3 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
@@ -3064,6 +3154,15 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
+		4BFF2B4E1FE12FCA006EF3F3 /* Build configuration list for PBXNativeTarget "can_clone_file" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4BFF2B4F1FE12FCA006EF3F3 /* Debug */,
+				4BFF2B501FE12FCA006EF3F3 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 /* End XCConfigurationList section */
 	};
 	rootObject = 4BDC71BF15B181DA00236D3C /* Project object */;