diff options
author | Cameron Katri <me@cameronkatri.com> | 2021-05-09 14:20:58 -0400 |
---|---|---|
committer | Cameron Katri <me@cameronkatri.com> | 2021-05-09 14:20:58 -0400 |
commit | 5fd83771641d15c418f747bd343ba6738d3875f7 (patch) | |
tree | 5abf0f78f680d9837dbd93d4d4c3933bb7509599 /diskdev_cmds/fstyp.tproj/fstyp.c | |
download | apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.gz apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.zst apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.zip |
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
Diffstat (limited to 'diskdev_cmds/fstyp.tproj/fstyp.c')
-rw-r--r-- | diskdev_cmds/fstyp.tproj/fstyp.c | 167 |
1 files changed, 167 insertions, 0 deletions
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 <sys/types.h> +#include <sys/stat.h> +#include <dirent.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <sysexits.h> + +#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; +} |