From 5a913db9576f87ae9780d22de7d7f614e7f53dda Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Wed, 9 Apr 2008 17:58:18 -0600 Subject: [PATCH] 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 --- disk-utils/mkswap.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index 4b1becaf..dbbfa389 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -488,6 +488,24 @@ check_mount(void) { return 1; } +static ssize_t +write_all(int fd, const void *buf, size_t count) { + const unsigned char *b = buf; + ssize_t ret = 0; + ssize_t tmp; + do { + tmp = write(fd, b + ret, count - ret); + if (tmp > 0) { + ret += tmp, b += tmp, count -= tmp; + } else if (tmp == 0) { + break; /* hit end of file... */ + } else if (errno != EINTR && errno != EAGAIN) { + return -1; + } + } while (ret < count && ret != -1); + return ret; +} + int main(int argc, char ** argv) { struct stat statbuf; @@ -730,8 +748,11 @@ 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) + i=write_all(DEV,(char*)signature_page+offset, pagesize-offset); + if (i < 0) + fprintf(stderr, _("error writing swap signature: %s"), + strerror(errno)); + if (i != pagesize-offset) die(_("unable to write signature page")); /* -- 2.39.5