Introduction
Introduction Statistics Contact Development Disclaimer Help
Use a new context for usmb_readdir(). - susmb - mounting of SMB/CIFS shares via…
git clone git://git.codemadness.org/susmb
Log
Files
Refs
README
LICENSE
---
commit c2d69fd5b355cd1b982bb9919d4e9910ef447e7c
parent 0e9a2c7d1d573efa1409280752f4660dfcb84a70
Author: Geoff Johnstone <[email protected]>
Date: Fri, 10 Apr 2009 13:46:02 +0100
Use a new context for usmb_readdir().
Diffstat:
M usmb.c | 26 +++-----------------------
M usmb.h | 3 ++-
M usmb_dir.c | 86 +++++++++++++++++++++--------…
3 files changed, 63 insertions(+), 52 deletions(-)
---
diff --git a/usmb.c b/usmb.c
@@ -76,7 +76,7 @@ static void auth_fn (const char *srv UNUSED, const char *shr …
}
-static void destroy_smb_context (SMBCCTX *ctx, int shutdown)
+void destroy_smb_context (SMBCCTX *ctx, int shutdown)
{
// Samba frees the workgroup and user strings but we want to persist them.
smbc_setWorkgroup (ctx, NULL);
@@ -85,7 +85,7 @@ static void destroy_smb_context (SMBCCTX *ctx, int shutdown)
}
-static bool create_smb_context (char *domain, char *username, SMBCCTX **pctx)
+bool create_smb_context (SMBCCTX **pctx)
{
*pctx = smbc_new_context();
@@ -256,7 +256,7 @@ static bool get_context (void)
if ((NULL == password) && !password_read (&password))
break;
- if (!create_smb_context (domain, username, &ctx))
+ if (!create_smb_context (&ctx))
{
clear_and_free (password);
password = NULL;
@@ -279,26 +279,6 @@ static bool get_context (void)
}
-bool renew_smb_context (void)
-{
- SMBCCTX *newctx;
-
- DEBUG (fputs ("renew_smb_context()\n", stderr));
-
- if (!create_smb_context (domain, username, &newctx))
- {
- fputs ("Failed to create new SMB context.\n", stderr);
- return false;
- }
-
- if (NULL != ctx)
- destroy_smb_context (ctx, 0);
-
- ctx = newctx;
- return true;
-}
-
-
int main (int argc, char **argv)
{
const char *conffile, *mountid;
diff --git a/usmb.h b/usmb.h
@@ -24,7 +24,8 @@
char * make_url (const char *path) MUSTCHECK;
- bool renew_smb_context (void);
+ bool create_smb_context (SMBCCTX **pctx) MUSTCHECK;
+ void destroy_smb_context (SMBCCTX *ctx, int shutdown);
/* fuse_file_info uses a uint64_t for a "File handle" */
static inline uint64_t smbcfile_to_fd (SMBCFILE *file)
diff --git a/usmb_dir.c b/usmb_dir.c
@@ -53,9 +53,6 @@ int usmb_rmdir (const char *dirname)
int ret = smbc_getFunctionRmdir (ctx) (ctx, url) ? -errno : 0;
free (url);
- if (0 == ret)
- (void)renew_smb_context();
-
return ret;
}
@@ -78,44 +75,77 @@ int usmb_opendir (const char *dirname, struct fuse_file_inf…
}
-int usmb_readdir (const char *path UNUSED, void *h, fuse_fill_dir_t filler,
- off_t offset UNUSED, struct fuse_file_info *fi)
+int usmb_readdir (const char *path, void *h, fuse_fill_dir_t filler,
+ off_t offset UNUSED, struct fuse_file_info *fi UNUSED)
{
+ SMBCCTX *ctx = NULL;
+ SMBCFILE *file = NULL;
+ char *url = NULL;
struct smbc_dirent *dirent;
- errno = 0;
- SMBCFILE *file = fd_to_smbcfile (fi->fh);
+ int ret = 0;
- DEBUG (fprintf (stderr, "readdir (%s, %p)\n", path, (void *)file));
- smbc_getFunctionLseekdir (ctx) (ctx, file, 0);
+ DEBUG (fprintf (stderr, "readdir (%s)\n", path));
- while (NULL != (dirent = smbc_getFunctionReaddir (ctx) (ctx, file)))
- {
- struct stat stbuf;
+ if (!create_smb_context (&ctx))
+ return -errno;
- switch (dirent->smbc_type)
+ do
+ {
+ url = make_url (path);
+ if (NULL == url)
{
- case SMBC_DIR:
- stbuf.st_mode = DT_DIR << 12;
- break;
+ ret = -ENOMEM;
+ break;
+ }
- case SMBC_FILE:
- stbuf.st_mode = DT_REG << 12;
- break;
+ file = smbc_getFunctionOpendir (ctx) (ctx, url);
+ if (NULL == file)
+ {
+ ret = -errno;
+ break;
+ }
- case SMBC_LINK:
- stbuf.st_mode = DT_LNK << 12;
- break;
+ smbc_getFunctionLseekdir (ctx) (ctx, file, 0);
- default:
+ while (NULL != (dirent = smbc_getFunctionReaddir (ctx) (ctx, file)))
+ {
+ struct stat stbuf;
+
+ switch (dirent->smbc_type)
+ {
+ case SMBC_DIR:
+ stbuf.st_mode = DT_DIR << 12;
+ break;
+
+ case SMBC_FILE:
+ stbuf.st_mode = DT_REG << 12;
+ break;
+
+ case SMBC_LINK:
+ stbuf.st_mode = DT_LNK << 12;
+ break;
+
+ default:
+ break;
+ }
+
+ DEBUG (fprintf (stderr, " %s\n", dirent->name));
+ if (1 == filler (h, dirent->name, &stbuf, 0)) /* if error */
+ {
+ ret = -1;
break;
+ }
}
+ } while (false /*CONSTCOND*/);
+
+ if (NULL != file)
+ (void)smbc_getFunctionClosedir (ctx) (ctx, file);
- DEBUG (fprintf (stderr, " %s\n", dirent->name));
- if (1 == filler (h, dirent->name, &stbuf, 0)) /* if error */
- return -1;
- }
+ if (NULL != url)
+ free (url);
- return -errno;
+ destroy_smb_context (ctx, 0);
+ 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.