#include <sys/stat.h>
#include <sys/param.h>
#include <sys/ucred.h>
#include <sys/mount.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "fspred.h"
static void
vstatmod(mode_t *m, int *error, const char *fmt, va_list args)
{
char *filename;
struct stat sb;
memset(&sb, 0, sizeof(sb));
vasprintf(&filename, fmt, args);
*error = stat(filename, &sb);
free(filename);
if (*error)
*m = 0;
else
*m = sb.st_mode;
}
int
is_dir(const char *fmt, ...)
{
va_list args;
int error;
mode_t m;
va_start(args, fmt);
vstatmod(&m, &error, fmt, args);
va_end(args);
if (error == 0)
return(S_ISDIR(m));
else
return(0);
}
int
is_file(const char *fmt, ...)
{
va_list args;
int error;
mode_t m;
va_start(args, fmt);
vstatmod(&m, &error, fmt, args);
va_end(args);
if (error == 0)
return(S_ISREG(m) );
else
return(0);
}
int
is_program(const char *fmt, ...)
{
char *filename;
struct stat sb;
va_list args;
int error;
uid_t uid;
gid_t gid;
va_start(args, fmt);
vasprintf(&filename, fmt, args);
va_end(args);
error = stat(filename, &sb);
free(filename);
uid = getuid();
gid = getgid();
if (error == 0) {
if ((S_ISREG(sb.st_mode)) &&
((sb.st_uid == uid && sb.st_mode & S_IXUSR) ||
(sb.st_gid == gid && sb.st_mode & S_IXGRP) ||
(sb.st_mode & S_IXOTH))) {
return 1;
}
}
return 0;
}
int
is_device(const char *fmt, ...)
{
va_list args;
int error;
mode_t m;
va_start(args, fmt);
vstatmod(&m, &error, fmt, args);
va_end(args);
if (error == 0)
return(S_ISBLK(m) || S_ISCHR(m));
else
return(0);
}
int
is_named_pipe(const char *fmt, ...)
{
va_list args;
int error;
mode_t m;
va_start(args, fmt);
vstatmod(&m, &error, fmt, args);
va_end(args);
if (error == 0)
return(S_ISFIFO(m));
else
return(0);
}
int
is_mountpoint_mounted(const char *mtpt)
{
struct statfs *mt_array, *mt_ptr;
int count;
count = getmntinfo(&mt_array, MNT_WAIT);
for (mt_ptr = mt_array; count > 0; mt_ptr++, count--) {
if (strncmp(mt_ptr->f_mntonname, mtpt, PATH_MAX) == 0)
return(1);
}
return(0);
}
int
is_device_mounted(const char *device)
{
struct statfs *mt_array, *mt_ptr;
int count;
count = getmntinfo(&mt_array, MNT_WAIT);
for (mt_ptr = mt_array; count > 0; mt_ptr++, count--) {
if (strncmp(mt_ptr->f_mntfromname, device, PATH_MAX) == 0)
return(1);
}
return(0);
}
int
is_any_slice_mounted(const char *diskdev)
{
struct statfs *mt_array, *mt_ptr;
int count;
count = getmntinfo(&mt_array, MNT_WAIT);
for (mt_ptr = mt_array; count > 0; mt_ptr++, count--) {
if (strstr(mt_ptr->f_mntfromname, diskdev) ==
mt_ptr->f_mntfromname)
return(1);
}
return(0);
}