From 5fd83771641d15c418f747bd343ba6738d3875f7 Mon Sep 17 00:00:00 2001 From: Cameron Katri Date: Sun, 9 May 2021 14:20:58 -0400 Subject: Import macOS userland adv_cmds-176 basic_cmds-55 bootstrap_cmds-116.100.1 developer_cmds-66 diskdev_cmds-667.40.1 doc_cmds-53.60.1 file_cmds-321.40.3 mail_cmds-35 misc_cmds-34 network_cmds-606.40.1 patch_cmds-17 remote_cmds-63 shell_cmds-216.60.1 system_cmds-880.60.2 text_cmds-106 --- diskdev_cmds/fstyp.tproj/fstyp.c | 167 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 diskdev_cmds/fstyp.tproj/fstyp.c (limited to 'diskdev_cmds/fstyp.tproj/fstyp.c') diff --git a/diskdev_cmds/fstyp.tproj/fstyp.c b/diskdev_cmds/fstyp.tproj/fstyp.c new file mode 100644 index 0000000..840c4aa --- /dev/null +++ b/diskdev_cmds/fstyp.tproj/fstyp.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define FSTYP_PREFIX "fstyp_" +#define MAX_PATH_LEN 80 +#define MAX_CMD_LEN (MAX_PATH_LEN * 2) +#define NULL_REDIRECTION ">/dev/null 2>&1" + +void usage(void); +int select_fstyp(const struct dirent * dp); +int test(const char *dir, const struct dirent * dp, const char *dev); +void dealloc(struct dirent ** dpp, int numElems); + +char *progname; + +/* + * The fstyp command iterates through the binary directories to look for + * commands of the form fstyp_* and runs them, trying to find one that + * matches the given device. Once one of the returns success, fstyp + * prints out that file system type name and terminates. 1 is returned + * if any match is found, and 0 is returned if no match is found. + */ + +int +main(int argc, char *argv[]) +{ + /* NULL-terminated list of directories to search for fstyp_* commands */ + const char *DIRS[] = { "/bin/", + "/sbin/", + "/usr/bin/", + "/usr/sbin/", + "/usr/local/bin/", + "/usr/local/sbin/", + NULL}; + + int numMatches, i, j, found; + struct stat sb; + struct dirent **dpp; + + numMatches = 0; + i = 0; + j = 0; + found = 0; + + if ((progname = strrchr(*argv, '/'))) + ++progname; + else + progname = *argv; + + if (argc != 2) { + usage(); + return EX_USAGE; + } + if (0 == stat(argv[1], &sb)) { + for (i = 0; (!found && (NULL != DIRS[i])); i++) { + /* + * scan DIRS[i] for files that start with + * "fstyp_" + */ + numMatches = scandir(DIRS[i], &dpp, select_fstyp, NULL); + + if (numMatches >= 0) { + for (j = 0; (!found && (j < numMatches)); j++) { + if (test(DIRS[i], dpp[j], argv[1]) == 1) { + puts(dpp[j]->d_name + 6); + + found = 1; + } + } + + dealloc(dpp, numMatches); + dpp = NULL; + } + } + } + return found; +} + +int +select_fstyp(const struct dirent * dp) +{ + return ((dp != NULL) && + ((dp->d_type == DT_REG) || (dp->d_type == DT_LNK)) && + (dp->d_namlen > strlen(FSTYP_PREFIX)) && + (!strncmp(FSTYP_PREFIX, dp->d_name, strlen(FSTYP_PREFIX)))); +} + +/* return dp if successful, else return NULL */ +int +test(const char *dir, const struct dirent * dp, const char *dev) +{ + char cmd[MAX_CMD_LEN + 1] = {0}; + int status; + FILE *fileptr; + + status = 0; + + /* + 1 for white space */ + if ((strlen(dir) + dp->d_namlen + 1 + strlen(dev) + + strlen(NULL_REDIRECTION)) > MAX_CMD_LEN) { + return 0; + } + snprintf(cmd, sizeof(cmd), "%s%s %s", dir, dp->d_name, dev); + + if ((fileptr = popen(cmd, "r")) != NULL) { + status = pclose(fileptr); + + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) == 1) { + return 1; + } + } + } + return 0; +} + +void +dealloc(struct dirent ** dpp, int numElems) +{ + int i; + + for (i = 0; i < numElems; i++) { + free(dpp[i]); + dpp[i] = NULL; + } + + free(dpp); + + return; +} + + +void +usage(void) +{ + fprintf(stdout, "usage: %s device\n", progname); + return; +} -- cgit v1.2.3-56-ge451