archive_write_disk.3 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. .\" Copyright (c) 2003-2007 Tim Kientzle
  2. .\" All rights reserved.
  3. .\"
  4. .\" Redistribution and use in source and binary forms, with or without
  5. .\" modification, are permitted provided that the following conditions
  6. .\" are met:
  7. .\" 1. Redistributions of source code must retain the above copyright
  8. .\" notice, this list of conditions and the following disclaimer.
  9. .\" 2. Redistributions in binary form must reproduce the above copyright
  10. .\" notice, this list of conditions and the following disclaimer in the
  11. .\" documentation and/or other materials provided with the distribution.
  12. .\"
  13. .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  14. .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16. .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  17. .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19. .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20. .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. .\" SUCH DAMAGE.
  24. .\"
  25. .Dd January 19, 2020
  26. .Dt ARCHIVE_WRITE_DISK 3
  27. .Os
  28. .Sh NAME
  29. .Nm archive_write_disk_new ,
  30. .Nm archive_write_disk_set_options ,
  31. .Nm archive_write_disk_set_skip_file ,
  32. .Nm archive_write_disk_set_group_lookup ,
  33. .Nm archive_write_disk_set_standard_lookup ,
  34. .Nm archive_write_disk_set_user_lookup
  35. .Nd functions for creating objects on disk
  36. .Sh LIBRARY
  37. Streaming Archive Library (libarchive, -larchive)
  38. .Sh SYNOPSIS
  39. .In archive.h
  40. .Ft struct archive *
  41. .Fn archive_write_disk_new "void"
  42. .Ft int
  43. .Fn archive_write_disk_set_options "struct archive *" "int flags"
  44. .Ft int
  45. .Fn archive_write_disk_set_skip_file "struct archive *" "dev_t" "ino_t"
  46. .Ft int
  47. .Fo archive_write_disk_set_group_lookup
  48. .Fa "struct archive *"
  49. .Fa "void *"
  50. .Fa "gid_t (*)(void *, const char *gname, gid_t gid)"
  51. .Fa "void (*cleanup)(void *)"
  52. .Fc
  53. .Ft int
  54. .Fn archive_write_disk_set_standard_lookup "struct archive *"
  55. .Ft int
  56. .Fo archive_write_disk_set_user_lookup
  57. .Fa "struct archive *"
  58. .Fa "void *"
  59. .Fa "uid_t (*)(void *, const char *uname, uid_t uid)"
  60. .Fa "void (*cleanup)(void *)"
  61. .Fc
  62. .Sh DESCRIPTION
  63. These functions provide a complete API for creating objects on
  64. disk from
  65. .Tn struct archive_entry
  66. descriptions.
  67. They are most naturally used when extracting objects from an archive
  68. using the
  69. .Fn archive_read
  70. interface.
  71. The general process is to read
  72. .Tn struct archive_entry
  73. objects from an archive, then write those objects to a
  74. .Tn struct archive
  75. object created using the
  76. .Fn archive_write_disk
  77. family functions.
  78. This interface is deliberately very similar to the
  79. .Fn archive_write
  80. interface used to write objects to a streaming archive.
  81. .Bl -tag -width indent
  82. .It Fn archive_write_disk_new
  83. Allocates and initializes a
  84. .Tn struct archive
  85. object suitable for writing objects to disk.
  86. .It Fn archive_write_disk_set_skip_file
  87. Records the device and inode numbers of a file that should not be
  88. overwritten.
  89. This is typically used to ensure that an extraction process does not
  90. overwrite the archive from which objects are being read.
  91. This capability is technically unnecessary but can be a significant
  92. performance optimization in practice.
  93. .It Fn archive_write_disk_set_options
  94. The options field consists of a bitwise OR of one or more of the
  95. following values:
  96. .Bl -tag -compact -width "indent"
  97. .It Cm ARCHIVE_EXTRACT_ACL
  98. Attempt to restore Access Control Lists.
  99. By default, extended ACLs are ignored.
  100. .It Cm ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS
  101. Before removing a file system object prior to replacing it, clear
  102. platform-specific file flags which might prevent its removal.
  103. .It Cm ARCHIVE_EXTRACT_FFLAGS
  104. Attempt to restore file attributes (file flags).
  105. By default, file attributes are ignored.
  106. See
  107. .Xr chattr 1
  108. .Pq Linux
  109. or
  110. .Xr chflags 1
  111. .Pq FreeBSD, Mac OS X
  112. for more information on file attributes.
  113. .It Cm ARCHIVE_EXTRACT_MAC_METADATA
  114. Mac OS X specific.
  115. Restore metadata using
  116. .Xr copyfile 3 .
  117. By default,
  118. .Xr copyfile 3
  119. metadata is ignored.
  120. .It Cm ARCHIVE_EXTRACT_NO_OVERWRITE
  121. Existing files on disk will not be overwritten.
  122. By default, existing regular files are truncated and overwritten;
  123. existing directories will have their permissions updated;
  124. other pre-existing objects are unlinked and recreated from scratch.
  125. .It Cm ARCHIVE_EXTRACT_OWNER
  126. The user and group IDs should be set on the restored file.
  127. By default, the user and group IDs are not restored.
  128. .It Cm ARCHIVE_EXTRACT_PERM
  129. Full permissions (including SGID, SUID, and sticky bits) should
  130. be restored exactly as specified, without obeying the
  131. current umask.
  132. Note that SUID and SGID bits can only be restored if the
  133. user and group ID of the object on disk are correct.
  134. If
  135. .Cm ARCHIVE_EXTRACT_OWNER
  136. is not specified, then SUID and SGID bits will only be restored
  137. if the default user and group IDs of newly-created objects on disk
  138. happen to match those specified in the archive entry.
  139. By default, only basic permissions are restored, and umask is obeyed.
  140. .It Cm ARCHIVE_EXTRACT_SAFE_WRITES
  141. Extract files atomically, by first creating a unique temporary file and then
  142. renaming it to its required destination name.
  143. This avoids a race where an application might see a partial file (or no
  144. file) during extraction.
  145. .It Cm ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS
  146. Refuse to extract an absolute path.
  147. The default is to not refuse such paths.
  148. .It Cm ARCHIVE_EXTRACT_SECURE_NODOTDOT
  149. Refuse to extract a path that contains a
  150. .Pa ..
  151. element anywhere within it.
  152. The default is to not refuse such paths.
  153. Note that paths ending in
  154. .Pa ..
  155. always cause an error, regardless of this flag.
  156. .It Cm ARCHIVE_EXTRACT_SECURE_SYMLINKS
  157. Refuse to extract any object whose final location would be altered
  158. by a symlink on disk.
  159. This is intended to help guard against a variety of mischief
  160. caused by archives that (deliberately or otherwise) extract
  161. files outside of the current directory.
  162. The default is not to perform this check.
  163. If
  164. .Cm ARCHIVE_EXTRACT_UNLINK
  165. is specified together with this option, the library will
  166. remove any intermediate symlinks it finds and return an
  167. error only if such symlink could not be removed.
  168. .It Cm ARCHIVE_EXTRACT_SPARSE
  169. Scan data for blocks of NUL bytes and try to recreate them with holes.
  170. This results in sparse files, independent of whether the archive format
  171. supports or uses them.
  172. .It Cm ARCHIVE_EXTRACT_TIME
  173. The timestamps (mtime, ctime, and atime) should be restored.
  174. By default, they are ignored.
  175. Note that restoring of atime is not currently supported.
  176. .It Cm ARCHIVE_EXTRACT_UNLINK
  177. Existing files on disk will be unlinked before any attempt to
  178. create them.
  179. In some cases, this can prove to be a significant performance improvement.
  180. By default, existing files are truncated and rewritten, but
  181. the file is not recreated.
  182. In particular, the default behavior does not break existing hard links.
  183. .It Cm ARCHIVE_EXTRACT_XATTR
  184. Attempt to restore extended file attributes.
  185. By default, they are ignored.
  186. See
  187. .Xr xattr 7
  188. .Pq Linux ,
  189. .Xr xattr 2
  190. .Pq Mac OS X ,
  191. or
  192. .Xr getextattr 8
  193. .Pq FreeBSD
  194. for more information on extended file attributes.
  195. .El
  196. .It Xo
  197. .Fn archive_write_disk_set_group_lookup ,
  198. .Fn archive_write_disk_set_user_lookup
  199. .Xc
  200. The
  201. .Tn struct archive_entry
  202. objects contain both names and ids that can be used to identify users
  203. and groups.
  204. These names and ids describe the ownership of the file itself and
  205. also appear in ACL lists.
  206. By default, the library uses the ids and ignores the names, but
  207. this can be overridden by registering user and group lookup functions.
  208. To register, you must provide a lookup function which
  209. accepts both a name and id and returns a suitable id.
  210. You may also provide a
  211. .Tn void *
  212. pointer to a private data structure and a cleanup function for
  213. that data.
  214. The cleanup function will be invoked when the
  215. .Tn struct archive
  216. object is destroyed.
  217. .It Fn archive_write_disk_set_standard_lookup
  218. This convenience function installs a standard set of user
  219. and group lookup functions.
  220. These functions use
  221. .Xr getpwnam 3
  222. and
  223. .Xr getgrnam 3
  224. to convert names to ids, defaulting to the ids if the names cannot
  225. be looked up.
  226. These functions also implement a simple memory cache to reduce
  227. the number of calls to
  228. .Xr getpwnam 3
  229. and
  230. .Xr getgrnam 3 .
  231. .El
  232. More information about the
  233. .Va struct archive
  234. object and the overall design of the library can be found in the
  235. .Xr libarchive 3
  236. overview.
  237. Many of these functions are also documented under
  238. .Xr archive_write 3 .
  239. .Sh RETURN VALUES
  240. Most functions return
  241. .Cm ARCHIVE_OK
  242. (zero) on success, or one of several non-zero
  243. error codes for errors.
  244. Specific error codes include:
  245. .Cm ARCHIVE_RETRY
  246. for operations that might succeed if retried,
  247. .Cm ARCHIVE_WARN
  248. for unusual conditions that do not prevent further operations, and
  249. .Cm ARCHIVE_FATAL
  250. for serious errors that make remaining operations impossible.
  251. .Pp
  252. .Fn archive_write_disk_new
  253. returns a pointer to a newly-allocated
  254. .Tn struct archive
  255. object.
  256. .Pp
  257. .Fn archive_write_data
  258. returns a count of the number of bytes actually written,
  259. or
  260. .Li -1
  261. on error.
  262. .\"
  263. .Sh ERRORS
  264. Detailed error codes and textual descriptions are available from the
  265. .Fn archive_errno
  266. and
  267. .Fn archive_error_string
  268. functions.
  269. .\"
  270. .Sh SEE ALSO
  271. .Xr tar 1 ,
  272. .Xr archive_read 3 ,
  273. .Xr archive_write 3 ,
  274. .Xr libarchive 3
  275. .Sh HISTORY
  276. The
  277. .Nm libarchive
  278. library first appeared in
  279. .Fx 5.3 .
  280. The
  281. .Nm archive_write_disk
  282. interface was added to
  283. .Nm libarchive 2.0
  284. and first appeared in
  285. .Fx 6.3 .
  286. .Sh AUTHORS
  287. .An -nosplit
  288. The
  289. .Nm libarchive
  290. library was written by
  291. .An Tim Kientzle Aq [email protected] .
  292. .Sh BUGS
  293. Directories are actually extracted in two distinct phases.
  294. Directories are created during
  295. .Fn archive_write_header ,
  296. but final permissions are not set until
  297. .Fn archive_write_close .
  298. This separation is necessary to correctly handle borderline
  299. cases such as a non-writable directory containing
  300. files, but can cause unexpected results.
  301. In particular, directory permissions are not fully
  302. restored until the archive is closed.
  303. If you use
  304. .Xr chdir 2
  305. to change the current directory between calls to
  306. .Fn archive_read_extract
  307. or before calling
  308. .Fn archive_read_close ,
  309. you may confuse the permission-setting logic with
  310. the result that directory permissions are restored
  311. incorrectly.
  312. .Pp
  313. The library attempts to create objects with filenames longer than
  314. .Cm PATH_MAX
  315. by creating prefixes of the full path and changing the current directory.
  316. Currently, this logic is limited in scope; the fixup pass does
  317. not work correctly for such objects and the symlink security check
  318. option disables the support for very long pathnames.
  319. .Pp
  320. Restoring the path
  321. .Pa aa/../bb
  322. does create each intermediate directory.
  323. In particular, the directory
  324. .Pa aa
  325. is created as well as the final object
  326. .Pa bb .
  327. In theory, this can be exploited to create an entire directory hierarchy
  328. with a single request.
  329. Of course, this does not work if the
  330. .Cm ARCHIVE_EXTRACT_NODOTDOT
  331. option is specified.
  332. .Pp
  333. Implicit directories are always created obeying the current umask.
  334. Explicit objects are created obeying the current umask unless
  335. .Cm ARCHIVE_EXTRACT_PERM
  336. is specified, in which case they current umask is ignored.
  337. .Pp
  338. SGID and SUID bits are restored only if the correct user and
  339. group could be set.
  340. If
  341. .Cm ARCHIVE_EXTRACT_OWNER
  342. is not specified, then no attempt is made to set the ownership.
  343. In this case, SGID and SUID bits are restored only if the
  344. user and group of the final object happen to match those specified
  345. in the entry.
  346. .Pp
  347. The
  348. .Dq standard
  349. user-id and group-id lookup functions are not the defaults because
  350. .Xr getgrnam 3
  351. and
  352. .Xr getpwnam 3
  353. are sometimes too large for particular applications.
  354. The current design allows the application author to use a more
  355. compact implementation when appropriate.
  356. .Pp
  357. There should be a corresponding
  358. .Nm archive_read_disk
  359. interface that walks a directory hierarchy and returns archive
  360. entry objects.