1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
2 /*****************************************************************************
5 * fuse frontend to MediaDatabase
8 * Nedko Arnaudov <nedko@users.sourceforge.net>
11 * GNU GENERAL PUBLIC LICENSE version 2
13 *****************************************************************************/
21 #include "../result.h"
22 #include "../libdb/libdb.h"
23 #include "../libfrontend/error.h"
24 #include "../libfrontend/conf.h"
25 #include "../libfrontend/db.h"
27 #define UNUSED_VARIABLE(x) ((void) (x))
30 mediadb_get_mediaid_from_path(
32 const char **ppMediaRoot
)
36 mediadb_uint nMediaID
;
63 nMediaID
= strtoull(pch
+1, &end
, 10);
64 if (nMediaID
== 18446744073709551615ULL)
69 if (*end
!= 0 && *end
!= '/')
78 static int mediadb_getattr(const char *path
, struct stat
*stbuf
)
80 const char * pszMediaRoot
;
82 mediadb_uint nMediaID
;
83 mediadb_uint nTotalFiles
;
84 mediadb_uint nTotalSize
;
85 mediadb_uint nTimeAdded
;
86 mediadb_mediatype nType
;
87 mediadb_uint nLocationID
;
89 mediadb_filetype Filetype
;
92 char *pszPath
, *pszName
;
94 memset(stbuf
, 0, sizeof(struct stat
));
96 if (path
[0] == '/' && path
[1] == 0)
98 stbuf
->st_mode
= __S_IFDIR
|0555;
102 nMediaID
= mediadb_get_mediaid_from_path(
110 if (*pszMediaRoot
== 0)
112 stbuf
->st_mode
= __S_IFDIR
|0555;
113 r
= mediadb_media_get_properties_data(
118 if (MEDIADB_IS_SUCCESS(r
))
120 stbuf
->st_size
= nTotalSize
;
121 stbuf
->st_nlink
= nTotalFiles
;
124 r
= mediadb_media_get_properties(
131 if (MEDIADB_IS_SUCCESS(r
))
133 stbuf
->st_ctime
= nTimeAdded
;
134 stbuf
->st_atime
= nTimeAdded
;
135 stbuf
->st_mtime
= nTimeAdded
;
141 stbuf
->st_mode
= __S_IFREG
;
143 pszPath
= strdup(pszMediaRoot
);
144 pszName
= strrchr(pszPath
, '/');
153 r
= mediadb_file_get_properties(
161 if (MEDIADB_IS_SUCCESS(r
))
163 if (Filetype
== MEDIADB_FILETYPE_FILE
)
165 stbuf
->st_mode
= __S_IFREG
|0444;
167 else if (Filetype
== MEDIADB_FILETYPE_DIR
)
169 stbuf
->st_mode
= __S_IFDIR
|0444;
171 stbuf
->st_size
= nSize
;
172 stbuf
->st_ctime
= nTime
;
173 stbuf
->st_atime
= nTime
;
174 stbuf
->st_mtime
= nTime
;
183 struct context_filldir
186 fuse_dirfil_t filler
;
189 #define ctx ((struct context_filldir *)pUserContext)
192 mediadb_fuse_media_callback(
194 mediadb_uint nMediaID
,
195 mediadb_mediatype nType
,
197 const char *pszComment
,
198 mediadb_uint nTimeAdded
,
199 mediadb_uint nTotalFiles
,
200 mediadb_uint nTotalSize
,
201 mediadb_uint nLocationID
,
202 const char *pszLocation
210 entry
= (char *)malloc(s
+100);
212 sprintf(entry
, "%s #%u", pszName
, (unsigned int)nMediaID
);
214 for (pch
= entry
; *pch
!= 0 ; pch
++)
222 ctx
->filler(ctx
->h
, entry
, __S_IFREG
, 0);
228 mediadb_fuse_files_callback(
232 mediadb_filetype Filetype
,
236 if (Filetype
== MEDIADB_FILETYPE_FILE
)
238 ctx
->filler(ctx
->h
, pszName
, __S_IFREG
, 0);
240 else if (Filetype
== MEDIADB_FILETYPE_DIR
)
242 ctx
->filler(ctx
->h
, pszName
, __S_IFDIR
, 0);
248 static int mediadb_getdir(const char *path
, fuse_dirh_t h
, fuse_dirfil_t filler
)
252 struct context_filldir ctx
;
253 mediadb_uint nMediaID
;
254 const char * pszMediaRoot
;
259 if (strcmp(path
, "/") == 0)
261 r
= mediadb_media_get_all(
263 mediadb_fuse_media_callback
,
268 nMediaID
= mediadb_get_mediaid_from_path(
276 r
= mediadb_files_get(
280 mediadb_fuse_files_callback
,
287 static struct fuse_operations mediadb_oper
= {
288 .getattr
= mediadb_getattr
,
289 .getdir
= mediadb_getdir
,
292 int main(int argc
, char *argv
[])
297 /* Look into configuration file */
304 ret
= fuse_main(argc
, argv
, &mediadb_oper
);
314 mediadb_error_callback(
315 unsigned int nCritical
,
316 const char *pszErrorDescription
321 pszErrorDescription
);
323 if (nCritical
== MEDIADB_ERROR_CRITICAL
)