00001
00007 #include <errno.h>
00008 #include <fcntl.h>
00009 #include <fuse.h>
00010 #include <stdio.h>
00011 #include <stdlib.h>
00012 #include <string.h>
00013 #include <unistd.h>
00014
00015 #include "fuse_implementation.h"
00016 #include "check.h"
00017
00018
00022 static void usage()
00023 {
00024 fprintf(stderr, "usage: db5fuse <hddfilesystem> <mountpoint>\n\n");
00025 fprintf(stderr, " <hddfilesystem> is the mounted HDD100/HDD120 fat file system path.\n");
00026 fprintf(stderr, " <mountpoint> is where the filesystem will be mounted.\n");
00027 exit(EXIT_FAILURE);
00028 }
00029
00033 static struct fuse_operations fuse_oper =
00034 {
00035 .getattr = &fuse_impl_getattr,
00036 .unlink = &fuse_impl_unlink,
00037 .rename = &fuse_impl_rename,
00038 .truncate = &fuse_impl_truncate,
00039 .open = &fuse_impl_open,
00040 .read = &fuse_impl_read,
00041 .write = &fuse_impl_write,
00042 .statfs = &fuse_impl_statfs,
00043 .flush = &fuse_impl_flush,
00044 .readdir = &fuse_impl_readdir,
00045 .init = &fuse_impl_init,
00046 .destroy = &fuse_impl_destroy,
00047 .create = &fuse_impl_create,
00048 .utimens = &fuse_impl_utimens,
00049 .fsync = &fuse_impl_fsync
00050 };
00051
00057 static const char *absolute_path(const char *relative)
00058 {
00059 char *backup_dir;
00060 const char *result;
00061
00062 check(relative != NULL);
00063
00064
00065 backup_dir = getcwd(NULL, 0);
00066 if (backup_dir == NULL)
00067 {
00068 return NULL;
00069 }
00070
00071
00072 if (chdir(relative) != 0)
00073 {
00074 free(backup_dir);
00075 return NULL;
00076 }
00077
00078
00079 result = getcwd(NULL, 0);
00080
00081
00082 chdir(backup_dir);
00083 free(backup_dir);
00084
00085 return (const char *)result;
00086 }
00087
00094 int main(int argc, char *argv[])
00095 {
00096 if (argc != 3)
00097 {
00098 usage();
00099 }
00100
00101 fuse_device = absolute_path(argv[1]);
00102 if (fuse_device == NULL)
00103 {
00104 fprintf(stderr, "Unable to reach device '%s'!", argv[1]);
00105 usage();
00106 }
00107
00108
00109 argv[1] = argv[0];
00110 argv++; argc--;
00111
00112 return fuse_main(argc, argv, &fuse_oper, NULL);
00113 }