/*
- sftp_fs_memory.c
+ sftp_fs_memory.c
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 Pekka Riikonen
+ Copyright (C) 2001 - 2004 Pekka Riikonen
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
/* $Id$ */
/* XXX TODO Win32 support */
-#include "silcincludes.h"
+#include "silc.h"
#include "silcsftp.h"
#include "silcsftp_fs.h"
#include "sftp_util.h"
int i;
/* Must be both write and exec permissions */
- if (check_perm &&
- !((dir->perm & SILC_SFTP_FS_PERM_WRITE) &&
+ if (check_perm &&
+ !((dir->perm & SILC_SFTP_FS_PERM_WRITE) &&
(dir->perm & SILC_SFTP_FS_PERM_EXEC)))
return FALSE;
return TRUE;
}
-/* Finds first occurence of entry named `name' under the directory `dir'.
+/* Finds first occurence of entry named `name' under the directory `dir'.
This does not check subdirectories recursively. */
static MemFSEntry mem_find_entry(MemFSEntry dir, const char *name,
if (!filename)
return FALSE;
- return mem_del_entry_name(dir ? dir : memfs->root, filename,
+ return mem_del_entry_name(dir ? dir : memfs->root, filename,
strlen(filename), FALSE);
}
return data;
}
-void mem_open(void *context, SilcSFTP sftp,
+void mem_open(void *context, SilcSFTP sftp,
const char *filename,
SilcSFTPFileOperation pflags,
SilcSFTPAttributes attrs,
if (entry->directory || !entry->data) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
/* Check for reading */
- if ((pflags & SILC_SFTP_FXF_READ) &&
+ if ((pflags & SILC_SFTP_FXF_READ) &&
!(entry->perm & SILC_SFTP_FS_PERM_READ)) {
- (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
callback_context);
return;
- }
+ }
/* Check for writing */
- if (((pflags & SILC_SFTP_FXF_WRITE) || (pflags & SILC_SFTP_FXF_APPEND)) &&
+ if (((pflags & SILC_SFTP_FXF_WRITE) || (pflags & SILC_SFTP_FXF_APPEND)) &&
!(entry->perm & SILC_SFTP_FS_PERM_WRITE)) {
- (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
callback_context);
return;
}
flags |= O_APPEND;
/* Attempt to open the file for real. */
- fd = silc_file_open_mode(entry->data + 7, flags,
+ fd = silc_file_open_mode(entry->data + 7, flags,
(attrs->flags & SILC_SFTP_ATTR_PERMISSIONS ?
attrs->permissions : 0600));
if (fd == -1) {
/* File opened, return handle */
handle = mem_create_handle(fs, fd, entry);
if (handle)
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
callback_context);
else
- (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
callback_context);
}
if (h->fd != -1) {
ret = silc_file_close(h->fd);
if (ret == -1) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, NULL,
+ (*callback)(sftp, silc_sftp_map_errno(errno), NULL, NULL,
callback_context);
return;
}
void mem_read(void *context, SilcSFTP sftp,
SilcSFTPHandle handle,
- SilcUInt64 offset,
+ SilcUInt64 offset,
SilcUInt32 len,
SilcSFTPDataCallback callback,
void *callback_context)
}
/* Return data */
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (const unsigned char *)data,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (const unsigned char *)data,
ret, callback_context);
silc_free(data);
/* Attempt to write */
ret = silc_file_write(h->fd, data, data_len);
if (ret <= 0) {
- (*callback)(sftp, silc_sftp_map_errno(errno), NULL, NULL,
+ (*callback)(sftp, silc_sftp_map_errno(errno), NULL, NULL,
callback_context);
return;
}
void *callback_context)
{
/* Remove is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
void *callback_context)
{
/* Rename is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
void *callback_context)
{
/* Mkdir is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
void *callback_context)
{
/* Rmdir is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
if (!entry->directory) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
/* Must be read permissions to open a directory */
if (!(entry->perm & SILC_SFTP_FS_PERM_READ)) {
- (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
callback_context);
return;
}
/* Directory opened, return handle */
handle = mem_create_handle(fs, 0, entry);
if (handle)
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
callback_context);
else
- (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
callback_context);
}
/* Long name format is:
drwx------ 1 324210 Apr 8 08:40 mail/
1234567890 123 12345678 123456789012 */
- snprintf(long_name, sizeof(long_name) - 1,
+ silc_snprintf(long_name, sizeof(long_name) - 1,
"%c%c%c%c------ %3d %8llu %12s %s%s",
(entry->directory ? 'd' : '-'),
((entry->perm & SILC_SFTP_FS_PERM_READ) ? 'r' : '-'),
((entry->perm & SILC_SFTP_FS_PERM_WRITE) ? 'w' : '-'),
((entry->perm & SILC_SFTP_FS_PERM_EXEC) ? 'x' : '-'),
(entry->directory ? (int)entry->entry_count : 1),
- filesize, date, entry->name,
- (entry->directory ? "/" :
+#ifndef SILC_WIN32
+ (unsigned long long)filesize,
+#else
+ (unsigned long)filesize,
+#endif
+ date, entry->name,
+ (entry->directory ? "/" :
((entry->perm & SILC_SFTP_FS_PERM_EXEC) ? "*" : "")));
/* Add attributes */
if (entry->directory || !entry->data) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
/* Get real stat */
ret = stat(entry->data + 7, &stats);
if (!attrs) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
attrs->mtime = stats.st_mtime;
/* Return attributes */
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
callback_context);
silc_sftp_attr_free(attrs);
if (entry->directory || !entry->data) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
/* Get real stat */
#ifndef SILC_WIN32
if (!attrs) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
attrs->mtime = stats.st_mtime;
/* Return attributes */
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
callback_context);
silc_sftp_attr_free(attrs);
if (h->entry->directory || !h->entry->data) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
/* Get real stat */
ret = fstat(h->fd, &stats);
if (!attrs) {
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
return;
- }
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
attrs->mtime = stats.st_mtime;
/* Return attributes */
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPAttributes)attrs,
callback_context);
silc_sftp_attr_free(attrs);
}
-
+
void mem_setstat(void *context, SilcSFTP sftp,
const char *path,
SilcSFTPAttributes attrs,
void *callback_context)
{
/* Setstat is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
void *callback_context)
{
/* Fsetstat is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
void *callback_context)
{
/* Symlink is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, NULL,
callback_context);
}
goto fail;
name->count = 1;
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPName)name,
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (const SilcSFTPName)name,
callback_context);
silc_sftp_name_free(name);
void *callback_context)
{
/* Extended is not supported */
- (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, 0,
+ (*callback)(sftp, SILC_SFTP_STATUS_OP_UNSUPPORTED, NULL, 0,
callback_context);
}