summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/archive_write_disk.c
Commit message (Collapse)AuthorAgeFilesLines
* Minor portability: Declare 'r' only within the conditionalkientzle2008-12-061-2/+2
| | | | block where it's used; S_ISLNK is more portable than S_ISLINK.
* Add test to verify ACL restores on FreeBSD, verify kern/128203 (mtimekientzle2008-10-191-4/+4
| | | | | | | | restore fails if ACL provided), apply patch from kern/128203, and verify fix. PR: kern/128203 Submitted by: Udo Schweigert MFC after: 3 days
* MfP4: restore birth time data to disk + more thorough tests forkientzle2008-09-301-83/+121
| | | | | | time restore to disk. MFC after: 30 days
* Choose a flag-handling strategy based on platform capabilitieskientzle2008-09-141-6/+7
| | | | rather than on platform.
* Portability: Not everyone is lucky enough to have ftruncate()kientzle2008-09-121-0/+2
|
* Portability: Support platforms that lack (struct stat).st_blksize or SSIZE_MAXkientzle2008-09-121-0/+6
| | | | Of course, FreeBSD has both.
* When restoring a directory, allow symlinks to be followed. The fullkientzle2008-09-071-3/+15
| | | | | | | | | | | | logic here gets a little complex, but the net effect is that the SECURE_SYMLINKS flag will prevent us from ever following a symlink. Without it, we'll only follow symlinks to dirs. bsdtar specifies SECURE_SYMLINKS by default, suppresses it for -P. I've also beefed up the write_disk_secure test to verify this behavior. PR: bin/126849
* MfP4: Handle entries with unset size properly: Regular files withkientzle2008-09-051-43/+81
| | | | | | | | unspecified size are "unlimited" (required by Zip reader, which sometimes does not know the uncompressed size of an entry until it gets to the end). Also, hardlinks with unspecified (or zero) size do not overwrite the data on disk nor do they set metadata. This is compatible with GNU tar and NetBSD pax behavior.
* MfP4: Use the set/unset tracking to determine when mtime or atimekientzle2008-09-051-14/+51
| | | | | is unavailable. Use start_time as a substitute when one is missing; if both are missing, skip the call to {f,l,}utime{s,}() entirely.
* Use the "start_time" (time at which the restore process began)kientzle2008-09-011-5/+13
| | | | | | to fill in a missing atime instead of substituting mtime. PR: bin/124915
* If no atime was specified (for example, when extracting from ustarkientzle2008-08-281-0/+5
| | | | | archives), set atime == mtime. Before this, atime would get restored to 0.
* Update the total archive byte counters when writing entries to disk usingkientzle2008-08-241-0/+2
| | | | | | archive_write_disk. Update cpio to use this to emit block counts in -p mode. Update cpio tests to verify these block counts.
* Fail copying path/.. only if SECURE_NODOTDOT was specified.kientzle2008-08-241-15/+3
| | | | | | | Since we already warn for any '..' elements in that case, the extra "lastdotdot" tracking turns out to be unnecessary. PR: bin/124924
* Fix the cpio bug tested for by r182092 of usr.bin/cpio/test.kientzle2008-08-241-1/+5
| | | | | | | | Since various 'find' incantations can emit container directories in various orders, we cannot refuse to update a dir because it's apparently the same age. MFC after: 3 days
* When ARCHIVE_EXTRACT_PERM is requested (e.g., by "tar -p"), alwayskientzle2008-07-051-5/+9
| | | | | | | | | | | | schedule a chmod() fixup for directories. In particular, this fixes sgid handling on systems where the sgid bit is inherited from the parent directory (which means that the actual mode of the dir does not match the mode used in the mkdir() system call. It may be possible to tighten this condition a bit. In working through this, I also found a few other places where it looks like we can avoid a redundant syscall or two. I've commented those here but not yet tried to address them.
* Don't use the deprecated linux/ext2_fs.h include file.kientzle2008-07-051-3/+0
|
* A security-check failure here should be ARCHIVE_FAILED (cannot continue thiskientzle2008-06-211-3/+3
| | | | | | operation) and not ARCHIVE_WARN, since we don't actually open the file. Both bsdtar and bsdcpio will try to copy file contents after an ARCHIVE_WARN, which will fail loudly.
* MFp4: libarchive 2.5.4b. (Still 'b' until I get a bit morekientzle2008-05-261-43/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | feedback, but the 2.5 branch is shaping up nicely.) In addition to many small bug fixes and code improvements: * Another iteration of versioning; I think I've got it right now. * Portability: A lot of progress on Windows support (though I'm not committing all of the Windows support files to FreeBSD CVS) * Explicit tracking of MBS, WCS, and UTF-8 versions of strings in archive_entry; the archive_entry routines now correctly return NULL only when something is unset, setting NULL properly clears string values. Most charset conversions have been pushed down to archive_string. * Better handling of charset conversion failure when writing or reading UTF-8 headers in pax archives * archive_entry_linkify() provides multiple strategies for hardlink matching to suit different format expectations * More accurate bzip2 format detection * Joerg Sonnenberger's extensive improvements to mtree support * Rough support for self-extracting ZIP archives. Not an ideal approach, but it works for the archives I've tried. * New "sparsify" option in archive_write_disk converts blocks of nulls into seeks. * Better default behavior for the test harness; it now reports all failures by default instead of coredumping at the first one.
* FreeBSD does have fstat().kientzle2008-03-151-1/+1
| | | | Correct the nasty typo this uncovers.
* Spelling correction, thanks to Joerg Sonnenberger.kientzle2008-02-271-1/+1
|
* Portability improvements:kientzle2008-02-191-23/+66
| | | | | | | | | | | | | | | * If the platform can't restore char nodes, block nodes, or fifos, don't try and just return error. * Include O_BINARY in most open() calls (define O_BINARY to 0 if the platform doesn't provide a definition already) * Refactor the ownership restore to more cleanly support platforms that don't have any form of {l,f,}chown() call. * Comment a lingering issue with older Unix-like systems that allow root to hose the filesystem. I don't (yet) have a good solution for this, but I expect it will require adding more redundant stat() calls. <sigh> MFC after: 14 days
* I misread the Tinderbox error; this should really unbreak 64-bit builds.kientzle2008-01-181-1/+1
| | | | Pointy hats, yep, keep 'em coming. ;-/
* Fix 64-bit build after my last commit. <sigh>kientzle2008-01-181-1/+1
|
* Issues with hardlinks in newc-format files prompted me tokientzle2008-01-181-6/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | write a new test to exercise the hardlink strategies used by different archive formats (tar, old cpio, new cpio). This uncovered two problems, both fixed by this commit: 1) Enforce file size when writing files to disk. 2) When restoring hardlink entries, if they have data associated, go ahead and open the file so we can write the data. In particular, this fixes bsdtar/bsdcpio extraction of new cpio formats where the "original" is empty and the subsequent "hardlink" entry actually carries the data. It also provides correct behavior for old cpio archives where hardlinked entries have their bodies stored multiple times in the archive; the last body should always be the one that ends up in the final file. The new pax format also permits (but does not require) hardlinks to carry file data; again, the last contents should always win. Note that with any of these, a size of zero on a hardlink simply means that the hardlink carries no data; it does not mean that the file has zero size. A non-zero size on a hardlink does provide the file size. Thanks to: John Baldwin, for reminding me about this long-standing bug and sending me a simple example archive that prompted this test case
* Update libarchive to 2.4.10. This includes a number of improvementskientzle2007-12-301-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | that I've been working on but put off committing until after the RELENG_7 branch, including: * New manpages: cpio.5 mtree.5 * New archive_entry_strmode() * New archive_entry_link_resolver() * New read support: mtree format * Internal API change: read format auction only runs once * Running the auction only once allowed simplifying a lot of bid logic. * Cpio robustness: search for next header after a sync error * Support device nodes on ISO9660 images * Eliminate a lot of unnecessary copies for uncompressed archives * Corrected handling of new GNU --sparse --posix formats * Correctly handle a zero-byte write to a compressed archive * Fixed memory leaks Many of these improvements were motivated by the upcoming bsdcpio front-end. There have also been extensive improvements to the libarchive_test test harness, which I'll commit separately.
* Fix the archive_write_data() function so it always returnskientzle2007-09-211-3/+10
| | | | | | | | | | | | | number of bytes written, even when used to write files to disk. Extend the test suite to verify the correct return values for archive_write_data() and archive_write_data_block(). Thanks to: Bruce Mah, for stepping in promptly to back out the earlier broken version of this fix Thanks to: Colin Percival, for pointing out the correct fix MFC after: 5 days Approved by: re (ksmith) Pointy hat: \me
* Revert the last commit to libarchive. It introduced some regresssions,bmah2007-09-181-7/+4
| | | | | | | | | | | most noticably the incorrect extraction of files by bsdtar. This commit reverts: src/lib/libarchive/archive_write_disk.c 1.15 src/lib/libarchive/test/test_write_disk.c 1.4 Approved by: re (implicitly)
* Correct the return value from archive_write_data()kientzle2007-09-181-4/+7
| | | | | | | | | | | (when used to restore files to disk) to match: * The documentation * The return values of this function when used to write files into an archive. Approved by: re (bmah) Pointy hat: \me MFC after: 5 days
* Make suid/sgid restore be "opportunistic" ifkientzle2007-08-121-6/+22
| | | | | | | | | | | | | | | | | | | | | | | | owner restore is not requested. If you ask for permissions to be restored but not owner, you will now get no error if suid/sgid bits cannot be set. (It's a security hole to restore suid/sgid bits if the owner/group aren't restored.) This fixes an obscure problem where a simple "tar -xf" with no other options will sometimes fail gratuitously because of suid/sgid bits. This is causing occasional problems for people using bsdtar as a drop-in replacement for "that other tar program." ;-) Note: If you do ask for owner restore, then suid/sgid restore failures still issue an error. This only suppresses the error in the case where an suid/sgid bit restore fails because of an owner mismatch and owner restore was not requested. Approved by: re (bmah) MFC after: 7 days
* archive_string_ensure() used to call exit(3) if itkientzle2007-07-151-1/+4
| | | | | | | | | | couldn't allocate more memory for a string. Change this so it returns NULL in that case, and update all of its callers to handle the error. Some of those callers can now return errors back to the client instead of calling exit(3). Approved by: re (bmah)
* libarchive 2.2.3kientzle2007-05-291-20/+92
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | * "compression_program" support uses an external program * Portability: no longer uses "struct stat" as a primary data interchange structure internally * Part of the above: refactor archive_entry to separate out copy_stat() and stat() functions * More complete tests for archive_entry * Finish archive_entry_clone() * Isolate major()/minor()/makedev() in archive_entry; remove these from everywhere else. * Bug fix: properly handle decompression look-ahead at end-of-data * Bug fixes to 'ar' support * Fix memory leak in ZIP reader * Portability: better timegm() emulation in iso9660 reader * New write_disk flags to suppress auto dir creation and not overwrite newer files (for future cpio front-end) * Simplify trailing-'/' fixup when writing tar and pax * Test enhancements: fix various compiler warnings, improve portability, add lots of new tests. * Documentation: document new functions, first draft of libarchive_internals.3 MFC after: 14 days Thanks to: Joerg Sonnenberger (compression_program) Thanks to: Kai Wang (ar) Thanks to: Colin Percival (many small fixes) Thanks to: Many others who sent me various patches and problem reports.
* Remove pointless code: Don't assign a value to a variable when we'recperciva2007-05-211-1/+0
| | | | | | | | | | | going to overwrite it with a new value a few lines later. Visual inspection of the surrounding code indicates that the code does what it's supposed to do; i.e., the pointless code wasn't supposed to be doing something other than what it was doing. CID: 3323 Found by: Coverity Prevent(tm)
* Properly cleanup the UID/GID lookup data.kientzle2007-04-151-0/+4
|
* Invoke utime(2) properly. (It's only used on platformskientzle2007-04-141-2/+2
| | | | that lack utimes(2).)
* More portability improvements from Martin Koeppe:kientzle2007-04-141-0/+51
| | | | | | conditionally use utime() when utimes() is not available; allow the most common wide-char functions to be replaced when local alternatives are lacking.
* Make Lint happier.kientzle2007-04-121-1/+2
|
* Fix build on Solaris.kientzle2007-04-071-1/+1
|
* Be consistent: file flags are unsigned bitmaps.kientzle2007-04-021-1/+1
| | | | Thanks to: Joerg Sonnenberger
* Notice when mkdir() fails.kientzle2007-03-241-9/+16
| | | | | | | | Don't change permissions on an existing dir unless _EXTRACT_PERM is requested. In particular, bsdtar -x should not edit mode of existing dirs now; bsdtar -xp will.
* When ARCHIVE_EXTRACT_UNLINK is requested:kientzle2007-03-131-4/+10
| | | | | | | | * Only try to remove the existing item if we're not restoring a directory. * If unlink fails, try rmdir next. This should fix the broken --unlink option in bsdtar. Thanks again to: Kris Kennaway, for beating up bsdtar on pointyhat.
* Libarchive 2.0.23:kientzle2007-03-111-1/+4
| | | | | | | | | | | | * The ACL formatter was mis-formatting entries which had a user/group ID but no name. Make the parser tolerant of these, so that old archives can be correctly restored; fix the formatter to generate correct entries. * Fix overwrite detection by introducing a new "FAILED" return code that indicates the current entry cannot be continued but the archive as a whole is still sound. * Header cleanup: Remove some unused headers, add some that are required with new Linux systems.
* libarchive 2.0kientzle2007-03-031-0/+1929
* libarchive_test program exercises many of the core features * Refactored old "read_extract" into new "archive_write_disk", which uses archive_write methods to put entries onto disk. In particular, you can now use archive_write_disk to create objects on disk without having an archive available. * Pushed some security checks from bsdtar down into libarchive, where they can be better optimized. * Rearchitected the logic for creating objects on disk to reduce the number of system calls. Several common cases now use a minimum number of system calls. * Virtualized some internal interfaces to provide a clearer separation of read and write handling and make it simpler to override key methods. * New "empty" format reader. * Corrected return types (this ABI breakage required the "2.0" version bump) * Many bug fixes.
OpenPOWER on IntegriCloud