Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/gpt Factor out the getdisksize() drvctl method, and pro...



details:   https://anonhg.NetBSD.org/src/rev/6ebaf50b9070
branches:  trunk
changeset: 335186:6ebaf50b9070
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Dec 29 16:27:06 2014 +0000

description:
Factor out the getdisksize() drvctl method, and provide an alternative that
directly uses the disk ioctl's instead of relying on the drvctl device driver
which is currently not mandatory.

diffstat:

 sbin/gpt/Makefile |   12 ++++-
 sbin/gpt/drvctl.c |  134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 sbin/gpt/gpt.c    |  102 +---------------------------------------
 sbin/gpt/gpt.h    |   10 ++++
 4 files changed, 158 insertions(+), 100 deletions(-)

diffs (truncated from 315 to 300 lines):

diff -r b824cf397154 -r 6ebaf50b9070 sbin/gpt/Makefile
--- a/sbin/gpt/Makefile Mon Dec 29 15:31:44 2014 +0000
+++ b/sbin/gpt/Makefile Mon Dec 29 16:27:06 2014 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.12 2014/09/30 17:59:59 christos Exp $
+# $NetBSD: Makefile,v 1.13 2014/12/29 16:27:06 christos Exp $
 # $FreeBSD: src/sbin/gpt/Makefile,v 1.7 2005/09/01 02:49:20 marcel Exp $
 
 PROG=  gpt
@@ -11,6 +11,16 @@
 SRCS+= backup.c restore.c
 LDADD+=        -lprop -lutil
 DPADD+= ${LIBPROP} ${LIBUTIL}
+
+.if ${USE_DRVCTL:Uno} == "yes"
+CPPFLAGS+=-DUSE_DRVCTL
+SRCS+=drvctl.c
+.else
+.PATH: ${.CURDIR}/../fsck
+CPPFLAGS+=-I${.CURDIR}/../fsck
+SRCS+=partutil.c
+.endif
 .endif
 
+
 .include <bsd.prog.mk>
diff -r b824cf397154 -r 6ebaf50b9070 sbin/gpt/drvctl.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/gpt/drvctl.c Mon Dec 29 16:27:06 2014 +0000
@@ -0,0 +1,134 @@
+/*     $NetBSD: drvctl.c,v 1.1 2014/12/29 16:27:06 christos Exp $      */
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: drvctl.c,v 1.1 2014/12/29 16:27:06 christos Exp $");
+
+#include <sys/types.h>
+#include <sys/disk.h>
+#include <sys/drvctlio.h>
+
+#include <prop/proplib.h>
+
+#include <errno.h>
+#include <err.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ctype.h>
+
+#include "map.h"
+#include "gpt.h"
+
+int
+getdisksize(const char *name, u_int *sector_size, off_t *media_size)
+{
+       prop_dictionary_t command_dict, args_dict, results_dict, data_dict,
+           disk_info, geometry;
+       prop_string_t string;
+       prop_number_t number;
+       int dfd, res;
+       char *dname, *p;
+
+       if (*sector_size && *media_size)
+               return 0;
+
+       if ((dfd = open("/dev/drvctl", O_RDONLY)) == -1) {
+               warn("%s: /dev/drvctl", __func__);
+               return -1;
+       }
+
+       command_dict = prop_dictionary_create();
+       args_dict = prop_dictionary_create();
+
+       string = prop_string_create_cstring_nocopy("get-properties");
+       prop_dictionary_set(command_dict, "drvctl-command", string);
+       prop_object_release(string);
+
+       if ((dname = strdup(name[0] == 'r' ? name + 1 : name)) == NULL) {
+               (void)close(dfd);
+               return -1;
+       }
+       for (p = dname; *p; p++)
+               continue;
+       for (--p; p >= dname && !isdigit((unsigned char)*p); *p-- = '\0')
+               continue;
+
+       string = prop_string_create_cstring(dname);
+       free(dname);
+       prop_dictionary_set(args_dict, "device-name", string);
+       prop_object_release(string);
+
+       prop_dictionary_set(command_dict, "drvctl-arguments", args_dict);
+       prop_object_release(args_dict);
+
+       res = prop_dictionary_sendrecv_ioctl(command_dict, dfd, DRVCTLCOMMAND,
+           &results_dict);
+       (void)close(dfd);
+       prop_object_release(command_dict);
+       if (res) {
+               warn("%s: prop_dictionary_sendrecv_ioctl", __func__);
+               errno = res;
+               return -1;
+       }
+
+       number = prop_dictionary_get(results_dict, "drvctl-error");
+       if ((errno = prop_number_integer_value(number)) != 0)
+               return -1;
+
+       data_dict = prop_dictionary_get(results_dict, "drvctl-result-data");
+       if (data_dict == NULL)
+               goto out;
+
+       disk_info = prop_dictionary_get(data_dict, "disk-info");
+       if (disk_info == NULL)
+               goto out;
+
+       geometry = prop_dictionary_get(disk_info, "geometry");
+       if (geometry == NULL)
+               goto out;
+
+       number = prop_dictionary_get(geometry, "sector-size");
+       if (number == NULL)
+               goto out;
+
+       if (*sector_size == 0)
+               *sector_size = prop_number_integer_value(number);
+
+       number = prop_dictionary_get(geometry, "sectors-per-unit");
+       if (number == NULL)
+               goto out;
+
+       if (*media_size == 0)
+               *media_size = prop_number_integer_value(number) * *sector_size;
+
+       return 0;
+out:
+       errno = EINVAL;
+       return -1;
+}
diff -r b824cf397154 -r 6ebaf50b9070 sbin/gpt/gpt.c
--- a/sbin/gpt/gpt.c    Mon Dec 29 15:31:44 2014 +0000
+++ b/sbin/gpt/gpt.c    Mon Dec 29 16:27:06 2014 +0000
@@ -35,7 +35,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/gpt.c,v 1.16 2006/07/07 02:44:23 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: gpt.c,v 1.39 2014/11/17 07:15:28 mlelstv Exp $");
+__RCSID("$NetBSD: gpt.c,v 1.40 2014/12/29 16:27:06 christos Exp $");
 #endif
 
 #include <sys/param.h>
