diff options
author | Karel Zak | 2008-04-15 00:35:05 +0200 |
---|---|---|
committer | Karel Zak | 2008-04-15 00:35:05 +0200 |
commit | db83e35c6a8189496a19b5868237c59ff34f8947 (patch) | |
tree | f64eddd0716a3c8583a5aceea7f5fba57534d1ed /disk-utils/mkswap.c | |
parent | build-sys: update .gitignore files (diff) | |
download | kernel-qcow2-util-linux-db83e35c6a8189496a19b5868237c59ff34f8947.tar.gz kernel-qcow2-util-linux-db83e35c6a8189496a19b5868237c59ff34f8947.tar.xz kernel-qcow2-util-linux-db83e35c6a8189496a19b5868237c59ff34f8947.zip |
mkswap: when writing the signature page, handle EINTR returns
If the signature page write bumps into EINTR, it should finish the
write, instead of dying.
Addresses-Ubuntu-Bug: 206113
Signed-off-by: LaMont Jones <lamont@canonical.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils/mkswap.c')
-rw-r--r-- | disk-utils/mkswap.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index 12d9a164a..dc3a3d308 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -465,6 +465,22 @@ check_mount(void) { return 1; } + +static int +write_all(int fd, const void *buf, size_t count) { + while(count) { + ssize_t tmp = write(fd, buf, count); + + if (tmp > 0) { + count -= tmp; + if (count) + buf += tmp; + } else if (errno != EINTR && errno != EAGAIN) + return -1; + } + return 0; +} + int main(int argc, char ** argv) { struct stat statbuf; @@ -711,9 +727,12 @@ use the -f option to force it.\n"), offset = ((version == 0) ? 0 : 1024); if (lseek(DEV, offset, SEEK_SET) != offset) die(_("unable to rewind swap-device")); - if (write(DEV,(char*)signature_page+offset, pagesize-offset) - != pagesize-offset) - die(_("unable to write signature page")); + if (write_all(DEV, (char *) signature_page + offset, + pagesize - offset) == -1) { + fprintf(stderr, _("%s: %s: unable to write signature page: %s"), + program_name, device_name, strerror(errno)); + exit(1); + } /* * A subsequent swapon() will fail if the signature |