From: Karel Zak Date: Mon, 14 Apr 2008 22:35:05 +0000 (+0200) Subject: mkswap: when writing the signature page, handle EINTR returns X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=37e8f037e3a4135039893961f7fea393d5ddea6c;p=util-linux 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 Signed-off-by: Karel Zak --- diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index 4b1becaf..c1907fbd 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -488,6 +488,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; @@ -730,9 +746,12 @@ 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