#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(struct dirent * dp);
int test(const char *dir, const struct dirent * dp, const char *dev);
void dealloc(struct dirent ** dpp, int numElems);
char *progname;
int
main(int argc, char *argv[])
{
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++) {
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(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))));
}
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;
if ((strlen(dir) + dp->d_namlen + 1 + strlen(dev) +
strlen(NULL_REDIRECTION)) > MAX_CMD_LEN) {
return 0;
}
strcpy(cmd, dir);
strcat(cmd, dp->d_name);
strcat(cmd, " ");
strcat(cmd, 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;
}