Add readlabelfs().
authordownsj <downsj@openbsd.org>
Tue, 3 Dec 1996 01:05:35 +0000 (01:05 +0000)
committerdownsj <downsj@openbsd.org>
Tue, 3 Dec 1996 01:05:35 +0000 (01:05 +0000)
lib/libutil/Makefile
lib/libutil/readlabel.c [new file with mode: 0644]
lib/libutil/util.h

index f053d07..3481192 100644 (file)
@@ -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/lib/libutil/readlabel.c b/lib/libutil/readlabel.c
new file mode 100644 (file)
index 0000000..f78ce58
--- /dev/null
@@ -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 <sys/types.h>
+#include <stdio.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <paths.h>
+#include <string.h>
+#include <util.h>
+#include <sys/dkio.h>
+#define DKTYPENAMES
+#include <sys/disklabel.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+
+/*
+ * 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]);
+}
index f4d6370..6206c8a 100644 (file)
@@ -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_ */