Module Name: src
Committed By: pooka
Date: Thu Feb 3 11:21:16 UTC 2011
Modified Files:
src/usr.bin/rump_allserver: rump_allserver.1 rump_allserver.c
Log Message:
* make it possible to specify an offset in -d
* truncate -d hostpath only if it's a regular file and smaller
than offset+size
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/rump_allserver/rump_allserver.1
cvs rdiff -u -r1.13 -r1.14 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.8 src/usr.bin/rump_allserver/rump_allserver.1:1.9
--- src/usr.bin/rump_allserver/rump_allserver.1:1.8 Sat Jan 8 09:36:26 2011
+++ src/usr.bin/rump_allserver/rump_allserver.1 Thu Feb 3 11:21:16 2011
@@ -1,4 +1,4 @@
-.\" $NetBSD: rump_allserver.1,v 1.8 2011/01/08 09:36:26 pooka Exp $
+.\" $NetBSD: rump_allserver.1,v 1.9 2011/02/03 11:21:16 pooka Exp $
.\"
.\" Copyright (c) 2010 Antti Kantee. All rights reserved.
.\"
@@ -91,6 +91,25 @@
.Xr dd 1 ,
this argument accepts a suffix as the multiplier for the number.
.El
+.Pp
+The following specifier is optional:
+.Bl -tag -width hostpath1234
+.It Ar offset
+Offset of the mapping.
+The window into
+.Ar hostpath
+therefore is
+.Fa [ offset , offset+size ] .
+In case this parameter is not given, the default value 0 is used.
+.El
+.Pp
+In case
+.Ar hostpath
+does not exist, it will be created as a regular file.
+In case
+.Ar hostpath
+is a regular file and is not large enough to accommodate the
+specified size, it will be extended to the specified size.
.It Fl l Ar library
Call
.Fn dlopen
Index: src/usr.bin/rump_allserver/rump_allserver.c
diff -u src/usr.bin/rump_allserver/rump_allserver.c:1.13 src/usr.bin/rump_allserver/rump_allserver.c:1.14
--- src/usr.bin/rump_allserver/rump_allserver.c:1.13 Mon Jan 3 12:18:25 2011
+++ src/usr.bin/rump_allserver/rump_allserver.c Thu Feb 3 11:21:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_allserver.c,v 1.13 2011/01/03 12:18:25 wiz Exp $ */
+/* $NetBSD: rump_allserver.c,v 1.14 2011/02/03 11:21:16 pooka Exp $ */
/*-
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: rump_allserver.c,v 1.13 2011/01/03 12:18:25 wiz Exp $");
+__RCSID("$NetBSD: rump_allserver.c,v 1.14 2011/02/03 11:21:16 pooka Exp $");
#endif /* !lint */
#include <sys/types.h>
@@ -81,6 +81,8 @@
"hostpath",
#define DSIZE 2
"size",
+#define DOFFSET 3
+ "offset",
NULL
};
@@ -88,6 +90,7 @@
const char *key;
const char *hostpath;
off_t flen;
+ off_t foffset;
enum rump_etfs_type type;
};
@@ -119,9 +122,9 @@
case 'd': {
char *options, *value;
char *key, *hostpath;
- long long flen;
+ long long flen, foffset;
- flen = 0;
+ flen = foffset = 0;
key = hostpath = NULL;
options = optarg;
while (*options) {
@@ -153,6 +156,16 @@
flen = strsuftoll("-d size", value,
0, LLONG_MAX);
break;
+ case DOFFSET:
+ if (foffset != 0) {
+ fprintf(stderr,
+ "offset already given\n");
+ usage();
+ }
+ /* XXX: off_t max? */
+ foffset = strsuftoll("-d offset", value,
+ 0, LLONG_MAX);
+ break;
default:
fprintf(stderr, "invalid dtoken\n");
usage();
@@ -175,6 +188,7 @@
etfs[curetfs].key = key;
etfs[curetfs].hostpath = hostpath;
etfs[curetfs].flen = flen;
+ etfs[curetfs].foffset = foffset;
etfs[curetfs].type = RUMP_ETFS_BLK;
curetfs++;
@@ -247,17 +261,25 @@
/* register host drives */
for (i = 0; i < curetfs; i++) {
+ struct stat sb;
+ off_t fsize;
int fd;
+ fsize = etfs[i].foffset + etfs[i].flen;
fd = open(etfs[i].hostpath, O_RDWR | O_CREAT, 0755);
if (fd == -1)
- die(sflag, error, "etfs hostpath create");
- if (ftruncate(fd, etfs[i].flen) == -1)
- die(sflag, error, "truncate");
+ die(sflag, errno, "etfs hostpath create");
+ if (fstat(fd, &sb) == -1)
+ die(sflag, errno, "fstat etfs hostpath");
+ if (S_ISREG(sb.st_mode) && sb.st_size < fsize) {
+ if (ftruncate(fd, fsize) == -1)
+ die(sflag, errno, "truncate");
+ }
close(fd);
- if ((error = rump_pub_etfs_register(etfs[i].key,
- etfs[i].hostpath, etfs[i].type)) != 0)
+ if ((error = rump_pub_etfs_register_withsize(etfs[i].key,
+ etfs[i].hostpath, etfs[i].type,
+ etfs[i].foffset, etfs[i].flen)) != 0)
die(sflag, error, "etfs register");
}