16cf357bcSUlrich Spörlein /* $NetBSD: fsutil.c,v 1.15 2006/06/05 16:52:05 christos Exp $ */ 2da7e7114SAdrian Chadd 3*8a16b7a1SPedro F. Giffuni /*- 4*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 5*8a16b7a1SPedro F. Giffuni * 6da7e7114SAdrian Chadd * Copyright (c) 1990, 1993 7da7e7114SAdrian Chadd * The Regents of the University of California. All rights reserved. 8da7e7114SAdrian Chadd * 9da7e7114SAdrian Chadd * Redistribution and use in source and binary forms, with or without 10da7e7114SAdrian Chadd * modification, are permitted provided that the following conditions 11da7e7114SAdrian Chadd * are met: 12da7e7114SAdrian Chadd * 1. Redistributions of source code must retain the above copyright 13da7e7114SAdrian Chadd * notice, this list of conditions and the following disclaimer. 14da7e7114SAdrian Chadd * 2. Redistributions in binary form must reproduce the above copyright 15da7e7114SAdrian Chadd * notice, this list of conditions and the following disclaimer in the 16da7e7114SAdrian Chadd * documentation and/or other materials provided with the distribution. 176cf357bcSUlrich Spörlein * 3. Neither the name of the University nor the names of its contributors 18da7e7114SAdrian Chadd * may be used to endorse or promote products derived from this software 19da7e7114SAdrian Chadd * without specific prior written permission. 20da7e7114SAdrian Chadd * 21da7e7114SAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22da7e7114SAdrian Chadd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23da7e7114SAdrian Chadd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24da7e7114SAdrian Chadd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25da7e7114SAdrian Chadd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26da7e7114SAdrian Chadd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27da7e7114SAdrian Chadd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28da7e7114SAdrian Chadd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29da7e7114SAdrian Chadd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30da7e7114SAdrian Chadd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31da7e7114SAdrian Chadd * SUCH DAMAGE. 32da7e7114SAdrian Chadd */ 33da7e7114SAdrian Chadd 34da7e7114SAdrian Chadd #include <sys/cdefs.h> 35da7e7114SAdrian Chadd #ifndef lint 366cf357bcSUlrich Spörlein __RCSID("$NetBSD: fsutil.c,v 1.15 2006/06/05 16:52:05 christos Exp $"); 37da7e7114SAdrian Chadd #endif /* not lint */ 38b813a714SMark Murray __FBSDID("$FreeBSD$"); 39da7e7114SAdrian Chadd 40a02a0079SKirk McKusick #include <sys/param.h> 41da7e7114SAdrian Chadd #include <sys/stat.h> 42a02a0079SKirk McKusick #include <sys/mount.h> 43da7e7114SAdrian Chadd 44b813a714SMark Murray #include <err.h> 45b813a714SMark Murray #include <errno.h> 46b813a714SMark Murray #include <fstab.h> 47b813a714SMark Murray #include <paths.h> 48b813a714SMark Murray #include <stdarg.h> 49b813a714SMark Murray #include <stdio.h> 50b813a714SMark Murray #include <stdlib.h> 51b813a714SMark Murray #include <string.h> 52b813a714SMark Murray 53da7e7114SAdrian Chadd #include "fsutil.h" 54da7e7114SAdrian Chadd 55da7e7114SAdrian Chadd static const char *dev = NULL; 56da7e7114SAdrian Chadd static int preen = 0; 57da7e7114SAdrian Chadd 58b70cd7eeSWarner Losh static void vmsg(int, const char *, va_list) __printflike(2, 0); 59da7e7114SAdrian Chadd 60da7e7114SAdrian Chadd void 61b70cd7eeSWarner Losh setcdevname(const char *cd, int pr) 62da7e7114SAdrian Chadd { 63da7e7114SAdrian Chadd dev = cd; 64da7e7114SAdrian Chadd preen = pr; 65da7e7114SAdrian Chadd } 66da7e7114SAdrian Chadd 67da7e7114SAdrian Chadd const char * 68b70cd7eeSWarner Losh cdevname(void) 69da7e7114SAdrian Chadd { 70da7e7114SAdrian Chadd return dev; 71da7e7114SAdrian Chadd } 72da7e7114SAdrian Chadd 73da7e7114SAdrian Chadd static void 74b70cd7eeSWarner Losh vmsg(int fatal, const char *fmt, va_list ap) 75da7e7114SAdrian Chadd { 76da7e7114SAdrian Chadd if (!fatal && preen) 77da7e7114SAdrian Chadd (void) printf("%s: ", dev); 78da7e7114SAdrian Chadd 79da7e7114SAdrian Chadd (void) vprintf(fmt, ap); 80da7e7114SAdrian Chadd 81da7e7114SAdrian Chadd if (fatal && preen) 82da7e7114SAdrian Chadd (void) printf("\n"); 83da7e7114SAdrian Chadd 84da7e7114SAdrian Chadd if (fatal && preen) { 85da7e7114SAdrian Chadd (void) printf( 86da7e7114SAdrian Chadd "%s: UNEXPECTED INCONSISTENCY; RUN %s MANUALLY.\n", 87b813a714SMark Murray dev, getprogname()); 88da7e7114SAdrian Chadd exit(8); 89da7e7114SAdrian Chadd } 90da7e7114SAdrian Chadd } 91da7e7114SAdrian Chadd 92da7e7114SAdrian Chadd /*VARARGS*/ 93da7e7114SAdrian Chadd void 94da7e7114SAdrian Chadd pfatal(const char *fmt, ...) 95da7e7114SAdrian Chadd { 96da7e7114SAdrian Chadd va_list ap; 97da7e7114SAdrian Chadd 98da7e7114SAdrian Chadd va_start(ap, fmt); 99da7e7114SAdrian Chadd vmsg(1, fmt, ap); 100da7e7114SAdrian Chadd va_end(ap); 101da7e7114SAdrian Chadd } 102da7e7114SAdrian Chadd 103da7e7114SAdrian Chadd /*VARARGS*/ 104da7e7114SAdrian Chadd void 105da7e7114SAdrian Chadd pwarn(const char *fmt, ...) 106da7e7114SAdrian Chadd { 107da7e7114SAdrian Chadd va_list ap; 108da7e7114SAdrian Chadd 109b70cd7eeSWarner Losh va_start(ap, fmt); 110da7e7114SAdrian Chadd vmsg(0, fmt, ap); 111da7e7114SAdrian Chadd va_end(ap); 112da7e7114SAdrian Chadd } 113da7e7114SAdrian Chadd 114da7e7114SAdrian Chadd void 1156cf357bcSUlrich Spörlein perr(const char *fmt, ...) 116da7e7114SAdrian Chadd { 1176cf357bcSUlrich Spörlein va_list ap; 1186cf357bcSUlrich Spörlein 1196cf357bcSUlrich Spörlein va_start(ap, fmt); 1206cf357bcSUlrich Spörlein vmsg(1, fmt, ap); 1216cf357bcSUlrich Spörlein va_end(ap); 122da7e7114SAdrian Chadd } 123da7e7114SAdrian Chadd 124da7e7114SAdrian Chadd void 125da7e7114SAdrian Chadd panic(const char *fmt, ...) 126da7e7114SAdrian Chadd { 127da7e7114SAdrian Chadd va_list ap; 128da7e7114SAdrian Chadd 129da7e7114SAdrian Chadd va_start(ap, fmt); 130da7e7114SAdrian Chadd vmsg(1, fmt, ap); 131da7e7114SAdrian Chadd va_end(ap); 132da7e7114SAdrian Chadd exit(8); 133da7e7114SAdrian Chadd } 134da7e7114SAdrian Chadd 135da7e7114SAdrian Chadd const char * 136b70cd7eeSWarner Losh devcheck(const char *origname) 137da7e7114SAdrian Chadd { 138da7e7114SAdrian Chadd struct stat stslash, stchar; 139da7e7114SAdrian Chadd 140da7e7114SAdrian Chadd if (stat("/", &stslash) < 0) { 1416cf357bcSUlrich Spörlein perr("Can't stat `/'"); 142da7e7114SAdrian Chadd return (origname); 143da7e7114SAdrian Chadd } 144da7e7114SAdrian Chadd if (stat(origname, &stchar) < 0) { 1456cf357bcSUlrich Spörlein perr("Can't stat %s\n", origname); 146da7e7114SAdrian Chadd return (origname); 147da7e7114SAdrian Chadd } 148da7e7114SAdrian Chadd if (!S_ISCHR(stchar.st_mode)) { 1496cf357bcSUlrich Spörlein perr("%s is not a char device\n", origname); 150da7e7114SAdrian Chadd } 151da7e7114SAdrian Chadd return (origname); 152da7e7114SAdrian Chadd } 153da7e7114SAdrian Chadd 154a02a0079SKirk McKusick /* 155a02a0079SKirk McKusick * Get the mount point information for name. 156a02a0079SKirk McKusick */ 157a02a0079SKirk McKusick struct statfs * 158b70cd7eeSWarner Losh getmntpt(const char *name) 159a02a0079SKirk McKusick { 160a02a0079SKirk McKusick struct stat devstat, mntdevstat; 161a02a0079SKirk McKusick char device[sizeof(_PATH_DEV) - 1 + MNAMELEN]; 1626cf357bcSUlrich Spörlein char *dev_name; 163a02a0079SKirk McKusick struct statfs *mntbuf, *statfsp; 164a02a0079SKirk McKusick int i, mntsize, isdev; 165a02a0079SKirk McKusick 166a02a0079SKirk McKusick if (stat(name, &devstat) != 0) 167a02a0079SKirk McKusick return (NULL); 168a02a0079SKirk McKusick if (S_ISCHR(devstat.st_mode) || S_ISBLK(devstat.st_mode)) 169a02a0079SKirk McKusick isdev = 1; 170a02a0079SKirk McKusick else 171a02a0079SKirk McKusick isdev = 0; 172a02a0079SKirk McKusick mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); 173a02a0079SKirk McKusick for (i = 0; i < mntsize; i++) { 174a02a0079SKirk McKusick statfsp = &mntbuf[i]; 1756cf357bcSUlrich Spörlein dev_name = statfsp->f_mntfromname; 1766cf357bcSUlrich Spörlein if (*dev_name != '/') { 177bcbaf9fdSConrad Meyer if (strlen(_PATH_DEV) + strlen(dev_name) + 1 > 178bcbaf9fdSConrad Meyer sizeof(statfsp->f_mntfromname)) 179bcbaf9fdSConrad Meyer continue; 180a02a0079SKirk McKusick strcpy(device, _PATH_DEV); 1816cf357bcSUlrich Spörlein strcat(device, dev_name); 182a02a0079SKirk McKusick strcpy(statfsp->f_mntfromname, device); 183a02a0079SKirk McKusick } 184a02a0079SKirk McKusick if (isdev == 0) { 185a02a0079SKirk McKusick if (strcmp(name, statfsp->f_mntonname)) 186a02a0079SKirk McKusick continue; 187a02a0079SKirk McKusick return (statfsp); 188a02a0079SKirk McKusick } 1896cf357bcSUlrich Spörlein if (stat(dev_name, &mntdevstat) == 0 && 190a02a0079SKirk McKusick mntdevstat.st_rdev == devstat.st_rdev) 191a02a0079SKirk McKusick return (statfsp); 192a02a0079SKirk McKusick } 193a02a0079SKirk McKusick statfsp = NULL; 194a02a0079SKirk McKusick return (statfsp); 195a02a0079SKirk McKusick } 196a02a0079SKirk McKusick 197da7e7114SAdrian Chadd 198da7e7114SAdrian Chadd void * 199b70cd7eeSWarner Losh emalloc(size_t s) 200da7e7114SAdrian Chadd { 201da7e7114SAdrian Chadd void *p; 202da7e7114SAdrian Chadd 203da7e7114SAdrian Chadd p = malloc(s); 204da7e7114SAdrian Chadd if (p == NULL) 205da7e7114SAdrian Chadd err(1, "malloc failed"); 206da7e7114SAdrian Chadd return (p); 207da7e7114SAdrian Chadd } 208da7e7114SAdrian Chadd 209da7e7114SAdrian Chadd 210da7e7114SAdrian Chadd void * 211b70cd7eeSWarner Losh erealloc(void *p, size_t s) 212da7e7114SAdrian Chadd { 213da7e7114SAdrian Chadd void *q; 214da7e7114SAdrian Chadd 215da7e7114SAdrian Chadd q = realloc(p, s); 216da7e7114SAdrian Chadd if (q == NULL) 217da7e7114SAdrian Chadd err(1, "realloc failed"); 218da7e7114SAdrian Chadd return (q); 219da7e7114SAdrian Chadd } 220da7e7114SAdrian Chadd 221da7e7114SAdrian Chadd 222da7e7114SAdrian Chadd char * 223b70cd7eeSWarner Losh estrdup(const char *s) 224da7e7114SAdrian Chadd { 225da7e7114SAdrian Chadd char *p; 226da7e7114SAdrian Chadd 227da7e7114SAdrian Chadd p = strdup(s); 228da7e7114SAdrian Chadd if (p == NULL) 229da7e7114SAdrian Chadd err(1, "strdup failed"); 230da7e7114SAdrian Chadd return (p); 231da7e7114SAdrian Chadd } 232