diff --git a/src/lib/libutil/Makefile b/src/lib/libutil/Makefile index f053d075..34811926 100644 --- a/src/lib/libutil/Makefile +++ b/src/lib/libutil/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.8 1996/07/31 17:46:51 deraadt Exp $ +# $OpenBSD: Makefile,v 1.9 1996/12/03 01:05:35 downsj Exp $ # $NetBSD: Makefile,v 1.8 1996/05/16 07:03:28 thorpej Exp $ LIB= util @@ -6,7 +6,7 @@ CFLAGS+=-DLIBC_SCCS HDRS= util.h scsi.h SRCS= getmaxpartitions.c getrawpartition.c login.c login_tty.c logout.c \ - logwtmp.c opendev.c passwd.c pty.c scsi.c login_fbtab.c + logwtmp.c opendev.c passwd.c pty.c readlabel.c scsi.c login_fbtab.c # XXX need login_fbtab.3 MAN= getmaxpartitions.3 getrawpartition.3 login.3 opendev.3 openpty.3 \ diff --git a/src/lib/libutil/readlabel.c b/src/lib/libutil/readlabel.c new file mode 100644 index 00000000..f78ce580 --- /dev/null +++ b/src/lib/libutil/readlabel.c @@ -0,0 +1,115 @@ +/* $OpenBSD: readlabel.c,v 1.1 1996/12/03 01:05:35 downsj Exp $ */ + +/* + * Copyright (c) 1996, Jason Downs. 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 AUTHOR(S) ``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 AUTHOR(S) 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 +#define DKTYPENAMES +#include +#include +#include + +/* + * Try to get a disklabel for the specified device, and return mount_xxx + * style filesystem type name for the specified partition. + */ + +char *readlabelfs(device) + char *device; +{ + char rpath[MAXPATHLEN]; + char part; + struct stat sbuf; + struct disklabel dk; + int fd; + + /* Assuming device is of the form /dev/??p, build a raw partition. */ + if (stat(device, &sbuf) < 0) { + warn("%s", device); + return(NULL); + } + switch(sbuf.st_mode & S_IFMT) { + case S_IFCHR: + /* Ok... already a raw device. Hmm. */ + strncpy(rpath, device, sizeof(rpath)); + rpath[sizeof(rpath) - 1] = '\0'; + + /* Change partition name. */ + part = rpath[strlen(rpath) - 1]; + rpath[strlen(rpath) - 1] = 'a' + getrawpartition(); + break; + case S_IFBLK: + if (strlen(device) > strlen(_PATH_DEV)) { + snprintf(rpath, sizeof(rpath), "%sr%s", _PATH_DEV, + &device[strlen(_PATH_DEV)]); + + /* Change partition name. */ + part = rpath[strlen(rpath) - 1]; + rpath[strlen(rpath) - 1] = 'a' + getrawpartition(); + break; + } + default: + warnx("%s: not a device node", device); + return(NULL); + } + + /* If rpath doesn't exist, change that partition back. */ + fd = open(rpath, O_RDONLY); + if (fd < 0) { + if (errno == ENOENT) { + rpath[strlen(rpath) - 1] = part; + + fd = open(rpath, O_RDONLY); + if (fd < 0) { + warn("%s", rpath); + return(NULL); + } + } else { + warn("%s", rpath); + return(NULL); + } + } + if (ioctl(fd, DIOCGDINFO, &dk) < 0) { + warn("%s: couldn't read disklabel", rpath); + close(fd); + return(NULL); + } + close(fd); + + if (dk.d_partitions[part - 'a'].p_fstype > FSMAXTYPES) { + warnx("%s: bad filesystem type in label", rpath); + return(NULL); + } + + return(fstypesnames[dk.d_partitions[part - 'a'].p_fstype]); +} diff --git a/src/lib/libutil/util.h b/src/lib/libutil/util.h index f4d63703..6206c8a1 100644 --- a/src/lib/libutil/util.h +++ b/src/lib/libutil/util.h @@ -1,4 +1,4 @@ -/* $OpenBSD: util.h,v 1.2 1996/07/31 17:44:22 deraadt Exp $ */ +/* $OpenBSD: util.h,v 1.3 1996/12/03 01:05:36 downsj Exp $ */ /* $NetBSD: util.h,v 1.2 1996/05/16 07:00:22 thorpej Exp $ */ /*- @@ -61,17 +61,18 @@ int pw_lock __P((int retries)); int pw_mkdb __P((void)); int pw_abort __P((void)); void pw_init __P((void)); -void pw_edit __P((int notsetuid, const char *filename)); +void pw_edit __P((int, const char *)); void pw_prompt __P((void)); -void pw_copy __P((int ffd, int tfd, struct passwd *pw)); -int pw_scan __P((char *bp, struct passwd *pw, int *flags)); -void pw_error __P((const char *name, int err, int eval)); +void pw_copy __P((int, int, struct passwd *)); +int pw_scan __P((char *, struct passwd *, int *)); +void pw_error __P((const char *, int, int)); int openpty __P((int *, int *, char *, struct termios *, struct winsize *)); pid_t forkpty __P((int *, char *, struct termios *, struct winsize *)); int getmaxpartitions __P((void)); int getrawpartition __P((void)); -void login_fbtab __P((char *tty, uid_t uid, gid_t gid)); +void login_fbtab __P((char *, uid_t, gid_t)); +char *readlabelfs __P((char *)); __END_DECLS #endif /* !_UTIL_H_ */