diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2025-09-18 22:39:39 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2025-09-18 22:39:39 +0000 |
| commit | a03d150a3d44c49344ebd0862defd1a5ad1f524e (patch) | |
| tree | de87f10c9745c9daa32ca4da1bdb45236805348c | |
| parent | 41b2a80353e0dd04939cc260d5763854a264c158 (diff) | |
pw: Use copy_file_range() when copying skeleton files
As a bonus, check for I/O errors and print them to standard error.
Reviewed by: bapt, emaste
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Sponsored by: Klara, Inc.
Differential Revision: https://reviews.freebsd.org/D52588
| -rw-r--r-- | usr.sbin/pw/cpdir.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/usr.sbin/pw/cpdir.c b/usr.sbin/pw/cpdir.c index 63068cab000c..3839a039495a 100644 --- a/usr.sbin/pw/cpdir.c +++ b/usr.sbin/pw/cpdir.c @@ -36,10 +36,10 @@ #include "pw.h" void -copymkdir(int rootfd, char const * dir, int skelfd, mode_t mode, uid_t uid, +copymkdir(int rootfd, char const *dir, int skelfd, mode_t mode, uid_t uid, gid_t gid, int flags) { - char *p, lnk[MAXPATHLEN], copybuf[4096]; + char *p, lnk[MAXPATHLEN]; int len, homefd, srcfd, destfd; ssize_t sz; struct stat st; @@ -120,8 +120,12 @@ copymkdir(int rootfd, char const * dir, int skelfd, mode_t mode, uid_t uid, continue; } - while ((sz = read(srcfd, copybuf, sizeof(copybuf))) > 0) - write(destfd, copybuf, sz); + do { + sz = copy_file_range(srcfd, NULL, destfd, NULL, + SSIZE_MAX, 0); + } while (sz > 0); + if (sz < 0) + warn("copy_file_range"); close(srcfd); /* |
