29 #include <sys/types.h>
32 #define VFS_SIG ('V' | ('F' << 8) | ('S' << 16))
68 static char last[256] =
"";
69 static int repeated = 0;
74 va_start (args, format);
75 vsnprintf (buf,
sizeof buf, format, args);
78 if (! strcmp (buf, last))
84 printf (
"VFS: (last message repeated %d times)\n", repeated);
98 file->handle = handle;
125 g_return_val_if_fail (path && mode,
NULL);
128 const char *
s = strstr (path,
"://");
129 g_return_val_if_fail (s,
NULL);
130 char scheme[s - path + 1];
131 strncpy (scheme, path, s - path);
132 scheme[s - path] = 0;
141 gchar buf[sub - path + 1];
142 memcpy (buf, path, sub - path);
145 void * handle = vtable->vfs_fopen_impl (buf, mode);
152 logger (
"VFS: <%p> open (mode %s) %s\n", file, mode, path);
166 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
169 logger (
"VFS: <%p> close\n", file);
173 if (file->base->vfs_fclose_impl(file) != 0)
178 memset (file, 0,
sizeof (
VFSFile));
195 g_return_val_if_fail (file && file->sig ==
VFS_SIG, 0);
197 int64_t readed = file->base->vfs_fread_impl (ptr, size, nmemb, file);
217 g_return_val_if_fail (file && file->sig ==
VFS_SIG, 0);
219 int64_t written = file->base->vfs_fwrite_impl (ptr, size, nmemb, file);
222 logger (
"VFS: <%p> write %"PRId64
" elements of size %"PRId64
" = "
223 "%"PRId64
"\n", file, nmemb, size, written);
237 g_return_val_if_fail (file && file->sig ==
VFS_SIG, EOF);
240 logger (
"VFS: <%p> getc\n", file);
242 return file->base->vfs_getc_impl(file);
255 g_return_val_if_fail (file && file->sig ==
VFS_SIG, EOF);
258 logger (
"VFS: <%p> ungetc\n", file);
260 return file->base->vfs_ungetc_impl(c, file);
281 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
284 logger (
"VFS: <%p> seek to %"PRId64
" from %s\n", file, offset, whence ==
285 SEEK_CUR ?
"current" : whence == SEEK_SET ?
"beginning" : whence ==
286 SEEK_END ?
"end" :
"invalid");
288 return file->base->vfs_fseek_impl(file, offset, whence);
299 g_return_if_fail (file && file->sig ==
VFS_SIG);
302 logger (
"VFS: <%p> rewind\n", file);
304 file->base->vfs_rewind_impl(file);
316 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
318 int64_t told = file->base->vfs_ftell_impl (file);
321 logger (
"VFS: <%p> tell = %"PRId64
"\n", file, told);
335 g_return_val_if_fail (file && file->sig ==
VFS_SIG,
TRUE);
337 bool_t eof = file->base->vfs_feof_impl (file);
340 logger (
"VFS: <%p> eof = %s\n", file, eof ?
"yes" :
"no");
354 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
357 logger (
"VFS: <%p> truncate to %"PRId64
"\n", file, length);
359 return file->base->vfs_ftruncate_impl(file, length);
370 g_return_val_if_fail (file && file->sig ==
VFS_SIG, -1);
372 int64_t size = file->base->vfs_fsize_impl (file);
375 logger (
"VFS: <%p> size = %"PRId64
"\n", file, size);
393 if (file->base->vfs_get_metadata_impl)
394 return file->base->vfs_get_metadata_impl(file, field);
408 if (strncmp (path,
"file://", 7))
419 if (lstat (path2, & st) < 0)
422 if (S_ISLNK (st.st_mode))
423 test &= ~VFS_IS_SYMLINK;
430 if (stat (path2, & st) < 0)
433 if (S_ISREG (st.st_mode))
435 if (S_ISDIR (st.st_mode))
437 if (st.st_mode & S_IXUSR)
460 if (stat(realfn, &info) == -1)
465 return (info.st_mode & S_IWUSR);
476 return strncmp (path,
"file://", 7) ?
TRUE :
FALSE;