Module Name:    src
Committed By:   pooka
Date:           Thu Feb 17 16:59:46 UTC 2011

Modified Files:
        src/usr.bin/rump_allserver: rump_allserver.1 rump_allserver.c

Log Message:
Use "size=e" as a way say "if the underlying file is preexisting
regular file, use whatever size it has".


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/usr.bin/rump_allserver/rump_allserver.1
cvs rdiff -u -r1.17 -r1.18 src/usr.bin/rump_allserver/rump_allserver.c

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

Modified files:

Index: src/usr.bin/rump_allserver/rump_allserver.1
diff -u src/usr.bin/rump_allserver/rump_allserver.1:1.13 src/usr.bin/rump_allserver/rump_allserver.1:1.14
--- src/usr.bin/rump_allserver/rump_allserver.1:1.13	Thu Feb 17 16:03:05 2011
+++ src/usr.bin/rump_allserver/rump_allserver.1	Thu Feb 17 16:59:46 2011
@@ -1,4 +1,4 @@
-.\"	$NetBSD: rump_allserver.1,v 1.13 2011/02/17 16:03:05 pooka Exp $
+.\"	$NetBSD: rump_allserver.1,v 1.14 2011/02/17 16:59:46 pooka Exp $
 .\"
 .\" Copyright (c) 2010 Antti Kantee.  All rights reserved.
 .\"
@@ -86,10 +86,17 @@
 If the file does not exist, it will be created.
 .It Ar size
 Size of the mapping.
-The host file will be truncated to the size indicated.
 Similar to
 .Xr dd 1 ,
 this argument accepts a suffix as the multiplier for the number.
+The special value
+.Dq e
+indicates that the current size of
+.Ar hostpath
+will be used.
+It is assumed that
+.Ar hostpath
+exists and is a regular file.
 .It OR
 .It Ar disklabel
 Use a disklabel partition identifier to specify the offset and size

Index: src/usr.bin/rump_allserver/rump_allserver.c
diff -u src/usr.bin/rump_allserver/rump_allserver.c:1.17 src/usr.bin/rump_allserver/rump_allserver.c:1.18
--- src/usr.bin/rump_allserver/rump_allserver.c:1.17	Thu Feb 17 16:03:05 2011
+++ src/usr.bin/rump_allserver/rump_allserver.c	Thu Feb 17 16:59:46 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump_allserver.c,v 1.17 2011/02/17 16:03:05 pooka Exp $	*/
+/*	$NetBSD: rump_allserver.c,v 1.18 2011/02/17 16:59:46 pooka Exp $	*/
 
 /*-
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: rump_allserver.c,v 1.17 2011/02/17 16:03:05 pooka Exp $");
+__RCSID("$NetBSD: rump_allserver.c,v 1.18 2011/02/17 16:59:46 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -82,6 +82,7 @@
 #define DFILE 1
 	"hostpath",
 #define DSIZE 2
+#define DSIZE_E -1
 	"size",
 #define DOFFSET 3
 	"offset",
@@ -174,9 +175,20 @@
 						    "size already given\n");
 						usage();
 					}
-					/* XXX: off_t max? */
-					flen = strsuftoll("-d size", value,
-					    0, LLONG_MAX);
+					if (strcmp(value, "e") == 0) {
+						if (foffset != 0) {
+							fprintf(stderr,
+							    "cannot specify "
+							    "offset with "
+							    "size=e\n");
+							usage();
+						}
+						flen = DSIZE_E;
+					} else {
+						/* XXX: off_t max? */
+						flen = strsuftoll("-d size",
+						    value, 0, LLONG_MAX);
+					}
 					break;
 				case DOFFSET:
 					if (foffset != 0) {
@@ -184,6 +196,12 @@
 						    "offset already given\n");
 						usage();
 					}
+					if (flen == DSIZE_E) {
+						fprintf(stderr, "cannot "
+						    "specify offset with "
+						    "size=e\n");
+						usage();
+					}
 					/* XXX: off_t max? */
 					foffset = strsuftoll("-d offset", value,
 					    0, LLONG_MAX);
@@ -330,11 +348,12 @@
 		struct disklabel dl;
 		struct stat sb;
 		off_t foffset, flen, fendoff;
-		int fd;
+		int fd, oflags;
 
-		fd = open(etfs[i].hostpath, O_RDWR | O_CREAT, 0644);
+		oflags = etfs[i].flen == DSIZE_E ? 0 : O_CREAT;
+		fd = open(etfs[i].hostpath, O_RDWR | oflags, 0644);
 		if (fd == -1)
-			die(sflag, errno, "etfs hostpath create");
+			die(sflag, errno, "etfs hostpath open");
 
 		if (etfs[i].partition) {
 			int partition = etfs[i].partition - 'a';
@@ -354,10 +373,15 @@
 			foffset = etfs[i].foffset;
 			flen = etfs[i].flen;
 		}
-		fendoff = foffset + flen;
 
 		if (fstat(fd, &sb) == -1)
 			die(sflag, errno, "fstat etfs hostpath");
+		if (flen == DSIZE_E) {
+			if (!S_ISREG(sb.st_mode))
+				die(sflag, EINVAL, "size=e requires reg file");
+			flen = sb.st_size;
+		}
+		fendoff = foffset + flen;
 		if (S_ISREG(sb.st_mode) && sb.st_size < fendoff) {
 			if (ftruncate(fd, fendoff) == -1)
 				die(sflag, errno, "truncate");

Reply via email to