Index: Makefile
===================================================================
RCS file: /cvs/src/lib/libutil/Makefile,v
retrieving revision 1.4
diff -u -u -r1.4 Makefile
--- Makefile	5 Nov 2004 17:05:26 -0000	1.4
+++ Makefile	7 Nov 2004 00:19:07 -0000
@@ -11,14 +11,14 @@
 	login_cap.c login_class.c login_auth.c login_times.c login_ok.c \
 	login_crypt.c _secure_path.c uucplock.c property.c auth.c \
 	realhostname.c fparseln.c stub.c pidfile.c trimdomain.c \
-	humanize_number.c
+	humanize_number.c opendisk.c
 INCS=	libutil.h login_cap.h
 
 MAN+=	login.3 login_auth.3 login_tty.3 logout.3 logwtmp.3 pty.3 \
 	login_cap.3 login_class.3 login_times.3 login_ok.3 \
 	_secure_path.3 uucplock.3 property.3 auth.3 realhostname.3 \
 	realhostname_sa.3 trimdomain.3 fparseln.3 pidfile.3 \
-	humanize_number.3
+	humanize_number.3 opendisk.3
 MAN+=	login.conf.5 auth.conf.5
 MLINKS+= property.3 properties_read.3  property.3 properties_free.3
 MLINKS+= property.3 property_find.3
Index: libutil.h
===================================================================
RCS file: /cvs/src/lib/libutil/libutil.h,v
retrieving revision 1.5
diff -u -u -r1.5 libutil.h
--- libutil.h	5 Nov 2004 17:05:26 -0000	1.5
+++ libutil.h	7 Nov 2004 00:41:06 -0000
@@ -65,6 +65,7 @@
 int	uu_unlock (const char *_ttyname);
 int	uu_lock_txfr (const char *_ttyname, pid_t _pid);
 int	_secure_path (const char *_path, uid_t _uid, gid_t _gid);
+int	opendisk(const char *path, int flags, char *buf, size_t buflen, int iscooked);
 int	pidfile(const char *);
 properties properties_read (int fd);
 void	properties_free (properties list);
Index: opendisk.3
===================================================================
RCS file: opendisk.3
diff -N opendisk.3
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ opendisk.3	7 Nov 2004 00:22:37 -0000
@@ -0,0 +1,176 @@
+.\"	$NetBSD: opendisk.3,v 1.10 2003/04/16 13:35:15 wiz Exp $
+.\" $DragonFly$
+.\"
+.\" Copyright (c) 1997, 2001 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Luke Mewburn.
+.\"
+.\" 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.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"        This product includes software developed by the NetBSD
+.\"        Foundation, Inc. and its contributors.
+.\" 4. Neither the name of The NetBSD Foundation nor the names of its
+.\"    contributors may be used to endorse or promote products derived
+.\"    from this software without specific prior written permission.
+.\"
+.\" 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.
+.\"
+.Dd December 11, 2001
+.Dt OPENDISK 3
+.Os
+.Sh NAME
+.Nm opendisk
+.Nd open a disk partition
+.Sh LIBRARY
+.Lb libutil
+.Sh SYNOPSIS
+.In util.h
+.Ft int
+.Fo opendisk
+.Fa "const char *path"
+.Fa "int flags"
+.Fa "char *buf"
+.Fa "size_t buflen"
+.Fa "int iscooked"
+.Fc
+.Sh DESCRIPTION
+.Fn opendisk
+opens
+.Fa path ,
+for reading and/or writing as specified by the argument
+.Fa flags
+using
+.Xr open 2 ,
+and the file descriptor is returned to the caller.
+.Fa buf
+is used to store the resultant filename.
+.Fa buflen
+is the size, in bytes, of the array referenced by
+.Fa buf
+(usually
+.Dv MAXPATHLEN
+bytes).
+.Fa iscooked
+controls which paths in
+.Pa /dev
+are tried.
+.Pp
+.Fn opendisk
+attempts to open the following variations of
+.Fa path ,
+in order:
+.Bl -tag -width "/dev/rpathX"
+.It Pa path
+The pathname as given.
+.It Pa path Ns Em X
+.Fa path
+with a suffix of
+.Sq Em X ,
+where
+.Sq Em X
+represents the raw partition of the device, as determined by
+.Xr RAW_PART ,
+usually
+.Dq c .
+.El
+.Pp
+If
+.Fa path
+does not contain a
+slash
+.Pq Dq / ,
+the following variations are attempted:
+.Pp
+.Bl -dash -offset indent
+.It
+If
+.Fa iscooked
+is zero:
+.Pp
+.Bl -tag -width "/dev/rpathX"
+.It Pa /dev/rpath
+.Fa path
+with a prefix of
+.Dq Pa /dev/r .
+.It Pa /dev/rpath Ns Em X
+.Fa path
+with a prefix of
+.Dq Pa /dev/r
+and a suffix of
+.Sq Em X
+(q.v.).
+.El
+.It
+If
+.Fa iscooked
+is non-zero:
+.Bl -tag -width "/dev/rpathX"
+.It Pa /dev/path
+.Fa path
+with a prefix of
+.Dq Pa /dev/ .
+.It Pa /dev/path Ns Em X
+.Fa path
+with a prefix of
+.Dq Pa /dev/
+and a suffix of
+.Sq Em X
+(q.v.).
+.El
+.El
+.Sh RETURN VALUES
+An open file descriptor, or -1 if the
+.Xr open 2
+failed.
+.Sh ERRORS
+.Fn opendisk
+may set
+.Va errno
+to one of the following values:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+.Dv O_CREAT
+was set in
+.Fa flags . 
+.It Bq Er EFAULT
+.Fa buf
+was the
+.Dv NULL
+pointer.
+.El
+.Pp
+The
+.Fn opendisk
+function
+may also set
+.Va errno
+to any value specified by the
+.Xr open 2
+function.
+.Sh SEE ALSO
+.Xr open 2 ,
+.Sh HISTORY
+The
+.Fn opendisk
+function first appeared in
+.Nx 1.3 .
Index: opendisk.c
===================================================================
RCS file: opendisk.c
diff -N opendisk.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ opendisk.c	7 Nov 2004 17:48:54 -0000
@@ -0,0 +1,79 @@
+/*	$NetBSD: opendisk.c,v 1.9 2001/12/10 22:41:52 lukem Exp $	*/
+/* $DragonFly$ */
+/*
+ * Copyright (c) 1997 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Luke Mewburn.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * 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>
+#include <sys/disklabel.h>
+#include <sys/param.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <paths.h>
+#include <stdio.h>
+#include <string.h>
+
+int
+opendisk(const char *path, int flags, char *buf, size_t buflen)
+{
+	int f;
+
+	if (buf == NULL) {
+		errno = EFAULT;
+		return (-1);
+	}
+	snprintf(buf, buflen, "%s", path);
+
+	if ((flags & O_CREAT) != 0) {
+		errno = EINVAL;
+		return (-1);
+	}
+
+	f = open(buf, flags);
+	if (f != -1 || errno != ENOENT)
+		return (f);
+
+	if (strchr(path, '/') != NULL)
+		return (-1);
+
+	snprintf(buf, buflen, "%s%s", _PATH_DEV, path);
+	f = open(buf, flags);
+	if (f != -1 || errno != ENOENT)
+		return (f);
+
+	return (f);
+}
