2 .\" Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
8 .Nm copyfile , fcopyfile ,
9 .Nm copyfile_state_alloc , copyfile_state_free ,
10 .Nm copyfile_state_get , copyfile_state_set
17 .Fn copyfile "const char *from" "const char *to" "copyfile_state_t state" "copyfile_flags_t flags"
19 .Fn fcopyfile "int from" "int to" "copyfile_state_t state" "copyfile_flags_t flags"
21 .Fn copyfile_state_alloc "void"
23 .Fn copyfile_state_free "copyfile_state_t state"
25 .Fn copyfile_state_get "copyfile_state_t state" "uint32_t flag" "void * dst"
27 .Fn copyfile_state_set "copyfile_state_t state" "uint32_t flag" "const void * src"
29 .Fn (*copyfile_callback_t) "int what" "int stage" "copyfile_state_t state" "const char * src" "const char * dst" "void * ctx"
31 These functions are used to copy a file's data and/or metadata. (Metadata
32 consists of permissions, extended attributes, access control lists, and so
36 .Fn copyfile_state_alloc
37 function initializes a
39 object (which is an opaque data type).
40 This object can be passed to
44 .Fn copyfile_state_get
46 .Fn copyfile_state_set
47 can be used to manipulate the state (see below).
49 .Fn copyfile_state_free
50 function is used to deallocate the object and its contents.
54 function can copy the named
60 function does the same, but using the file descriptors of already-opened
64 parameter is the return value from
65 .Fn copyfile_state_alloc ,
70 will use the information from the state object; if it is
72 then both functions will work normally, but less control will be available to the caller.
75 parameter controls which contents are copied:
76 .Bl -tag -width COPYFILE_XATTR
78 Copy the source file's access control lists.
80 Copy the source file's POSIX information (mode, modification time, etc.).
82 Copy the source file's extended attributes.
84 Copy the source file's data.
87 These values may be or'd together; several convenience macros are provided:
88 .Bl -tag -width COPYFILE_SECURITY
89 .It Dv COPYFILE_SECURITY
90 Copy the source file's POSIX and ACL information; equivalent to
91 .Dv (COPYFILE_STAT|COPYFILE_ACL) .
92 .It Dv COPYFILE_METADATA
93 Copy the metadata; equivalent to
94 .Dv (COPYFILE_SECURITY|COPYFILE_XATTR) .
96 Copy the entire file; equivalent to
97 .Dv (COPYFILE_METADATA|COPYFILE_DATA) .
104 functions can also have their behavior modified by the following flags:
105 .Bl -tag -width COPYFILE_NOFOLLOW_SRC
106 .It Dv COPYFILE_RECURSIVE
109 to recursively copy a hierarchy.
110 This flag is not used by
112 see below for more information.
113 .It Dv COPYFILE_CHECK
114 Return a bitmask (corresponding to the
116 argument) indicating which contents would be copied; no data are actually
120 .Dv COPYFILE_CHECK|COPYFILE_METADATA ,
123 file had extended attributes but no ACLs, the return value would be
124 .Dv COPYFILE_XATTR .)
130 file is an AppleDouble-format file.
131 .It Dv COPYFILE_UNPACK
136 file is an AppleDouble-format file; the
138 file will have the extended attributes, ACLs, resource fork, and
139 FinderInfo data from the
141 file, regardless of the
147 file already exists. (This is only applicable for the
150 .It Dv COPYFILE_NOFOLLOW_SRC
153 file, if it is a symbolic link. (This is only applicable for the
156 .It Dv COPYFILE_NOFOLLOW_DST
159 file, if it is a symbolic link. (This is only applicable for the
167 file. (This is only applicable for the
169 function.) No error is returned if
173 removes a symbolic link itself, not the
175 .It Dv COPYFILE_UNLINK
178 file before starting. (This is only applicable for the
181 .It Dv COPYFILE_CLONE_FORCE
182 Clone the file instead.
183 This is a force flag i.e. if cloning fails, an error is returned.
184 This flag is equivalent to (COPYFILE_EXCL | COPYFILE_ACL | COPYFILE_STAT | COPYFILE_XATTR | COPYFILE_DATA
185 | COPYFILE_NOFOLLOW_SRC).
186 Note that if cloning is successful, progress callbacks will not be invoked.
187 Note also that there is no support for cloning directories: if a directory is provided as the source,
188 an error will be returned.
189 (This is only applicable for the
192 .It Dv COPYFILE_CLONE
193 Try to clone the file instead.
194 This is a best try flag i.e. if cloning fails, fallback to copying the file.
195 This flag is equivalent to (COPYFILE_EXCL | COPYFILE_ACL | COPYFILE_STAT | COPYFILE_XATTR | COPYFILE_DATA
196 | COPYFILE_NOFOLLOW_SRC).
197 Note that if cloning is successful, progress callbacks will not be invoked.
198 Note also that there is no support for cloning directories: if a directory is provided as the source and
199 COPYFILE_CLONE_FORCE is not passed, this will instead copy the directory. Recursive copying however is
200 supported, see below for more information.
201 (This is only applicable for the
204 .It Dv COPYFILE_NOFOLLOW
205 This is a convenience macro, equivalent to
206 .Dv (COPYFILE_NOFOLLOW_DST | COPYFILE_NOFOLLOW_SRC) .
207 .It Dv COPYFILE_RUN_IN_PLACE
208 If the src file has quarantine information, add the QTN_FLAG_DO_NOT_TRANSLOCATE flag to the quarantine information of the dst file. This allows a bundle to run in place instead of being translocated.
212 .Fn copyfile_state_get
214 .Fn copyfile_state_set
215 functions can be used to manipulate the
218 .Fn copyfile_state_alloc .
219 In both functions, the
221 parameter's type depends on the
223 parameter that is passed in.
224 .Bl -tag -width COPYFILE_STATE_DST_FILENAME
225 .It Dv COPYFILE_STATE_SRC_FD
226 .It Dv COPYFILE_STATE_DST_FD
227 Get or set the file descriptor associated with the source (or destination)
229 If this has not been initialized yet, the value will be -2.
233 .Fn copyfile_state_get )
237 .Fn copyfile_state_set )
238 parameters are pointers to
240 .It Dv COPYFILE_STATE_SRC_FILENAME
241 .It Dv COPYFILE_STATE_DST_FILENAME
242 Get or set the filename associated with the source (or destination)
243 file. If it has not been initialized yet, the value will be
246 .Fn copyfile_state_set ,
249 parameter is a pointer to a C string
252 .Fn copyfile_state_set
253 makes a private copy of this string.
255 .Fn copyfile_state_get
258 parameter is a pointer to a pointer to a C string
261 the returned value is a pointer to the
263 copy, and must not be modified or released.
264 .It Dv COPYFILE_STATE_STATUS_CB
265 Get or set the callback status function (currently
266 only used for recursive copies; see below for details).
269 parameter is a pointer to a function of type
270 .Vt copyfile_callback_t
272 .It Dv COPYFILE_STATE_STATUS_CTX
273 Get or set the context parameter for the status
274 call-back function (see below for details).
279 .It Dv COPYFILE_STATE_QUARANTINE
280 Get or set the quarantine information with the source file.
283 parameter is a pointer to an opaque
287 .It Dv COPYFILE_STATE_COPIED
288 Get the number of data bytes copied so far.
290 .Fn copyfile_state_get ;
291 see below for more details about callbacks.)
295 .Dv COPYFILE_CLONE_FORCE
296 operation successfully cloned the requested objects, then this value will be 0.
299 parameter is a pointer to
303 .It Dv COPYFILE_STATE_XATTRNAME
304 Get the name of the extended attribute during a callback
306 .Dv COPYFILE_COPY_XATTR
307 (see below for details). This field cannot be set,
310 .It Dv COPYFILE_STATE_WAS_CLONED
314 .Dv COPYFILE_CLONE_FORCE
315 operation successfully cloned the requested objects.
318 parameter is a pointer to
325 .Dv COPYFILE_RECURSIVE
332 functions to recursively descend into the source file-system object.
335 on each of the entries it finds that way.
336 If a call-back function is given (using
337 .Fn copyfile_state_set
339 .Dv COPYFILE_STATE_STATUS_CB ),
340 the call-back function will be called four times for each directory
341 object, and twice for all other objects. (Each directory will
342 be examined twice, once on entry -- before copying each of the
343 objects contained in the directory -- and once on exit -- after
344 copying each object contained in the directory, in order to perform
347 The call-back function will have one of the following values
348 as the first argument, indicating what is being copied:
349 .Bl -tag -width COPYFILE_RECURSE_DIR_CLEANUP
350 .It Dv COPYFILE_RECURSE_FILE
351 The object being copied is a file (or, rather,
352 something other than a directory).
353 .It Dv COPYFILE_RECURSE_DIR
354 The object being copied is a directory, and is being
355 entered. (That is, none of the filesystem objects contained
356 within the directory have been copied yet.)
357 .It Dv COPYFILE_RECURSE_DIR_CLEANUP
358 The object being copied is a directory, and all of the
359 objects contained have been copied. At this stage, the destination directory
360 being copied will have any extra permissions that were added to
361 allow the copying will be removed.
362 .It Dv COPYFILE_RECURSE_ERROR
363 There was an error in processing an element of the source hierarchy;
366 returns an error or unknown file type.
367 (Currently, the second argument to the call-back function will always
373 The second argument to the call-back function will indicate
374 the stage of the copy, and will be one of the following values:
375 .Bl -tag -width COPYFILE_FINISH
376 .It Dv COPYFILE_START
377 Before copying has begun. The third
378 parameter will be a newly-created
380 object with the call-back function and context pre-loaded.
381 .It Dv COPYFILE_FINISH
382 After copying has successfully finished.
384 Indicates an error has happened at some stage. If the
385 first argument to the call-back function is
386 .Dv COPYFILE_RECURSE_ERROR ,
387 then an error occurred while processing the source hierarchy;
388 otherwise, it will indicate what type of object was being copied,
391 will be set to indicate the error.
395 parameters are the source and destination paths that
396 are to be copied (or have been copied, or failed to copy, depending on
397 the second argument).
399 The last argument to the call-back function will be the value
401 .Dv COPYFILE_STATE_STATUS_CTX ,
404 The call-back function is required to return one of the following
406 .Bl -tag -width COPYFILE_CONTINUE
407 .It Dv COPYFILE_CONTINUE
408 The copy will continue as expected.
410 This object will be skipped, and the next object will
411 be processed. (Note that, when entering a directory.
414 from the call-back function will prevent the contents
415 of the directory from being copied.)
417 The entire copy is aborted at this stage. Any filesystem
418 objects created up to this point will remain.
425 The call-back function must always return one of the values listed
426 above; if not, the results are undefined.
428 The call-back function will be called twice for each object
429 (and an additional two times for directory cleanup); the first
434 the second time, that value will be either
438 to indicate a successful completion, or an error during
440 In the event of an error, the
442 value will be set appropriately.
444 Note that recursive cloning is also supported with the
447 .Dv COPYFILE_CLONE_FORCE
448 flag). A recursive clone operation invokes
452 on every entry found in the source file-system object. Because
454 does not allow the cloning of directories, a recursive clone will
455 instead copy any directory it finds (while cloning its contents).
456 As symbolic links may point to directories, they are not followed
457 during recursive clones even if the source is a symbolic link.
458 Additionally, because the
462 flag, recursive clones require a nonexistent destination.
466 .Dv COPYFILE_UNPACK ,
470 flags are not used during a recursive copy, and will result
471 in an error being returned.
472 .Sh Progress Callback
473 In addition to the recursive callbacks described above,
477 will also use a callback to report data (e.g.,
479 progress. If given, the callback will be invoked on each
481 call. The first argument to the callback function will be
482 .Dv COPYFILE_COPY_DATA .
483 The second argument will either be
484 .Dv COPYFILE_PROGRESS
485 (indicating that the write was successful), or
487 (indicating that there was an error of some sort).
489 The amount of data bytes copied so far can be retrieved using
490 .Fn copyfile_state_get ,
492 .Dv COPYFILE_STATE_COPIED
493 requestor (the argument type is a pointer to
496 When copying extended attributes, the first argument to the
497 callback function will be
498 .Dv COPYFILE_COPY_XATTR .
499 The other arguments will be as described for
500 .Dv COPYFILE_COPY_DATA ;
501 the name of the extended attribute being copied may be
503 .Fn copyfile_state_get
505 .Dv COPYFILE_STATE_XATTRNAME .
508 the callback may be called with
510 for each of the extended attributes first, followed by
511 .Dv COPYFILE_PROGRESS
512 before getting and packing the data for each
513 individual attribute, and then
515 when finished with each individual attribute.
518 may be called for all of the extended attributes, before
519 the first callback with
520 .Dv COPYFILE_PROGRESS
521 is invoked.) Any attribute skipped by returning
525 callback will not be placed into the packed output file.
527 The return value for the data callback must be one of
528 .Bl -tag -width COPYFILE_CONTINUE
529 .It Dv COPYFILE_CONTINUE
530 The copy will continue as expected.
531 (In the case of error, it will attempt to write the data again.)
533 The data copy will be aborted, but without error.
535 The data copy will be aborted; in the case of
536 .Dv COPYFILE_PROGRESS ,
546 parameters will be passed in, they may be
551 Note that progress callbacks are not invoked when a clone is requested
554 unless the clone cannot be performed and a copy is performed instead.
556 Except when given the
562 return less than 0 on error, and 0 on success.
563 All of the other functions return 0 on success, and less than 0
570 can copy symbolic links; there is a gap between when the source
571 link is examined and the actual copy is started, and this can
572 be a potential security risk, especially if the process has
575 When performing a recursive copy, if the source hierarchy
576 changes while the copy is occurring, the results are undefined.
579 does not reset the seek position for either source or destination.
580 This can result in the destination file being a different size
581 than the source file.
589 An invalid flag was passed in with
590 .Dv COPYFILE_RECURSIVE .
608 was a negative number.
610 A memory allocation failed.
612 The source file was not a directory, symbolic link, or regular file.
614 The copy was cancelled by callback.
620 already existed and was passed in with
629 Search permission is denied for a component of the path prefix for
636 Write permission is denied for a component of the path prefix for the
641 In addition, both functions may set
643 via an underlying library or system call.
645 .Bd -literal -offset indent
646 /* Initialize a state variable */
648 s = copyfile_state_alloc();
649 /* Copy the data and extended attributes of one file to another */
650 copyfile("/tmp/f1", "/tmp/f2", s, COPYFILE_DATA | COPYFILE_XATTR);
651 /* Convert a file to an AppleDouble file for serialization */
652 copyfile("/tmp/f2", "/tmp/tmpfile", NULL, COPYFILE_ALL | COPYFILE_PACK);
653 /* Release the state variable */
654 copyfile_state_free(s);
655 /* A more complex way to call copyfile() */
656 s = copyfile_state_alloc();
657 copyfile_state_set(s, COPYFILE_STATE_SRC_FILENAME, "/tmp/foo");
658 /* One of src or dst must be set... rest can come from the state */
659 copyfile(NULL, "/tmp/bar", s, COPYFILE_ALL);
660 /* Now copy the same source file to another destination file */
661 copyfile(NULL, "/tmp/car", s, COPYFILE_ALL);
662 copyfile_state_free(s);
663 /* Remove extended attributes from a file */
664 copyfile("/dev/null", "/tmp/bar", NULL, COPYFILE_XATTR);
674 functions lack a way to set the input or output block size.
676 Recursive copies do not honor hard links.
680 API was introduced in Mac OS X 10.5.