From 21dea5024c2fba9bcbe080dbd917dd27562c1190 Mon Sep 17 00:00:00 2001 From: lace <> Date: Sun, 1 Jan 2006 07:24:34 +0000 Subject: [PATCH 1/1] Implemented sub-second W32 filesystem interface by new: CaptiveFileInfoObject - Fixed FUSE uninitialized sub-seconds fields. - Bugreported by: Frederic L. W. Meunier --- configure.ac | 8 + src/client/bug-replay/main.c | 21 ++- src/client/cmdline/cmd_info.c | 7 +- src/client/cmdline/cmd_ls.c | 8 +- src/client/cmdline/file_info.c | 58 +++--- src/client/cmdline/file_info.h | 5 +- src/client/fuse/Makefile.am | 4 +- src/client/fuse/capfuse_captive_file_info_object.c | 164 +++++++++++++++++ ...leinfo.h => capfuse_captive_file_info_object.h} | 12 +- src/client/fuse/gnomevfsfileinfo.c | 118 ------------- src/client/fuse/op_chmod.c | 16 +- src/client/fuse/op_getattr.c | 12 +- src/client/fuse/op_readdir.c | 16 +- src/client/fuse/op_utime.c | 27 ++- src/client/gnomevfs/gnome-vfs-method.c | 55 +++++- src/libcaptive/client/Makefile.am | 1 + src/libcaptive/client/directory-parent.c | 8 +- src/libcaptive/client/directory-slave.c | 95 +++++----- src/libcaptive/client/directory.c | 7 +- src/libcaptive/client/directory.h | 4 +- src/libcaptive/client/file-info.c | 95 ++++++++++ src/libcaptive/client/file-parent.c | 16 +- src/libcaptive/client/file-slave.c | 196 +++++++++++++-------- src/libcaptive/client/file.c | 12 +- src/libcaptive/client/file.h | 4 +- src/libcaptive/include/captive/Makefile.am | 4 +- src/libcaptive/include/captive/client-directory.h | 4 +- src/libcaptive/include/captive/client-file-info.h | 60 +++++++ src/libcaptive/include/captive/client-file.h | 5 +- src/libcaptive/include/captive/rtl-time.h | 38 ++++ src/libcaptive/rtl/Makefile.am | 3 + src/libcaptive/rtl/time.c | 100 +++++++++++ src/libcaptive/sandbox/FileInfo.c | 120 ++++++++----- src/libcaptive/sandbox/FileInfo.h | 10 +- src/libcaptive/sandbox/parent-Directory.c | 43 +++-- src/libcaptive/sandbox/parent-Directory.h | 2 +- src/libcaptive/sandbox/parent-File.c | 31 +++- src/libcaptive/sandbox/parent-File.h | 4 +- src/libcaptive/sandbox/sandbox.idl | 12 +- src/libcaptive/sandbox/server-Directory.c | 18 +- src/libcaptive/sandbox/server-File.c | 31 ++-- 41 files changed, 1003 insertions(+), 451 deletions(-) create mode 100644 src/client/fuse/capfuse_captive_file_info_object.c rename src/client/fuse/{gnomevfsfileinfo.h => capfuse_captive_file_info_object.h} (67%) delete mode 100644 src/client/fuse/gnomevfsfileinfo.c create mode 100644 src/libcaptive/client/file-info.c create mode 100644 src/libcaptive/include/captive/client-file-info.h create mode 100644 src/libcaptive/include/captive/rtl-time.h create mode 100644 src/libcaptive/rtl/time.c diff --git a/configure.ac b/configure.ac index bbddb7d..51d8f47 100644 --- a/configure.ac +++ b/configure.ac @@ -336,6 +336,14 @@ if test x$enable_fuse != xno;then fi ]) fi +if $have_fuse;then + AC_CHECK_MEMBERS([struct stat.st_atim]) + AC_CHECK_MEMBERS([struct stat.st_atimensec]) + AC_CHECK_MEMBERS([struct stat.st_mtim]) + AC_CHECK_MEMBERS([struct stat.st_mtimensec]) + AC_CHECK_MEMBERS([struct stat.st_ctim]) + AC_CHECK_MEMBERS([struct stat.st_ctimensec]) +fi AM_CONDITIONAL(ENABLE_FUSE,[ $have_fuse ]) # Avoid default backward compatibility mode - see the heading of: FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=22" diff --git a/src/client/bug-replay/main.c b/src/client/bug-replay/main.c index 2c4b5cf..4e6d5c3 100644 --- a/src/client/bug-replay/main.c +++ b/src/client/bug-replay/main.c @@ -388,11 +388,13 @@ CaptiveVfsVolumeInfo volume_info; continue; } if (!xmlStrcmp(xml_node->name,BAD_CAST "directory_read")) { -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; captive_directory_object=CAPTIVE_DIRECTORY_OBJECT(object); - errgnomevfsresult=captive_directory_read(captive_directory_object,&file_info); + errgnomevfsresult=captive_directory_read(captive_directory_object,&captive_file_info_object); g_assert(!strcmp(gnome_vfs_result_to_string(errgnomevfsresult),GET_PROP_STRING("result"))); + if (GNOME_VFS_OK==errgnomevfsresult) + g_object_unref(captive_file_info_object); continue; } if (!xmlStrcmp(xml_node->name,BAD_CAST "directory_remove")) { @@ -492,23 +494,26 @@ GnomeVFSFileOffset offset; continue; } if (!xmlStrcmp(xml_node->name,BAD_CAST "file_file_info_get")) { -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; captive_file_object=CAPTIVE_FILE_OBJECT(object); - errgnomevfsresult=captive_file_file_info_get(captive_file_object,&file_info); + errgnomevfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object); g_assert(!strcmp(gnome_vfs_result_to_string(errgnomevfsresult),GET_PROP_STRING("result"))); + if (GNOME_VFS_OK==errgnomevfsresult) + g_object_unref(captive_file_info_object); continue; } if (!xmlStrcmp(xml_node->name,BAD_CAST "file_file_info_set")) { -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; captive_file_object=CAPTIVE_FILE_OBJECT(object); - /* FIXME: We do not have 'file_info' content in the bug file! */ - errgnomevfsresult=captive_file_file_info_get(captive_file_object,&file_info); + /* FIXME: We do not have 'captive_file_info_object' content in the bug file! */ + errgnomevfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object); g_assert(errgnomevfsresult==GNOME_VFS_OK); - errgnomevfsresult=captive_file_file_info_set(captive_file_object,&file_info, + errgnomevfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object, GET_PROP_GINT64("mask")); g_assert(!strcmp(gnome_vfs_result_to_string(errgnomevfsresult),GET_PROP_STRING("result"))); + g_object_unref(captive_file_info_object); continue; } if (!xmlStrcmp(xml_node->name,BAD_CAST "file_truncate")) { diff --git a/src/client/cmdline/cmd_info.c b/src/client/cmdline/cmd_info.c index f937429..a58e173 100644 --- a/src/client/cmdline/cmd_info.c +++ b/src/client/cmdline/cmd_info.c @@ -53,7 +53,7 @@ const struct poptOption cmd_info_table[]={ void cmd_info(const char **cmd_argv,GError **errp) { CaptiveFileObject *captive_file_object; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; const gchar *filepath; g_return_if_fail(!errp || !*errp); @@ -73,13 +73,14 @@ const gchar *filepath; if (!errvfsresult_to_gerr(errp,captive_file_file_info_get( captive_file_object, /* captive_file_object */ - &file_info))) { /* file_info */ + &captive_file_info_object))) { /* file_info */ err_cleanup(errp); g_set_error(errp,CMDLINE_CMD_INFO_ERROR,CMDLINE_CMD_INFO_ERROR_GETTING_FILE_INFO, _("Cannot get file information about: %s"),CMD_LOCALE_FROM_UTF8_ALLOCA(filepath)); goto err_unref; } - file_info_dump_full(&file_info,errp); + cmdline_captive_file_info_object_dump_full(captive_file_info_object,errp); + g_object_unref(captive_file_info_object); if (*errp) goto err_unref; diff --git a/src/client/cmdline/cmd_ls.c b/src/client/cmdline/cmd_ls.c index 0ed1b35..dc1479f 100644 --- a/src/client/cmdline/cmd_ls.c +++ b/src/client/cmdline/cmd_ls.c @@ -53,7 +53,7 @@ const struct poptOption cmd_ls_table[]={ void cmd_ls(const char **cmd_argv,GError **errp) { CaptiveDirectoryObject *captive_directory_object; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; GnomeVFSResult errvfsresult; const gchar *targetdir; @@ -73,11 +73,11 @@ const gchar *targetdir; while (GNOME_VFS_OK==(errvfsresult=captive_directory_read( captive_directory_object, /* captive_directory_object */ - &file_info))) { /* file_info */ - file_info_dump_line(&file_info,errp); + &captive_file_info_object))) { /* captive_file_info_object_return */ + cmdline_captive_file_info_object_dump_line(captive_file_info_object,errp); + g_object_unref(captive_file_info_object); if (*errp) goto err_unref; - /* FIXME: Memory leaked 'file_info'? */ } if (GNOME_VFS_ERROR_EOF!=errvfsresult) { gboolean errbool; diff --git a/src/client/cmdline/file_info.c b/src/client/cmdline/file_info.c index eab9d62..f3fc342 100644 --- a/src/client/cmdline/file_info.c +++ b/src/client/cmdline/file_info.c @@ -42,47 +42,61 @@ GQuark r=0; } -void file_info_dump_line(const GnomeVFSFileInfo *file_info,GError **errp) +void cmdline_captive_file_info_object_dump_line(CaptiveFileInfoObject *captive_file_info_object,GError **errp) { const gchar *file_type,*file_perms; gchar *file_size; + g_return_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object)); g_return_if_fail(!errp || !*errp); - switch (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : file_info->type) { + switch (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : captive_file_info_object->p.type) { case GNOME_VFS_FILE_TYPE_REGULAR: file_type="FILE"; break; case GNOME_VFS_FILE_TYPE_DIRECTORY: file_type="DIR "; break; case GNOME_VFS_FILE_TYPE_SOCKET: file_type="DEV "; break; default: file_type="??? "; break; } - if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)) + if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)) file_perms="???"; - else if (file_info->permissions & GNOME_VFS_PERM_USER_WRITE) + else if (captive_file_info_object->p.permissions & GNOME_VFS_PERM_USER_WRITE) file_perms="r/w"; else file_perms="r/o"; - if (file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE) - file_size=g_strdup_printf("%8" GNOME_VFS_SIZE_FORMAT_STR,file_info->size); + if (captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE) + file_size=g_strdup_printf("%8" GNOME_VFS_SIZE_FORMAT_STR,captive_file_info_object->p.size); else file_size=g_strdup_printf("%8s","???"); /* type pm sz nm */ - printf("[%s] %s %s %s\n",file_type,file_perms,file_size,CMD_LOCALE_FROM_UTF8_ALLOCA(file_info->name)); + printf("[%s] %s %s %s\n",file_type,file_perms,file_size,CMD_LOCALE_FROM_UTF8_ALLOCA(captive_file_info_object->p.name)); g_free(file_size); } +static void timespec_split_print(time_t sec,guint nsec) +{ +char *ctime_buf,*s; + + g_return_if_fail(sec!=0); + g_return_if_fail(nsec<1000000000); + + ctime_buf=ctime(&sec); + if ((s=strchr(ctime_buf,'\n'))) + *s='\0'; + printf("%s +%09u nsec\n",ctime_buf,(unsigned)nsec); +} -void file_info_dump_full(const GnomeVFSFileInfo *file_info,GError **errp) +void cmdline_captive_file_info_object_dump_full(CaptiveFileInfoObject *captive_file_info_object,GError **errp) { + g_return_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object)); g_return_if_fail(!errp || !*errp); - printf("Filename: %s\n",CMD_LOCALE_FROM_UTF8_ALLOCA(file_info->name)); + printf("Filename: %s\n",CMD_LOCALE_FROM_UTF8_ALLOCA(captive_file_info_object->p.name)); fputs("File type: ",stdout); - switch (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : file_info->type) { + switch (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : captive_file_info_object->p.type) { case GNOME_VFS_FILE_TYPE_REGULAR: puts("REGULAR"); break; case GNOME_VFS_FILE_TYPE_DIRECTORY: puts("DIRECTORY"); break; case GNOME_VFS_FILE_TYPE_SOCKET: puts("SOCKET"); break; @@ -90,40 +104,40 @@ void file_info_dump_full(const GnomeVFSFileInfo *file_info,GError **errp) } fputs("File size: ",stdout); - if (file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE) - printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",file_info->size); + if (captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE) + printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",captive_file_info_object->p.size); else puts("???"); fputs("Block count: ",stdout); - if (file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT) - printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",file_info->block_count); + if (captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT) + printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",captive_file_info_object->p.block_count); else puts("???"); fputs("Writable?: ",stdout); - if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)) + if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)) puts("???"); - else if (file_info->permissions & GNOME_VFS_PERM_USER_WRITE) + else if (captive_file_info_object->p.permissions & GNOME_VFS_PERM_USER_WRITE) puts("read/write"); else puts("read/only"); fputs("Access-time (atime): ",stdout); - if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_ATIME)) + if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_ATIME)) puts("???"); else - fputs(ctime(&file_info->atime),stdout); + timespec_split_print(captive_file_info_object->p.atime,captive_file_info_object->atime_nsec); fputs("Modification-time (mtime): ",stdout); - if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_MTIME)) + if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_MTIME)) puts("???"); else - fputs(ctime(&file_info->mtime),stdout); + timespec_split_print(captive_file_info_object->p.mtime,captive_file_info_object->mtime_nsec); fputs("Change-time (ctime): ",stdout); - if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_CTIME)) + if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_CTIME)) puts("???"); else - fputs(ctime(&file_info->ctime),stdout); + timespec_split_print(captive_file_info_object->p.ctime,captive_file_info_object->ctime_nsec); } diff --git a/src/client/cmdline/file_info.h b/src/client/cmdline/file_info.h index 8881837..5c7ac66 100644 --- a/src/client/cmdline/file_info.h +++ b/src/client/cmdline/file_info.h @@ -23,6 +23,7 @@ #include #include +#include #define CMDLINE_FILE_INFO_ERROR (cmdline_file_info_error_quark()) @@ -33,8 +34,8 @@ typedef enum { } CmdlineFileInfoError; -void file_info_dump_line(const GnomeVFSFileInfo *file_info,GError **errp); -void file_info_dump_full(const GnomeVFSFileInfo *file_info,GError **errp); +void cmdline_captive_file_info_object_dump_line(CaptiveFileInfoObject *captive_file_info_object,GError **errp); +void cmdline_captive_file_info_object_dump_full(CaptiveFileInfoObject *captive_file_info_object,GError **errp); #endif /* _CAPTIVE_CLIENT_CMDLINE_FILE_INFO_H */ diff --git a/src/client/fuse/Makefile.am b/src/client/fuse/Makefile.am index ee1bbc8..78fcb62 100644 --- a/src/client/fuse/Makefile.am +++ b/src/client/fuse/Makefile.am @@ -60,8 +60,8 @@ mount_captive_SOURCES= \ op_utime.h \ gnomevfsresult.c \ gnomevfsresult.h \ - gnomevfsfileinfo.c \ - gnomevfsfileinfo.h \ + capfuse_captive_file_info_object.c \ + capfuse_captive_file_info_object.h \ main.c \ main.h mount_captive_CFLAGS= $(GNOME_VFS_CFLAGS) $(LIBXML_CFLAGS) $(FUSE_CFLAGS) diff --git a/src/client/fuse/capfuse_captive_file_info_object.c b/src/client/fuse/capfuse_captive_file_info_object.c new file mode 100644 index 0000000..ca50361 --- /dev/null +++ b/src/client/fuse/capfuse_captive_file_info_object.c @@ -0,0 +1,164 @@ +/* $Id$ + * Client fuse interface handling of 'GnomeVFSFileInfo' for libcaptive + * Copyright (C) 2005 Jan Kratochvil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; exactly version 2 of June 1991 is required + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "config.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include "capfuse_captive_file_info_object.h" /* self */ +#include "gnomevfsresult.h" +#include "main.h" + + +static CaptiveVfsVolumeInfo volume_info; +static gboolean volume_info_valid=FALSE; + + +int capfuse_captive_file_info_object_to_stat(struct stat *stat,CaptiveFileInfoObject *captive_file_info_object) +{ +guint nsec; + + g_return_val_if_fail(stat!=NULL,-EINVAL); + g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),-EINVAL); + + if (!volume_info_valid) { +GnomeVFSResult errvfsresult; + + if (GNOME_VFS_OK!=(errvfsresult=captive_vfs_volume_info_get(capfuse_captive_vfs_object,&volume_info))) + return -gnomevfsresult_to_errno(errvfsresult); + volume_info_valid=TRUE; + } + + stat->st_mode=0; + + if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE) + switch (captive_file_info_object->p.type) { + case GNOME_VFS_FILE_TYPE_REGULAR: + stat->st_mode|=S_IFREG; + if (1 /* !private */) + stat->st_mode|=0444; + break; + case GNOME_VFS_FILE_TYPE_DIRECTORY: + stat->st_mode|=S_IFDIR; + if (1 /* !private */) + stat->st_mode|=0555; + break; + default: + g_warning("Unknown GnomeVFSFileInfo.type=%d of: %s",(int)captive_file_info_object->p.type,captive_file_info_object->p.name); + return -EINVAL; + } + if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS) + stat->st_mode|=captive_file_info_object->p.permissions & 0777; + else + stat->st_mode|=0600; + + if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT)) + stat->st_nlink=1; + else + stat->st_nlink=captive_file_info_object->p.link_count; + + stat->st_uid=0; /* we own the file */ + stat->st_gid=0; /* we own the file */ + + if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE)) + stat->st_size=0; + else + stat->st_size=captive_file_info_object->p.size; + + if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME)) + capfuse_timespec_split_get(&stat->st_atime,&nsec); + else { + stat->st_atime=captive_file_info_object->p.atime; + nsec=captive_file_info_object->atime_nsec; + } +#if defined(HAVE_STRUCT_STAT_ST_ATIM) + g_assert(&stat->st_atim.tv_sec==&stat->st_atime); + stat->st_atim.tv_nsec=nsec; +#elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC) + stat->st_atimensec=nsec; +#endif + + if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME)) + capfuse_timespec_split_get(&stat->st_mtime,&nsec); + else { + stat->st_mtime=captive_file_info_object->p.mtime; + nsec=captive_file_info_object->mtime_nsec; + } +#if defined(HAVE_STRUCT_STAT_ST_MTIM) + g_assert(&stat->st_mtim.tv_sec==&stat->st_mtime); + stat->st_mtim.tv_nsec=nsec; +#elif defined(HAVE_STRUCT_STAT_ST_MTIMENSEC) + stat->st_mtimensec=nsec; +#endif + + if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME)) + capfuse_timespec_split_get(&stat->st_ctime,&nsec); + else { + stat->st_ctime=captive_file_info_object->p.ctime; + nsec=captive_file_info_object->ctime_nsec; + } +#if defined(HAVE_STRUCT_STAT_ST_CTIM) + g_assert(&stat->st_ctim.tv_sec==&stat->st_ctime); + stat->st_ctim.tv_nsec=nsec; +#elif defined(HAVE_STRUCT_STAT_ST_CTIMENSEC) + stat->st_ctimensec=nsec; +#endif + + stat->st_blksize=volume_info.block_size; + + if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)) { + /* Rounding? */ + /* 0? */ + stat->st_blocks=stat->st_size/volume_info.block_size; + } + else + stat->st_blocks=captive_file_info_object->p.block_count; + + stat->st_dev=0; + stat->st_rdev=0; /* Never to be used. */ + stat->st_ino=0; + + return 0; +} + + +void capfuse_timespec_split_get(time_t *sec_return,guint *nsec_return) +{ +int errint; +struct timeval timeval; + + g_return_if_fail(sec_return!=NULL); + g_return_if_fail(nsec_return!=NULL); + + errint=gettimeofday( + &timeval, /* (struct timeval *)tv */ + NULL); /* (struct timezone *)tz */ + g_assert(!errint); + + *sec_return=timeval.tv_sec; + /* FIXME: Where to get 'usec' precision? */ + *nsec_return=timeval.tv_usec*1000; +} diff --git a/src/client/fuse/gnomevfsfileinfo.h b/src/client/fuse/capfuse_captive_file_info_object.h similarity index 67% rename from src/client/fuse/gnomevfsfileinfo.h rename to src/client/fuse/capfuse_captive_file_info_object.h index f37098c..e00fee7 100644 --- a/src/client/fuse/gnomevfsfileinfo.h +++ b/src/client/fuse/capfuse_captive_file_info_object.h @@ -17,15 +17,17 @@ */ -#ifndef _CAPTIVE_CLIENT_FUSE_GNOMEVFSFILEINFO_H -#define _CAPTIVE_CLIENT_FUSE_GNOMEVFSFILEINFO_H 1 +#ifndef _CAPTIVE_CLIENT_FUSE_CAPFUSE_CAPTIVE_FILE_INFO_OBJECT_H +#define _CAPTIVE_CLIENT_FUSE_CAPFUSE_CAPTIVE_FILE_INFO_OBJECT_H 1 -#include #include +#include -int gnomevfsfileinfo_to_stat(struct stat *stat,const GnomeVFSFileInfo *file_info); +int capfuse_captive_file_info_object_to_stat(struct stat *stat,CaptiveFileInfoObject *captive_file_info_object); +void capfuse_timespec_split_get(time_t *sec_return,guint *nsec_return); -#endif /* _CAPTIVE_CLIENT_FUSE_GNOMEVFSFILEINFO_H */ + +#endif /* _CAPTIVE_CLIENT_FUSE_CAPFUSE_CAPTIVE_FILE_INFO_OBJECT_H */ diff --git a/src/client/fuse/gnomevfsfileinfo.c b/src/client/fuse/gnomevfsfileinfo.c deleted file mode 100644 index 4f07b76..0000000 --- a/src/client/fuse/gnomevfsfileinfo.c +++ /dev/null @@ -1,118 +0,0 @@ -/* $Id$ - * Client fuse interface handling of 'GnomeVFSFileInfo' for libcaptive - * Copyright (C) 2005 Jan Kratochvil - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; exactly version 2 of June 1991 is required - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "config.h" - -#include -#include -#include -#include -#include -#include - -#include - -#include "gnomevfsresult.h" /* self */ -#include "main.h" - - -static CaptiveVfsVolumeInfo volume_info; -static gboolean volume_info_valid=FALSE; - - -int gnomevfsfileinfo_to_stat(struct stat *stat,const GnomeVFSFileInfo *file_info) -{ - g_return_val_if_fail(stat!=NULL,-EINVAL); - g_return_val_if_fail(file_info!=NULL,-EINVAL); - - if (!volume_info_valid) { -GnomeVFSResult errvfsresult; - - if (GNOME_VFS_OK!=(errvfsresult=captive_vfs_volume_info_get(capfuse_captive_vfs_object,&volume_info))) - return -gnomevfsresult_to_errno(errvfsresult); - volume_info_valid=TRUE; - } - - stat->st_mode=0; - - if (file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE) - switch (file_info->type) { - case GNOME_VFS_FILE_TYPE_REGULAR: - stat->st_mode|=S_IFREG; - if (1 /* !private */) - stat->st_mode|=0444; - break; - case GNOME_VFS_FILE_TYPE_DIRECTORY: - stat->st_mode|=S_IFDIR; - if (1 /* !private */) - stat->st_mode|=0555; - break; - default: - g_warning("Unknown GnomeVFSFileInfo.type=%d of: %s",(int)file_info->type,file_info->name); - return -EINVAL; - } - if (file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS) - stat->st_mode|=file_info->permissions & 0777; - else - stat->st_mode|=0600; - - if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT)) - stat->st_nlink=1; - else - stat->st_nlink=file_info->link_count; - - stat->st_uid=0; /* we own the file */ - stat->st_gid=0; /* we own the file */ - - if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE)) - stat->st_size=0; - else - stat->st_size=file_info->size; - - if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME)) - stat->st_atime=time(NULL); - else - stat->st_atime=file_info->atime; - - if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME)) - stat->st_mtime=time(NULL); - else - stat->st_mtime=file_info->mtime; - - if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME)) - stat->st_ctime=time(NULL); - else - stat->st_ctime=file_info->ctime; - - stat->st_blksize=volume_info.block_size; - - if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)) { - /* Rounding? */ - /* 0? */ - stat->st_blocks=stat->st_size/volume_info.block_size; - } - else - stat->st_blocks=file_info->block_count; - - stat->st_dev=0; - stat->st_rdev=0; /* Never to be used. */ - stat->st_ino=0; - - return 0; -} diff --git a/src/client/fuse/op_chmod.c b/src/client/fuse/op_chmod.c index e09e6c3..3813a67 100644 --- a/src/client/fuse/op_chmod.c +++ b/src/client/fuse/op_chmod.c @@ -25,18 +25,18 @@ #include #include #include +#include #include "op_chmod.h" /* self */ #include "main.h" #include "gnomevfsresult.h" -#include "gnomevfsfileinfo.h" int op_chmod(const char *path,mode_t mode) { CaptiveFileObject *captive_file_object; GnomeVFSResult errvfsresult; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(path!=NULL,-EINVAL); @@ -51,12 +51,18 @@ GnomeVFSFileInfo file_info; if (GNOME_VFS_OK!=(errvfsresult=captive_file_new_open(&captive_file_object,capfuse_captive_vfs_object,path,0))) return -gnomevfsresult_to_errno(errvfsresult); - file_info.valid_fields=0 + if (GNOME_VFS_OK!=(errvfsresult=captive_file_info_object_new(&captive_file_info_object))) { + g_object_unref(captive_file_object); + return -gnomevfsresult_to_errno(errvfsresult); + } + + captive_file_info_object->p.valid_fields=0 |GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS |GNOME_VFS_FILE_INFO_FIELDS_ACCESS; - file_info.permissions=mode; - errvfsresult=captive_file_file_info_set(captive_file_object,&file_info,GNOME_VFS_SET_FILE_INFO_PERMISSIONS); + captive_file_info_object->p.permissions=mode; + errvfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,GNOME_VFS_SET_FILE_INFO_PERMISSIONS); + g_object_unref(captive_file_info_object); g_object_unref(captive_file_object); if (GNOME_VFS_OK!=errvfsresult) return -gnomevfsresult_to_errno(errvfsresult); diff --git a/src/client/fuse/op_getattr.c b/src/client/fuse/op_getattr.c index 071027e..f72a8a9 100644 --- a/src/client/fuse/op_getattr.c +++ b/src/client/fuse/op_getattr.c @@ -29,14 +29,14 @@ #include "op_getattr.h" /* self */ #include "main.h" #include "gnomevfsresult.h" -#include "gnomevfsfileinfo.h" +#include "capfuse_captive_file_info_object.h" int op_getattr(const char *path,struct stat *buf) { CaptiveFileObject *captive_file_object; GnomeVFSResult errvfsresult; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; int errint; g_return_val_if_fail(path!=NULL,-EINVAL); @@ -45,15 +45,13 @@ int errint; if (GNOME_VFS_OK!=(errvfsresult=captive_file_new_open(&captive_file_object,capfuse_captive_vfs_object,path,0))) return -gnomevfsresult_to_errno(errvfsresult); - /* Pre-clear to take care of any fields not touched by libcaptive there. */ - CAPTIVE_MEMZERO(&file_info); - errvfsresult=captive_file_file_info_get(captive_file_object,&file_info); + errvfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object); g_object_unref(captive_file_object); if (GNOME_VFS_OK!=errvfsresult) return -gnomevfsresult_to_errno(errvfsresult); - errint=gnomevfsfileinfo_to_stat(buf,&file_info); - gnome_vfs_file_info_clear(&file_info); + errint=capfuse_captive_file_info_object_to_stat(buf,captive_file_info_object); + g_object_unref(captive_file_info_object); return errint; } diff --git a/src/client/fuse/op_readdir.c b/src/client/fuse/op_readdir.c index 5bec35f..6aceb66 100644 --- a/src/client/fuse/op_readdir.c +++ b/src/client/fuse/op_readdir.c @@ -28,7 +28,7 @@ #include "op_readdir.h" /* self */ #include "main.h" #include "gnomevfsresult.h" -#include "gnomevfsfileinfo.h" +#include "capfuse_captive_file_info_object.h" /* int (*fuse_fill_dir_t)(void *buf,const char *name,const struct stat *stbuf,off_t off); */ @@ -37,7 +37,7 @@ int op_readdir(const char *path,void *buf,fuse_fill_dir_t fill_dir,off_t off,str { CaptiveDirectoryObject *captive_directory_object; GnomeVFSResult errvfsresult; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(path!=NULL,-EINVAL); g_return_val_if_fail(fill_dir!=NULL,-EINVAL); @@ -46,23 +46,21 @@ GnomeVFSFileInfo file_info; captive_directory_object=(gpointer)fi->fh; g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),-EINVAL); - /* Pre-clear to take care of any fields not touched by libcaptive there. */ - CAPTIVE_MEMZERO(&file_info); - gnome_vfs_file_info_clear(&file_info); while (GNOME_VFS_OK==(errvfsresult=captive_directory_read( captive_directory_object, /* captive_directory_object */ - &file_info))) { /* file_info */ + &captive_file_info_object))) { /* captive_file_info_object */ struct stat stat; int errint; - if ((errint=gnomevfsfileinfo_to_stat(&stat,&file_info))) + errint=capfuse_captive_file_info_object_to_stat(&stat,captive_file_info_object); + g_object_unref(captive_file_info_object); + if (errint) return errint; errint=(*fill_dir)( buf, /* buf; opaque */ - file_info.name, /* name */ + captive_file_info_object->p.name, /* name */ &stat, /* stbuf */ 0); /* off; operation mode 1 - /(*readdir) */ - gnome_vfs_file_info_clear(&file_info); if (errint) { /* FIXME: Is it right? Examples do so. */ break; diff --git a/src/client/fuse/op_utime.c b/src/client/fuse/op_utime.c index 99f74fb..22b9386 100644 --- a/src/client/fuse/op_utime.c +++ b/src/client/fuse/op_utime.c @@ -26,18 +26,19 @@ #include #include #include +#include #include "op_utime.h" /* self */ #include "main.h" #include "gnomevfsresult.h" -#include "gnomevfsfileinfo.h" +#include "capfuse_captive_file_info_object.h" int op_utime(const char *path,struct utimbuf *buf) { CaptiveFileObject *captive_file_object; GnomeVFSResult errvfsresult; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(path!=NULL,-EINVAL); g_return_val_if_fail(buf!=NULL,-EINVAL); @@ -48,22 +49,30 @@ GnomeVFSFileInfo file_info; GNOME_VFS_OPEN_WRITE|GNOME_VFS_OPEN_RANDOM))) return -gnomevfsresult_to_errno(errvfsresult); - file_info.valid_fields=0 + if (GNOME_VFS_OK!=(errvfsresult=captive_file_info_object_new(&captive_file_info_object))) { + g_object_unref(captive_file_object); + return -gnomevfsresult_to_errno(errvfsresult); + } + + captive_file_info_object->p.valid_fields=0 |GNOME_VFS_FILE_INFO_FIELDS_ATIME |GNOME_VFS_FILE_INFO_FIELDS_MTIME |GNOME_VFS_FILE_INFO_FIELDS_CTIME; - file_info.atime=buf->actime; - file_info.mtime=buf->modtime; - file_info.ctime=time(NULL); + captive_file_info_object->p.atime=buf->actime; + captive_file_info_object->atime_nsec=0; + captive_file_info_object->p.mtime=buf->modtime; + captive_file_info_object->mtime_nsec=0; + capfuse_timespec_split_get(&captive_file_info_object->p.ctime,&captive_file_info_object->ctime_nsec); /* Do not: * It is probably not GnomeVFS compliant but still libcaptive compatible. * * GnomeVFS looks as assuming all the three fields set. * * GnomeVFS also does not check 'valid_fields' at all. - * file_info.ctime=0; * Just sanity for sure. * - * file_info.valid_fields&=~GNOME_VFS_FILE_INFO_FIELDS_CTIME; + * captive_file_info_object->p.ctime=0; * Just sanity for sure. * + * captive_file_info_object->p.valid_fields&=~GNOME_VFS_FILE_INFO_FIELDS_CTIME; * as utime() syscall should really update 'ctime' to the current time. */ - errvfsresult=captive_file_file_info_set(captive_file_object,&file_info,GNOME_VFS_SET_FILE_INFO_TIME); + errvfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,GNOME_VFS_SET_FILE_INFO_TIME); + g_object_unref(captive_file_info_object); g_object_unref(captive_file_object); if (GNOME_VFS_OK!=errvfsresult) return -gnomevfsresult_to_errno(errvfsresult); diff --git a/src/client/gnomevfs/gnome-vfs-method.c b/src/client/gnomevfs/gnome-vfs-method.c index 447925b..6506a05 100644 --- a/src/client/gnomevfs/gnome-vfs-method.c +++ b/src/client/gnomevfs/gnome-vfs-method.c @@ -217,6 +217,7 @@ static GnomeVFSResult captive_gnomevfs_read_directory(GnomeVFSMethod *method, { GnomeVFSResult errvfsresult; CaptiveDirectoryObject *captive_directory_object; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_directory_object=(CaptiveDirectoryObject *)method_handle; @@ -224,10 +225,17 @@ CaptiveDirectoryObject *captive_directory_object; g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); G_LOCK(libcaptive); - errvfsresult=captive_directory_read(captive_directory_object,file_info); + errvfsresult=captive_directory_read(captive_directory_object,&captive_file_info_object); G_UNLOCK(libcaptive); + if (GNOME_VFS_OK!=errvfsresult) + return errvfsresult; - return errvfsresult; + gnome_vfs_file_info_copy(file_info,&captive_file_info_object->p); + G_LOCK(libcaptive); + g_object_unref(captive_file_info_object); + G_UNLOCK(libcaptive); + + return GNOME_VFS_OK; } @@ -491,6 +499,7 @@ static GnomeVFSResult captive_gnomevfs_get_file_info(GnomeVFSMethod *method, GnomeVFSResult errvfsresult; CaptiveVfsObject *captive_vfs_object; CaptiveFileObject *captive_file_object; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); @@ -510,9 +519,17 @@ CaptiveFileObject *captive_file_object; return errvfsresult; G_LOCK(libcaptive); - errvfsresult=captive_file_file_info_get(captive_file_object,file_info); + errvfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object); G_UNLOCK(libcaptive); + if (GNOME_VFS_OK!=errvfsresult) + goto fail_g_object_unref_captive_file_object; + gnome_vfs_file_info_copy(file_info,&captive_file_info_object->p); + G_LOCK(libcaptive); + g_object_unref(captive_file_info_object); + G_UNLOCK(libcaptive); + +fail_g_object_unref_captive_file_object: G_LOCK(libcaptive); g_object_unref(captive_file_object); G_UNLOCK(libcaptive); @@ -526,6 +543,7 @@ GnomeVFSResult captive_gnomevfs_get_file_info_from_handle(GnomeVFSMethod *method { GnomeVFSResult errvfsresult; CaptiveFileObject *captive_file_object; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_file_object=(CaptiveFileObject *)method_handle; @@ -534,10 +552,17 @@ CaptiveFileObject *captive_file_object; /* handle 'options & GNOME_VFS_FILE_INFO_GET_MIME_TYPE'? */ G_LOCK(libcaptive); - errvfsresult=captive_file_file_info_get(captive_file_object,file_info); + errvfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object); G_UNLOCK(libcaptive); + if (GNOME_VFS_OK!=errvfsresult) + return errvfsresult; - return errvfsresult; + gnome_vfs_file_info_copy(file_info,&captive_file_info_object->p); + G_LOCK(libcaptive); + g_object_unref(captive_file_info_object); + G_UNLOCK(libcaptive); + + return GNOME_VFS_OK; } @@ -661,6 +686,7 @@ GnomeVFSResult captive_gnomevfs_set_file_info(GnomeVFSMethod *method, GnomeVFSResult errvfsresult; CaptiveVfsObject *captive_vfs_object; CaptiveFileObject *captive_file_object; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); @@ -679,9 +705,26 @@ CaptiveFileObject *captive_file_object; return errvfsresult; G_LOCK(libcaptive); - errvfsresult=captive_file_file_info_set(captive_file_object,info,mask); + errvfsresult=captive_file_info_object_new(&captive_file_info_object); + G_UNLOCK(libcaptive); + if (errvfsresult!=GNOME_VFS_OK) + goto fail_g_object_unref_captive_file_object; + + captive_file_info_object->p=*info; + /* Unsupported by GnomeVFS, see: http://bugzilla.gnome.org/show_bug.cgi?id=325427 */ + captive_file_info_object->atime_nsec=0; + captive_file_info_object->mtime_nsec=0; + captive_file_info_object->ctime_nsec=0; + + G_LOCK(libcaptive); + errvfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,mask); + G_UNLOCK(libcaptive); + + G_LOCK(libcaptive); + g_object_unref(captive_file_info_object); G_UNLOCK(libcaptive); +fail_g_object_unref_captive_file_object: G_LOCK(libcaptive); g_object_unref(captive_file_object); G_UNLOCK(libcaptive); diff --git a/src/libcaptive/client/Makefile.am b/src/libcaptive/client/Makefile.am index 55a700a..a45f90c 100644 --- a/src/libcaptive/client/Makefile.am +++ b/src/libcaptive/client/Makefile.am @@ -39,6 +39,7 @@ libclient_la_SOURCES= \ file-slave.h \ file.c \ file.h \ + file-info.c \ giochannel-blind.c \ giochannel-blind.h \ giochannel-subrange.c \ diff --git a/src/libcaptive/client/directory-parent.c b/src/libcaptive/client/directory-parent.c index 796a05b..e52f386 100644 --- a/src/libcaptive/client/directory-parent.c +++ b/src/libcaptive/client/directory-parent.c @@ -31,7 +31,7 @@ static gpointer captive_directory_parent_object_parent_class=NULL; static GnomeVFSResult captive_directory_parent_close(CaptiveDirectoryObject *captive_directory_object); static GnomeVFSResult captive_directory_parent_read - (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info); + (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return); static GnomeVFSResult captive_directory_parent_remove(CaptiveDirectoryObject *captive_directory_object); @@ -288,14 +288,14 @@ CaptiveDirectoryParentObject *captive_directory_parent_object; static GnomeVFSResult captive_directory_parent_read - (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info) + (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return) { CaptiveDirectoryParentObject *captive_directory_parent_object; GnomeVFSResult r; gint retried=0; g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_directory_object); @@ -303,7 +303,7 @@ gint retried=0; if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object)))) return r; if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE - !=(r=captive_sandbox_parent_directory_read(captive_directory_parent_object,file_info))) + !=(r=captive_sandbox_parent_directory_read(captive_directory_parent_object,captive_file_info_object_return))) return r; } while (!retried++); return r; diff --git a/src/libcaptive/client/directory-slave.c b/src/libcaptive/client/directory-slave.c index 1a6f6b6..3e8c4be 100644 --- a/src/libcaptive/client/directory-slave.c +++ b/src/libcaptive/client/directory-slave.c @@ -33,13 +33,14 @@ #include "captive/usecount.h" #include "vfs.h" #include "vfs-slave.h" +#include "captive/rtl-time.h" static gpointer captive_directory_slave_object_parent_class=NULL; static GnomeVFSResult captive_directory_slave_close(CaptiveDirectoryObject *captive_directory_object); static GnomeVFSResult captive_directory_slave_read - (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info); + (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return); static GnomeVFSResult captive_directory_slave_remove(CaptiveDirectoryObject *captive_directory_object); @@ -218,16 +219,21 @@ CaptiveDirectorySlaveObject *captive_directory_slave_object; } -static GnomeVFSResult FileIdBothDirInformation_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info, +static GnomeVFSResult FileIdBothDirInformation_to_CaptiveFileInfoObject( + CaptiveFileInfoObject **captive_file_info_object_return, FILE_ID_BOTH_DIR_INFORMATION *FileIdBothDirInformation,IO_STATUS_BLOCK *IoStatusBlock) { UNICODE_STRING FileName_UnicodeString; -ULONG tmp_ULONG; +GnomeVFSResult errvfsresult; +CaptiveFileInfoObject *captive_file_info_object; - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_GENERIC); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_GENERIC); g_return_val_if_fail(FileIdBothDirInformation!=NULL,GNOME_VFS_ERROR_GENERIC); g_return_val_if_fail(IoStatusBlock!=NULL,GNOME_VFS_ERROR_GENERIC); + errvfsresult=captive_file_info_object_new(&captive_file_info_object); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + g_return_val_if_fail(NT_SUCCESS(IoStatusBlock->Status),GNOME_VFS_ERROR_GENERIC); /* do not exceed the returned buffer by this record; Redundant now, see below. */ g_assert((gpointer)(((char *)FileIdBothDirInformation)+FileIdBothDirInformation->NextEntryOffset) @@ -235,7 +241,7 @@ ULONG tmp_ULONG; /* '->NextEntryOffset' is ==0 as we used 'ReturnSingleEntry==TRUE' */ g_assert(FileIdBothDirInformation->NextEntryOffset==0); - file_info->valid_fields=0; + captive_file_info_object->p.valid_fields=0; FileName_UnicodeString.Length=FileIdBothDirInformation->FileNameLength; FileName_UnicodeString.MaximumLength=FileIdBothDirInformation->FileNameLength @@ -246,65 +252,74 @@ ULONG tmp_ULONG; FileIdBothDirInformation->FileName[FileIdBothDirInformation->FileNameLength /sizeof(*FileIdBothDirInformation->FileName)]=0; /* 0-terminate it */ FileName_UnicodeString.Buffer=FileIdBothDirInformation->FileName; - file_info->name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString); - /* '->name' assumed for 'file_info->valid_fields' */ + captive_file_info_object->p.name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString); + /* '->name' assumed for 'captive_file_info_object->p.valid_fields' */ /* FIXME: What is 'FILE_ATTRIBUTE_NORMAL'? */ switch (FileIdBothDirInformation->FileAttributes & (0 | FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) { - case 0: file_info->type=GNOME_VFS_FILE_TYPE_REGULAR; break; - case FILE_ATTRIBUTE_DIRECTORY: file_info->type=GNOME_VFS_FILE_TYPE_DIRECTORY; break; - case FILE_ATTRIBUTE_DEVICE: file_info->type=GNOME_VFS_FILE_TYPE_SOCKET; + case 0: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_REGULAR; break; + case FILE_ATTRIBUTE_DIRECTORY: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_DIRECTORY; break; + case FILE_ATTRIBUTE_DEVICE: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_SOCKET; /* or GNOME_VFS_FILE_TYPE_CHARACTER_DEVICE or GNOME_VFS_FILE_TYPE_BLOCK_DEVICE ? */ break; - default: file_info->type=GNOME_VFS_FILE_TYPE_UNKNOWN; break; + default: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_UNKNOWN; break; } - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE; /* we use 0600 for r/w files, 0400 for FILE_ATTRIBUTE_READONLY */ - file_info->permissions=GNOME_VFS_PERM_USER_READ; - if (file_info->type==GNOME_VFS_FILE_TYPE_DIRECTORY) - file_info->permissions|=GNOME_VFS_PERM_USER_EXEC; + captive_file_info_object->p.permissions=GNOME_VFS_PERM_USER_READ; + if (captive_file_info_object->p.type==GNOME_VFS_FILE_TYPE_DIRECTORY) + captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_EXEC; if (!(FileIdBothDirInformation->FileAttributes & FILE_ATTRIBUTE_READONLY)) - file_info->permissions|=GNOME_VFS_PERM_USER_WRITE; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS; + captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_WRITE; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS; - file_info->size=FileIdBothDirInformation->EndOfFile.QuadPart; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE; + captive_file_info_object->p.size=FileIdBothDirInformation->EndOfFile.QuadPart; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE; - file_info->block_count=FileIdBothDirInformation->AllocationSize.QuadPart/512; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT; + captive_file_info_object->p.block_count=FileIdBothDirInformation->AllocationSize.QuadPart/512; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT; - file_info->flags=GNOME_VFS_FILE_FLAGS_LOCAL; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS; + captive_file_info_object->p.flags=GNOME_VFS_FILE_FLAGS_LOCAL; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS; if (FileIdBothDirInformation->LastAccessTime.QuadPart) { /* it may be 0 if not set */ - if (RtlTimeToSecondsSince1970(&FileIdBothDirInformation->LastAccessTime,&tmp_ULONG)) { - file_info->atime=tmp_ULONG; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME; - } +struct timespec timespec; + + errvfsresult=Time_to_timespec(×pec,&FileIdBothDirInformation->LastAccessTime); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + captive_file_info_object->p.atime=timespec.tv_sec; + captive_file_info_object->atime_nsec=timespec.tv_nsec; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME; } /* it may be 0 if not set */ if (FileIdBothDirInformation->LastWriteTime.QuadPart || FileIdBothDirInformation->ChangeTime.QuadPart) { - if (RtlTimeToSecondsSince1970( +struct timespec timespec; + + errvfsresult=Time_to_timespec(×pec, /* take the more recent (==bigger) time: */ (FileIdBothDirInformation->LastWriteTime.QuadPart > FileIdBothDirInformation->ChangeTime.QuadPart - ? &FileIdBothDirInformation->LastWriteTime : &FileIdBothDirInformation->ChangeTime), - &tmp_ULONG)) { - file_info->mtime=tmp_ULONG; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME; - } + ? &FileIdBothDirInformation->LastWriteTime : &FileIdBothDirInformation->ChangeTime)); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + captive_file_info_object->p.mtime=timespec.tv_sec; + captive_file_info_object->mtime_nsec=timespec.tv_nsec; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME; } if (FileIdBothDirInformation->CreationTime.QuadPart) { /* it may be 0 if not set */ - if (RtlTimeToSecondsSince1970(&FileIdBothDirInformation->CreationTime,&tmp_ULONG)) { - file_info->ctime=tmp_ULONG; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME; - } +struct timespec timespec; + + errvfsresult=Time_to_timespec(×pec,&FileIdBothDirInformation->CreationTime); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + captive_file_info_object->p.ctime=timespec.tv_sec; + captive_file_info_object->ctime_nsec=timespec.tv_nsec; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME; } + *captive_file_info_object_return=captive_file_info_object; return GNOME_VFS_OK; } @@ -385,7 +400,7 @@ HANDLE dir_Handle; static GnomeVFSResult captive_directory_slave_read - (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info) + (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return) { CaptiveDirectorySlaveObject *captive_directory_slave_object; NTSTATUS err; @@ -395,7 +410,7 @@ FILE_BOTH_DIR_INFORMATION *FileBothDirInformation; GnomeVFSResult errvfsresult; g_return_val_if_fail(CAPTIVE_DIRECTORY_SLAVE_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_directory_slave_object=CAPTIVE_DIRECTORY_SLAVE_OBJECT(captive_directory_object); @@ -473,7 +488,7 @@ retry: default: g_assert_not_reached(); } - errvfsresult=FileIdBothDirInformation_to_GnomeVFSFileInfo(file_info,FileIdBothDirInformation, + errvfsresult=FileIdBothDirInformation_to_CaptiveFileInfoObject(captive_file_info_object_return,FileIdBothDirInformation, &dir_IoStatusBlock); g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); diff --git a/src/libcaptive/client/directory.c b/src/libcaptive/client/directory.c index eacc458..2f5a1ac 100644 --- a/src/libcaptive/client/directory.c +++ b/src/libcaptive/client/directory.c @@ -140,13 +140,14 @@ CaptiveVfsObject *captive_directory_ref_vfs(CaptiveDirectoryObject *captive_dire } -GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info) +GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object, + CaptiveFileInfoObject **captive_file_info_object_return) { g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); return (*CAPTIVE_DIRECTORY_OBJECT_GET_CLASS(captive_directory_object)->read) - (captive_directory_object,file_info); + (captive_directory_object,captive_file_info_object_return); } diff --git a/src/libcaptive/client/directory.h b/src/libcaptive/client/directory.h index 59da556..4dc099f 100644 --- a/src/libcaptive/client/directory.h +++ b/src/libcaptive/client/directory.h @@ -25,6 +25,7 @@ #include #include "captive/client-vfs.h" #include "captive/client-directory.h" +#include "captive/client-file-info.h" G_BEGIN_DECLS @@ -38,7 +39,8 @@ struct _CaptiveDirectoryObject { struct _CaptiveDirectoryObjectClass { GObjectClass parent_class; - GnomeVFSResult (*read)(CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info); + GnomeVFSResult (*read)(CaptiveDirectoryObject *captive_directory_object, + CaptiveFileInfoObject **captive_file_info_object_return); GnomeVFSResult (*remove)(CaptiveDirectoryObject *captive_directory_object); }; diff --git a/src/libcaptive/client/file-info.c b/src/libcaptive/client/file-info.c new file mode 100644 index 0000000..ee3ba78 --- /dev/null +++ b/src/libcaptive/client/file-info.c @@ -0,0 +1,95 @@ +/* $Id$ + * captive wrapper of GnomeVFSFileInfo interface to reactos + * Copyright (C) 2005 Jan Kratochvil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; exactly version 2 of June 1991 is required + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "config.h" + +#include "captive/client-file-info.h" /* self */ +#include +#include "vfs.h" +#include "reactos/ntos/types.h" /* for ULONG */ + + +struct _CaptiveFileInfoObjectClass { + GObjectClass parent_class; + }; + + +static gpointer captive_file_info_object_parent_class=NULL; + + +static void captive_file_info_object_finalize(CaptiveFileInfoObject *captive_file_info_object) +{ + g_return_if_fail(captive_file_info_object!=NULL); + + gnome_vfs_file_info_clear(&captive_file_info_object->p); + + G_OBJECT_CLASS(captive_file_info_object_parent_class)->finalize((GObject *)captive_file_info_object); +} + + +static void captive_file_info_object_class_init(CaptiveFileInfoObjectClass *class) +{ +GObjectClass *gobject_class=G_OBJECT_CLASS(class); + + captive_file_info_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class))); + gobject_class->finalize=(void (*)(GObject *object))captive_file_info_object_finalize; +} + + +static void captive_file_info_object_init(CaptiveFileInfoObject *captive_file_info_object) +{ +} + + +GType captive_file_info_object_get_type(void) +{ +static GType captive_file_info_object_type=0; + + if (!captive_file_info_object_type) { +static const GTypeInfo captive_file_info_object_info={ + sizeof(CaptiveFileInfoObjectClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)captive_file_info_object_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(CaptiveFileInfoObject), + 5, /* n_preallocs */ + (GInstanceInitFunc)captive_file_info_object_init, + }; + + captive_file_info_object_type=g_type_register_static(G_TYPE_OBJECT, + "CaptiveFileInfoObject",&captive_file_info_object_info,0); + } + + return captive_file_info_object_type; +} + + +GnomeVFSResult captive_file_info_object_new(CaptiveFileInfoObject **captive_file_info_object_return) +{ + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + + *captive_file_info_object_return=g_object_new( + CAPTIVE_FILE_INFO_TYPE_OBJECT, /* object_type */ + NULL); /* first_property_name; FIXME: support properties */ + g_assert(*captive_file_info_object_return!=NULL); + + return GNOME_VFS_OK; +} diff --git a/src/libcaptive/client/file-parent.c b/src/libcaptive/client/file-parent.c index cf680b6..8fdf41e 100644 --- a/src/libcaptive/client/file-parent.c +++ b/src/libcaptive/client/file-parent.c @@ -42,9 +42,9 @@ static GnomeVFSResult captive_file_parent_seek static GnomeVFSResult captive_file_parent_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return); static GnomeVFSResult captive_file_parent_remove(CaptiveFileObject *captive_file_object); static GnomeVFSResult captive_file_parent_file_info_get - (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info); + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject **captive_file_info_object_return); static GnomeVFSResult captive_file_parent_file_info_set - (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask); + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask); static GnomeVFSResult captive_file_parent_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size); static GnomeVFSResult captive_file_parent_move (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace); @@ -485,14 +485,14 @@ gint retried=0; static GnomeVFSResult captive_file_parent_file_info_get - (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info) + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject **captive_file_info_object_return) { CaptiveFileParentObject *captive_file_parent_object; GnomeVFSResult r; gint retried=0; g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object); @@ -500,7 +500,7 @@ gint retried=0; if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object)))) return r; if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE - !=(r=captive_sandbox_parent_file_file_info_get(captive_file_parent_object,file_info))) + !=(r=captive_sandbox_parent_file_file_info_get(captive_file_parent_object,captive_file_info_object_return))) return r; } while (!retried++); return r; @@ -508,14 +508,14 @@ gint retried=0; static GnomeVFSResult captive_file_parent_file_info_set - (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask) + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask) { CaptiveFileParentObject *captive_file_parent_object; GnomeVFSResult r; gint retried=0; g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS); captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object); @@ -523,7 +523,7 @@ gint retried=0; if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object)))) return r; if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE - !=(r=captive_sandbox_parent_file_file_info_set(captive_file_parent_object,info,mask))) { + !=(r=captive_sandbox_parent_file_file_info_set(captive_file_parent_object,captive_file_info_object,mask))) { if (GNOME_VFS_OK==r) captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object)); return r; diff --git a/src/libcaptive/client/file-slave.c b/src/libcaptive/client/file-slave.c index 8193e38..08bc4d5 100644 --- a/src/libcaptive/client/file-slave.c +++ b/src/libcaptive/client/file-slave.c @@ -38,6 +38,7 @@ #include "vfs.h" #include "vfs-slave.h" #include "../cc/sharedcachemap.h" +#include "captive/rtl-time.h" /* Config: */ @@ -70,9 +71,9 @@ static GnomeVFSResult captive_file_slave_seek static GnomeVFSResult captive_file_slave_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return); static GnomeVFSResult captive_file_slave_remove(CaptiveFileObject *captive_file_object); static GnomeVFSResult captive_file_slave_file_info_get - (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info); + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject **captive_file_info_object_return); static GnomeVFSResult captive_file_slave_file_info_set - (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask); + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask); static GnomeVFSResult captive_file_slave_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size); static GnomeVFSResult captive_file_slave_move (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace); @@ -357,10 +358,11 @@ CaptiveFileSlaveObject *captive_file_slave_object; NTSTATUS err; IO_STATUS_BLOCK file_IoStatusBlock; LARGE_INTEGER file_offset; -GnomeVFSFileInfo file_info; +CaptiveFileInfoObject *captive_file_info_object; GnomeVFSFileSize endoffile_wanted; GnomeVFSResult errvfsresult; static GnomeVFSFileSize total_written=0; +gboolean extension_needed; g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); @@ -380,9 +382,12 @@ static GnomeVFSFileSize total_written=0; return GNOME_VFS_ERROR_TOO_BIG; endoffile_wanted=captive_file_slave_object->offset+num_bytes; if (GNOME_VFS_OK!=(errvfsresult=captive_file_slave_file_info_get( - CAPTIVE_FILE_OBJECT(captive_file_slave_object),&file_info))) + CAPTIVE_FILE_OBJECT(captive_file_slave_object),&captive_file_info_object))) return errvfsresult; - if (file_info.sizep.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE); + extension_needed=(captive_file_info_object->p.sizeFileNameLength; @@ -523,8 +528,8 @@ UNICODE_STRING FileName_UnicodeString; FileNameInformationStruct->FileName[FileNameInformationStruct->FileNameLength /sizeof(*FileNameInformationStruct->FileName)]=0; /* 0-terminate it */ FileName_UnicodeString.Buffer=FileNameInformationStruct->FileName; - file_info->name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString); - /* '->name' assumed for 'file_info->valid_fields' */ + captive_file_info_object->p.name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString); + /* '->name' assumed for 'captive_file_info_object->p.valid_fields' */ return GNOME_VFS_OK; } @@ -533,57 +538,66 @@ UNICODE_STRING FileName_UnicodeString; /* Use 'FileBasicInformationStruct' identifier instead of the logical 'FileBasicInformation' * to prevent override of enum member 'FileBasicInformation' */ -static GnomeVFSResult FileBasicInformationStruct_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info, - FILE_BASIC_INFORMATION *FileBasicInformationStruct) +static GnomeVFSResult FileBasicInformationStruct_to_CaptiveFileInfoObject_in_place + (CaptiveFileInfoObject *captive_file_info_object,FILE_BASIC_INFORMATION *FileBasicInformationStruct) { -BOOLEAN errBOOLEAN; -ULONG tmp_ULONG; +GnomeVFSResult errvfsresult; + + g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS); /* FIXME: What is 'FILE_ATTRIBUTE_NORMAL'? */ switch (FileBasicInformationStruct->FileAttributes & (0 | FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) { - case 0: file_info->type=GNOME_VFS_FILE_TYPE_REGULAR; break; - case FILE_ATTRIBUTE_DIRECTORY: file_info->type=GNOME_VFS_FILE_TYPE_DIRECTORY; break; - case FILE_ATTRIBUTE_DEVICE: file_info->type=GNOME_VFS_FILE_TYPE_SOCKET; + case 0: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_REGULAR; break; + case FILE_ATTRIBUTE_DIRECTORY: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_DIRECTORY; break; + case FILE_ATTRIBUTE_DEVICE: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_SOCKET; /* or GNOME_VFS_FILE_TYPE_CHARACTER_DEVICE or GNOME_VFS_FILE_TYPE_BLOCK_DEVICE ? */ break; - default: file_info->type=GNOME_VFS_FILE_TYPE_UNKNOWN; break; + default: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_UNKNOWN; break; } - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE; /* we use 0600 for r/w files, 0400 for FILE_ATTRIBUTE_READONLY */ - file_info->permissions=GNOME_VFS_PERM_USER_READ; - if (file_info->type==GNOME_VFS_FILE_TYPE_DIRECTORY) - file_info->permissions|=GNOME_VFS_PERM_USER_EXEC; + captive_file_info_object->p.permissions=GNOME_VFS_PERM_USER_READ; + if (captive_file_info_object->p.type==GNOME_VFS_FILE_TYPE_DIRECTORY) + captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_EXEC; if (!(FileBasicInformationStruct->FileAttributes & FILE_ATTRIBUTE_READONLY)) - file_info->permissions|=GNOME_VFS_PERM_USER_WRITE; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS; + captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_WRITE; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS; if (FileBasicInformationStruct->LastAccessTime.QuadPart) { /* it may be 0 if not set */ - errBOOLEAN=RtlTimeToSecondsSince1970(&FileBasicInformationStruct->LastAccessTime,&tmp_ULONG); - g_assert(errBOOLEAN==TRUE); - file_info->atime=tmp_ULONG; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME; +struct timespec timespec; + + errvfsresult=Time_to_timespec(×pec,&FileBasicInformationStruct->LastAccessTime); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + captive_file_info_object->p.atime=timespec.tv_sec; + captive_file_info_object->atime_nsec=timespec.tv_nsec; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME; } /* it may be 0 if not set */ if (FileBasicInformationStruct->LastWriteTime.QuadPart || FileBasicInformationStruct->ChangeTime.QuadPart) { - errBOOLEAN=RtlTimeToSecondsSince1970( +struct timespec timespec; + + errvfsresult=Time_to_timespec(×pec, /* take the more recent (==bigger) time: */ (FileBasicInformationStruct->LastWriteTime.QuadPart > FileBasicInformationStruct->ChangeTime.QuadPart - ? &FileBasicInformationStruct->LastWriteTime : &FileBasicInformationStruct->ChangeTime), - &tmp_ULONG); - g_assert(errBOOLEAN==TRUE); - file_info->mtime=tmp_ULONG; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME; + ? &FileBasicInformationStruct->LastWriteTime : &FileBasicInformationStruct->ChangeTime)); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + captive_file_info_object->p.mtime=timespec.tv_sec; + captive_file_info_object->mtime_nsec=timespec.tv_nsec; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME; } if (FileBasicInformationStruct->CreationTime.QuadPart) { /* it may be 0 if not set */ - errBOOLEAN=RtlTimeToSecondsSince1970(&FileBasicInformationStruct->CreationTime,&tmp_ULONG); - g_assert(errBOOLEAN==TRUE); - file_info->ctime=tmp_ULONG; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME; +struct timespec timespec; + + errvfsresult=Time_to_timespec(×pec,&FileBasicInformationStruct->CreationTime); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + captive_file_info_object->p.ctime=timespec.tv_sec; + captive_file_info_object->ctime_nsec=timespec.tv_nsec; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME; } return GNOME_VFS_OK; @@ -593,22 +607,25 @@ ULONG tmp_ULONG; /* Use 'FileStandardInformationStruct' identifier instead of the logical 'FileStandardInformation' * to prevent override of enum member 'FileStandardInformation' */ -static GnomeVFSResult FileStandardInformationStruct_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info, - FILE_STANDARD_INFORMATION *FileStandardInformationStruct) +static GnomeVFSResult FileStandardInformationStruct_to_CaptiveFileInfoObject_in_place + (CaptiveFileInfoObject *captive_file_info_object,FILE_STANDARD_INFORMATION *FileStandardInformationStruct) { - file_info->size=FileStandardInformationStruct->EndOfFile.QuadPart; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE; + g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + + captive_file_info_object->p.size=FileStandardInformationStruct->EndOfFile.QuadPart; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE; - file_info->block_count=FileStandardInformationStruct->AllocationSize.QuadPart/512; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT; + captive_file_info_object->p.block_count=FileStandardInformationStruct->AllocationSize.QuadPart/512; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT; return GNOME_VFS_OK; } GnomeVFSResult captive_file_slave_file_info_get(CaptiveFileObject *captive_file_object, - GnomeVFSFileInfo *file_info) + CaptiveFileInfoObject **captive_file_info_object_return) { +CaptiveFileInfoObject *captive_file_info_object; CaptiveFileSlaveObject *captive_file_slave_object; NTSTATUS err; IO_STATUS_BLOCK file_IoStatusBlock; @@ -620,22 +637,23 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION) +0x1000 /* max 'FileName' length, 255 should be enough */ * sizeof(WCHAR /* *FILE_ALL_INFORMATION.NameInformation.FileName */ )]; g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_file_slave_object=CAPTIVE_FILE_SLAVE_OBJECT(captive_file_object); g_return_val_if_fail(captive_file_slave_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + errvfsresult=captive_file_info_object_new(&captive_file_info_object); + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); + /* ntfs.sys of NT-5.1sp1 has *(FILE_BASIC_INFORMATION *)FILE_ALL_INFORMATION.BasicInformation * size 0x28 although reactos includes and all the information says 0x24. * fastfat.sys of NT-5.1sp1 also has the 'official' sizeof 0x24. * It would be a bit of heuristic to correctly detect its expected sizeof. */ - file_info->valid_fields=0; - - file_info->flags=GNOME_VFS_FILE_FLAGS_LOCAL; - file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS; + captive_file_info_object->p.flags=GNOME_VFS_FILE_FLAGS_LOCAL; + captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS; /* query NameInformation */ FileNameInformationStruct=(void *)QueryFile_buf; @@ -650,7 +668,8 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION) return errvfsresult; g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC); g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - errvfsresult=FileNameInformationStruct_to_GnomeVFSFileInfo(file_info,FileNameInformationStruct); + errvfsresult=FileNameInformationStruct_to_CaptiveFileInfoObject_in_place(captive_file_info_object, + FileNameInformationStruct); g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); /* query BasicInformation */ @@ -665,7 +684,8 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION) return errvfsresult; g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC); g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - errvfsresult=FileBasicInformationStruct_to_GnomeVFSFileInfo(file_info,FileBasicInformationStruct); + errvfsresult=FileBasicInformationStruct_to_CaptiveFileInfoObject_in_place(captive_file_info_object, + FileBasicInformationStruct); g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); /* query StandardInformation */ @@ -680,21 +700,23 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION) return errvfsresult; g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC); g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - errvfsresult=FileStandardInformationStruct_to_GnomeVFSFileInfo(file_info,FileStandardInformationStruct); + errvfsresult=FileStandardInformationStruct_to_CaptiveFileInfoObject_in_place(captive_file_info_object, + FileStandardInformationStruct); g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); + *captive_file_info_object_return=captive_file_info_object; captive_leave(); return GNOME_VFS_OK; } -GnomeVFSResult captive_file_slave_file_info_set(CaptiveFileObject *captive_file_object, - const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask) +static GnomeVFSResult captive_file_slave_file_info_set + (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask) { CaptiveFileSlaveObject *captive_file_slave_object; g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS); captive_file_slave_object=CAPTIVE_FILE_SLAVE_OBJECT(captive_file_object); @@ -710,7 +732,7 @@ NTSTATUS err=STATUS_SUCCESS; /* Prevent: ... might be used uninitialized in this GnomeVFSResult errvfsresult; /* non-existing dirname assertion */ - name_dirname=g_path_get_dirname(info->name); + name_dirname=g_path_get_dirname(captive_file_info_object->p.name); if (*name_dirname) { g_assert_not_reached(); errvfsresult=GNOME_VFS_ERROR_BAD_PARAMETERS; @@ -718,14 +740,14 @@ GnomeVFSResult errvfsresult; } /* fully-matching basename assertion */ - name_basename=g_path_get_basename(info->name); - if (strcmp(name_basename,info->name)) { + name_basename=g_path_get_basename(captive_file_info_object->p.name); + if (strcmp(name_basename,captive_file_info_object->p.name)) { g_assert_not_reached(); errvfsresult=GNOME_VFS_ERROR_BAD_PARAMETERS; goto err_free_name_dirname; } - name_UnicodeString=captive_utf8_to_UnicodeString_alloca(info->name); + name_UnicodeString=captive_utf8_to_UnicodeString_alloca(captive_file_info_object->p.name); FileRenameInformation_struct_len=sizeof(*FileRenameInformation_structp) +name_UnicodeString->MaximumLength; /* ==Length+(0-terminator); is the terminator needed? */ @@ -778,31 +800,49 @@ NTSTATUS err; if (mask & GNOME_VFS_SET_FILE_INFO_PERMISSIONS) { FileBasicInformationp->FileAttributes&=~FILE_ATTRIBUTE_READONLY; - g_assert(info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS); - if (!(info->permissions&0200)) + g_assert(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS); + if (!(captive_file_info_object->p.permissions&0200)) FileBasicInformationp->FileAttributes|=FILE_ATTRIBUTE_READONLY; } if (mask & GNOME_VFS_SET_FILE_INFO_TIME) { - g_assert(info->valid_fields & (0 + g_assert(captive_file_info_object->p.valid_fields & (0 | GNOME_VFS_FILE_INFO_FIELDS_ATIME - | GNOME_VFS_FILE_INFO_FIELDS_MTIME)); - /* !GNOME_VFS_FILE_INFO_FIELDS_CTIME is used by FUSE op_utime(). */ - if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) { - RtlSecondsSince1970ToTime( - info->atime, /* SecondsSince1970 */ - &FileBasicInformationp->LastAccessTime); /* Time */ + | GNOME_VFS_FILE_INFO_FIELDS_MTIME + | GNOME_VFS_FILE_INFO_FIELDS_CTIME)); + if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) { +struct timespec timespec; +GnomeVFSResult errvfsresult; + + timespec.tv_sec=captive_file_info_object->p.atime; + timespec.tv_nsec=captive_file_info_object->atime_nsec; + errvfsresult=timespec_to_Time( + &FileBasicInformationp->LastAccessTime, /* Time */ + ×pec); /* timespec */ + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); } - if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) { - RtlSecondsSince1970ToTime( - info->mtime, /* SecondsSince1970 */ - &FileBasicInformationp->LastWriteTime); /* Time */ + if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) { +struct timespec timespec; +GnomeVFSResult errvfsresult; + + timespec.tv_sec=captive_file_info_object->p.mtime; + timespec.tv_nsec=captive_file_info_object->mtime_nsec; + errvfsresult=timespec_to_Time( + &FileBasicInformationp->LastWriteTime, /* Time */ + ×pec); /* timespec */ + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); FileBasicInformationp->ChangeTime=FileBasicInformationp->LastWriteTime; } - if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) { - RtlSecondsSince1970ToTime( - info->ctime, /* SecondsSince1970 */ - &FileBasicInformationp->CreationTime); /* Time */ + if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) { +struct timespec timespec; +GnomeVFSResult errvfsresult; + + timespec.tv_sec=captive_file_info_object->p.ctime; + timespec.tv_nsec=captive_file_info_object->ctime_nsec; + errvfsresult=timespec_to_Time( + &FileBasicInformationp->CreationTime, /* Time */ + ×pec); /* timespec */ + g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult); } } @@ -816,7 +856,7 @@ NTSTATUS err; } if (mask & GNOME_VFS_SET_FILE_INFO_OWNER) { - /* FIXME: g_assert(info->valid_fields & ???); */ + /* FIXME: g_assert(captive_file_info_object->p.valid_fields & ???); */ /* owner ignored for W32 */ } diff --git a/src/libcaptive/client/file.c b/src/libcaptive/client/file.c index b1268be..ce6d4e2 100644 --- a/src/libcaptive/client/file.c +++ b/src/libcaptive/client/file.c @@ -196,24 +196,24 @@ GnomeVFSResult captive_file_remove(CaptiveFileObject *captive_file_object) GnomeVFSResult captive_file_file_info_get(CaptiveFileObject *captive_file_object, - GnomeVFSFileInfo *file_info) + CaptiveFileInfoObject **captive_file_info_object_return) { g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_get) - (captive_file_object,file_info); + (captive_file_object,captive_file_info_object_return); } GnomeVFSResult captive_file_file_info_set(CaptiveFileObject *captive_file_object, - const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask) + CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask) { g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS); return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_set) - (captive_file_object,info,mask); + (captive_file_object,captive_file_info_object,mask); } diff --git a/src/libcaptive/client/file.h b/src/libcaptive/client/file.h index e4f1af5..23826f9 100644 --- a/src/libcaptive/client/file.h +++ b/src/libcaptive/client/file.h @@ -46,9 +46,9 @@ struct _CaptiveFileObjectClass { GnomeVFSResult (*tell)(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return); GnomeVFSResult (*remove)(CaptiveFileObject *captive_file_object); GnomeVFSResult (*file_info_get)(CaptiveFileObject *captive_file_object, - GnomeVFSFileInfo *file_info); + CaptiveFileInfoObject **captive_file_info_object_return); GnomeVFSResult (*file_info_set)(CaptiveFileObject *captive_file_object, - const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask); + CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask); GnomeVFSResult (*truncate)(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size); GnomeVFSResult (*move)(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace); }; diff --git a/src/libcaptive/include/captive/Makefile.am b/src/libcaptive/include/captive/Makefile.am index ca75698..d89e46b 100644 --- a/src/libcaptive/include/captive/Makefile.am +++ b/src/libcaptive/include/captive/Makefile.am @@ -1,6 +1,6 @@ # $Id$ # automake source for include/captive directory Makefile -# Copyright (C) 2002-2003 Jan Kratochvil +# Copyright (C) 2002-2005 Jan Kratochvil # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ pkginclude_HEADERS+= \ client-directory.h \ client-file.h \ client-vfs.h \ + client-file-info.h \ client.h \ config2.h \ ldr.h \ @@ -37,6 +38,7 @@ pkginclude_HEADERS+= \ options.h \ ps_reactos.h \ rtl-file.h \ + rtl-time.h \ signal.h \ storage.h \ unicode.h \ diff --git a/src/libcaptive/include/captive/client-directory.h b/src/libcaptive/include/captive/client-directory.h index 82f34ae..9f9ce31 100644 --- a/src/libcaptive/include/captive/client-directory.h +++ b/src/libcaptive/include/captive/client-directory.h @@ -24,6 +24,7 @@ #include #include #include /* for GnomeVFSFileInfo */ +#include "captive/client-file-info.h" #include "captive/client-vfs.h" @@ -46,7 +47,8 @@ GnomeVFSResult captive_directory_new_open(CaptiveDirectoryObject **captive_direc GnomeVFSResult captive_directory_new_make(CaptiveDirectoryObject **captive_directory_object_return, CaptiveVfsObject *captive_vfs_object,const gchar *pathname,guint perm); CaptiveVfsObject *captive_directory_ref_vfs(CaptiveDirectoryObject *captive_directory_object); -GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info); +GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object, + CaptiveFileInfoObject **captive_file_info_object_return); GnomeVFSResult captive_directory_remove(CaptiveDirectoryObject *captive_directory_object); diff --git a/src/libcaptive/include/captive/client-file-info.h b/src/libcaptive/include/captive/client-file-info.h new file mode 100644 index 0000000..349f5f9 --- /dev/null +++ b/src/libcaptive/include/captive/client-file-info.h @@ -0,0 +1,60 @@ +/* $Id$ + * Include file with client-application 'file' access to libcaptive + * Copyright (C) 2005 Jan Kratochvil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; exactly version 2 of June 1991 is required + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _CAPTIVE_CLIENT_FILE_INFO_H +#define _CAPTIVE_CLIENT_FILE_INFO_H 1 + + +#include +#include +#include /* for GnomeVFSFileInfo*/ + + +G_BEGIN_DECLS + +#define CAPTIVE_FILE_INFO_TYPE_OBJECT (captive_file_info_object_get_type()) +#define CAPTIVE_FILE_INFO_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST((object),CAPTIVE_FILE_INFO_TYPE_OBJECT,CaptiveFileInfoObject)) +#define CAPTIVE_FILE_INFO_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),CAPTIVE_FILE_INFO_TYPE_OBJECT,CaptiveFileInfoObjectClass)) +#define CAPTIVE_FILE_INFO_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE((object),CAPTIVE_FILE_INFO_TYPE_OBJECT)) +#define CAPTIVE_FILE_INFO_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),CAPTIVE_FILE_INFO_TYPE_OBJECT)) +#define CAPTIVE_FILE_INFO_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),CAPTIVE_FILE_INFO_TYPE_OBJECT,CaptiveFileInfoObjectClass)) +typedef struct _CaptiveFileInfoObject CaptiveFileInfoObject; +typedef struct _CaptiveFileInfoObjectClass CaptiveFileInfoObjectClass; + + +struct _CaptiveFileInfoObject { + GObject parent_instance; + + /*< public >*/ + GnomeVFSFileInfo p; + /* Unsupported by GnomeVFS, see: http://bugzilla.gnome.org/show_bug.cgi?id=325427 */ + guint atime_nsec; /* Valid if: p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME */ + guint mtime_nsec; /* Valid if: p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME */ + guint ctime_nsec; /* Valid if: p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME */ + }; + + +GType captive_file_info_object_get_type(void); + +GnomeVFSResult captive_file_info_object_new(CaptiveFileInfoObject **captive_file_info_object_return); + +G_END_DECLS + + +#endif /* _CAPTIVE_CLIENT_FILE_INFO_H */ diff --git a/src/libcaptive/include/captive/client-file.h b/src/libcaptive/include/captive/client-file.h index 421ace2..5b3238f 100644 --- a/src/libcaptive/include/captive/client-file.h +++ b/src/libcaptive/include/captive/client-file.h @@ -25,6 +25,7 @@ #include #include /* for GnomeVFSOpenMode */ #include "captive/client-vfs.h" +#include "captive/client-file-info.h" G_BEGIN_DECLS @@ -55,9 +56,9 @@ GnomeVFSResult captive_file_seek GnomeVFSResult captive_file_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return); GnomeVFSResult captive_file_remove(CaptiveFileObject *captive_file_object); GnomeVFSResult captive_file_file_info_get(CaptiveFileObject *captive_file_object, - GnomeVFSFileInfo *file_info); + CaptiveFileInfoObject **captive_file_info_object_return); GnomeVFSResult captive_file_file_info_set(CaptiveFileObject *captive_file_object, - const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask); + CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask); GnomeVFSResult captive_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size); GnomeVFSResult captive_file_move(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace); diff --git a/src/libcaptive/include/captive/rtl-time.h b/src/libcaptive/include/captive/rtl-time.h new file mode 100644 index 0000000..1de7733 --- /dev/null +++ b/src/libcaptive/include/captive/rtl-time.h @@ -0,0 +1,38 @@ +/* $Id$ + * Include file for internal (rtl/) time handling utilities of libcaptive + * Copyright (C) 2005 Jan Kratochvil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; exactly version 2 of June 1991 is required + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _CAPTIVE_RTL_TIME_H +#define _CAPTIVE_RTL_TIME_H 1 + + +#include +#include +#include "reactos/ntos/types.h" /* For PLARGE_INTEGER */ +#include + + +G_BEGIN_DECLS + +GnomeVFSResult timespec_to_Time(PLARGE_INTEGER Time,const struct timespec *timespec); +GnomeVFSResult Time_to_timespec(struct timespec *timespec,const PLARGE_INTEGER Time); + +G_END_DECLS + + +#endif /* _CAPTIVE_RTL_TIME_H */ diff --git a/src/libcaptive/rtl/Makefile.am b/src/libcaptive/rtl/Makefile.am index b54b0c0..a3403ec 100644 --- a/src/libcaptive/rtl/Makefile.am +++ b/src/libcaptive/rtl/Makefile.am @@ -30,6 +30,9 @@ librtl_la_SOURCES= \ memmove.c \ memset.c \ string.c \ + time.c \ unicode.c \ unicode_reactos.c \ version.c + +librtl_la_CFLAGS=$(GNOME_VFS_CFLAGS) diff --git a/src/libcaptive/rtl/time.c b/src/libcaptive/rtl/time.c new file mode 100644 index 0000000..0e7d0d8 --- /dev/null +++ b/src/libcaptive/rtl/time.c @@ -0,0 +1,100 @@ +/* $Id$ + * reactos time user/kernel memory handling functions emulation of libcaptive + * Copyright (C) 2005 Jan Kratochvil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; exactly version 2 of June 1991 is required + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "config.h" + +#include "captive/rtl-time.h" /* self */ +#include +#include "reactos/ntos/rtl.h" /* For RtlSecondsSince1970ToTime() */ + + +/* It MUST match those of: reactos/ntoskrnl/rtl/time.c */ +#define TICKSPERSEC 10000000 +#define TICKSTO1970 0x019db1ded53e8000LL + + +/** timespec_to_Time: + * @Time: Target %PLARGE_INTEGER type target MS-Windows timestamp. + * %NULL value is forbidden. + * @timespec: Source %struct %timespec type UNIX timestamp. + * %NULL value is forbidden. + * + * Converts the timestamp format including the sub-second part not handled by + * just ReactOS RtlSecondsSince1970ToTime(). + * + * Returns: %GNOME_VFS_OK if everything got converted OK. + */ +GnomeVFSResult timespec_to_Time(PLARGE_INTEGER Time,const struct timespec *timespec) +{ + g_return_val_if_fail(Time!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(timespec!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(timespec->tv_nsec<0,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(timespec->tv_nsec>1000000000,GNOME_VFS_ERROR_BAD_PARAMETERS); + + RtlSecondsSince1970ToTime(timespec->tv_sec,Time); + + /* #define TICKSPERSEC 10000000 */ +#if TICKSPERSEC<1000000000 && !(1000000000%TICKSPERSEC) + Time->QuadPart+=timespec->tv_nsec / (1000000000/TICKSPERSEC); +#else +#error "Unsupported: TICKSPERSEC" +#endif + + return GNOME_VFS_OK; +} + +/** Time_to_timespec: + * @timespec: Target %struct %timespec type UNIX timestamp. + * %NULL value is forbidden. + * @Time: Source %PLARGE_INTEGER type target MS-Windows timestamp. + * %NULL value is forbidden. + * + * Converts the timestamp format including the sub-second part not handled by + * just ReactOS RtlTimeToSecondsSince1970(). + * + * Returns: %GNOME_VFS_OK if everything got converted OK. + */ +GnomeVFSResult Time_to_timespec(struct timespec *timespec,const PLARGE_INTEGER Time) +{ +ULONG SecondsSince1970; +BOOLEAN errBOOLEAN; + + g_return_val_if_fail(timespec!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(Time!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + + errBOOLEAN=RtlTimeToSecondsSince1970(Time,&SecondsSince1970); + g_assert(errBOOLEAN==TRUE); + + timespec->tv_sec=SecondsSince1970; + + /* #define TICKSPERSEC 10000000 */ + + /* Some problem with the remainer? */ +#if TICKSTO1970%TICKSPERSEC +#error "Unsupported: TICKSTO1970 +#endif + +#if TICKSPERSEC<1000000000 && !(1000000000%TICKSPERSEC) + timespec->tv_nsec=(Time->QuadPart%TICKSPERSEC) * (1000000000/TICKSPERSEC); +#else +#error "Unsupported: TICKSPERSEC" +#endif + + return GNOME_VFS_OK; +} diff --git a/src/libcaptive/sandbox/FileInfo.c b/src/libcaptive/sandbox/FileInfo.c index 1c5bb89..d70b25b 100644 --- a/src/libcaptive/sandbox/FileInfo.c +++ b/src/libcaptive/sandbox/FileInfo.c @@ -24,44 +24,49 @@ GnomeVFSResult captive_sandbox_file_info_corba_to_captive - (GnomeVFSFileInfo *file_info_captive,const Captive_GnomeVFSFileInfo *file_info_corba) + (CaptiveFileInfoObject *file_info_captive,const Captive_CaptiveFileInfoObject *file_info_corba) { g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(file_info_corba!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(file_info_captive->p.valid_fields==0,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(file_info_captive->p.name==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - file_info_captive->valid_fields=0; - file_info_captive->name=g_strdup(file_info_corba->name); + file_info_captive->p.valid_fields=0; + file_info_captive->p.name=g_strdup(file_info_corba->name); if (file_info_corba->type_valid) { - file_info_captive->type=file_info_corba->type; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE; + file_info_captive->p.type=file_info_corba->type; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE; } if (file_info_corba->permissions_valid) { - file_info_captive->permissions=file_info_corba->permissions; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS; + file_info_captive->p.permissions=file_info_corba->permissions; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS; } if (file_info_corba->size_valid) { - file_info_captive->size=file_info_corba->size; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE; + file_info_captive->p.size=file_info_corba->size; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE; } if (file_info_corba->block_count_valid) { - file_info_captive->block_count=file_info_corba->block_count; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT; + file_info_captive->p.block_count=file_info_corba->block_count; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT; } if (file_info_corba->atime) { - file_info_captive->atime=file_info_corba->atime; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME; + file_info_captive->p.atime=file_info_corba->atime; + file_info_captive->atime_nsec=file_info_corba->atime_nsec; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME; } if (file_info_corba->mtime) { - file_info_captive->mtime=file_info_corba->mtime; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME; + file_info_captive->p.mtime=file_info_corba->mtime; + file_info_captive->mtime_nsec=file_info_corba->mtime_nsec; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME; } if (file_info_corba->ctime) { - file_info_captive->ctime=file_info_corba->ctime; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME; + file_info_captive->p.ctime=file_info_corba->ctime; + file_info_captive->ctime_nsec=file_info_corba->ctime_nsec; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME; } if (file_info_corba->flags_valid) { - file_info_captive->flags=file_info_corba->flags; - file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS; + file_info_captive->p.flags=file_info_corba->flags; + file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS; } return GNOME_VFS_OK; @@ -69,35 +74,56 @@ GnomeVFSResult captive_sandbox_file_info_corba_to_captive GnomeVFSResult captive_sandbox_file_info_captive_to_corba - (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive) + (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive) { g_return_val_if_fail(file_info_corba!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - if (!file_info_captive->name) + if (!file_info_captive->p.name) file_info_corba->name=CORBA_string_dup(""); else - file_info_corba->name=CORBA_string_dup(file_info_captive->name); - if ((file_info_corba->type_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE))) - file_info_corba->type=file_info_captive->type; - if ((file_info_corba->permissions_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS))) - file_info_corba->permissions=file_info_captive->permissions; - if ((file_info_corba->size_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE))) - file_info_corba->size=file_info_captive->size; - if ((file_info_corba->block_count_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT))) - file_info_corba->block_count=file_info_captive->block_count; - file_info_corba->atime=(!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) ? 0 : file_info_captive->atime); - file_info_corba->mtime=(!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) ? 0 : file_info_captive->mtime); - file_info_corba->ctime=(!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) ? 0 : file_info_captive->ctime); - if ((file_info_corba->flags_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_FLAGS))) - file_info_corba->flags=file_info_captive->flags; + file_info_corba->name=CORBA_string_dup(file_info_captive->p.name); + if ((file_info_corba->type_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE))) + file_info_corba->type=file_info_captive->p.type; + if ((file_info_corba->permissions_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS))) + file_info_corba->permissions=file_info_captive->p.permissions; + if ((file_info_corba->size_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE))) + file_info_corba->size=file_info_captive->p.size; + if ((file_info_corba->block_count_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT))) + file_info_corba->block_count=file_info_captive->p.block_count; + if (!file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) { + file_info_corba->atime =0; + file_info_corba->atime_nsec=0; + } + else { + file_info_corba->atime=file_info_captive->p.atime; + file_info_corba->atime_nsec=file_info_captive->atime_nsec; + } + if (!file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) { + file_info_corba->mtime =0; + file_info_corba->mtime_nsec=0; + } + else { + file_info_corba->mtime=file_info_captive->p.mtime; + file_info_corba->mtime_nsec=file_info_captive->mtime_nsec; + } + if (!file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) { + file_info_corba->ctime =0; + file_info_corba->ctime_nsec=0; + } + else { + file_info_corba->ctime=file_info_captive->p.ctime; + file_info_corba->ctime_nsec=file_info_captive->ctime_nsec; + } + if ((file_info_corba->flags_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_FLAGS))) + file_info_corba->flags=file_info_captive->p.flags; return GNOME_VFS_OK; } GnomeVFSResult captive_sandbox_file_info_set_mask_captive_to_corba - (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask) + (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask) { g_return_val_if_fail(file_info_corba!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); @@ -107,22 +133,28 @@ GnomeVFSResult captive_sandbox_file_info_set_mask_captive_to_corba file_info_corba->permissions_valid=CORBA_FALSE; file_info_corba->size_valid=CORBA_FALSE; file_info_corba->block_count_valid=CORBA_FALSE; - file_info_corba->atime=0; - file_info_corba->mtime=0; - file_info_corba->ctime=0; + file_info_corba->atime =0; + file_info_corba->atime_nsec=0; + file_info_corba->mtime =0; + file_info_corba->mtime_nsec=0; + file_info_corba->ctime =0; + file_info_corba->ctime_nsec=0; file_info_corba->flags_valid=CORBA_FALSE; if (!(mask&GNOME_VFS_SET_FILE_INFO_NAME)) file_info_corba->name=CORBA_string_dup(""); else - file_info_corba->name=CORBA_string_dup(file_info_captive->name); + file_info_corba->name=CORBA_string_dup(file_info_captive->p.name); if ((file_info_corba->permissions_valid=!!(mask&GNOME_VFS_SET_FILE_INFO_PERMISSIONS))) - file_info_corba->permissions=file_info_captive->permissions; + file_info_corba->permissions=file_info_captive->p.permissions; /* Not implemented by libcaptive: GNOME_VFS_SET_FILE_INFO_OWNER */ if (mask&GNOME_VFS_SET_FILE_INFO_TIME) { - file_info_corba->atime=file_info_captive->atime; - file_info_corba->mtime=file_info_captive->mtime; - file_info_corba->ctime=file_info_captive->ctime; + file_info_corba->atime =file_info_captive->p.atime; + file_info_corba->atime_nsec=file_info_captive->atime_nsec; + file_info_corba->mtime =file_info_captive->p.mtime; + file_info_corba->mtime_nsec=file_info_captive->mtime_nsec; + file_info_corba->ctime =file_info_captive->p.ctime; + file_info_corba->ctime_nsec=file_info_captive->ctime_nsec; } return GNOME_VFS_OK; diff --git a/src/libcaptive/sandbox/FileInfo.h b/src/libcaptive/sandbox/FileInfo.h index d9efbc8..1ab8ac9 100644 --- a/src/libcaptive/sandbox/FileInfo.h +++ b/src/libcaptive/sandbox/FileInfo.h @@ -1,5 +1,5 @@ /* $Id$ - * Include file for CORBA/ORBit server side of GnomeVFSFileInfo handling + * Include file for CORBA/ORBit server side of CaptiveFileInfoObject handling * Copyright (C) 2003 Jan Kratochvil * * This program is free software; you can redistribute it and/or modify @@ -23,17 +23,17 @@ #include #include "sandbox.h" -#include +#include "captive/client-file-info.h" G_BEGIN_DECLS GnomeVFSResult captive_sandbox_file_info_corba_to_captive - (GnomeVFSFileInfo *file_info_captive,const Captive_GnomeVFSFileInfo *file_info_corba); + (CaptiveFileInfoObject *file_info_captive,const Captive_CaptiveFileInfoObject *file_info_corba); GnomeVFSResult captive_sandbox_file_info_captive_to_corba - (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive); + (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive); GnomeVFSResult captive_sandbox_file_info_set_mask_captive_to_corba - (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask); + (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask); G_END_DECLS diff --git a/src/libcaptive/sandbox/parent-Directory.c b/src/libcaptive/sandbox/parent-Directory.c index 993d32e..ebcaa54 100644 --- a/src/libcaptive/sandbox/parent-Directory.c +++ b/src/libcaptive/sandbox/parent-Directory.c @@ -28,6 +28,7 @@ #include "FileInfo.h" #include "captive/macros.h" #include "../client/vfs-parent.h" +#include "captive/client-file-info.h" GnomeVFSResult captive_sandbox_parent_directory_new_open @@ -142,16 +143,17 @@ GList *file_info_last_l=g_list_last(captive_directory_parent_object->corba_Direc return r; } -static GnomeVFSResult captive_sandbox_parent_directory_read_fill1 - (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive) +static GnomeVFSResult captive_sandbox_parent_directory_read_get1 + (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return) { xmlNode *xml_action=NULL; -Captive_GnomeVFSFileInfo *file_info_corba; +Captive_CaptiveFileInfoObject *file_info_corba; GnomeVFSResult r; CaptiveVfsParentObject *captive_vfs_parent_object; +CaptiveFileInfoObject *file_info_captive; g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs); @@ -167,35 +169,40 @@ CaptiveVfsParentObject *captive_vfs_parent_object; if (r!=GNOME_VFS_OK) return r; - r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba); + r=captive_file_info_object_new(&file_info_captive); if (xml_action) xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r)); if (r!=GNOME_VFS_OK) return r; /* 'file_info_corba' leak */ - Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */); + r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba); + if (xml_action) + xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r)); + if (r!=GNOME_VFS_OK) { + g_object_unref(file_info_captive); + return r; /* 'file_info_corba' leak */ + } + + Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */); CORBA_free(file_info_corba); + *file_info_captive_return=file_info_captive; return GNOME_VFS_OK; } static GnomeVFSResult captive_sandbox_parent_directory_read_filldir(CaptiveDirectoryParentObject *captive_directory_parent_object) { -GnomeVFSFileInfo *file_info_captive; +CaptiveFileInfoObject *file_info_captive; GnomeVFSResult r; g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(captive_directory_parent_object->corba_Directory_file_info_list==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); for (;;) { - file_info_captive=gnome_vfs_file_info_new(); - r=captive_sandbox_parent_directory_read_fill1(captive_directory_parent_object,file_info_captive); - if (r==GNOME_VFS_ERROR_EOF) { - gnome_vfs_file_info_unref(file_info_captive); + r=captive_sandbox_parent_directory_read_get1(captive_directory_parent_object,&file_info_captive); + if (r==GNOME_VFS_ERROR_EOF) break; - } if (r!=GNOME_VFS_OK) { - gnome_vfs_file_info_unref(file_info_captive); gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list); captive_directory_parent_object->corba_Directory_file_info_list=NULL; return r; @@ -214,14 +221,15 @@ GnomeVFSResult r; /* We have to read the whole directory atomically * as during valid child restart we would loose our reading position. + * Returned 'CaptiveFileInfoObject' has 1 reference for yourself, you must g_object_unref() it. */ GnomeVFSResult captive_sandbox_parent_directory_read - (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive) + (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return) { GnomeVFSResult r; g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); if (!captive_directory_parent_object->corba_Directory_file_info_list) if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_read_filldir(captive_directory_parent_object))) @@ -234,10 +242,7 @@ GnomeVFSResult r; } else { /* Cut first list item. */ - gnome_vfs_file_info_copy( - file_info_captive, /* dest */ - captive_directory_parent_object->corba_Directory_file_info_list->data); /* src */ - gnome_vfs_file_info_unref(captive_directory_parent_object->corba_Directory_file_info_list->data); + *file_info_captive_return=captive_directory_parent_object->corba_Directory_file_info_list->data; captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link( captive_directory_parent_object->corba_Directory_file_info_list, captive_directory_parent_object->corba_Directory_file_info_list); diff --git a/src/libcaptive/sandbox/parent-Directory.h b/src/libcaptive/sandbox/parent-Directory.h index 483c844..abf2cdd 100644 --- a/src/libcaptive/sandbox/parent-Directory.h +++ b/src/libcaptive/sandbox/parent-Directory.h @@ -35,7 +35,7 @@ GnomeVFSResult captive_sandbox_parent_directory_new_make (CaptiveDirectoryParentObject *captive_directory_parent_object,guint perm); GnomeVFSResult captive_sandbox_parent_directory_close(CaptiveDirectoryParentObject *captive_directory_parent_object); GnomeVFSResult captive_sandbox_parent_directory_read - (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive); + (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return); GnomeVFSResult captive_sandbox_parent_directory_remove(CaptiveDirectoryParentObject *captive_directory_parent_object); G_END_DECLS diff --git a/src/libcaptive/sandbox/parent-File.c b/src/libcaptive/sandbox/parent-File.c index 46e4889..ca062f5 100644 --- a/src/libcaptive/sandbox/parent-File.c +++ b/src/libcaptive/sandbox/parent-File.c @@ -396,15 +396,16 @@ CaptiveVfsParentObject *captive_vfs_parent_object; GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileParentObject *captive_file_parent_object, - GnomeVFSFileInfo *file_info_captive) + CaptiveFileInfoObject **captive_file_info_object_return) { -Captive_GnomeVFSFileInfo *file_info_corba; +Captive_CaptiveFileInfoObject *file_info_corba; GnomeVFSResult r; xmlNode *xml_action=NULL; CaptiveVfsParentObject *captive_vfs_parent_object; +CaptiveFileInfoObject *captive_file_info_object; g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs); @@ -420,22 +421,34 @@ CaptiveVfsParentObject *captive_vfs_parent_object; if (r!=GNOME_VFS_OK) return r; - r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba); - Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */); + r=captive_file_info_object_new(&captive_file_info_object); + if (xml_action) + xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r)); + if (r!=GNOME_VFS_OK) { + Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */); + CORBA_free(file_info_corba); + return r; + } + + r=captive_sandbox_file_info_corba_to_captive(captive_file_info_object,file_info_corba); + Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */); CORBA_free(file_info_corba); if (xml_action) xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r)); - if (r!=GNOME_VFS_OK) + if (r!=GNOME_VFS_OK) { + g_object_unref(captive_file_info_object); return r; + } + *captive_file_info_object_return=captive_file_info_object; return GNOME_VFS_OK; } GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileParentObject *captive_file_parent_object, - const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask) + CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask) { -Captive_GnomeVFSFileInfo file_info_corba; +Captive_CaptiveFileInfoObject file_info_corba; GnomeVFSResult r; xmlNode *xml_action=NULL; CaptiveVfsParentObject *captive_vfs_parent_object; @@ -461,7 +474,7 @@ CaptiveVfsParentObject *captive_vfs_parent_object; if (r!=GNOME_VFS_OK) return r; - Captive_GnomeVFSFileInfo__freekids(&file_info_corba,NULL/* 'd'; meaning? */); + Captive_CaptiveFileInfoObject__freekids(&file_info_corba,NULL/* 'd'; meaning? */); return GNOME_VFS_OK; } diff --git a/src/libcaptive/sandbox/parent-File.h b/src/libcaptive/sandbox/parent-File.h index d8cd094..0d10081 100644 --- a/src/libcaptive/sandbox/parent-File.h +++ b/src/libcaptive/sandbox/parent-File.h @@ -43,9 +43,9 @@ GnomeVFSResult captive_sandbox_parent_file_tell (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileOffset *offset_return); GnomeVFSResult captive_sandbox_parent_file_remove(CaptiveFileParentObject *captive_file_parent_object); GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileParentObject *captive_file_parent_object, - GnomeVFSFileInfo *file_info); + CaptiveFileInfoObject **captive_file_info_object_return); GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileParentObject *captive_file_parent_object, - const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask); + CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask); GnomeVFSResult captive_sandbox_parent_file_truncate (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileSize file_size); GnomeVFSResult captive_sandbox_parent_file_move diff --git a/src/libcaptive/sandbox/sandbox.idl b/src/libcaptive/sandbox/sandbox.idl index 7e3cb44..74c0fae 100644 --- a/src/libcaptive/sandbox/sandbox.idl +++ b/src/libcaptive/sandbox/sandbox.idl @@ -52,6 +52,7 @@ module Captive typedef unsigned long GnomeVFSFileType; /* enum */ typedef unsigned short GnomeVFSFilePermissions; + typedef unsigned long guint; typedef unsigned long long time_t; typedef unsigned long long GnomeVFSFileSize; typedef unsigned long long GnomeVFSFileFlags; @@ -59,7 +60,7 @@ module Captive typedef unsigned long GnomeVFSSeekPosition; /* enum */ typedef unsigned long GnomeVFSSetFileInfoMask; /* enum mask */ typedef unsigned long long GnomeVFSOpenMode; /* enum mask */ - struct GnomeVFSFileInfo { + struct CaptiveFileInfoObject { string name; /* Base name of the file (no path). */ /* File type (i.e. regular, directory, block device...). */ GnomeVFSFileType type; @@ -72,8 +73,11 @@ module Captive boolean block_count_valid; /* Access, modification and change times. */ time_t atime; /* not valid if ==(time_t)0 */ + guint atime_nsec; time_t mtime; /* not valid if ==(time_t)0 */ + guint mtime_nsec; time_t ctime; /* not valid if ==(time_t)0 */ + guint ctime_nsec; GnomeVFSFileFlags flags; boolean flags_valid; }; @@ -123,7 +127,7 @@ module Captive interface Directory { - void read(out GnomeVFSFileInfo file_info) + void read(out CaptiveFileInfoObject file_info) raises (GnomeVFSResultException,GLogMessageFatal); void remove() raises (GnomeVFSResultException,GLogMessageFatal); @@ -142,9 +146,9 @@ module Captive raises (GnomeVFSResultException,GLogMessageFatal); void remove() raises (GnomeVFSResultException,GLogMessageFatal); - void file_info_get(out GnomeVFSFileInfo file_info) + void file_info_get(out CaptiveFileInfoObject file_info) raises (GnomeVFSResultException,GLogMessageFatal); - void file_info_set(in GnomeVFSFileInfo file_info,in GnomeVFSSetFileInfoMask mask) + void file_info_set(in CaptiveFileInfoObject file_info,in GnomeVFSSetFileInfoMask mask) raises (GnomeVFSResultException,GLogMessageFatal); void truncate(in GnomeVFSFileSize file_size) raises (GnomeVFSResultException,GLogMessageFatal); diff --git a/src/libcaptive/sandbox/server-Directory.c b/src/libcaptive/sandbox/server-Directory.c index 069db40..c77a605 100644 --- a/src/libcaptive/sandbox/server-Directory.c +++ b/src/libcaptive/sandbox/server-Directory.c @@ -31,7 +31,7 @@ static void impl_Captive_Directory_fini(impl_POA_Captive_Directory *servant,CORBA_Environment *ev); static void impl_Captive_Directory_read - (impl_POA_Captive_Directory *servant,Captive_GnomeVFSFileInfo **file_info,CORBA_Environment *ev); + (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info,CORBA_Environment *ev); static void impl_Captive_Directory_remove(impl_POA_Captive_Directory *servant,CORBA_Environment *ev); static void impl_Captive_Directory_shutdown(impl_POA_Captive_Directory *servant,CORBA_Environment *ev); @@ -150,10 +150,10 @@ GnomeVFSResult errvfsresult; static void impl_Captive_Directory_read - (impl_POA_Captive_Directory *servant,Captive_GnomeVFSFileInfo **file_info_corba_return,CORBA_Environment *ev) + (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info_corba_return,CORBA_Environment *ev) { -GnomeVFSFileInfo file_info_captive; -Captive_GnomeVFSFileInfo *file_info_corba; +CaptiveFileInfoObject *file_info_captive; +Captive_CaptiveFileInfoObject *file_info_corba; GnomeVFSResult errvfsresult; if (GNOME_VFS_OK!=(errvfsresult=captive_directory_read(servant->captive_directory_object,&file_info_captive))) { @@ -161,12 +161,14 @@ GnomeVFSResult errvfsresult; return; } - file_info_corba=Captive_GnomeVFSFileInfo__alloc(); + file_info_corba=Captive_CaptiveFileInfoObject__alloc(); - if (GNOME_VFS_OK!=(errvfsresult=captive_sandbox_file_info_captive_to_corba( - file_info_corba,&file_info_captive))) { + errvfsresult=captive_sandbox_file_info_captive_to_corba(file_info_corba,file_info_captive); + g_object_unref(file_info_captive); + + if (GNOME_VFS_OK!=errvfsresult) { captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); - Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */); + Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */); CORBA_free(file_info_corba); return; } diff --git a/src/libcaptive/sandbox/server-File.c b/src/libcaptive/sandbox/server-File.c index 48e94d8..b5a144b 100644 --- a/src/libcaptive/sandbox/server-File.c +++ b/src/libcaptive/sandbox/server-File.c @@ -39,9 +39,9 @@ static void impl_Captive_File_tell (impl_POA_Captive_File *servant,Captive_GnomeVFSFileOffset *offset_return,CORBA_Environment *ev); static void impl_Captive_File_remove(impl_POA_Captive_File *servant,CORBA_Environment *ev); static void impl_Captive_File_file_info_get - (impl_POA_Captive_File *servant,Captive_GnomeVFSFileInfo **file_info,CORBA_Environment *ev); + (impl_POA_Captive_File *servant,Captive_CaptiveFileInfoObject **file_info,CORBA_Environment *ev); static void impl_Captive_File_file_info_set(impl_POA_Captive_File *servant, - const Captive_GnomeVFSFileInfo *file_info,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev); + const Captive_CaptiveFileInfoObject *file_info,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev); static void impl_Captive_File_truncate (impl_POA_Captive_File *servant,const Captive_GnomeVFSFileSize file_size,CORBA_Environment *ev); static void impl_Captive_File_move @@ -250,23 +250,25 @@ GnomeVFSResult errvfsresult; static void impl_Captive_File_file_info_get - (impl_POA_Captive_File *servant,Captive_GnomeVFSFileInfo **file_info_corba_return,CORBA_Environment *ev) + (impl_POA_Captive_File *servant,Captive_CaptiveFileInfoObject **file_info_corba_return,CORBA_Environment *ev) { -GnomeVFSFileInfo file_info_captive; +CaptiveFileInfoObject *file_info_captive; GnomeVFSResult errvfsresult; -Captive_GnomeVFSFileInfo *file_info_corba; +Captive_CaptiveFileInfoObject *file_info_corba; if (GNOME_VFS_OK!=(errvfsresult=captive_file_file_info_get(servant->captive_file_object,&file_info_captive))) { captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); return; } - file_info_corba=Captive_GnomeVFSFileInfo__alloc(); + file_info_corba=Captive_CaptiveFileInfoObject__alloc(); - if (GNOME_VFS_OK!=(errvfsresult=captive_sandbox_file_info_captive_to_corba( - file_info_corba,&file_info_captive))) { + errvfsresult=captive_sandbox_file_info_captive_to_corba(file_info_corba,file_info_captive); + g_object_unref(file_info_captive); + + if (GNOME_VFS_OK!=errvfsresult) { captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); - Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */); + Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */); CORBA_free(file_info_corba); return; } @@ -276,18 +278,21 @@ Captive_GnomeVFSFileInfo *file_info_corba; static void impl_Captive_File_file_info_set(impl_POA_Captive_File *servant, - const Captive_GnomeVFSFileInfo *file_info_corba,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev) + const Captive_CaptiveFileInfoObject *file_info_corba,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev) { -GnomeVFSFileInfo file_info_captive; +CaptiveFileInfoObject *file_info_captive; GnomeVFSResult errvfsresult; if (GNOME_VFS_OK!=(errvfsresult=captive_sandbox_file_info_corba_to_captive( - &file_info_captive,file_info_corba))) { + file_info_captive,file_info_corba))) { captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); return; } - if (GNOME_VFS_OK!=(errvfsresult=captive_file_file_info_set(servant->captive_file_object,&file_info_captive,mask))) { + errvfsresult=captive_file_file_info_set(servant->captive_file_object,file_info_captive,mask); + g_object_unref(file_info_captive); + + if (GNOME_VFS_OK!=errvfsresult) { captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); return; } -- 1.8.3.1