29 #include <sys/types.h>
34 #define VFS_SIG ('V' | ('F' << 8) | ('S' << 16))
70 static char last[256] =
"";
71 static int repeated = 0;
76 va_start (args, format);
77 vsnprintf (buf,
sizeof buf, format, args);
80 if (! strcmp (buf, last))
86 printf (
"VFS: (last message repeated %d times)\n", repeated);
100 file->handle = handle;
127 g_return_val_if_fail (path && mode,
NULL);
130 const char *
s = strstr (path,
"://");
131 g_return_val_if_fail (s,
NULL);
132 char scheme[s - path + 1];
133 strncpy (scheme, path, s - path);
134 scheme[s - path] = 0;
143 gchar buf[sub - path + 1];
144 memcpy (buf, path, sub - path);
147 void * handle = vtable->vfs_fopen_impl (buf, mode);
154 logger (
"VFS: <%p> open (mode %s) %s\n", file, mode, path);
168 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
171 logger (
"VFS: <%p> close\n", file);
175 if (file->base->vfs_fclose_impl(file) != 0)
180 memset (file, 0,
sizeof (
VFSFile));
197 g_return_val_if_fail (file && file->sig ==
VFS_SIG, 0);
199 int64_t readed = file->base->vfs_fread_impl (ptr, size, nmemb, file);
219 g_return_val_if_fail (file && file->sig ==
VFS_SIG, 0);
221 int64_t written = file->base->vfs_fwrite_impl (ptr, size, nmemb, file);
224 logger (
"VFS: <%p> write %"PRId64
" elements of size %"PRId64
" = "
225 "%"PRId64
"\n", file, nmemb, size, written);
239 g_return_val_if_fail (file && file->sig ==
VFS_SIG, EOF);
242 logger (
"VFS: <%p> getc\n", file);
244 return file->base->vfs_getc_impl(file);
257 g_return_val_if_fail (file && file->sig ==
VFS_SIG, EOF);
260 logger (
"VFS: <%p> ungetc\n", file);
262 return file->base->vfs_ungetc_impl(c, file);
283 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
286 logger (
"VFS: <%p> seek to %"PRId64
" from %s\n", file, offset, whence ==
287 SEEK_CUR ?
"current" : whence == SEEK_SET ?
"beginning" : whence ==
288 SEEK_END ?
"end" :
"invalid");
290 return file->base->vfs_fseek_impl(file, offset, whence);
301 g_return_if_fail (file && file->sig ==
VFS_SIG);
304 logger (
"VFS: <%p> rewind\n", file);
306 file->base->vfs_rewind_impl(file);
318 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
320 int64_t told = file->base->vfs_ftell_impl (file);
323 logger (
"VFS: <%p> tell = %"PRId64
"\n", file, told);
337 g_return_val_if_fail (file && file->sig ==
VFS_SIG,
TRUE);
339 bool_t eof = file->base->vfs_feof_impl (file);
342 logger (
"VFS: <%p> eof = %s\n", file, eof ?
"yes" :
"no");
356 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
359 logger (
"VFS: <%p> truncate to %"PRId64
"\n", file, length);
361 return file->base->vfs_ftruncate_impl(file, length);
372 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
374 int64_t size = file->base->vfs_fsize_impl (file);
377 logger (
"VFS: <%p> size = %"PRId64
"\n", file, size);
395 if (file->base->vfs_get_metadata_impl)
396 return file->base->vfs_get_metadata_impl(file, field);
410 if (strncmp (path,
"file://", 7))
416 path2 = g_strdup(path);
418 bool_t ret = g_file_test (path2, test);
437 if (stat(realfn, &info) == -1)
442 return (info.st_mode & S_IWUSR);
453 return strncmp (path,
"file://", 7) ?
TRUE :
FALSE;