summaryrefslogtreecommitdiff
path: root/src/shared/copy.c
Commit message (Collapse)AuthorAgeFilesLines
* copy: Respect COPY_REPLACE flag for copy_treeAlexander Wilson2022-07-271-2/+10
| | | | | - Add a test that asserts that copy_tree on an existing file will fail without COPY_REPLACE - Add a test that asserts that copy_tree with COPY_MERGE and COPY_REPLACE on an existing directory will overwrite files that already exist.
* copy.[ch]: RefactorAlexander Wilson2022-07-271-23/+75
| | | | | | - Refactor: Move HardlinkContext to header file - Refactor: Create `fd_copy_tree_generic` which isolates the functionality to check stat type and appropriately copy. - Refactor: Create `fd_copy_leaf` which handles copying leaf nodes of a file tree.
* stat-util: fix dir_is_empty() with hidden/backup filesLennart Poettering2022-05-041-1/+1
| | | | | | | | | | | | | | | | | | | | This is a follow-up for f470cb6d13558fc06131dc677d54a089a0b07359 which in turn is a follow-up for a068aceafbffcba85398cce636c25d659265087a. The latter started to honour hidden files when deciding whether a directory is empty. The former reverted to the old behaviour to fix issue #23220. It introduced a bug though: when a directory contains a larger number of hidden entries the getdents64() buffer will not suffice to read them, since we just allocate three entries for it (which is definitely enough if we just ignore the . + .. entries, but not ig we ignore more). I think it's a bit confusing that dir_is_empty() can return true even if rmdir() on the dir would return ENOTEMPTY. Hence, let's rework the function to make it optional whether hidden files are ignored or not. After all, I looking at the users of this function I am pretty sure in more cases we want to honour hidden files.
* copy: use FLAGS_SET() in copy_xattr()Franck Bui2022-03-141-1/+1
|
* copy: fix wrong argument passed to S_ISREG() in copy_file_fd_full()Franck Bui2022-03-141-1/+4
| | | | Follow-up for 2f782044986a30bf73f1fe00209dbd204b3efe33.
* shared: Handle filesystems that don't support hole punching in COPY_HOLESDaan De Meyer2022-01-311-2/+4
|
* shared: Ensure COPY_HOLES copies trailing holesDaan De Meyer2022-01-271-2/+44
| | | | | | | | | | Previously, files with a hole at the end would get silently truncated which breaks reading journal files. This commit makes sure that holes are punched in existing space and if no more space is available, that we grow the file and the hole by using ftruncate(). The corresponding test is extended to put a hole at the end of the file and we make sure that hole is copied correctly.
* journal: Copy holes when archiving BTRFS journal filesDaan De Meyer2022-01-171-11/+10
| | | | | | | | | | | Previously, the holes we punched earlier would get removed when copying the file. Let's enable the new COPY_HOLES flag to make sure this doesn't happen. In my test, this drops a 800MB btrfs journal (without compression) to 720 MB. Fixes #22087
* shared: Copy holes in sparse files in copy_bytes_full()Daan De Meyer2022-01-141-0/+41
| | | | | | Previously, all holes in sparse files copied with copy_bytes_full() would be expanded in the target file. Now, we correctly detect holes in the input file and we replicate them in the target file.
* tree-wide: make FOREACH_DIRENT_ALL define the iterator variableZbigniew Jędrzejewski-Szmek2021-12-151-1/+0
| | | | | | | | | The variable is not useful outside of the loop (it'll always be null after the loop is finished), so we can declare it inline in the loop. This saves one variable declaration and reduces the chances that somebody tries to use the variable outside of the loop. For consistency, 'de' is used everywhere for the var name.
* tree-wide: port various places over to open_mkdir_at()Lennart Poettering2021-11-171-11/+3
|
* shared: clean up mkdir.h/label.h situationLennart Poettering2021-11-161-0/+1
| | | | | | | | | | Previously the mkdir_label() family of calls was implemented in src/shared/mkdir-label.c but its functions partly declared ins src/shared/label.h and partly in src/basic/mkdir.h (!!). That's weird (and wrong). Let's clean this up, and add a proper mkdir-label.h matching the .c file.
* tree-wide: use new RET_NERRNO() helper at various placesLennart Poettering2021-11-161-4/+1
|
* basic: split out sync() family of calls from fs-util.[ch] into new c/h fileLennart Poettering2021-10-051-0/+1
| | | | No changes in code, just some splitting out.
* shared/copy: add a new flag COPY_ALL_XATTRSAndrej Lajovic2021-08-111-6/+6
| | | | | | | | When the flag COPY_ALL_XATTRS is set, it causes the complete set of xattrs to be copied. If the flag is unset, only xattrs from the "user" namespace are copied. Fixes #17178.
* copy: add COPY_SIGTERM, matching the existing COPY_SIGINTLennart Poettering2021-08-021-15/+24
|
* copy: add COPY_SYNCFS flagLennart Poettering2021-08-021-11/+27
| | | | | | | | | When copying large directory trees it should be a better idea to sync the whole fs once when we are done instead of individually for each file, hence add COPY_SYNCFS. As opposed to COPY_FSYNC/COPY_FSYNC_FULL this only really applies to the top-level directory, after completion of the whole copy.
* copy: optionally fsync() files after copying themLennart Poettering2021-08-021-7/+107
| | | | | | As a safety precaution it makes sense to fsync() files after copying them, and maybe even the directories they are contained in. Let's add a flag for these two cases.
* copy: tighten destination checks when copying filesLennart Poettering2021-08-021-6/+27
| | | | | | | | let's make sure we only operate on regular files when copying files. Also, make sure to copy file attributes only over if target is a regular file (so that copying a file to /dev/null won't alter the access mode/ownership of that device node...)
* copy: move to single clean-up pathLennart Poettering2021-08-021-21/+33
| | | | | | | | | (This might not look like a big improvement, but will shortly, when we add fsync() support to the copy logic, at which point there are more error paths we can unify that way.) While we are at it, tweak a clean-up path: only unlink a copied file if we are definitely the ones who created them, i.e. if O_EXCL is set.
* copy: port over to pop_pending_signal()Lennart Poettering2021-07-081-18/+3
|
* remove a left-over breakDavid Tardon2021-06-251-1/+0
| | | | | | | By the "same logic as above...", we want to continue to fallback here, but the break prohibits that. This is a follow-up for ee1aa61c4710ae567a2b844e0f0bb8cb0456ab8c .
* basic,shared: move a bunch of files to src/shared/Zbigniew Jędrzejewski-Szmek2021-06-241-0/+1286
| | | | | | | | | | | | The goal is to move everything that requires selinux or smack away from src/basic/. This means that src/basic/label.[ch] must move, which implies btrfs-util.[ch], copy.[ch], and a bunch of other files which form a cluster of internal use. This is just moving text around, so there should be no functional difference. test-blockdev-util is new, because path_is_encrypted() is moved to blockdev-util.c, and so far we didn't have any tests for code there.
* build-sys: split internal basic/ library from shared/Kay Sievers2015-06-111-507/+0
| | | | | | | | | | basic/ can be used by everything cannot use anything outside of basic/ libsystemd/ can use basic/ cannot use shared/ shared/ can use libsystemd/
* util: merge change_attr_fd() and chattr_fd()Lennart Poettering2015-04-081-1/+1
|
* fix gcc warnings about uninitialized variablesHarald Hoyer2015-03-271-3/+3
| | | | | | | | | | | | | like: src/shared/install.c: In function ‘unit_file_lookup_state’: src/shared/install.c:1861:16: warning: ‘r’ may be used uninitialized in this function [-Wmaybe-uninitialized] return r < 0 ? r : state; ^ src/shared/install.c:1796:13: note: ‘r’ was declared here int r; ^
* tree-wide: there is no ENOTSUP on linuxDavid Herrmann2015-03-131-2/+2
| | | | Replace ENOTSUP by EOPNOTSUPP as this is what linux actually uses.
* util: add rename_noreplaceAlban Crequy2015-03-101-3/+9
| | | | | | | | | renameat2() exists since Linux 3.15 but btrfs support for the flag RENAME_NOREPLACE was added later. This patch implements a fallback when renameat2() returns EINVAL. EINVAL is the error returned when the filesystem does not support one of the flags.
* util: the chattr flags field is actually unsigned, judging by kernel sourcesLennart Poettering2015-01-141-2/+2
| | | | Unlike some client code suggests...
* machined: when cloning a raw disk image, also set the NOCOW flagLennart Poettering2015-01-081-3/+6
|
* machinectl/machined: implement "rename", "clone", "read-only" verbs for ↵Lennart Poettering2014-12-281-6/+40
| | | | machine images
* copy: try top copy atime/time/xattrs when copying filesLennart Poettering2014-12-261-1/+102
|
* machinectl: add new commands for copying files from/to containersLennart Poettering2014-12-181-9/+15
|
* copy: use btrfs reflinking only whe we know we copy full filesLennart Poettering2014-12-121-7/+7
|
* nspawn: beef up nspawn with some btrfs magicLennart Poettering2014-12-121-1/+0
| | | | | | | | This adds --template= to duplicate an OS tree as btrfs snpashot and run it This also adds --ephemeral or -x to create a snapshot of an OS tree and boot that, removing it after exit.
* copy: teach copy_bytes() btrfs reflink magicLennart Poettering2014-12-121-2/+9
|
* shared: add new btrfs-util.[ch] helpers for doing common btrfs operationLennart Poettering2014-12-121-5/+30
|
* treewide: sanitize loop_writeZbigniew Jędrzejewski-Szmek2014-12-091-7/+4
| | | | | | | loop_write() didn't follow the usual systemd rules and returned status partially in errno and required extensive checks from callers. Some of the callers dealt with this properly, but many did not, treating partial writes as successful. Simplify things by conforming to usual rules.
* copy: change error code when hitting copy limit to EFBIGLennart Poettering2014-11-071-1/+1
| | | | | After all, this is about files, not arguments, hence EFBIG is more appropriate than E2BIG
* copy: teach copy_bytes() sendfile() support, and then replace ↵Lennart Poettering2014-11-071-26/+59
| | | | sendfile_full() by it
* journal/compress: add stream compression/decompression functionsZbigniew Jędrzejewski-Szmek2014-06-261-3/+1
|
* coredump: never write more than the configured processing size limit to diskLennart Poettering2014-06-231-4/+21
|
* copy: don't eat up error from chown()/chmod()Lennart Poettering2014-06-201-1/+2
| | | | | The idea was to not fail on, nor to ignore errors from chown()/chmod(), but to proceed and simply return the most recent error...
* tmpfiles: make sure "C" doesn't copy anything if the destination already existsLennart Poettering2014-06-191-25/+12
| | | | | | | | | Previously it would recursively copy the entire tree in, and descend into subdirectories even if the destination already exists. Let's do what the documentation says and not do that. If files down the tree shall be copied too, they should get their own "C" lines.
* tmpfiles: do not fail when copying an empty directoryKay Sievers2014-06-191-0/+1
|
* sysusers: add minimal tool to reconstruct /etc/passwd and /etc/group from ↵Lennart Poettering2014-06-121-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | static files systemd-sysusers is a tool to reconstruct /etc/passwd and /etc/group from static definition files that take a lot of inspiration from tmpfiles snippets. These snippets should carry information about system users only. To make sure it is not misused for normal users these snippets only allow configuring UID and gecos field for each user, but do not allow configuration of the home directory or shell, which is necessary for real login users. The purpose of this tool is to enable state-less systems that can populate /etc with the minimal files necessary, solely from static data in /usr. systemd-sysuser is additive only, and will never override existing users. This tool will create these files directly, and not via some user database abtsraction layer. This is appropriate as this tool is supposed to run really early at boot, and is only useful for creating system users, and system users cannot be stored in remote databases anyway. The tool is also useful to be invoked from RPM scriptlets, instead of useradd. This allows moving from imperative user descriptions in RPM to declarative descriptions. The UID/GID for a user/group to be created can either be chosen dynamic, or fixed, or be read from the owner of a file in the file system, in order to support reconstructing the correct IDs for files that shall be owned by them. This also adds a minimal user definition file, that should be sufficient for most basic systems. Distributions are expected to patch these files and augment the contents, for example with fixed UIDs for the users where that's necessary.
* tmpfiles: add new "C" line for copying files or directoriesLennart Poettering2014-06-101-0/+292