Introduction
Introduction Statistics Contact Development Disclaimer Help
Implemented truncation to the file's current size (for OpenOffice). Added erroe…
git clone git://git.codemadness.org/susmb
Log
Files
Refs
README
LICENSE
---
commit 74f8aa75a21a15d0a9bd036ce850b65c210fa7ee
parent 3947905896338d7572fe97a22fe6d53038966cb0
Author: Geoff Johnstone <[email protected]>
Date: Mon, 21 Apr 2008 21:35:58 +0100
Implemented truncation to the file's current size (for OpenOffice).
Added erroeously omitted make_url() return check in getattr().
Fixed memory leak in getattr().
Version 20080421.
Diffstat:
M usmb.c | 14 +++++++-------
M usmb_file.c | 52 ++++++++++++++++++++++-------…
M version.h | 2 +-
3 files changed, 46 insertions(+), 22 deletions(-)
---
diff --git a/usmb.c b/usmb.c
@@ -106,15 +106,15 @@ static bool create_smb_context (char *domain, char *usern…
#if 0
static int usmb_statfs (const char *path, struct statvfs *vfs)
{
- if ((NULL == path) || (NULL == vfs))
- return -EINVAL;
+ if ((NULL == path) || (NULL == vfs))
+ return -EINVAL;
- memset (vfs, 0, sizeof (*vfs));
+ memset (vfs, 0, sizeof (*vfs));
- vfs->f_bsize = 32768;
- vfs->f_blocks = 0x7FFFFFFFl;
- vfs->f_bfree = 0x7FFFFFFFl;
- vfs->f_bavail = 0x7FFFFFFFl;
+ vfs->f_bsize = 32768;
+ vfs->f_blocks = 0x7FFFFFFFl;
+ vfs->f_bfree = 0x7FFFFFFFl;
+ vfs->f_bavail = 0x7FFFFFFFl;
return 0;
}
diff --git a/usmb_file.c b/usmb_file.c
@@ -31,6 +31,9 @@
int usmb_getattr (const char *filename, struct stat *st)
{
char *url = make_url (filename);
+ if (NULL == url)
+ return -ENOMEM;
+
DEBUG (fprintf (stderr, "stat (%s)\n", url));
int ret = ctx->stat (ctx, url, st);
@@ -247,24 +250,45 @@ int usmb_utimes (const char *filename, const struct times…
#endif
-int usmb_truncate (const char *filename, off_t newsize)
+int usmb_truncate (const char *filename, off_t offset)
{
- DEBUG (fprintf (stderr, "truncate (%s, %llu)\n", filename, newsize));
- // FIXME: TODO: handle newsize != 0
- if (0 != newsize)
- return -ENOSYS;
+ /* Windows doesn't support truncation so we implement a limited version:
+ * 0 == offset => create a new file for writing.
+ * current size == offset => succeed.
+ * else return -ENOSYS.
+ */
- char *url = make_url (filename);
- if (NULL == url)
- return -ENOMEM;
+ DEBUG (fprintf (stderr, "truncate (%s, %llu)\n", filename, offset));
+
+ if (NULL == filename)
+ return -EINVAL;
+
+ if (0 == offset)
+ {
+ char *url = make_url (filename);
+ if (NULL == url)
+ return -ENOMEM;
- DEBUG (fprintf (stderr, "truncate (%s)\n", url));
- SMBCFILE *file = ctx->open (ctx, url, O_WRONLY | O_TRUNC, 0);
- if (NULL == file)
- return -errno;
+ SMBCFILE *file = ctx->open (ctx, url, O_WRONLY | O_TRUNC, 0);
+ if (NULL == file)
+ {
+ free (url);
+ return -errno;
+ }
- ctx->close_fn (ctx, file);
- return 0;
+ ctx->close_fn (ctx, file);
+ free (url);
+
+ return 0;
+ }
+
+ struct stat st;
+ int ret = usmb_getattr (filename, &st);
+
+ if (0 != ret)
+ return ret;
+
+ return (offset == st.st_size) ? 0 : -ENOSYS;
}
diff --git a/version.h b/version.h
@@ -19,7 +19,7 @@
#include <stdio.h>
- #define USMB_VERSION 0x20080419
+ #define USMB_VERSION 0x20080421
// a - alpha, b - beta, p - pre-release, s - stable
#define USMB_VERSION_STATUS 's'
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.