X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcsftp%2Fsftp_fs_memory.c;h=04979b720f90a84995c7ec00b5462869eed1f6b1;hb=8556fb525f0f1cb2e9cdffebb96f942bd077f51b;hp=135810f14c46be0fb385ab586b3647143b671bac;hpb=e5d8d3db6caa344b3d419b884556c21b15e7d123;p=silc.git diff --git a/lib/silcsftp/sftp_fs_memory.c b/lib/silcsftp/sftp_fs_memory.c index 135810f1..04979b72 100644 --- a/lib/silcsftp/sftp_fs_memory.c +++ b/lib/silcsftp/sftp_fs_memory.c @@ -16,6 +16,7 @@ GNU General Public License for more details. */ +/* $Id$ */ /* XXX TODO Win32 support */ #include "silcincludes.h" @@ -25,6 +26,8 @@ #define DIR_SEPARATOR "/" +struct SilcSFTPFilesystemOpsStruct silc_sftp_fs_memory; + /* Memory filesystem entry */ typedef struct MemFSEntryStruct { char *name; /* Name of the entry */ @@ -304,8 +307,9 @@ static MemFSFileHandle mem_find_handle(MemFS fs, uint32 handle) silc_sftp_fs_memory_free. The `perm' is the permissions for the root directory of the filesystem (/ dir). */ -void *silc_sftp_fs_memory_alloc(SilcSFTPFSMemoryPerm perm) +SilcSFTPFilesystem silc_sftp_fs_memory_alloc(SilcSFTPFSMemoryPerm perm) { + SilcSFTPFilesystem filesystem; MemFS fs; fs = silc_calloc(1, sizeof(*fs)); @@ -315,17 +319,21 @@ void *silc_sftp_fs_memory_alloc(SilcSFTPFSMemoryPerm perm) fs->root->directory = TRUE; fs->root->name = strdup(DIR_SEPARATOR); - return (void *)fs; + filesystem = silc_calloc(1, sizeof(*filesystem)); + filesystem->fs = &silc_sftp_fs_memory; + filesystem->fs_context = (void *)fs; + + return filesystem; } /* Frees the memory filesystem context. */ -void silc_sftp_fs_memory_free(void *context) +void silc_sftp_fs_memory_free(SilcSFTPFilesystem fs) { - MemFS fs = (MemFS)context; + MemFS memfs = (MemFS)fs->fs_context; - silc_free(fs->root); - silc_free(fs); + silc_free(memfs->root); + silc_free(memfs); } /* Adds a new directory to the memory filesystem. Returns the directory @@ -337,20 +345,20 @@ void silc_sftp_fs_memory_free(void *context) not free the returned context. The `perm' will indicate the permissions for the directory and they work in POSIX style. */ -void *silc_sftp_fs_memory_add_dir(void *context, void *dir, +void *silc_sftp_fs_memory_add_dir(SilcSFTPFilesystem fs, void *dir, SilcSFTPFSMemoryPerm perm, const char *name) { - MemFS fs = (MemFS)context; + MemFS memfs = (MemFS)fs->fs_context; MemFSEntry entry; entry = silc_calloc(1, sizeof(*entry)); entry->perm = perm; entry->name = strdup(name); entry->directory = TRUE; - entry->parent = dir ? dir : fs->root; + entry->parent = dir ? dir : memfs->root; - if (!mem_add_entry(dir ? dir : fs->root, entry, FALSE)) + if (!mem_add_entry(dir ? dir : memfs->root, entry, FALSE)) return NULL; return entry; @@ -363,21 +371,21 @@ void *silc_sftp_fs_memory_add_dir(void *context, void *dir, in memory file system. The filesystem does not allow removing directories with remote access using the filesystem access function sftp_rmdir. */ -bool silc_sftp_fs_memory_del_dir(void *context, void *dir) +bool silc_sftp_fs_memory_del_dir(SilcSFTPFilesystem fs, void *dir) { - MemFS fs = (MemFS)context; + MemFS memfs = (MemFS)fs->fs_context; bool ret; if (dir) return mem_del_entry(dir, FALSE); /* Remove from root */ - ret = mem_del_entry(fs->root, FALSE); + ret = mem_del_entry(memfs->root, FALSE); - fs->root = silc_calloc(1, sizeof(*fs->root)); - fs->root->perm = fs->root_perm; - fs->root->directory = TRUE; - fs->root->name = strdup(DIR_SEPARATOR); + memfs->root = silc_calloc(1, sizeof(*memfs->root)); + memfs->root->perm = memfs->root_perm; + memfs->root->directory = TRUE; + memfs->root->name = strdup(DIR_SEPARATOR); return ret; } @@ -390,13 +398,12 @@ bool silc_sftp_fs_memory_del_dir(void *context, void *dir) file and they work in POSIX style. Returns TRUE if the file was added to the directory. */ -bool silc_sftp_fs_memory_add_file(void *context, - void *dir, +bool silc_sftp_fs_memory_add_file(SilcSFTPFilesystem fs, void *dir, SilcSFTPFSMemoryPerm perm, const char *filename, const char *realpath) { - MemFS fs = (MemFS)context; + MemFS memfs = (MemFS)fs->fs_context; MemFSEntry entry; entry = silc_calloc(1, sizeof(*entry)); @@ -405,21 +412,21 @@ bool silc_sftp_fs_memory_add_file(void *context, entry->data = strdup(realpath); entry->directory = FALSE; - return mem_add_entry(dir ? dir : fs->root, entry, FALSE); + return mem_add_entry(dir ? dir : memfs->root, entry, FALSE); } /* Removes a file indicated by the `filename' from the directory indicated by the `dir'. Returns TRUE if the removing was success. */ -bool silc_sftp_fs_memory_del_file(void *context, void *dir, +bool silc_sftp_fs_memory_del_file(SilcSFTPFilesystem fs, void *dir, const char *filename) { - MemFS fs = (MemFS)context; + MemFS memfs = (MemFS)fs->fs_context; if (!filename) return FALSE; - return mem_del_entry_name(dir ? dir : fs->root, filename, + return mem_del_entry_name(dir ? dir : memfs->root, filename, strlen(filename), FALSE); } @@ -723,13 +730,17 @@ void mem_readdir(void *context, SilcSFTP sftp, *strrchr(date, ':') = '\0'; if (!entry->directory) - if (!lstat(entry->data + 7, &stats)) - filesize = stats.st_size; +#ifndef SILC_WIN32 + if (!lstat(entry->data + 7, &stats)) +#else + if (!stat(entry->data + 7, &stats)) +#endif + filesize = stats.st_size; /* Long name format is: drwx------ 1 324210 Apr 8 08:40 mail/ 1234567890 123 12345678 123456789012 */ - snprintf(long_name, sizeof(long_name), + snprintf(long_name, sizeof(long_name) - 1, "%c%c%c%c------ %3d %8lu %12s %s%s", (entry->directory ? 'd' : '-'), ((entry->perm & SILC_SFTP_FS_PERM_READ) ? 'r' : '-'), @@ -854,7 +865,11 @@ void mem_lstat(void *context, SilcSFTP sftp, } /* Get real stat */ +#ifndef SILC_WIN32 ret = lstat(entry->data + 7, &stats); +#else + ret = stat(entry->data + 7, &stats); +#endif if (ret == -1) { (*callback)(sftp, silc_sftp_map_errno(errno), NULL, callback_context); return; @@ -1004,7 +1019,7 @@ void mem_extended(void *context, SilcSFTP sftp, callback_context); } -struct SilcSFTPFilesystemStruct silc_sftp_fs_memory = { +struct SilcSFTPFilesystemOpsStruct silc_sftp_fs_memory = { mem_get_handle, mem_encode_handle, mem_open,