@@ -54,11 +54,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <ctype.h>
-#ifndef HAVE_NBTOOL_CONFIG_H
-#include <prop/proplib.h>
-#include <sys/drvctlio.h>
-#include <sys/disk.h>
-#endif
 
 #include "map.h"
 #include "gpt.h"
@@ -364,96 +359,6 @@
        return (0);
 }
 
-#ifndef HAVE_NBTOOL_CONFIG_H
-static int
-drvctl(const char *name, u_int *sector_size, off_t *media_size)
-{
-       prop_dictionary_t command_dict, args_dict, results_dict, data_dict,
-           disk_info, geometry;
-       prop_string_t string;
-       prop_number_t number;
-       int dfd, res;
-       char *dname, *p;
-
-       if (*sector_size && *media_size)
-               return 0;
-
-       if ((dfd = open("/dev/drvctl", O_RDONLY)) == -1) {
-               warn("%s: /dev/drvctl", __func__);
-               return -1;
-       }
-
-       command_dict = prop_dictionary_create();
-       args_dict = prop_dictionary_create();
-
-       string = prop_string_create_cstring_nocopy("get-properties");
-       prop_dictionary_set(command_dict, "drvctl-command", string);
-       prop_object_release(string);
-
-       if ((dname = strdup(name[0] == 'r' ? name + 1 : name)) == NULL) {
-               (void)close(dfd);
-               return -1;
-       }
-       for (p = dname; *p; p++)
-               continue;
-       for (--p; p >= dname && !isdigit((unsigned char)*p); *p-- = '\0')
-               continue;
-
-       string = prop_string_create_cstring(dname);
-       free(dname);
-       prop_dictionary_set(args_dict, "device-name", string);
-       prop_object_release(string);
-
-       prop_dictionary_set(command_dict, "drvctl-arguments", args_dict);
-       prop_object_release(args_dict);
-
-       res = prop_dictionary_sendrecv_ioctl(command_dict, dfd, DRVCTLCOMMAND,
-           &results_dict);
-       (void)close(dfd);
-       prop_object_release(command_dict);
-       if (res) {
-               warn("%s: prop_dictionary_sendrecv_ioctl", __func__);
-               errno = res;
-               return -1;
-       }
-
-       number = prop_dictionary_get(results_dict, "drvctl-error");
-       if ((errno = prop_number_integer_value(number)) != 0)
-               return -1;
-
-       data_dict = prop_dictionary_get(results_dict, "drvctl-result-data");
-       if (data_dict == NULL)
-               goto out;
-
-       disk_info = prop_dictionary_get(data_dict, "disk-info");
-       if (disk_info == NULL)
-               goto out;
-
-       geometry = prop_dictionary_get(disk_info, "geometry");
-       if (geometry == NULL)
-               goto out;
-
-       number = prop_dictionary_get(geometry, "sector-size");
-       if (number == NULL)
-               goto out;
-
-       if (*sector_size == 0)
-               *sector_size = prop_number_integer_value(number);
-
-       number = prop_dictionary_get(geometry, "sectors-per-unit");
-       if (number == NULL)
-               goto out;
-
-       if (*media_size == 0)
-               *media_size = prop_number_integer_value(number) * *sector_size;
-
-       return 0;
-out:
-       errno = EINVAL;
-       return -1;
-}
-#endif
-
 int
 gpt_gpt(int fd, off_t lba, int found)
 {
@@ -580,9 +485,8 @@
                if ((secsz == 0 && ioctl(fd, DIOCGSECTORSIZE, &secsz) == -1) ||
                    (mediasz == 0 && ioctl(fd, DIOCGMEDIASIZE, &mediasz) == -1))
                        goto close;
-#endif
-#ifndef HAVE_NBTOOL_CONFIG_H
-               if (drvctl(device_name, &secsz, &mediasz) == -1)
+#else
+               if (getdisksize(device_name, &secsz, &mediasz) == -1)
                        goto close;
 #endif
                if (secsz == 0 || mediasz == 0)
diff -r b824cf397154 -r 6ebaf50b9070 sbin/gpt/gpt.h
--- a/sbin/gpt/gpt.h    Mon Dec 29 15:31:44 2014 +0000
+++ b/sbin/gpt/gpt.h    Mon Dec 29 16:27:06 2014 +0000



Home | Main Index | Thread Index | Old Index