Not ready to be committed yet. Index: lib/libutil/Makefile =================================================================== RCS file: /cvs/src/lib/libutil/Makefile,v retrieving revision 1.4 diff -u -u -r1.4 Makefile --- lib/libutil/Makefile 5 Nov 2004 17:05:26 -0000 1.4 +++ lib/libutil/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: lib/libutil/libutil.h =================================================================== RCS file: /cvs/src/lib/libutil/libutil.h,v retrieving revision 1.5 diff -u -u -r1.5 libutil.h --- lib/libutil/libutil.h 5 Nov 2004 17:05:26 -0000 1.5 +++ lib/libutil/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: lib/libutil/opendisk.3 =================================================================== RCS file: lib/libutil/opendisk.3 diff -N lib/libutil/opendisk.3 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libutil/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: lib/libutil/opendisk.c =================================================================== RCS file: lib/libutil/opendisk.c diff -N lib/libutil/opendisk.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libutil/opendisk.c 7 Nov 2004 00:24:16 -0000 @@ -0,0 +1,87 @@ +/* $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 +#include +#include + +#include +#include +#include +#include +#include +#include + +int +opendisk(const char *path, int flags, char *buf, size_t buflen, int iscooked) +{ + 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); + + snprintf(buf, buflen, "%s%c", path, 'a' + RAW_PART); + f = open(buf, flags); + if (f != -1 || errno != ENOENT) + return (f); + + if (strchr(path, '/') != NULL) + return (-1); + + snprintf(buf, buflen, "%s%s%s", _PATH_DEV, iscooked ? "" : "r", path); + f = open(buf, flags); + if (f != -1 || errno != ENOENT) + return (f); + + snprintf(buf, buflen, "%s%s%s%c", _PATH_DEV, iscooked ? "" : "r", path, + 'a' + RAW_PART); + f = open(buf, flags); + return (f); +} Index: sys/sys/diskmbr.h =================================================================== RCS file: /cvs/src/sys/sys/diskmbr.h,v retrieving revision 1.2 diff -u -u -r1.2 diskmbr.h --- sys/sys/diskmbr.h 21 Apr 2004 02:32:41 -0000 1.2 +++ sys/sys/diskmbr.h 3 Nov 2004 18:57:59 -0000 @@ -48,12 +48,25 @@ #define DOSMAGICOFFSET 510 #define DOSMAGIC 0xAA55 -#define DOSPTYP_386BSD 0xa5 /* 386BSD partition type */ +/* values for dos_partition.dp->typ */ #define DOSPTYP_LINSWP 0x82 /* Linux swap partition */ #define DOSPTYP_LINUX 0x83 /* Linux partition */ +#define DOSPTYP_EXT_LNX 0x85 /* Linux extended partition */ +#define DOSPTYP_NTFSVOL 0x87 /* NTFS volume set or HPFS mirrored */ +#define DOSPTYP_FAT12 0x01 /* 12-bit FAT */ +#define DOSPTYP_FAT16S 0x04 /* 16-bit FAT, less than 32M */ +#define DOSPTYP_EXT 0x05 /* DOS extended partition */ +#define DOSPTYP_FAT16B 0x06 /* 16-bit FAT, more than 32M */ +#define DOSPTYP_FAT32 0x0b /* 32-bit FAT */ +#define DOSPTYP_FAT32L 0x0c /* 32-bit FAT, LBA-mapped */ +#define DOSPTYP_FAT16L 0x0e /* 16-bit FAT, LBA-mapped */ +#define DOSPTYP_EXTLBA 0x0f /* DOS extended partition, LBA-mapped */ +#define DOSPTYP_386BSD 0xa5 /* 386BSD partition type */ +#define DOSPTYP_OPENBSD 0xa6 /* OpenBSD partition type */ +#define DOSPTYP_APPLEUFS 0xa8 /* Apple UFS */ +#define DOSPTYP_NETBSD 0xa9 /* NetBSD partition type */ #define DOSPTYP_PMBR 0xee /* GPT Protective MBR */ -#define DOSPTYP_EXT 5 /* DOS extended partition */ -#define DOSPTYP_EXTLBA 15 /* DOS extended partition */ +#define DOSPTYP_EFI 0xef /* EFI system partition */ struct dos_partition { unsigned char dp_flag; /* bootstrap flags */ @@ -74,6 +87,10 @@ #define DPSECT(s) ((s) & 0x3f) /* isolate relevant bits of sector */ #define DPCYL(c, s) ((c) + (((s) & 0xc0)<<2)) /* and those that are cylinder */ +#define MBR_IS_EXTENDED(x) ((x) == DOSPTYP_EXT || \ + (x) == DOSPTYP_EXTLBA || \ + (x) == DOSPTYP_EXT_LNX) + #define DIOCSMBR _IOW('M', 129, u_char[512]) #endif /* !_SYS_DISKMBR_H_ */