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");