summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <lulf@carrot.studby.ntnu.no>2008-08-17 14:37:05 +0200
committerUlf Lilleengen <lulf@carrot.studby.ntnu.no>2008-08-17 14:37:05 +0200
commitb8e5a73d12367281bd9d5ecb6d1a6886582fa0d0 (patch)
tree4f844af17b4340dbb485b41eb25dceeca4bb88a7
parentea89c89fff226f0f9eef485afa38ef4833aaa824 (diff)
- Simplify mfs_file_data_from_path a lot and rename it to mfs_realpath, which
have the objective of looking up the real file path, given the musicfs path. Some thoughts: Instead of creating a function for each operation we want to do, this change adds a mfs_lookup_path which allocates a buffer with the real path of the file we're looking for. This way, we can do the operations we want on the path externally instead, which is a lot simpler when using it. This also gets rid of the file_data data structure, and just use a pointer pointer where one is to allocate the real path.
-rw-r--r--include/musicfs.h16
-rw-r--r--src/mfs_subr.c50
-rwxr-xr-xsrc/mfs_vnops.c57
3 files changed, 38 insertions, 85 deletions
diff --git a/include/musicfs.h b/include/musicfs.h
index 8443198..5c141c3 100644
--- a/include/musicfs.h
+++ b/include/musicfs.h
@@ -42,14 +42,6 @@ struct filler_data {
fuse_fill_dir_t filler;
};
-/*
- * Data passed to mfs_lookup_open
- */
-struct file_data {
- int fd;
- int found;
-};
-
#define LIST_DATATYPE_STRING 1
#define LIST_DATATYPE_INT 2
@@ -59,10 +51,8 @@ enum mfs_filetype { MFS_NOTFOUND, MFS_FILE, MFS_DIRECTORY };
typedef int lookup_fn_t(void *, const char *);
/* Lookup function listing each row. */
lookup_fn_t mfs_lookup_list;
-/* Lookup function opening the first file match. */
-lookup_fn_t mfs_lookup_open;
-/* Lookup function stat'ing a file. */
-lookup_fn_t mfs_lookup_stat;
+/* Lookup real pathname for a file. */
+lookup_fn_t mfs_lookup_path;
/* Lookup function loading a path into DB */
lookup_fn_t mfs_lookup_load_path;
@@ -77,7 +67,7 @@ void mfs_lookup_genre(const char *, struct filler_data *);
void mfs_lookup_album(const char *, struct filler_data *);
char *mfs_gettoken(const char *, int);
int mfs_numtoken(const char *);
-int mfs_file_data_for_path(const char *, void *);
+int mfs_realpath(const char *, char **);
int mfs_reload_config();
char *mfs_get_home_path(const char *);
diff --git a/src/mfs_subr.c b/src/mfs_subr.c
index d70bade..6f4c7b6 100644
--- a/src/mfs_subr.c
+++ b/src/mfs_subr.c
@@ -559,22 +559,17 @@ mfs_lookup_finish(struct lookuphandle *lh)
}
/*
- * Build a file_data struct for a path.
+ * Return the realpath given a path in the musicfs tree.
*
- * data should be a pointer to a file handle
- * returns 0 on success
+ * Returns pointer to real path or NULL if not found.
*/
-int
-mfs_file_data_for_path(const char *path, void *data) {
- DEBUG("getting file data for %s\n", path);
- struct file_data *fd;
- fd = (struct file_data *)data;
+int
+mfs_realpath(const char *path, char **realpath) {
+ DEBUG("getting real path for %s\n", path);
struct lookuphandle *lh;
char *artist, *album, *title;
lh = NULL;
- fd->fd = -1;
- fd->found = 0;
/* Open a specific track. */
if (strncmp(path, "/Tracks", 7) == 0) {
@@ -583,7 +578,7 @@ mfs_file_data_for_path(const char *path, void *data) {
title = mfs_gettoken(path, 2);
if (title == NULL)
break;
- lh = mfs_lookup_start(0, fd, mfs_lookup_open,
+ lh = mfs_lookup_start(0, realpath, mfs_lookup_path,
"SELECT filepath FROM song "
"WHERE (artistname||' - '||title||'.'||extension) LIKE ?");
if (lh == NULL)
@@ -602,7 +597,7 @@ mfs_file_data_for_path(const char *path, void *data) {
title = mfs_gettoken(path, 3);
if (title == NULL)
break;
- lh = mfs_lookup_start(0, fd, mfs_lookup_open,
+ lh = mfs_lookup_start(0, realpath, mfs_lookup_path,
"SELECT filepath FROM song "
"WHERE (title||'.'||extension) LIKE ? AND "
"album LIKE ?");
@@ -624,7 +619,7 @@ mfs_file_data_for_path(const char *path, void *data) {
if (!(artist && album && title)) {
break;
}
- lh = mfs_lookup_start(0, fd, mfs_lookup_open,
+ lh = mfs_lookup_start(0, realpath, mfs_lookup_path,
"SELECT filepath FROM song WHERE artistname LIKE ? AND "
"album LIKE ? AND "
"(LTRIM(track||' ')||title||'.'||extension) LIKE ?");
@@ -642,7 +637,8 @@ mfs_file_data_for_path(const char *path, void *data) {
if (lh) {
mfs_lookup_finish(lh);
}
-
+ if (*realpath == NULL)
+ return (-ENOMEM);
return 0;
}
@@ -846,31 +842,15 @@ mfs_lookup_list(void *data, const char *str)
}
/*
- * Lookup a file and open it if found.
- */
-int
-mfs_lookup_open(void *data, const char *str)
-{
- struct file_data *fd;
-
- fd = (struct file_data *)data;
- fd->fd = open(str, O_RDONLY);
- fd->found = 1;
- return (1);
-}
-
-/*
- * Stat a file.
- * XXX: watch out for duplicates, we might stat more than once.
+ * Lookup the real path of a file.
*/
int
-mfs_lookup_stat(void *data, const char *str)
+mfs_lookup_path(void *data, const char *str)
{
- struct stat *st;
- st = (struct stat *)data;
- if (stat(str, st) < 0)
- return (0);
+ char **path;
+ path = data;
+ *path = strdup(str);
return (1);
}
diff --git a/src/mfs_vnops.c b/src/mfs_vnops.c
index 55907d9..07faf44 100755
--- a/src/mfs_vnops.c
+++ b/src/mfs_vnops.c
@@ -41,9 +41,7 @@
static int mfs_getattr (const char *path, struct stat *stbuf)
{
- struct file_data fd;
- fd.fd = -1;
- fd.found = 0;
+ char *realpath;
int status = 0;
memset (stbuf, 0, sizeof (struct stat));
@@ -71,19 +69,16 @@ static int mfs_getattr (const char *path, struct stat *stbuf)
return 0;
case MFS_FILE:
- status = mfs_file_data_for_path(path, &fd);
+ realpath = NULL;
+ status = mfs_realpath(path, &realpath);
if (status != 0)
- return (status);
-
- if (!fd.found)
- return (-ENOENT);
- if (fd.fd < 0)
- return (-EIO);
-
- if (fstat(fd.fd, stbuf) == 0)
- return (0);
- else
- return (-ENOENT);
+ return status;
+ if (stat(realpath, stbuf) != 0) {
+ free(realpath);
+ return -ENOENT;
+ }
+ free(realpath);
+ return 0;
case MFS_NOTFOUND:
default:
@@ -139,32 +134,20 @@ static int mfs_readdir (const char *path, void *buf, fuse_fill_dir_t filler,
static int mfs_open (const char *path, struct fuse_file_info *fi)
{
- struct file_data fd;
- fd.fd = -1;
- fd.found = 0;
+ char *realpath;
+ int fd, status;
if (strcmp(path, "/.config") == 0)
return (0);
- int status = mfs_file_data_for_path(path, &fd);
+ status = mfs_realpath(path, &realpath);
if (status != 0)
- return (status);
-
- if (!fd.found)
- return (-ENOENT);
- if (fd.fd < 0)
- return (-EIO);
- fi->fh = fd.fd;
+ return status;
+ fd = open(realpath, O_RDONLY);
+ if (fd < 0)
+ return (-errno);
+ fi->fh = (uint64_t)fd;
return (0);
-
- /*
- * 1. Have a lookup cache for names?.
- * Parse Genre, Album, Artist etc.
- * 2. Find MP3s that match. XXX what do we do with duplicates? just
- * return the first match?
- * 3. Put the mnode of the mp3 in our cache.
- * 4. Signal in mnode that the mp3 is being read?
- */
}
static int mfs_read (const char *path, char *buf, size_t size, off_t offset,
@@ -185,7 +168,7 @@ static int mfs_read (const char *path, char *buf, size_t size, off_t offset,
return (bytes);
}
- fd = fi->fh;
+ fd = (int)fi->fh;
if (fd < 0)
return (-EIO);
bytes = read(fd, buf, size);
@@ -276,7 +259,7 @@ static int mfs_release(const char *path, struct fuse_file_info *fi)
mfs_reload_config();
}
- fd = fi->fh;
+ fd = (int)fi->fh;
if (fd >= 0)
close(fd);