Page MenuHomeFreeBSD

D55168.id171424.diff
No OneTemporary

D55168.id171424.diff

diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -140,7 +140,7 @@
static int compare(int, const char *, size_t, int, const char *, size_t,
char **);
-static char *copy(int, const char *, int, const char *, off_t);
+static char *copy(int, const char *, int, const char *, size_t);
static int create_tempfile(const char *, char *, size_t);
static char *quiet_mktemp(char *template);
static char *digest_file(const char *);
@@ -1176,7 +1176,7 @@
*/
static char *
copy(int from_fd, const char *from_name, int to_fd, const char *to_name,
- off_t size)
+ size_t size)
{
static char *buf = NULL;
static size_t bufsize;
@@ -1199,7 +1199,7 @@
do {
ret = copy_file_range(from_fd, NULL, to_fd, NULL,
(size_t)size, 0);
- } while (ret > 0);
+ } while (ret > 0 || (ret < 0 && errno == EINTR));
if (ret == 0)
goto done;
if (errno != EINVAL) {
@@ -1227,28 +1227,28 @@
if (buf == NULL)
err(1, "Not enough memory");
}
- while ((nr = read(from_fd, buf, bufsize)) > 0) {
- if ((nw = write(to_fd, buf, nr)) != nr) {
+ while (size > 0) {
+ if ((nr = read(from_fd, buf, MAX(size, bufsize))) < 0) {
+ if (errno == EINTR)
+ continue;
serrno = errno;
(void)unlink(to_name);
- if (nw >= 0) {
- errx(EX_OSERR,
- "short write to %s: %jd bytes written, "
- "%jd bytes asked to write",
- to_name, (uintmax_t)nw,
- (uintmax_t)size);
- } else {
+ errno = serrno;
+ err(EX_OSERR, "%s", from_name);
+ }
+ while (nr > 0) {
+ if ((nw = write(to_fd, buf, nr)) < 0) {
+ if (errno == EINTR)
+ continue;
+ serrno = errno;
+ (void)unlink(to_name);
errno = serrno;
err(EX_OSERR, "%s", to_name);
}
+ nr -= nw;
}
digest_update(&ctx, buf, nr);
- }
- if (nr != 0) {
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_OSERR, "%s", from_name);
+ size -= nr;
}
#ifndef BOOTSTRAP_XINSTALL
done:

File Metadata

Mime Type
text/plain
Expires
Thu, Jul 23, 6:27 AM (19 m, 56 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35394370
Default Alt Text
D55168.id171424.diff (1 KB)

Event Timeline