Module Name:    src
Committed By:   pooka
Date:           Fri Feb  4 20:06:23 UTC 2011

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

Log Message:
Allow to specify -d hostpath offset,size with disklabel.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/usr.bin/rump_allserver/Makefile
cvs rdiff -u -r1.11 -r1.12 src/usr.bin/rump_allserver/rump_allserver.1
cvs rdiff -u -r1.15 -r1.16 src/usr.bin/rump_allserver/rump_allserver.c
cvs rdiff -u -r1.2 -r1.3 src/usr.bin/rump_server/Makefile

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/Makefile
diff -u src/usr.bin/rump_allserver/Makefile:1.3 src/usr.bin/rump_allserver/Makefile:1.4
--- src/usr.bin/rump_allserver/Makefile:1.3	Mon Dec 13 19:36:34 2010
+++ src/usr.bin/rump_allserver/Makefile	Fri Feb  4 20:06:23 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.3 2010/12/13 19:36:34 pooka Exp $
+#	$NetBSD: Makefile,v 1.4 2011/02/04 20:06:23 pooka Exp $
 #
 
 PROG=	rump_allserver
@@ -14,4 +14,7 @@
 LDADD+=	${RUMPDEVLDADD} ${RUMPFSLDADD} ${RUMPKERNLDADD} ${RUMPNETLDADD}
 LDADD+= -lrumpdev -lrumpvfs -lrumpnet -lrump -lrumpuser -lpthread
 
+DPADD+=	${LIBUTIL}
+LDADD+=	-lutil
+
 .include <bsd.prog.mk>

Index: src/usr.bin/rump_allserver/rump_allserver.1
diff -u src/usr.bin/rump_allserver/rump_allserver.1:1.11 src/usr.bin/rump_allserver/rump_allserver.1:1.12
--- src/usr.bin/rump_allserver/rump_allserver.1:1.11	Thu Feb  3 11:25:27 2011
+++ src/usr.bin/rump_allserver/rump_allserver.1	Fri Feb  4 20:06:23 2011
@@ -1,4 +1,4 @@
-.\"	$NetBSD: rump_allserver.1,v 1.11 2011/02/03 11:25:27 pooka Exp $
+.\"	$NetBSD: rump_allserver.1,v 1.12 2011/02/04 20:06:23 pooka Exp $
 .\"
 .\" Copyright (c) 2010 Antti Kantee.  All rights reserved.
 .\"
@@ -23,7 +23,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd February 3, 2011
+.Dd February 4, 2011
 .Dt RUMP_SERVER 1
 .Os
 .Sh NAME
@@ -90,9 +90,16 @@
 Similar to
 .Xr dd 1 ,
 this argument accepts a suffix as the multiplier for the number.
+.It OR
+.It Ar disklabel
+Use a disklabel partition identifier to specify the offset and size
+of the mapping.
+.Ar hostpath
+must contain an existing and valid disklabel within the first 64k.
 .El
 .Pp
-The following specifier is optional:
+The following specifier is optional and used only if disklabel is
+not specified:
 .Bl -tag -width hostpath1234
 .It Ar offset
 Offset of the mapping.

