diff --git a/sbin/fsck/partutil.c b/sbin/fsck/partutil.c new file mode 100644 index 000000000000..e82056116ff0 --- /dev/null +++ b/sbin/fsck/partutil.c @@ -0,0 +1,182 @@ +/* $NetBSD: partutil.c,v 1.1 2006/08/26 21:54:05 christos Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * 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 +__RCSID("$NetBSD: partutil.c,v 1.1 2006/08/26 21:54:05 christos Exp $"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "partutil.h" + +static void +label2geom(struct disk_geom *geo, const struct disklabel *lp) +{ + geo->dg_secperunit = lp->d_secperunit; + geo->dg_secsize = lp->d_secsize; + geo->dg_nsectors = lp->d_nsectors; + geo->dg_ntracks = lp->d_ntracks; + geo->dg_ncylinders = lp->d_ncylinders; + geo->dg_secpercyl = lp->d_secpercyl; + geo->dg_pcylinders = lp->d_ncylinders; + geo->dg_sparespertrack = lp->d_sparespertrack; + geo->dg_sparespercyl = lp->d_sparespercyl; + geo->dg_acylinders = lp->d_acylinders; +} + +static void +part2wedge(struct dkwedge_info *dkw, const struct disklabel *lp, const char *s) +{ + struct stat sb; + struct partition *pp; + int ptn; + + (void)memset(dkw, 0, sizeof(*dkw)); + if (stat(s, &sb) == -1) + return; + + ptn = strchr(s, '\0')[-1] - 'a'; + if (ptn >= lp->d_npartitions || ptn != DISKPART(sb.st_rdev)) + return; + + pp = &lp->d_partitions[ptn]; + dkw->dkw_offset = pp->p_offset; + dkw->dkw_size = pp->p_size; + dkw->dkw_parent[0] = '*'; + switch (pp->p_fstype) { + default: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_UNKNOWN); + break; + case FS_UNUSED: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_UNUSED); + break; + case FS_SWAP: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_SWAP); + break; + case FS_BSDFFS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_FFS); + break; + case FS_BSDLFS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_LFS); + break; + case FS_EX2FS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_EXT2FS); + break; + case FS_ISO9660: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_ISO9660); + break; + case FS_ADOS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_AMIGADOS); + break; + case FS_HFS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_APPLEHFS); + break; + case FS_MSDOS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_FAT); + break; + case FS_FILECORE: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_FILECORE); + break; + case FS_APPLEUFS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_APPLEUFS); + break; + case FS_NTFS: + (void)strcpy(dkw->dkw_ptype, DKW_PTYPE_NTFS); + break; + } +} + +int +getdiskinfo(const char *s, int fd, const char *dt, struct disk_geom *geo, + struct dkwedge_info *dkw) +{ + struct disklabel lab; + struct disklabel *lp = &lab; + char parent[1024]; + + if (dt) { + lp = getdiskbyname(dt); + if (lp == NULL) + errx(1, "%s: unknown disk type", dt); + goto part; + } + + if (ioctl(fd, DIOCGDINFO, lp) == -1) { + if (errno == ENOTTY) { + int pfd; + if (ioctl(fd, DIOCGWEDGEINFO, dkw) == -1) { + warn("ioctl (DIOCGWEDGEINFO)"); + goto bad; + } + pfd = opendisk(dkw->dkw_parent, O_RDONLY, + parent, sizeof(parent), 0); + if (pfd == -1) { + warn("Cannot open `%s'", dkw->dkw_parent); + goto bad; + } + if (ioctl(pfd, DIOCGDINFO, lp) != -1) { + (void)close(pfd); + goto label; + } else { + int serrno = errno; + (void)close(pfd); + errno = serrno; + } + } + warn("ioctl (DIOCGDINFO)"); + goto bad; + } +part: + part2wedge(dkw, lp, s); +label: + label2geom(geo, lp); + return 0; +bad: + return -1; +} diff --git a/sbin/fsck/partutil.h b/sbin/fsck/partutil.h new file mode 100644 index 000000000000..eda91b8f26d8 --- /dev/null +++ b/sbin/fsck/partutil.h @@ -0,0 +1,46 @@ +/* $NetBSD: partutil.h,v 1.1 2006/08/26 21:54:05 christos Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * 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. + */ +#ifndef _PARTUTIL_H_ +#define _PARTUTIL_H_ + +__BEGIN_DECLS +int getdiskinfo(const char *, int, const char *, + struct disk_geom *, struct dkwedge_info *); +__END_DECLS + +#endif /* _PARTUTIL_H_ */ diff --git a/sbin/fsck/preen.c b/sbin/fsck/preen.c index f0341b22f600..2fa28314d82a 100644 --- a/sbin/fsck/preen.c +++ b/sbin/fsck/preen.c @@ -1,4 +1,4 @@ -/* $NetBSD: preen.c,v 1.28 2006/08/26 18:14:28 christos Exp $ */ +/* $NetBSD: preen.c,v 1.29 2006/08/26 21:54:05 christos Exp $ */ /* * Copyright (c) 1990, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)preen.c 8.5 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: preen.c,v 1.28 2006/08/26 18:14:28 christos Exp $"); +__RCSID("$NetBSD: preen.c,v 1.29 2006/08/26 21:54:05 christos Exp $"); #endif #endif /* not lint */ @@ -42,10 +42,13 @@ __RCSID("$NetBSD: preen.c,v 1.28 2006/08/26 18:14:28 christos Exp $"); #include #include #include +#include +#include #include #include #include +#include #include #include #include @@ -71,7 +74,7 @@ struct diskentry { int d_pid; /* 0 or pid of fsck proc */ }; -TAILQ_HEAD(disk, diskentry) diskh; +TAILQ_HEAD(diskinfo, diskentry) diskh; static int nrun = 0, ndisks = 0; @@ -265,16 +268,25 @@ static struct diskentry * finddisk(const char *name) { const char *p; - size_t len = 0; + size_t len, dlen; struct diskentry *d; + char buf[MAXPATHLEN]; + struct dkwedge_info dkw; + int fd; - for (len = strlen(name), p = name + len - 1; p >= name; --p) + if ((fd = opendisk(name, O_RDONLY, buf, sizeof(buf), 0)) != -1) { + if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) + name = dkw.dkw_parent; + (void)close(fd); + } + + for (dlen = len = strlen(name), p = name + len - 1; p >= name; --p) if (isdigit((unsigned char)*p)) { len = p - name + 1; break; } if (p < name) - len = strlen(name); + len = dlen; TAILQ_FOREACH(d, &diskh, d_entries) if (strncmp(d->d_name, name, len) == 0 && d->d_name[len] == 0) @@ -300,9 +312,9 @@ printpart(void) struct partentry *p; TAILQ_FOREACH(d, &diskh, d_entries) { - (void) printf("disk %s: ", d->d_name); + (void) printf("disk %s:", d->d_name); TAILQ_FOREACH(p, &d->d_part, p_entries) - (void) printf("%s ", p->p_devname); + (void) printf(" %s", p->p_devname); (void) printf("\n"); } }