Browse Source

Add readlabelfs().

OPENBSD_2_1
downsj 28 years ago
parent
commit
30a5f11ec5
3 changed files with 124 additions and 8 deletions
  1. +2
    -2
      src/lib/libutil/Makefile
  2. +115
    -0
      src/lib/libutil/readlabel.c
  3. +7
    -6
      src/lib/libutil/util.h

+ 2
- 2
src/lib/libutil/Makefile View 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 $ # $NetBSD: Makefile,v 1.8 1996/05/16 07:03:28 thorpej Exp $
LIB= util LIB= util
@ -6,7 +6,7 @@ CFLAGS+=-DLIBC_SCCS
HDRS= util.h scsi.h HDRS= util.h scsi.h
SRCS= getmaxpartitions.c getrawpartition.c login.c login_tty.c logout.c \ 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 # XXX need login_fbtab.3
MAN= getmaxpartitions.3 getrawpartition.3 login.3 opendev.3 openpty.3 \ MAN= getmaxpartitions.3 getrawpartition.3 login.3 opendev.3 openpty.3 \


+ 115
- 0
src/lib/libutil/readlabel.c View File

@ -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]);
}

+ 7
- 6
src/lib/libutil/util.h View 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 $ */ /* $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_mkdb __P((void));
int pw_abort __P((void)); int pw_abort __P((void));
void pw_init __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_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 *, int openpty __P((int *, int *, char *, struct termios *,
struct winsize *)); struct winsize *));
pid_t forkpty __P((int *, char *, struct termios *, struct winsize *)); pid_t forkpty __P((int *, char *, struct termios *, struct winsize *));
int getmaxpartitions __P((void)); int getmaxpartitions __P((void));
int getrawpartition __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 __END_DECLS
#endif /* !_UTIL_H_ */ #endif /* !_UTIL_H_ */

Loading…
Cancel
Save