1241806Suqs/* $NetBSD: fsutil.c,v 1.15 2006/06/05 16:52:05 christos Exp $ */ 266868Sadrian 366868Sadrian/* 466868Sadrian * Copyright (c) 1990, 1993 566868Sadrian * The Regents of the University of California. All rights reserved. 666868Sadrian * 766868Sadrian * Redistribution and use in source and binary forms, with or without 866868Sadrian * modification, are permitted provided that the following conditions 966868Sadrian * are met: 1066868Sadrian * 1. Redistributions of source code must retain the above copyright 1166868Sadrian * notice, this list of conditions and the following disclaimer. 1266868Sadrian * 2. Redistributions in binary form must reproduce the above copyright 1366868Sadrian * notice, this list of conditions and the following disclaimer in the 1466868Sadrian * documentation and/or other materials provided with the distribution. 15241806Suqs * 3. Neither the name of the University nor the names of its contributors 1666868Sadrian * may be used to endorse or promote products derived from this software 1766868Sadrian * without specific prior written permission. 1866868Sadrian * 1966868Sadrian * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2066868Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2166868Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2266868Sadrian * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2366868Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2466868Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2566868Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2666868Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2766868Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2866868Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2966868Sadrian * SUCH DAMAGE. 3066868Sadrian */ 3166868Sadrian 3266868Sadrian#include <sys/cdefs.h> 3366868Sadrian#ifndef lint 34241806Suqs__RCSID("$NetBSD: fsutil.c,v 1.15 2006/06/05 16:52:05 christos Exp $"); 3566868Sadrian#endif /* not lint */ 3693102Smarkm__FBSDID("$FreeBSD$"); 3766868Sadrian 3893102Smarkm#include <sys/param.h> 3993102Smarkm#include <sys/stat.h> 4093102Smarkm#include <sys/mount.h> 4193102Smarkm 4293102Smarkm#include <err.h> 4366868Sadrian#include <errno.h> 4466868Sadrian#include <fstab.h> 4575936Smckusick#include <paths.h> 4693102Smarkm#include <stdarg.h> 4793102Smarkm#include <stdio.h> 4893102Smarkm#include <stdlib.h> 4993102Smarkm#include <string.h> 5066868Sadrian 5166868Sadrian#include "fsutil.h" 5266868Sadrian 5366868Sadrianstatic const char *dev = NULL; 5466868Sadrianstatic int preen = 0; 5566868Sadrian 5692839Simpstatic void vmsg(int, const char *, va_list) __printflike(2, 0); 5766868Sadrian 5866868Sadrianvoid 5992839Simpsetcdevname(const char *cd, int pr) 6066868Sadrian{ 6166868Sadrian dev = cd; 6266868Sadrian preen = pr; 6366868Sadrian} 6466868Sadrian 6566868Sadrianconst char * 6692839Simpcdevname(void) 6766868Sadrian{ 6866868Sadrian return dev; 6966868Sadrian} 7066868Sadrian 7166868Sadrianstatic void 7292839Simpvmsg(int fatal, const char *fmt, va_list ap) 7366868Sadrian{ 7466868Sadrian if (!fatal && preen) 7566868Sadrian (void) printf("%s: ", dev); 7666868Sadrian 7766868Sadrian (void) vprintf(fmt, ap); 7866868Sadrian 7966868Sadrian if (fatal && preen) 8066868Sadrian (void) printf("\n"); 8166868Sadrian 8266868Sadrian if (fatal && preen) { 8366868Sadrian (void) printf( 8466868Sadrian "%s: UNEXPECTED INCONSISTENCY; RUN %s MANUALLY.\n", 8593102Smarkm dev, getprogname()); 8666868Sadrian exit(8); 8766868Sadrian } 8866868Sadrian} 8966868Sadrian 9066868Sadrian/*VARARGS*/ 9166868Sadrianvoid 9266868Sadrianpfatal(const char *fmt, ...) 9366868Sadrian{ 9466868Sadrian va_list ap; 9566868Sadrian 9666868Sadrian va_start(ap, fmt); 9766868Sadrian vmsg(1, fmt, ap); 9866868Sadrian va_end(ap); 9966868Sadrian} 10066868Sadrian 10166868Sadrian/*VARARGS*/ 10266868Sadrianvoid 10366868Sadrianpwarn(const char *fmt, ...) 10466868Sadrian{ 10566868Sadrian va_list ap; 10692839Simp 10766868Sadrian va_start(ap, fmt); 10866868Sadrian vmsg(0, fmt, ap); 10966868Sadrian va_end(ap); 11066868Sadrian} 11166868Sadrian 11266868Sadrianvoid 113241806Suqsperr(const char *fmt, ...) 11466868Sadrian{ 115241806Suqs va_list ap; 116241806Suqs 117241806Suqs va_start(ap, fmt); 118241806Suqs vmsg(1, fmt, ap); 119241806Suqs va_end(ap); 12066868Sadrian} 12166868Sadrian 12266868Sadrianvoid 12366868Sadrianpanic(const char *fmt, ...) 12466868Sadrian{ 12566868Sadrian va_list ap; 12666868Sadrian 12766868Sadrian va_start(ap, fmt); 12866868Sadrian vmsg(1, fmt, ap); 12966868Sadrian va_end(ap); 13066868Sadrian exit(8); 13166868Sadrian} 13266868Sadrian 13366868Sadrianconst char * 13492839Simpdevcheck(const char *origname) 13566868Sadrian{ 13666868Sadrian struct stat stslash, stchar; 13766868Sadrian 13866868Sadrian if (stat("/", &stslash) < 0) { 139241806Suqs perr("Can't stat `/'"); 14066868Sadrian return (origname); 14166868Sadrian } 14266868Sadrian if (stat(origname, &stchar) < 0) { 143241806Suqs perr("Can't stat %s\n", origname); 14466868Sadrian return (origname); 14566868Sadrian } 14666868Sadrian if (!S_ISCHR(stchar.st_mode)) { 147241806Suqs perr("%s is not a char device\n", origname); 14866868Sadrian } 14966868Sadrian return (origname); 15066868Sadrian} 15166868Sadrian 15275936Smckusick/* 15375936Smckusick * Get the mount point information for name. 15475936Smckusick */ 15575936Smckusickstruct statfs * 15692839Simpgetmntpt(const char *name) 15775936Smckusick{ 15875936Smckusick struct stat devstat, mntdevstat; 15975936Smckusick char device[sizeof(_PATH_DEV) - 1 + MNAMELEN]; 160241806Suqs char *dev_name; 16175936Smckusick struct statfs *mntbuf, *statfsp; 16275936Smckusick int i, mntsize, isdev; 16375936Smckusick 16475936Smckusick if (stat(name, &devstat) != 0) 16575936Smckusick return (NULL); 16675936Smckusick if (S_ISCHR(devstat.st_mode) || S_ISBLK(devstat.st_mode)) 16775936Smckusick isdev = 1; 16875936Smckusick else 16975936Smckusick isdev = 0; 17075936Smckusick mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); 17175936Smckusick for (i = 0; i < mntsize; i++) { 17275936Smckusick statfsp = &mntbuf[i]; 173241806Suqs dev_name = statfsp->f_mntfromname; 174241806Suqs if (*dev_name != '/') { 17575936Smckusick strcpy(device, _PATH_DEV); 176241806Suqs strcat(device, dev_name); 17775936Smckusick strcpy(statfsp->f_mntfromname, device); 17875936Smckusick } 17975936Smckusick if (isdev == 0) { 18075936Smckusick if (strcmp(name, statfsp->f_mntonname)) 18175936Smckusick continue; 18275936Smckusick return (statfsp); 18375936Smckusick } 184241806Suqs if (stat(dev_name, &mntdevstat) == 0 && 18575936Smckusick mntdevstat.st_rdev == devstat.st_rdev) 18675936Smckusick return (statfsp); 18775936Smckusick } 18875936Smckusick statfsp = NULL; 18975936Smckusick return (statfsp); 19075936Smckusick} 19175936Smckusick 19266868Sadrian 19366868Sadrianvoid * 19492839Simpemalloc(size_t s) 19566868Sadrian{ 19666868Sadrian void *p; 19766868Sadrian 19866868Sadrian p = malloc(s); 19966868Sadrian if (p == NULL) 20066868Sadrian err(1, "malloc failed"); 20166868Sadrian return (p); 20266868Sadrian} 20366868Sadrian 20466868Sadrian 20566868Sadrianvoid * 20692839Simperealloc(void *p, size_t s) 20766868Sadrian{ 20866868Sadrian void *q; 20966868Sadrian 21066868Sadrian q = realloc(p, s); 21166868Sadrian if (q == NULL) 21266868Sadrian err(1, "realloc failed"); 21366868Sadrian return (q); 21466868Sadrian} 21566868Sadrian 21666868Sadrian 21766868Sadrianchar * 21892839Simpestrdup(const char *s) 21966868Sadrian{ 22066868Sadrian char *p; 22166868Sadrian 22266868Sadrian p = strdup(s); 22366868Sadrian if (p == NULL) 22466868Sadrian err(1, "strdup failed"); 22566868Sadrian return (p); 22666868Sadrian} 227