Introduction
Introduction Statistics Contact Development Disclaimer Help
Implemented Samba contexts. Added -Werror to CFLAGS. Forced -f in debug build. …
git clone git://git.codemadness.org/susmb
Log
Files
Refs
README
LICENSE
---
commit 23d458c666083432ecb49a694ded6372b131e03b
parent c8dd66a8ee51aaa97ad616e5a0b619fad341b9dd
Author: geoff <devnull@localhost>
Date: Sat, 8 Jul 2006 20:15:57 +0000
Implemented Samba contexts.
Added -Werror to CFLAGS.
Forced -f in debug build.
Diffstat:
M Makefile | 2 +-
M options.c | 3 +++
M usmb.c | 40 +++++++++++++++++++++++++----…
M usmb.h | 16 ++++++++++++++++
M usmb_dir.c | 26 +++++++++++++++-----------
M usmb_file.c | 73 +++++++++++++++++++----------…
6 files changed, 112 insertions(+), 48 deletions(-)
---
diff --git a/Makefile b/Makefile
@@ -23,7 +23,7 @@ INSTALL = install
PREFIX = /usr/local
BINDIR = $(PREFIX)/bin
-CFLAGS = -Wall -W -std=c99 -pedantic -O \
+CFLAGS = -Wall -W -Werror -std=c99 -pedantic -O \
-I$(SAMBA)/include -D_BSD_SOURCE -DFUSE_USE_VERSION=25 \
-DHAVE_UTIME_H
diff --git a/options.c b/options.c
@@ -147,7 +147,10 @@ void build_fuse_args (char *options, char *mountpoint,
if (debug)
argv[argc++] = "-d";
+ // force -f in debug mode
+#ifndef DEBUG
if (nofork)
+#endif
argv[argc++] = "-f";
argv[argc++] = "-o";
diff --git a/usmb.c b/usmb.c
@@ -40,6 +40,7 @@
#include "version.h"
+SMBCCTX *ctx;
static const char *share = NULL;
@@ -61,9 +62,9 @@ static inline void do_strncpy (char *to, const char *from, in…
}
-static const char *domain = NULL;
-static const char *username = NULL;
-static const char *password = NULL;
+static char *domain = NULL;
+static char *username = NULL;
+static char *password = NULL;
static void auth_fn (const char *srv, const char *shr, char *wg, int wglen,
char *un, int unlen, char *pw, int pwlen)
@@ -82,6 +83,32 @@ static void auth_fn (const char *srv, const char *shr, char …
}
+static bool create_smb_context (char *domain, char *username, SMBCCTX **pctx)
+{
+ *pctx = smbc_new_context();
+
+ if (NULL == *pctx)
+ {
+ perror ("Cannot create SMB context");
+ return false;
+ }
+
+ (*pctx)->workgroup = domain;
+ (*pctx)->user = username;
+ (*pctx)->timeout = 5000;
+ (*pctx)->callbacks.auth_fn = auth_fn;
+
+ if (NULL == smbc_init_context (*pctx))
+ {
+ perror ("Cannot initialise SMB context");
+ smbc_free_context (*pctx, 1);
+ return false;
+ }
+
+ return true;
+}
+
+
static void * usmb_init (void)
{
DEBUG (fputs ("usmb_init()\n", stderr));
@@ -270,11 +297,8 @@ int main (int argc, char **argv)
return EXIT_FAILURE;
}
- if (0 != smbc_init (auth_fn, 0))
- {
- perror ("Cannot initialise SMB library");
+ if (!create_smb_context (domain, username, &ctx))
return EXIT_FAILURE;
- }
show_about (stdout);
@@ -283,6 +307,8 @@ int main (int argc, char **argv)
build_fuse_args (options, mountpoint, &fuse_argc, &fuse_argv);
int ret = fuse_main (fuse_argc, fuse_argv, &fuse_ops);
+ smbc_free_context (ctx, 1);
+
xfree (mountpoint);
xfree (options);
xfree (domain);
diff --git a/usmb.h b/usmb.h
@@ -19,6 +19,22 @@
#ifndef USMB_H
#define USMB_H
+ #include <libsmbclient.h>
+
+ extern SMBCCTX *ctx;
+
char * make_url (const char *path);
+
+ static inline int smbcfile_to_fd (SMBCFILE *file)
+ {
+ return (NULL == file) ? -1 : (int)file;
+ }
+
+
+ static inline SMBCFILE * fd_to_smbcfile (int fd)
+ {
+ return (SMBCFILE *)fd;
+ }
+
#endif
diff --git a/usmb_dir.c b/usmb_dir.c
@@ -38,7 +38,7 @@ int usmb_mkdir (const char *dirname, mode_t mode)
return -ENOMEM;
DEBUG (fprintf (stderr, "mkdir (%s)\n", url));
- int ret = smbc_mkdir (url, mode) ? -errno : 0;
+ int ret = ctx->mkdir (ctx, url, mode) ? -errno : 0;
free (url);
return ret;
}
@@ -51,7 +51,7 @@ int usmb_rmdir (const char *dirname)
return -ENOMEM;
DEBUG (fprintf (stderr, "rmdir (%s)\n", url));
- int ret = smbc_rmdir (url) ? -errno : 0;
+ int ret = ctx->rmdir (ctx, url) ? -errno : 0;
free (url);
return ret;
}
@@ -64,12 +64,13 @@ int usmb_opendir (const char *dirname, struct fuse_file_inf…
return -ENOMEM;
DEBUG (fprintf (stderr, "opendir (%s)", url));
- int fd = smbc_opendir (url);
- fi->fh = fd;
- DEBUG (fprintf (stderr, " = %d\n", fd));
+ SMBCFILE *file = ctx->opendir (ctx, url);
+ DEBUG (fprintf (stderr, " = %p\n", (void *)file));
- int ret = (fd < 0) ? -errno : 0;
+ int ret = (file == NULL) ? -errno : 0;
free (url);
+ fi->fh = smbcfile_to_fd (file);
+
return ret;
}
@@ -80,11 +81,13 @@ int usmb_readdir (const char *path, void *h, fuse_fill_dir_…
(void)path;
(void)offset;
- DEBUG (fprintf (stderr, "readdir (%s, %llu)\n", path, fi->fh));
-
struct smbc_dirent *dirent;
errno = 0;
- while (NULL != (dirent = smbc_readdir (fi->fh)))
+ SMBCFILE *file = fd_to_smbcfile (fi->fh);
+
+ DEBUG (fprintf (stderr, "readdir (%s, %p)\n", path, (void *)file));
+
+ while (NULL != (dirent = ctx->readdir (ctx, file)))
{
struct stat stbuf;
@@ -118,7 +121,8 @@ int usmb_releasedir (const char *path, struct fuse_file_inf…
{
(void)path;
- DEBUG (fprintf (stderr, "releasedir (%s, %llu)\n", path, fi->fh));
- return (smbc_closedir (fi->fh) < 0) ? -errno : 0;
+ SMBCFILE *file = fd_to_smbcfile (fi->fh);
+ DEBUG (fprintf (stderr, "releasedir (%s, %p)\n", path, (void *)file));
+ return (ctx->closedir (ctx, file) < 0) ? -errno : 0;
}
diff --git a/usmb_file.c b/usmb_file.c
@@ -35,7 +35,7 @@ int usmb_getattr (const char *filename, struct stat *st)
char *url = make_url (filename);
DEBUG (fprintf (stderr, "stat (%s)\n", url));
- int ret = smbc_stat (url, st);
+ int ret = ctx->stat (ctx, url, st);
free (url);
return (ret < 0) ? -errno : 0;
}
@@ -45,8 +45,9 @@ int usmb_fgetattr (const char *filename, struct stat *st,
struct fuse_file_info *fi)
{
(void)filename;
- DEBUG (fprintf (stderr, "fgetattr (%s, %llu)\n", filename, fi->fh));
- return (smbc_fstat (fi->fh, st) < 0) ? -errno : 0;
+ SMBCFILE *file = fd_to_smbcfile (fi->fh);
+ DEBUG (fprintf (stderr, "fgetattr (%s, %p)\n", filename, (void *)file));
+ return (ctx->fstat (ctx, file, st) < 0) ? -errno : 0;
}
@@ -57,7 +58,7 @@ int usmb_unlink (const char *filename)
return -ENOMEM;
DEBUG (fprintf (stderr, "unlink (%s)\n", url));
- int ret = (smbc_unlink (url) < 0) ? -errno : 0;
+ int ret = (ctx->unlink (ctx, url) < 0) ? -errno : 0;
free (url);
return ret;
}
@@ -70,13 +71,13 @@ int usmb_open (const char *filename, struct fuse_file_info …
return -ENOMEM;
DEBUG (fprintf (stderr, "open (%s, %d)", url, fi->flags));
-
- int fd = smbc_open (url, fi->flags, 0);
- int ret = (fd < 0) ? -errno : 0;
- fi->fh = fd;
- DEBUG (fprintf (stderr, " = %d\n", fd));
+ SMBCFILE *file = ctx->open (ctx, url, fi->flags, 0);
+ DEBUG (fprintf (stderr, " = %p\n", (void *)file));
free (url);
+ int ret = (NULL == file) ? -errno : 0;
+ fi->fh = smbcfile_to_fd (file);
+
return ret;
}
@@ -84,8 +85,9 @@ int usmb_open (const char *filename, struct fuse_file_info *f…
int usmb_release (const char *filename, struct fuse_file_info *fi)
{
(void)filename;
- DEBUG (fprintf (stderr, "release (%s, %llu)\n", filename, fi->fh));
- return (smbc_close (fi->fh) < 0) ? -errno : 0;
+ SMBCFILE *file = fd_to_smbcfile (fi->fh);
+ DEBUG (fprintf (stderr, "release (%s, %p)\n", filename, (void *)file));
+ return (ctx->close_fn (ctx, file) < 0) ? -errno : 0;
}
@@ -97,15 +99,18 @@ int usmb_read (const char *filename, char *buff, size_t len…
assert (len <= 32768);
- DEBUG (fprintf (stderr, "read (%p, %u, %lld) ", buff, len, off));
+ SMBCFILE *file = fd_to_smbcfile (fi->fh);
+ DEBUG (fprintf (stderr, "read (%p, %p, %u, %lld) ",
+ (void *)file, buff, len, off));
- if (smbc_lseek (fi->fh, off, SEEK_SET) < 0)
+ if (ctx->lseek (ctx, file, off, SEEK_SET) < 0)
{
fprintf (stderr, "- seek failed: %d\n", -errno);
return -errno;
}
- int bytes = smbc_read (fi->fh, buff, len);
+ int bytes = ctx->read (ctx, file, buff, len);
+ DEBUG (fprintf (stderr, "= %d\n", bytes));
return (bytes < 0) ? -errno : (int)bytes;
}
@@ -116,10 +121,15 @@ int usmb_write (const char *filename, const char *buff, s…
(void)filename;
(void)off;
- DEBUG (fprintf (stderr, "write (%p, len=%u, off=%lld)\n", buff, len, off));
+ SMBCFILE *file = fd_to_smbcfile (fi->fh);
+ DEBUG (fprintf (stderr, "write (%p, %p, len=%u, off=%lld) ",
+ (void *)file, buff, len, off));
- if (smbc_lseek (fi->fh, off, SEEK_SET) < 0)
+ if (ctx->lseek (ctx, file, off, SEEK_SET) < 0)
+ {
+ fprintf (stderr, "- seek failed: %d\n", -errno);
return -errno;
+ }
size_t written = 0;
int bytes = 0;
@@ -128,7 +138,7 @@ int usmb_write (const char *filename, const char *buff, siz…
// (cf. usmb_read), but taking no chances...
while (written < len)
{
- bytes = smbc_write (fi->fh, (char *)buff, (len > 32768) ? 32768 : len);
+ bytes = ctx->write (ctx, file, (char *)buff, (len > 32768) ? 32768 : len);
if (bytes < 0)
break;
@@ -141,7 +151,7 @@ int usmb_write (const char *filename, const char *buff, siz…
break;
}
- DEBUG (fprintf (stderr, " = %d\n", (bytes < 0) ? -errno : (int)written));
+ DEBUG (fprintf (stderr, "= %d\n", (bytes < 0) ? -errno : (int)written));
return (bytes < 0) ? -errno : (int)written;
}
@@ -154,10 +164,10 @@ int usmb_create (const char *filename, mode_t mode, struc…
DEBUG (fprintf (stderr, "creat (%s)", url));
- int fd = smbc_creat (url, mode);
- int ret = (fd < 0) ? -errno : 0;
- fi->fh = fd;
- DEBUG (fprintf (stderr, " = %d\n", fd));
+ SMBCFILE *file = ctx->creat (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;
@@ -178,7 +188,7 @@ int usmb_rename (const char *from, const char *to)
}
DEBUG (fprintf (stderr, "rename (%s, %s)\n", fromurl, tourl));
- int ret = (smbc_rename (fromurl, tourl) < 0) ? -errno : 0;
+ int ret = (ctx->rename (ctx, fromurl, ctx, tourl) < 0) ? -errno : 0;
free (tourl);
free (fromurl);
return ret;
@@ -191,8 +201,13 @@ int usmb_utime (const char *filename, struct utimbuf *utb)
if (NULL == url)
return -ENOMEM;
+ struct timeval tv = {
+ .tv_sec = utb->modtime,
+ .tv_usec = 0
+ };
+
DEBUG (fprintf (stderr, "utime (%s)\n", url));
- int ret = (smbc_utime (url, utb) < 0) ? -errno : 0;
+ int ret = (ctx->utimes (ctx, url, &tv) < 0) ? -errno : 0;
free (url);
return ret;
}
@@ -210,11 +225,11 @@ int usmb_truncate (const char *filename, off_t newsize)
return -ENOMEM;
DEBUG (fprintf (stderr, "truncate (%s)\n", url));
- int fd = smbc_open (url, O_WRONLY | O_TRUNC, 0);
- if (fd < 0)
+ SMBCFILE *file = ctx->open (ctx, url, O_WRONLY | O_TRUNC, 0);
+ if (NULL == file)
return -errno;
- smbc_close (fd);
+ ctx->close_fn (ctx, file);
return 0;
}
@@ -226,7 +241,7 @@ int usmb_chmod (const char *filename, mode_t mode)
return -ENOMEM;
DEBUG (fprintf (stderr, "chmod (%s, %u)\n", url, mode));
- int ret = (smbc_chmod (url, mode) < 0) ? -errno : 0;
+ int ret = (ctx->chmod (ctx, url, mode) < 0) ? -errno : 0;
free (url);
return ret;
}
@@ -241,7 +256,7 @@ int usmb_chown (const char *filename, uid_t owner, uid_t gr…
return -ENOMEM;
DEBUG (fprintf (stderr, "chown (%s, %d, %d)\n", url, owner, group));
- int ret = (smbc_chown (url, owner, group) < 0) ? -errno : 0;
+ int ret = (ctx->chown (ctx, url, owner, group) < 0) ? -errno : 0;
free (url);
return ret;
}
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.