diff options
-rw-r--r-- | include/musicfs.h | 16 | ||||
-rw-r--r-- | src/mfs_subr.c | 50 | ||||
-rwxr-xr-x | src/mfs_vnops.c | 57 |
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); |