Module Name:    src
Committed By:   pooka
Date:           Sun Feb  6 21:05:53 UTC 2011

Modified Files:
        src/lib/librumpuser: rumpuser.c

Log Message:
Support query of the partition size in case underlying device is
a wedge.  This still lacks the proplibistic query of the sector
size and just assumes 512.  It's good that we make asking a file's
size as simple as requiring one stat(), one open() and three (3)
different ioctls plus some proplist mumbojumbo.  I'm surprised it's
available at all by means other than #wish.

code mostly from Taylor R Campbell, rant from me.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/lib/librumpuser/rumpuser.c

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

Modified files:

Index: src/lib/librumpuser/rumpuser.c
diff -u src/lib/librumpuser/rumpuser.c:1.14 src/lib/librumpuser/rumpuser.c:1.15
--- src/lib/librumpuser/rumpuser.c:1.14	Sat Jan 22 14:22:10 2011
+++ src/lib/librumpuser/rumpuser.c	Sun Feb  6 21:05:53 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.c,v 1.14 2011/01/22 14:22:10 pooka Exp $	*/
+/*	$NetBSD: rumpuser.c,v 1.15 2011/02/06 21:05:53 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser.c,v 1.14 2011/01/22 14:22:10 pooka Exp $");
+__RCSID("$NetBSD: rumpuser.c,v 1.15 2011/02/06 21:05:53 pooka Exp $");
 #endif /* !lint */
 
 /* thank the maker for this */
@@ -45,7 +45,9 @@
 #include <sys/uio.h>
 
 #ifdef __NetBSD__
+#include <sys/disk.h>
 #include <sys/disklabel.h>
+#include <sys/dkio.h>
 #include <sys/sysctl.h>
 #endif
 
@@ -147,6 +149,7 @@
 #else
 		struct disklabel lab;
 		struct partition *parta;
+		struct dkwedge_info dkw;
 
 		fd = open(path, O_RDONLY);
 		if (fd == -1) {
@@ -155,14 +158,26 @@
 			goto out;
 		}
 
-		if (ioctl(fd, DIOCGDINFO, &lab) == -1) {
-			seterror(errno);
-			rv = -1;
+		if (ioctl(fd, DIOCGDINFO, &lab) == 0) {
+			parta = &lab.d_partitions[DISKPART(sb.st_rdev)];
+			size = (uint64_t)lab.d_secsize * parta->p_size;
 			goto out;
 		}
 
-		parta = &lab.d_partitions[DISKPART(sb.st_rdev)];
-		size = (uint64_t)lab.d_secsize * parta->p_size;
+		if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == 0) {
+			/*
+			 * XXX: should use DIOCGDISKINFO to query
+			 * sector size, but that requires proplib,
+			 * so just don't bother for now.  it's nice
+			 * that something as difficult as figuring out
+			 * a partition's size has been made so easy.
+			 */
+			size = dkw.dkw_size << DEV_BSHIFT;
+			goto out;
+		}
+
+		seterror(errno);
+		rv = -1;
 #endif /* __NetBSD__ */
 	}
 

Reply via email to