/*-1* SPDX-License-Identifier: BSD-3-Clause2*3* Copyright (c) 1980, 1986, 19934* The Regents of the University of California. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14* 3. Neither the name of the University nor the names of its contributors15* may be used to endorse or promote products derived from this software16* without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND19* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE20* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE21* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE22* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL23* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS24* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT26* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY27* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF28* SUCH DAMAGE.29*/3031#include <sys/param.h>32#include <sys/types.h>33#include <sys/stat.h>3435#include <ufs/ufs/dinode.h>36#include <ufs/ufs/dir.h>37#include <ufs/ffs/fs.h>3839#include <errno.h>40#include <string.h>41#include <fstab.h>42#include <paths.h>43#include <stdio.h>4445#include "fsck.h"464748char *49blockcheck(char *origname)50{51struct stat stblock;52char *newname, *cp;53struct fstab *fsinfo;54int retried = 0, len;55static char device[MAXPATHLEN];5657newname = origname;58if (stat(newname, &stblock) < 0) {59cp = strrchr(newname, '/');60if (cp == NULL) {61(void)snprintf(device, sizeof(device), "%s%s",62_PATH_DEV, newname);63newname = device;64}65}66retry:67if (stat(newname, &stblock) < 0) {68printf("Can't stat %s: %s\n", newname, strerror(errno));69return (origname);70}71switch(stblock.st_mode & S_IFMT) {72case S_IFCHR:73case S_IFBLK:74return(newname);75case S_IFDIR:76if (retried)77break;7879len = strlen(origname) - 1;80if (len > 0 && origname[len] == '/')81/* remove trailing slash */82origname[len] = '\0';83if ((fsinfo = getfsfile(origname)) == NULL) {84printf(85"Can't resolve %s to character special device.\n",86origname);87return (origname);88}89newname = fsinfo->fs_spec;90retried++;91goto retry;92}93/*94* Not a block or character device, just return name and95* let the user decide whether to use it.96*/97return (origname);98}99100101102