Index: src/usr.bin/rump_allserver/rump_allserver.c
diff -u src/usr.bin/rump_allserver/rump_allserver.c:1.15 src/usr.bin/rump_allserver/rump_allserver.c:1.16
--- src/usr.bin/rump_allserver/rump_allserver.c:1.15	Thu Feb  3 11:25:27 2011
+++ src/usr.bin/rump_allserver/rump_allserver.c	Fri Feb  4 20:06:23 2011
@@ -1,7 +1,7 @@
-/*	$NetBSD: rump_allserver.c,v 1.15 2011/02/03 11:25:27 pooka Exp $	*/
+/*	$NetBSD: rump_allserver.c,v 1.16 2011/02/04 20:06:23 pooka Exp $	*/
 
 /*-
- * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
+ * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -27,10 +27,11 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: rump_allserver.c,v 1.15 2011/02/03 11:25:27 pooka Exp $");
+__RCSID("$NetBSD: rump_allserver.c,v 1.16 2011/02/04 20:06:23 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
+#include <sys/disklabel.h>
 #include <sys/signal.h>
 #include <sys/module.h>
 
@@ -46,6 +47,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <util.h>
 
 static void
 usage(void)
@@ -83,6 +85,8 @@
 	"size",
 #define DOFFSET 3
 	"offset",
+#define DLABEL 4
+	"disklabel",
 	NULL
 };
 
@@ -91,6 +95,7 @@
 	const char *hostpath;
 	off_t flen;
 	off_t foffset;
+	char partition;
 	enum rump_etfs_type type;
 };
 
@@ -123,8 +128,10 @@
 			char *options, *value;
 			char *key, *hostpath;
 			long long flen, foffset;
+			char partition;
 
 			flen = foffset = 0;
+			partition = 0;
 			key = hostpath = NULL;
 			options = optarg;
 			while (*options) {
@@ -138,6 +145,7 @@
 					}
 					key = value;
 					break;
+
 				case DFILE:
 					if (hostpath != NULL) {
 						fprintf(stderr,
@@ -146,6 +154,7 @@
 					}
 					hostpath = value;
 					break;
+
 				case DSIZE:
 					if (flen != 0) {
 						fprintf(stderr,
@@ -166,6 +175,23 @@
 					foffset = strsuftoll("-d offset", value,
 					    0, LLONG_MAX);
 					break;
+
+				case DLABEL:
+					if (foffset != 0 || flen != 0) {
+						fprintf(stderr,
+						    "disklabel needs to be "
+						    "used alone\n");
+						usage();
+					}
+					if (strlen(value) != 1 ||
+					    *value < 'a' || *value > 'z') {
+						fprintf(stderr,
+						    "invalid label part\n");
+						usage();
+					}
+					partition = *value;
+					break;
+
 				default:
 					fprintf(stderr, "invalid dtoken\n");
 					usage();
@@ -173,7 +199,8 @@
 				}
 			}
 
-			if (key == NULL || hostpath == NULL || flen == 0) {
+			if (key == NULL || hostpath == NULL ||
+			    (flen == 0 && partition == 0)) {
 				fprintf(stderr, "incomplete drivespec\n");
 				usage();
 			}
@@ -189,6 +216,7 @@
 			etfs[curetfs].hostpath = hostpath;
 			etfs[curetfs].flen = flen;
 			etfs[curetfs].foffset = foffset;
+			etfs[curetfs].partition = partition;
 			etfs[curetfs].type = RUMP_ETFS_BLK;
 			curetfs++;
 
@@ -261,25 +289,46 @@
 
 	/* register host drives */
 	for (i = 0; i < curetfs; i++) {
+		char buf[1<<16];
+		struct disklabel dl;
 		struct stat sb;
-		off_t fsize;
+		off_t foffset, flen, fendoff;
 		int fd;
 
-		fsize = etfs[i].foffset + etfs[i].flen;
 		fd = open(etfs[i].hostpath, O_RDWR | O_CREAT, 0644);
 		if (fd == -1)
 			die(sflag, errno, "etfs hostpath create");
+
+		if (etfs[i].partition) {
+			int partition = etfs[i].partition - 'a';
+
+			pread(fd, buf, sizeof(buf), 0);
+			if (disklabel_scan(&dl, buf, sizeof(buf)))
+				die(sflag, ENOENT, "disklabel not found");
+
+			if (partition >= dl.d_npartitions)
+				die(sflag, ENOENT, "partition not available");
+
+			foffset = dl.d_partitions[partition].p_offset
+			    << DEV_BSHIFT;
+			flen = dl.d_partitions[partition].p_size
+			    << DEV_BSHIFT;
+		} else {
+			foffset = etfs[i].foffset;
+			flen = etfs[i].flen;
+		}
+		fendoff = foffset + flen;
+
 		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)
+		if (S_ISREG(sb.st_mode) && sb.st_size < fendoff) {
+			if (ftruncate(fd, fendoff) == -1)
 				die(sflag, errno, "truncate");
 		}
 		close(fd);
 
 		if ((error = rump_pub_etfs_register_withsize(etfs[i].key,
-		    etfs[i].hostpath, etfs[i].type,
-		    etfs[i].foffset, etfs[i].flen)) != 0)
+		    etfs[i].hostpath, etfs[i].type, foffset, flen)) != 0)
 			die(sflag, error, "etfs register");
 	}
 

Index: src/usr.bin/rump_server/Makefile
diff -u src/usr.bin/rump_server/Makefile:1.2 src/usr.bin/rump_server/Makefile:1.3
--- src/usr.bin/rump_server/Makefile:1.2	Mon Dec 13 19:39:37 2010
+++ src/usr.bin/rump_server/Makefile	Fri Feb  4 20:06:23 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.2 2010/12/13 19:39:37 pooka Exp $
+#	$NetBSD: Makefile,v 1.3 2011/02/04 20:06:23 pooka Exp $
 #
 
 .PATH: ${.CURDIR}/../rump_allserver
@@ -7,6 +7,6 @@
 SRCS=		rump_allserver.c
 NOMAN=		installed by ../rump_allserver
 
-LDADD+= -lrump -lrumpuser -lpthread
+LDADD+= -lrump -lrumpuser -lpthread -lutil
 
 .include <bsd.prog.mk>

Reply via email to