30 #include <sys/types.h>
35 #define VFS_SIG ('V' | ('F' << 8) | ('S' << 16))
71 static char last[256] =
"";
72 static int repeated = 0;
77 va_start (args, format);
78 vsnprintf (buf,
sizeof buf, format, args);
81 if (! strcmp (buf, last))
87 printf (
"VFS: (last message repeated %d times)\n", repeated);
101 file->handle = handle;
128 g_return_val_if_fail (path && mode,
NULL);
131 const char *
s = strstr (path,
"://");
132 g_return_val_if_fail (s,
NULL);
133 char scheme[s - path + 1];
134 strncpy (scheme, path, s - path);
135 scheme[s - path] = 0;
144 gchar buf[sub - path + 1];
145 memcpy (buf, path, sub - path);
148 void * handle = vtable->vfs_fopen_impl (buf, mode);
155 logger (
"VFS: <%p> open (mode %s) %s\n", file, mode, path);
169 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
172 logger (
"VFS: <%p> close\n", file);
176 if (file->base->vfs_fclose_impl(file) != 0)
181 memset (file, 0,
sizeof (
VFSFile));
198 g_return_val_if_fail (file && file->sig ==
VFS_SIG, 0);
200 int64_t readed = file->base->vfs_fread_impl (ptr, size, nmemb, file);
220 g_return_val_if_fail (file && file->sig ==
VFS_SIG, 0);
222 int64_t written = file->base->vfs_fwrite_impl (ptr, size, nmemb, file);
225 logger (
"VFS: <%p> write %"PRId64
" elements of size %"PRId64
" = "
226 "%"PRId64
"\n", file, nmemb, size, written);
240 g_return_val_if_fail (file && file->sig ==
VFS_SIG, EOF);
243 logger (
"VFS: <%p> getc\n", file);
245 return file->base->vfs_getc_impl(file);
258 g_return_val_if_fail (file && file->sig ==
VFS_SIG, EOF);
261 logger (
"VFS: <%p> ungetc\n", file);
263 return file->base->vfs_ungetc_impl(c, file);
284 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
287 logger (
"VFS: <%p> seek to %"PRId64
" from %s\n", file, offset, whence ==
288 SEEK_CUR ?
"current" : whence == SEEK_SET ?
"beginning" : whence ==
289 SEEK_END ?
"end" :
"invalid");
291 return file->base->vfs_fseek_impl(file, offset, whence);
302 g_return_if_fail (file && file->sig ==
VFS_SIG);
305 logger (
"VFS: <%p> rewind\n", file);
307 file->base->vfs_rewind_impl(file);
319 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
321 int64_t told = file->base->vfs_ftell_impl (file);
324 logger (
"VFS: <%p> tell = %"PRId64
"\n", file, told);
338 g_return_val_if_fail (file && file->sig ==
VFS_SIG,
TRUE);
340 bool_t eof = file->base->vfs_feof_impl (file);
343 logger (
"VFS: <%p> eof = %s\n", file, eof ?
"yes" :
"no");
357 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
360 logger (
"VFS: <%p> truncate to %"PRId64
"\n", file, length);
362 return file->base->vfs_ftruncate_impl(file, length);
373 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
375 int64_t size = file->base->vfs_fsize_impl (file);
378 logger (
"VFS: <%p> size = %"PRId64
"\n", file, size);
396 if (file->base->vfs_get_metadata_impl)
397 return file->base->vfs_get_metadata_impl(file, field);
411 if (strncmp (path,
"file://", 7))
417 path2 = g_strdup(path);
419 bool_t ret = g_file_test (path2, test);
438 if (stat(realfn, &info) == -1)
443 return (info.st_mode & S_IWUSR);
454 return strncmp (path,
"file://", 7) ?
TRUE :
FALSE;