Module Name:    src
Committed By:   yamt
Date:           Wed Dec 29 22:56:59 UTC 2010

Modified Files:
        src/tests/fs/common: fstest_puffs.c

Log Message:
don't assume atomic read/write on socketpair.  puffs_kargs at least is
too large to assume atomic read/write.  this makes some tests including
fs/puffs/t_basic pass on my environment.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/tests/fs/common/fstest_puffs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/fs/common/fstest_puffs.c
diff -u src/tests/fs/common/fstest_puffs.c:1.6 src/tests/fs/common/fstest_puffs.c:1.7
--- src/tests/fs/common/fstest_puffs.c:1.6	Mon Nov  1 16:27:07 2010
+++ src/tests/fs/common/fstest_puffs.c	Wed Dec 29 22:56:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: fstest_puffs.c,v 1.6 2010/11/01 16:27:07 pooka Exp $	*/
+/*	$NetBSD: fstest_puffs.c,v 1.7 2010/12/29 22:56:59 yamt Exp $	*/
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -55,6 +55,44 @@
 
 static bool mayquit = false;
 
+static ssize_t
+xread(int fd, void *vp, size_t n)
+{
+	size_t left;
+
+	left = n;
+	do {
+		ssize_t ssz;
+
+		ssz = read(fd, vp, left);
+		if (ssz == -1) {
+			return ssz;
+		}
+		left -= ssz;
+		vp = (char *)vp + ssz;
+	} while (left > 0);
+	return n;
+}
+
+static ssize_t
+xwrite(int fd, const void *vp, size_t n)
+{
+	size_t left;
+
+	left = n;
+	do {
+		ssize_t ssz;
+
+		ssz = write(fd, vp, left);
+		if (ssz == -1) {
+			return ssz;
+		}
+		left -= ssz;
+		vp = (const char *)vp + ssz;
+	} while (left > 0);
+	return n;
+}
+
 /*
  * Threads which shovel data between comfd and /dev/puffs.
  * (cannot use polling since fd's are in different namespaces)
@@ -102,7 +140,7 @@
 		}
 
 		n = phdr->pth_framelen;
-		if (write(comfd, buf, n) != n) {
+		if (xwrite(comfd, buf, n) != n) {
 			fprintf(stderr, "readshovel write %zd / %d\n", n, errno);
 			break;
 		}
@@ -143,7 +181,7 @@
 		toread = sizeof(struct putter_hdr);
 		assert(toread < BUFSIZE);
 		do {
-			n = read(comfd, buf+off, toread);
+			n = xread(comfd, buf+off, toread);
 			if (n <= 0) {
 				fprintf(stderr, "writeshovel read %zd / %d\n",
 				    n, errno);
@@ -269,30 +307,30 @@
 	}
 
 	/* read args */
-	if ((n = read(sv[1], &len, sizeof(len))) != sizeof(len))
+	if ((n = xread(sv[1], &len, sizeof(len))) != sizeof(len))
 		err(1, "mp 1 %zd", n);
 	if (len > MAXPATHLEN)
 		err(1, "mntpath > MAXPATHLEN");
-	if ((size_t)read(sv[1], args->pta_dir, len) != len)
+	if ((size_t)xread(sv[1], args->pta_dir, len) != len)
 		err(1, "mp 2");
-	if (read(sv[1], &len, sizeof(len)) != sizeof(len))
+	if (xread(sv[1], &len, sizeof(len)) != sizeof(len))
 		err(1, "fn 1");
 	if (len > MAXPATHLEN)
 		err(1, "devpath > MAXPATHLEN");
-	if ((size_t)read(sv[1], args->pta_dev, len) != len)
+	if ((size_t)xread(sv[1], args->pta_dev, len) != len)
 		err(1, "fn 2");
-	if (read(sv[1], &mntflags, sizeof(mntflags)) != sizeof(mntflags))
+	if (xread(sv[1], &mntflags, sizeof(mntflags)) != sizeof(mntflags))
 		err(1, "mntflags");
-	if (read(sv[1], &args->pta_pargslen, sizeof(args->pta_pargslen))
+	if (xread(sv[1], &args->pta_pargslen, sizeof(args->pta_pargslen))
 	    != sizeof(args->pta_pargslen))
 		err(1, "puffstest_args len");
 	args->pta_pargs = malloc(args->pta_pargslen);
 	if (args->pta_pargs == NULL)
 		err(1, "malloc");
-	if (read(sv[1], args->pta_pargs, args->pta_pargslen)
+	if (xread(sv[1], args->pta_pargs, args->pta_pargslen)
 	    != (ssize_t)args->pta_pargslen)
 		err(1, "puffstest_args");
-	if (read(sv[1], pflags, sizeof(*pflags)) != sizeof(*pflags))
+	if (xread(sv[1], pflags, sizeof(*pflags)) != sizeof(*pflags))
 		err(1, "pflags");
 
 	args->pta_childpid = childpid;

Reply via email to