Ported to samba 3.2 with a compatibility header for Samba 3.0. Version 20080626; downgraded to beta given the above. Minor whitespace cleanups. - susmb - mounting of SMB/CIFS shares via FUSE
(HTM) git clone git://git.codemadness.org/susmb
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 1e80c5eb0c78bc1824bcdb92010b6a3d25b0fa32
(DIR) parent bd037226cf4a14330a38b1370ed42b33618edb5c
(HTM) Author: Geoff Johnstone <geoffSHEEP.johnstoneFROG@googlemail.com>
Date: Thu, 26 Jun 2008 21:25:38 +0100
Ported to samba 3.2 with a compatibility header for Samba 3.0.
Version 20080626; downgraded to beta given the above.
Minor whitespace cleanups.
Diffstat:
A .hgignore | 1 +
M Makefile | 6 +++---
M README | 7 +++++--
M conffile.c | 2 +-
M options.c | 4 ++--
M password.c | 2 +-
A samba30-compat.h | 266 +++++++++++++++++++++++++++++++
M usmb.c | 9 +++++----
M usmb.conf | 4 ++--
M usmb_dir.c | 21 ++++++++++++---------
M usmb_file.c | 62 ++++++++++++++++---------------
M version.h | 4 ++--
12 files changed, 333 insertions(+), 55 deletions(-)
---
(DIR) diff --git a/.hgignore b/.hgignore
@@ -0,0 +1 @@
+config.rng.h
(DIR) diff --git a/Makefile b/Makefile
@@ -100,9 +100,9 @@ conffile.o: conffile.c password.h utils.h xml.h config.rng.h
options.o: options.c options.h utils.h version.h
password.o: password.c password.h utils.h
usmb.o: usmb.c conffile.h options.h usmb.h usmb_dir.h usmb_file.h utils.h \
- version.h
-usmb_dir.o: usmb_dir.c usmb_dir.h usmb.h utils.h
-usmb_file.o: usmb_file.c usmb_file.h usmb.h utils.h
+ version.h samba30-compat.h
+usmb_dir.o: samba30-compat.h usmb_dir.c usmb_dir.h usmb.h utils.h
+usmb_file.o: samba30-compat.h usmb_file.c usmb_file.h usmb.h utils.h
utils.o: utils.c utils.h
version.o: version.c version.h
xml.o: xml.c xml.h utils.h
(DIR) diff --git a/README b/README
@@ -4,12 +4,15 @@ usmb - Unprivileged mounting of SMB/CIFS shares via FUSE
Acknowledgements
----------------
-Jonathan Schultz (Email firstname at imatix.com) provided a patch
+Jonathan Schultz (Email <firstname> at imatix.com) provided a patch
to fix the display of file modification times.
-Stijn Hoop (Email firstname at sandcat.nl) provided a patch to fix
+Stijn Hoop (Email <firstname> at sandcat.nl) provided a patch to fix
a compilation problem on 64-bit platforms.
+Nigel Smith (Email me at <firstname>.<surname>.name) contributed the
+port to Samba 3.2.
+
Introduction
------------
(DIR) diff --git a/conffile.c b/conffile.c
@@ -100,7 +100,7 @@ static bool conffile_read (const char *filename,
xmlFreeDoc (*doc);
return false;
}
-
+
return true;
}
(DIR) diff --git a/options.c b/options.c
@@ -144,13 +144,13 @@ void build_fuse_args (const char *options, const char *mountpoint,
if (debug)
argv[argc++] = "-d";
-
+
// force -f in debug mode
#ifndef DEBUGON
if (nofork)
#endif
argv[argc++] = "-f";
-
+
argv[argc++] = "-o";
argv[argc++] = "max_read=32768";
(DIR) diff --git a/password.c b/password.c
@@ -70,7 +70,7 @@ bool password_read (char **out)
if ((0 < len) && ('\n' == buff[len - 1]))
buff[len - 1] = '\0';
}
-
+
*out = xstrdup (buff);
DEBUG (fprintf (stderr, "Password: %s\n", *out));
(DIR) diff --git a/samba30-compat.h b/samba30-compat.h
@@ -0,0 +1,266 @@
+/* usmb - mount SMB shares via FUSE and Samba
+ * Copyright (C) 2006-2008 Geoff Johnstone
+ *
+ * Portions of this file are taken from Samba 3.2's libsmbclient.h:
+ * Copyright (C) Andrew Tridgell 1998
+ * Copyright (C) Richard Sharpe 2000
+ * Copyright (C) John Terpsra 2000
+ * Copyright (C) Tom Jansen (Ninja ISD) 2002
+ * Copyright (C) Derrell Lipman 2003-2008
+ *
+ * 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; either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SAMBA_30_COMPAT_H
+ #define SAMBA_30_COMPAT_H
+
+ #include <libsmbclient.h>
+
+ #ifndef DEPRECATED_SMBC_INTERFACE
+
+ typedef int (*smbc_chmod_fn) (SMBCCTX *c, const char *fname, mode_t mode);
+
+ static inline smbc_chmod_fn smbc_getFunctionChmod (SMBCCTX *c)
+ {
+ return c->chmod;
+ }
+
+
+ typedef int (*smbc_close_fn) (SMBCCTX *c, SMBCFILE *file);
+
+ static inline smbc_close_fn smbc_getFunctionClose (SMBCCTX *c)
+ {
+ return c->close_fn;
+ }
+
+
+ typedef int (*smbc_closedir_fn) (SMBCCTX *c, SMBCFILE *dir);
+
+ static inline smbc_closedir_fn smbc_getFunctionClosedir (SMBCCTX *c)
+ {
+ return c->closedir;
+ }
+
+
+ typedef SMBCFILE * (*smbc_creat_fn) (SMBCCTX *c,
+ const char *path,
+ mode_t mode);
+
+ static inline smbc_creat_fn smbc_getFunctionCreat (SMBCCTX *c)
+ {
+ return c->creat;
+ }
+
+
+ typedef int (*smbc_fstat_fn) (SMBCCTX *c, SMBCFILE *file, struct stat *st);
+
+ static inline smbc_fstat_fn smbc_getFunctionFstat (SMBCCTX *c)
+ {
+ return c->fstat;
+ }
+
+
+ typedef int (*smbc_getxattr_fn) (SMBCCTX *context,
+ const char *fname,
+ const char *name,
+ const void *value,
+ size_t size);
+
+ static inline smbc_getxattr_fn smbc_getFunctionGetxattr (SMBCCTX *c)
+ {
+ return c->getxattr;
+ }
+
+
+ typedef int (*smbc_listxattr_fn) (SMBCCTX *context,
+ const char *fname,
+ char *list,
+ size_t size);
+
+ static inline smbc_listxattr_fn smbc_getFunctionListxattr (SMBCCTX *c)
+ {
+ return c->listxattr;
+ }
+
+
+ typedef off_t (*smbc_lseek_fn) (SMBCCTX *c,
+ SMBCFILE *file,
+ off_t offset,
+ int whence);
+
+ static inline smbc_lseek_fn smbc_getFunctionLseek (SMBCCTX *c)
+ {
+ return c->lseek;
+ }
+
+
+ typedef int (*smbc_mkdir_fn) (SMBCCTX *c, const char *fname, mode_t mode);
+
+ static inline smbc_mkdir_fn smbc_getFunctionMkdir (SMBCCTX *c)
+ {
+ return c->mkdir;
+ }
+
+
+ typedef SMBCFILE * (*smbc_open_fn) (SMBCCTX *c,
+ const char *fname,
+ int flags,
+ mode_t mode);
+
+ static inline smbc_open_fn smbc_getFunctionOpen (SMBCCTX *c)
+ {
+ return c->open;
+ }
+
+
+ typedef SMBCFILE * (*smbc_opendir_fn) (SMBCCTX *c, const char *fname);
+
+ static inline smbc_opendir_fn smbc_getFunctionOpendir (SMBCCTX *c)
+ {
+ return c->opendir;
+ }
+
+
+ typedef ssize_t (*smbc_read_fn) (SMBCCTX *c,
+ SMBCFILE *file,
+ void *buf,
+ size_t count);
+
+ static inline smbc_read_fn smbc_getFunctionRead (SMBCCTX *c)
+ {
+ return c->read;
+ }
+
+
+ typedef struct smbc_dirent * (*smbc_readdir_fn) (SMBCCTX *c, SMBCFILE *dir);
+
+ static inline smbc_readdir_fn smbc_getFunctionReaddir (SMBCCTX *c)
+ {
+ return c->readdir;
+ }
+
+
+ typedef int (*smbc_removexattr_fn) (SMBCCTX *context,
+ const char *fname,
+ const char *name);
+
+ static inline smbc_removexattr_fn smbc_getFunctionRemovexattr (SMBCCTX *c)
+ {
+ return c->removexattr;
+ }
+
+
+ typedef int (*smbc_rename_fn) (SMBCCTX *ocontext,
+ const char *oname,
+ SMBCCTX *ncontext,
+ const char *nname);
+
+ static inline smbc_rename_fn smbc_getFunctionRename (SMBCCTX *c)
+ {
+ return c->rename;
+ }
+
+
+ typedef int (*smbc_rmdir_fn) (SMBCCTX *c, const char *fname);
+
+ static inline smbc_rmdir_fn smbc_getFunctionRmdir (SMBCCTX *c)
+ {
+ return c->rmdir;
+ }
+
+
+ typedef int (*smbc_setxattr_fn) (SMBCCTX *context,
+ const char *fname,
+ const char *name,
+ const void *value,
+ size_t size,
+ int flags);
+
+ static inline smbc_setxattr_fn smbc_getFunctionSetxattr (SMBCCTX *c)
+ {
+ return c->setxattr;
+ }
+
+
+ typedef int (*smbc_stat_fn) (SMBCCTX *c, const char *fname, struct stat *s);
+
+ static inline smbc_stat_fn smbc_getFunctionStat (SMBCCTX *c)
+ {
+ return c->stat;
+ }
+
+
+ typedef int (*smbc_unlink_fn) (SMBCCTX *c, const char *fname);
+
+ static inline smbc_unlink_fn smbc_getFunctionUnlink (SMBCCTX *c)
+ {
+ return c->unlink;
+ }
+
+
+ typedef int (*smbc_utimes_fn) (SMBCCTX *c,
+ const char *fname,
+ struct timeval *tbuf);
+
+ static inline smbc_utimes_fn smbc_getFunctionUtimes (SMBCCTX *c)
+ {
+ return c->utimes;
+ }
+
+
+ typedef ssize_t (*smbc_write_fn) (SMBCCTX *c,
+ SMBCFILE *file,
+ void *buf,
+ size_t count);
+
+ static inline smbc_write_fn smbc_getFunctionWrite (SMBCCTX *c)
+ {
+ return c->write;
+ }
+
+
+ typedef void (*smbc_get_auth_fn) (const char *srv,
+ const char *shr,
+ char *wg, int wglen,
+ char *un, int unlen,
+ char *pw, int pwlen);
+
+ static inline void smbc_setFunctionAuthData (SMBCCTX *c,
+ smbc_get_auth_data_fn fn)
+ {
+ c->callbacks.auth_fn = fn;
+ }
+
+
+ static inline void smbc_setTimeout (SMBCCTX *c, int timeout)
+ {
+ c->timeout = timeout;
+ }
+
+
+ static inline void smbc_setUser (SMBCCTX *c, char *user)
+ {
+ c->user = user;
+ }
+
+
+ static inline void smbc_setWorkgroup (SMBCCTX *c, char *workgroup)
+ {
+ c->workgroup = workgroup;
+ }
+
+ #endif
+
+#endif
+
(DIR) diff --git a/usmb.c b/usmb.c
@@ -17,6 +17,7 @@
#include <sys/time.h> // struct timeval needed by libsmbclient.h
#include <unistd.h>
#include <libsmbclient.h>
+#include "samba30-compat.h"
#include <fuse.h>
#include <assert.h>
#include <stdarg.h>
@@ -83,10 +84,10 @@ static bool create_smb_context (char *domain, char *username, SMBCCTX **pctx)
return false;
}
- (*pctx)->workgroup = domain;
- (*pctx)->user = username;
- (*pctx)->timeout = 5000;
- (*pctx)->callbacks.auth_fn = auth_fn;
+ smbc_setWorkgroup (*pctx, domain);
+ smbc_setUser (*pctx, username);
+ smbc_setTimeout (*pctx, 5000);
+ smbc_setFunctionAuthData (*pctx, auth_fn);
if (NULL == smbc_init_context (*pctx))
{
(DIR) diff --git a/usmb.conf b/usmb.conf
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
+<!--
Example usmb.conf
=================
@@ -56,4 +56,4 @@
</mount>
</usmbconfig>
-
+
(DIR) diff --git a/usmb_dir.c b/usmb_dir.c
@@ -16,6 +16,7 @@
#include <sys/time.h> // struct timeval needed by libsmbclient.h
#include <libsmbclient.h>
+#include "samba30-compat.h"
#include <fuse.h>
#include <dirent.h>
#include <errno.h>
@@ -36,7 +37,7 @@ int usmb_mkdir (const char *dirname, mode_t mode)
return -ENOMEM;
DEBUG (fprintf (stderr, "mkdir (%s)\n", url));
- int ret = ctx->mkdir (ctx, url, mode) ? -errno : 0;
+ int ret = smbc_getFunctionMkdir (ctx) (ctx, url, mode) ? -errno : 0;
free (url);
return ret;
}
@@ -49,7 +50,7 @@ int usmb_rmdir (const char *dirname)
return -ENOMEM;
DEBUG (fprintf (stderr, "rmdir (%s)\n", url));
- int ret = ctx->rmdir (ctx, url) ? -errno : 0;
+ int ret = smbc_getFunctionRmdir (ctx) (ctx, url) ? -errno : 0;
free (url);
return ret;
}
@@ -62,7 +63,7 @@ int usmb_opendir (const char *dirname, struct fuse_file_info *fi)
return -ENOMEM;
DEBUG (fprintf (stderr, "opendir (%s)", url));
- SMBCFILE *file = ctx->opendir (ctx, url);
+ SMBCFILE *file = smbc_getFunctionOpendir (ctx) (ctx, url);
DEBUG (fprintf (stderr, " = %p\n", (void *)file));
int ret = (NULL == file) ? -errno : 0;
@@ -82,7 +83,7 @@ int usmb_readdir (const char *path UNUSED, void *h, fuse_fill_dir_t filler,
DEBUG (fprintf (stderr, "readdir (%s, %p)\n", path, (void *)file));
- while (NULL != (dirent = ctx->readdir (ctx, file)))
+ while (NULL != (dirent = smbc_getFunctionReaddir (ctx) (ctx, file)))
{
struct stat stbuf;
@@ -116,7 +117,7 @@ int usmb_releasedir (const char *path UNUSED, struct fuse_file_info *fi)
{
SMBCFILE *file = fd_to_smbcfile (fi->fh);
DEBUG (fprintf (stderr, "releasedir (%s, %p)\n", path, (void *)file));
- return (0 > ctx->closedir (ctx, file)) ? -errno : 0;
+ return (0 > smbc_getFunctionClosedir (ctx) (ctx, file)) ? -errno : 0;
}
@@ -129,7 +130,8 @@ int usmb_setxattr (const char *path, const char *name, const char *value,
DEBUG (fprintf (stderr, "setxattr (%s, %s, %p, %u, %x)\n",
path, url, value, size, flags));
- int ret = ctx->setxattr (ctx, url, name, value, size, flags) ? -errno : 0;
+ int ret = smbc_getFunctionSetxattr (ctx) (ctx, url, name,
+ value, size, flags) ? -errno : 0;
free (url);
return ret;
}
@@ -143,7 +145,8 @@ int usmb_getxattr (const char *path, const char *name, char *value, size_t size)
DEBUG (fprintf (stderr, "getxattr (%s, %s, %p, %u)\n",
path, url, value, size));
- int ret = ctx->getxattr (ctx, url, name, value, size) ? -errno : 0;
+ int ret = smbc_getFunctionGetxattr (ctx) (ctx, url, name,
+ value, size) ? -errno : 0;
free (url);
return ret;
}
@@ -156,7 +159,7 @@ int usmb_listxattr (const char *path, char *list, size_t size)
return -ENOMEM;
DEBUG (fprintf (stderr, "listxattr (%s, %p, %u)\n", url, list, size));
- int ret = ctx->listxattr (ctx, url, list, size) ? -errno : 0;
+ int ret = smbc_getFunctionListxattr (ctx) (ctx, url, list, size) ? -errno : 0;
free (url);
return ret;
}
@@ -169,7 +172,7 @@ int usmb_removexattr (const char *path, const char *name)
return -ENOMEM;
DEBUG (fprintf (stderr, "removexattr (%s, %s)\n", url, name));
- int ret = ctx->removexattr (ctx, url, name) ? -errno : 0;
+ int ret = smbc_getFunctionRemovexattr (ctx) (ctx, url, name) ? -errno : 0;
free (url);
return ret;
}
(DIR) diff --git a/usmb_file.c b/usmb_file.c
@@ -16,6 +16,7 @@
#include <sys/time.h> // struct timeval needed by libsmbclient.h
#include <libsmbclient.h>
+#include "samba30-compat.h"
#include <limits.h>
#include <assert.h>
#include <fuse.h>
@@ -39,7 +40,7 @@ static bool fix_nlink (const char *url, struct stat *st)
if (!S_ISDIR (st->st_mode))
return true;
- SMBCFILE *file = ctx->opendir (ctx, url);
+ SMBCFILE *file = smbc_getFunctionOpendir (ctx) (ctx, url);
if (NULL == file)
return false;
@@ -48,15 +49,15 @@ static bool fix_nlink (const char *url, struct stat *st)
struct smbc_dirent *dirent;
- while (NULL != (dirent = ctx->readdir (ctx, file)))
+ while (NULL != (dirent = smbc_getFunctionReaddir (ctx) (ctx, file)))
if (SMBC_DIR == dirent->smbc_type)
if (INT_MAX == st->st_nlink++)
break;
- (void)ctx->closedir (ctx, file);
+ (void)smbc_getFunctionClosedir (ctx) (ctx, file);
return (NULL == dirent);
}
-
+
int usmb_getattr (const char *filename, struct stat *st)
{
@@ -66,7 +67,7 @@ int usmb_getattr (const char *filename, struct stat *st)
DEBUG (fprintf (stderr, "stat (%s)\n", url));
- int ret = ctx->stat (ctx, url, st);
+ int ret = smbc_getFunctionStat (ctx) (ctx, url, st);
if ((0 > ret) || !fix_nlink (url, st))
ret = -errno;
@@ -82,7 +83,7 @@ int usmb_fgetattr (const char *filename UNUSED, struct stat *st,
SMBCFILE *file = fd_to_smbcfile (fi->fh);
DEBUG (fprintf (stderr, "fgetattr (%s, %p)\n", filename, (void *)file));
- if (0 > ctx->fstat (ctx, file, st))
+ if (0 > smbc_getFunctionFstat (ctx) (ctx, file, st))
return -errno;
if (S_ISDIR (st->st_mode))
@@ -109,7 +110,7 @@ int usmb_unlink (const char *filename)
return -ENOMEM;
DEBUG (fprintf (stderr, "unlink (%s)\n", url));
- int ret = (0 > ctx->unlink (ctx, url)) ? -errno : 0;
+ int ret = (0 > smbc_getFunctionUnlink (ctx) (ctx, url)) ? -errno : 0;
free (url);
return ret;
}
@@ -122,7 +123,7 @@ int usmb_open (const char *filename, struct fuse_file_info *fi)
return -ENOMEM;
DEBUG (fprintf (stderr, "open (%s, %d)", url, fi->flags));
- SMBCFILE *file = ctx->open (ctx, url, fi->flags, 0);
+ SMBCFILE *file = smbc_getFunctionOpen (ctx) (ctx, url, fi->flags, 0);
DEBUG (fprintf (stderr, " = %p\n", (void *)file));
int ret = (NULL == file) ? -errno : 0;
@@ -137,26 +138,26 @@ int usmb_release (const char *filename UNUSED, struct fuse_file_info *fi)
{
SMBCFILE *file = fd_to_smbcfile (fi->fh);
DEBUG (fprintf (stderr, "release (%s, %p)\n", filename, (void *)file));
- return (0 > ctx->close_fn (ctx, file)) ? -errno : 0;
+ return (0 > smbc_getFunctionClose (ctx) (ctx, file)) ? -errno : 0;
}
int usmb_read (const char *filename UNUSED, char *buff, size_t len, off_t off,
struct fuse_file_info *fi)
{
- assert (len <= 32768);
+ assert (32768 >= len);
SMBCFILE *file = fd_to_smbcfile (fi->fh);
DEBUG (fprintf (stderr, "read (%p, %p, %u, %lld) ",
(void *)file, buff, len, off));
- if (0 > ctx->lseek (ctx, file, off, SEEK_SET))
+ if (0 > smbc_getFunctionLseek (ctx) (ctx, file, off, SEEK_SET))
{
fprintf (stderr, "- seek failed: %d\n", -errno);
return -errno;
}
- int bytes = ctx->read (ctx, file, buff, len);
+ int bytes = smbc_getFunctionRead (ctx) (ctx, file, buff, len);
DEBUG (fprintf (stderr, "= %d\n", bytes));
return (0 > bytes) ? -errno : (int)bytes;
}
@@ -169,20 +170,20 @@ int usmb_write (const char *filename UNUSED, const char *buff, size_t len,
DEBUG (fprintf (stderr, "write (%p, %p, len=%u, off=%lld) ",
(void *)file, buff, len, off));
- if (0 > ctx->lseek (ctx, file, off, SEEK_SET))
- {
- fprintf (stderr, "- seek failed: %d\n", -errno);
+ if (0 > smbc_getFunctionLseek (ctx) (ctx, file, off, SEEK_SET))
return -errno;
- }
size_t written = 0;
int bytes = 0;
// No idea whether Windows servers don't like > 32768 byte writes
// (cf. usmb_read), but taking no chances...
+
+ const smbc_write_fn write_fn = smbc_getFunctionWrite (ctx);
+
while (written < len)
{
- bytes = ctx->write (ctx, file, (char *)buff, (len > 32768) ? 32768 : len);
+ bytes = write_fn (ctx, file, (char *)buff, (len > 32768) ? 32768 : len);
if (0 > bytes)
break;
@@ -207,11 +208,11 @@ int usmb_create (const char *filename, mode_t mode, struct fuse_file_info *fi)
DEBUG (fprintf (stderr, "creat (%s)", url));
- SMBCFILE *file = ctx->creat (ctx, url, mode);
+ SMBCFILE *file = smbc_getFunctionCreat (ctx) (ctx, url, mode);
DEBUG (fprintf (stderr, " = %p\n", (void *)file));
int ret = (NULL == file) ? -errno : 0;
fi->fh = smbcfile_to_fd (file);
-
+
free (url);
return ret;
}
@@ -231,7 +232,8 @@ int usmb_rename (const char *from, const char *to)
}
DEBUG (fprintf (stderr, "rename (%s, %s)\n", fromurl, tourl));
- int ret = (0 > ctx->rename (ctx, fromurl, ctx, tourl)) ? -errno : 0;
+ int ret =
+ (0 > smbc_getFunctionRename (ctx) (ctx, fromurl, ctx, tourl)) ? -errno : 0;
free (tourl);
free (fromurl);
return ret;
@@ -270,7 +272,7 @@ int usmb_utime (const char *filename, struct utimbuf *utb)
};
DEBUG (fprintf (stderr, "utime (%s)\n", url));
- int ret = (0 > ctx->utimes (ctx, url, tv)) ? -errno : 0;
+ int ret = (0 > smbc_getFunctionUtimes (ctx) (ctx, url, tv)) ? -errno : 0;
free (url);
return ret;
}
@@ -310,15 +312,16 @@ int usmb_truncate (const char *filename, off_t offset)
char *url = make_url (filename);
if (NULL == url)
return -ENOMEM;
-
- SMBCFILE *file = ctx->open (ctx, url, O_WRONLY | O_TRUNC, 0);
+
+ SMBCFILE *file = smbc_getFunctionOpen (ctx) (ctx, url,
+ O_WRONLY | O_TRUNC, 0);
if (NULL == file)
{
free_errno (url);
return -errno;
}
-
- ctx->close_fn (ctx, file);
+
+ smbc_getFunctionClose (ctx) (ctx, file);
free (url);
return 0;
@@ -339,9 +342,9 @@ int usmb_chmod (const char *filename, mode_t mode)
char *url = make_url (filename);
if (NULL == url)
return -ENOMEM;
-
+
DEBUG (fprintf (stderr, "chmod (%s, %u)\n", url, mode));
- int ret = (0 > ctx->chmod (ctx, url, mode)) ? -errno : 0;
+ int ret = (0 > smbc_getFunctionChmod (ctx) (ctx, url, mode)) ? -errno : 0;
free (url);
return ret;
}
@@ -354,9 +357,10 @@ int usmb_chown (const char *filename, uid_t owner, uid_t group)
char *url = make_url (filename);
if (NULL == url)
return -ENOMEM;
-
+
DEBUG (fprintf (stderr, "chown (%s, %d, %d)\n", url, owner, group));
- int ret = (ctx->chown (ctx, url, owner, group) < 0) ? -errno : 0;
+ int ret =
+ (0 > smbc_getFunctionChown (ctx) (ctx, url, owner, group)) ? -errno : 0;
free (url);
return ret;
}
(DIR) diff --git a/version.h b/version.h
@@ -19,10 +19,10 @@
#include <stdio.h>
- #define USMB_VERSION 0x20080625
+ #define USMB_VERSION 0x20080626
// a - alpha, b - beta, p - pre-release, s - stable
- #define USMB_VERSION_STATUS 's'
+ #define USMB_VERSION_STATUS 'b'
void show_about (FILE *fp);
void show_version (FILE *fp);