#include "fuse.hpp"
#include "common.hpp"
#include <sys/stat.h>
static bool check_dir(const char* s, char* d) {
if (!realpath(s, d)) {
LOG_ERRNO("realpath(%s)", s);
return false;
}
struct stat ss;
if (stat(d, &ss) != 0) {
LOG_ERRNO("%s", d);
return false;
}
if (!S_ISDIR(ss.st_mode)) { // TODO: check permissions, too?
LOG_ERR(ENOTDIR, "%s", d);
return false;
}
return true;
}
int main(int argc, char** argv) {
config_t config = {};
if (argc < 4 || argc > 7) {
LOG("Usage: %s [-p|--persistent] [--filter=...] dir-handler file-handler src/ [dst/]", argv[0]);
return 1;
}
argc--; argv++;
config.persistent = (!strcmp(argv[0], "-p") || !strcmp(argv[0], "--persistent"));
if (config.persistent) {
argc--; argv++;
}
if (!strncmp(argv[0], "--filter=", 9)) {
argv[0] += 9;
if (strlen(argv[9]) >= sizeof(config.filter)) {
return 1;
}
strcpy(config.filter, argv[0]);
argc--; argv++;
}
if (argc < 3) {
return 1;
}
if (!realpath(argv[0], config.list_handler)) {
LOG_ERRNO("realpath(%s)", argv[0]);
return 1;
}
if (!realpath(argv[1], config.file_handler)) {
LOG_ERRNO("realpath(%s)", argv[1]);
return 1;
}
if (!check_dir(argv[2], config.src)) {
return 1;
}
if (!check_dir(argv[argc-1], config.dst)) {
return 1;
}
return fifuma_fuse_loop(config)? 0: 1;
}