]> err.no Git - util-linux/commitdiff
mkswap: when writing the signature page, handle EINTR returns.
authorLaMont Jones <lamont@debian.org>
Wed, 9 Apr 2008 23:58:18 +0000 (17:58 -0600)
committerLaMont Jones <lamont@debian.org>
Fri, 11 Apr 2008 15:04:22 +0000 (09:04 -0600)
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>
disk-utils/mkswap.c

index 4b1becafbdace898d908ec264018f18af819f5b9..dbbfa389fe021afe513b322281123ef4f6ac439a 100644 (file)
@@ -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"));
 
        /*