summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/Makefile.in2
-rw-r--r--source3/include/libsmb_internal.h67
-rw-r--r--source3/include/libsmbclient.h257
-rw-r--r--source3/libsmb/libsmb_compat.c8
-rw-r--r--source3/libsmb/libsmbclient.c169
5 files changed, 329 insertions, 174 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index c05006d3d3..630aa3a9bd 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -103,7 +103,7 @@ WINBIND_LPROGS = @WINBIND_LTARGETS@
SPROGS = bin/smbd bin/nmbd bin/swat bin/wrepld @WINBIND_STARGETS@
PROGS1 = bin/smbclient bin/net bin/smbspool bin/testparm bin/testprns bin/smbstatus bin/smbcontrol bin/smbtree bin/tdbbackup @RUNPROG@ @WINBIND_TARGETS@
-PROGS2 = bin/smbpasswd bin/rpcclient bin/smbcacls @WRAPPROG@ @WRAP@ @WRAP32@ @PAM_MOD@
+PROGS2 = bin/smbpasswd bin/rpcclient bin/smbcacls bin/profiles @WRAPPROG@ @WRAP@ @WRAP32@ @PAM_MOD@
MPROGS = @MPROGS@
LPROGS = $(WINBIND_PAM_PROGS) $(WINBIND_LPROGS)
diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h
new file mode 100644
index 0000000000..21fe47d4b2
--- /dev/null
+++ b/source3/include/libsmb_internal.h
@@ -0,0 +1,67 @@
+#ifndef _LIBSMB_INTERNAL_H_
+#define _LIBSMB_INTERNAL_H_
+
+#define SMBC_MAX_NAME 1023
+#define SMBC_FILE_MODE (S_IFREG | 0444)
+#define SMBC_DIR_MODE (S_IFDIR | 0555)
+
+
+#include "../include/libsmbclient.h"
+
+
+struct _SMBCSRV {
+ struct cli_state cli;
+ dev_t dev;
+ BOOL no_pathinfo2;
+ int server_fd;
+
+ SMBCSRV *next, *prev;
+
+};
+
+/*
+ * Keep directory entries in a list
+ */
+struct smbc_dir_list {
+ struct smbc_dir_list *next;
+ struct smbc_dirent *dirent;
+};
+
+
+/*
+ * Structure for open file management
+ */
+struct _SMBCFILE {
+ int cli_fd;
+ char *fname;
+ off_t offset;
+ struct _SMBCSRV *srv;
+ BOOL file;
+ struct smbc_dir_list *dir_list, *dir_end, *dir_next;
+ int dir_type, dir_error;
+
+ SMBCFILE *next, *prev;
+};
+
+
+struct smbc_internal_data {
+
+ /** INTERNAL: is this handle initialized ?
+ */
+ int _initialized;
+
+ /** INTERNAL: dirent pointer location
+ */
+ char _dirent[512];
+
+ /** INTERNAL: server connection list
+ */
+ SMBCSRV * _servers;
+
+ /** INTERNAL: open file/dir list
+ */
+ SMBCFILE * _files;
+};
+
+
+#endif
diff --git a/source3/include/libsmbclient.h b/source3/include/libsmbclient.h
index 2b45709a5e..0c905edcbc 100644
--- a/source3/include/libsmbclient.h
+++ b/source3/include/libsmbclient.h
@@ -35,6 +35,10 @@
* \ingroup libsmbclient
* Data structures, types, and constants
*/
+/** \defgroup callback Callback function types
+* \ingroup libsmbclient
+* Callback functions
+*/
/** \defgroup file File Functions
* \ingroup libsmbclient
* Functions used to access individual file contents
@@ -51,7 +55,7 @@
* \ingroup libsmbclient
* Functions used to access printing functionality
*/
-/** \defgroup attribute Miscellaneous Functions
+/** \defgroup misc Miscellaneous Functions
* \ingroup libsmbclient
* Functions that don't fit in to other categories
*/
@@ -62,7 +66,6 @@
#include <sys/stat.h>
#include <fcntl.h>
-#define SMBC_MAX_NAME 1023
#define SMBC_WORKGROUP 1
#define SMBC_SERVER 2
#define SMBC_FILE_SHARE 3
@@ -73,12 +76,6 @@
#define SMBC_FILE 8
#define SMBC_LINK 9
-#define SMBC_FILE_MODE (S_IFREG | 0444)
-#define SMBC_DIR_MODE (S_IFDIR | 0555)
-
-#define SMBC_MAX_FD 10000
-
-
/**@ingroup structure
* Structure that represents a directory entry.
*
@@ -116,12 +113,12 @@ struct smbc_dirent
char name[1];
};
-#ifndef _CLIENT_H
/**@ingroup structure
* Structure that represents a print job.
*
*/
+#ifndef _CLIENT_H
struct print_job_info
{
/** numeric ID of the print job
@@ -149,9 +146,29 @@ struct print_job_info
*/
time_t t;
};
-#endif /* ifndef _CLIENT_H */
+#endif /* _CLIENT_H */
+
+
+/**@ingroup structure
+ * Server handle
+ */
+typedef struct _SMBCSRV SMBCSRV;
/**@ingroup structure
+ * File or directory handle
+ */
+typedef struct _SMBCFILE SMBCFILE;
+
+/**@ingroup structure
+ * File or directory handle
+ */
+typedef struct _SMBCCTX SMBCCTX;
+
+
+
+
+
+/**@ingroup callback
* Authentication callback function type.
*
* Type for the the authentication function called by the library to
@@ -187,51 +204,114 @@ typedef void (*smbc_get_auth_data_fn)(const char *srv,
char *pw, int pwlen);
-/**@ingroup structure
+/**@ingroup callback
* Print job info callback function type.
*
* @param i pointer to print job information structure
*
*/
-typedef void (*smbc_get_print_job_info)(struct print_job_info *i);
+typedef void (*smbc_list_print_job_fn)(struct print_job_info *i);
+
-typedef struct _SMBCSRV {
- struct cli_state cli;
- dev_t dev;
- BOOL no_pathinfo2;
- int server_fd;
+/**@ingroup callback
+ * Check if a server is still good
+ *
+ * @param c pointer to smb context
+ *
+ * @param srv pointer to server to check
+ *
+ * @return 0 when connection is good. 1 on error.
+ *
+ */
+typedef int (*smbc_check_server_fn)(SMBCCTX * c, SMBCSRV *srv);
- struct _SMBCSRV *next, *prev;
-
-} SMBCSRV;
+/**@ingroup callback
+ * Remove a server if unused
+ *
+ * @param c pointer to smb context
+ *
+ * @param srv pointer to server to remove
+ *
+ * @return 0 on success. 1 on failure.
+ *
+ */
+typedef int (*smbc_remove_unused_server_fn)(SMBCCTX * c, SMBCSRV *srv);
-/*
- * Keep directory entries in a list
- */
-struct smbc_dir_list {
- struct smbc_dir_list *next;
- struct smbc_dirent *dirent;
-};
-/*
- * Structure for open file management
+/**@ingroup callback
+ * Add a server to the cache system
+ *
+ * @param c pointer to smb context
+ *
+ * @param srv pointer to server to add
+ *
+ * @param server server name
+ *
+ * @param share share name
+ *
+ * @param workgroup workgroup used to connect
+ *
+ * @param username username used to connect
+ *
+ * @return 0 on success. 1 on failure.
+ *
+ */
+typedef int (*smbc_add_cached_srv_fn) (SMBCCTX * c, SMBCSRV *srv,
+ char * server, char * share,
+ char * workgroup, char * username);
+
+
+/**@ingroup callback
+ * Look up a server in the cache system
+ *
+ * @param c pointer to smb context
+ *
+ * @param server server name to match
+ *
+ * @param share share name to match
+ *
+ * @param workgroup workgroup to match
+ *
+ * @param username username to match
+ *
+ * @return pointer to SMBCSRV on success. NULL on failure.
+ *
+ */
+typedef SMBCSRV * (*smbc_get_cached_srv_fn) (SMBCCTX * c, char * server,
+ char * share, char * workgroup, char * username);
+
+
+/**@ingroup callback
+ * Check if a server is still good
+ *
+ * @param c pointer to smb context
+ *
+ * @param srv pointer to server to remove
+ *
+ * @return 0 when found and removed. 1 on failure.
+ *
+ */
+typedef int (*smbc_remove_cached_srv_fn)(SMBCCTX * c, SMBCSRV *srv);
+
+
+/**@ingroup callback
+ * Try to remove all servers from the cache system and disconnect
+ *
+ * @param c pointer to smb context
+ *
+ * @return 0 when found and removed. 1 on failure.
+ *
*/
-typedef struct _SMBCFILE {
- int cli_fd;
- char *fname;
- off_t offset;
- SMBCSRV *srv;
- BOOL file;
- struct smbc_dir_list *dir_list, *dir_end, *dir_next;
- int dir_type, dir_error;
-
- struct _SMBCFILE *next, *prev;
-} SMBCFILE;
+typedef int (*smbc_purge_cached_fn) (SMBCCTX * c);
+
+
+
/**@ingroup structure
* Structure that contains a client context information
+ * This structure is know as SMBCCTX
*/
-typedef struct _SMBCCTX {
+struct _SMBCCTX {
/** debug level
*/
int debug;
@@ -255,42 +335,42 @@ typedef struct _SMBCCTX {
/** callable functions for files:
* For usage and return values see the smbc_* functions
*/
- SMBCFILE * (*open) (struct _SMBCCTX *c, const char *fname, int flags, mode_t mode);
- SMBCFILE * (*creat) (struct _SMBCCTX *c, const char *path, mode_t mode);
- ssize_t (*read) (struct _SMBCCTX *c, SMBCFILE *file, void *buf, size_t count);
- ssize_t (*write) (struct _SMBCCTX *c, SMBCFILE *file, void *buf, size_t count);
- int (*unlink) (struct _SMBCCTX *c, const char *fname);
- int (*rename) (struct _SMBCCTX *ocontext, const char *oname,
- struct _SMBCCTX *ncontext, const char *nname);
- off_t (*lseek) (struct _SMBCCTX *c, SMBCFILE * file, off_t offset, int whence);
- int (*stat) (struct _SMBCCTX *c, const char *fname, struct stat *st);
- int (*fstat) (struct _SMBCCTX *c, SMBCFILE *file, struct stat *st);
- int (*close) (struct _SMBCCTX *c, SMBCFILE *file);
+ SMBCFILE * (*open) (SMBCCTX *c, const char *fname, int flags, mode_t mode);
+ SMBCFILE * (*creat) (SMBCCTX *c, const char *path, mode_t mode);
+ ssize_t (*read) (SMBCCTX *c, SMBCFILE *file, void *buf, size_t count);
+ ssize_t (*write) (SMBCCTX *c, SMBCFILE *file, void *buf, size_t count);
+ int (*unlink) (SMBCCTX *c, const char *fname);
+ int (*rename) (SMBCCTX *ocontext, const char *oname,
+ SMBCCTX *ncontext, const char *nname);
+ off_t (*lseek) (SMBCCTX *c, SMBCFILE * file, off_t offset, int whence);
+ int (*stat) (SMBCCTX *c, const char *fname, struct stat *st);
+ int (*fstat) (SMBCCTX *c, SMBCFILE *file, struct stat *st);
+ int (*close) (SMBCCTX *c, SMBCFILE *file);
/** callable functions for dirs
*/
- SMBCFILE * (*opendir) (struct _SMBCCTX *c, const char *fname);
- int (*closedir)(struct _SMBCCTX *c, SMBCFILE *dir);
- struct smbc_dirent * (*readdir)(struct _SMBCCTX *c, SMBCFILE *dir);
- int (*getdents)(struct _SMBCCTX *c, SMBCFILE *dir,
+ SMBCFILE * (*opendir) (SMBCCTX *c, const char *fname);
+ int (*closedir)(SMBCCTX *c, SMBCFILE *dir);
+ struct smbc_dirent * (*readdir)(SMBCCTX *c, SMBCFILE *dir);
+ int (*getdents)(SMBCCTX *c, SMBCFILE *dir,
struct smbc_dirent *dirp, int count);
- int (*mkdir) (struct _SMBCCTX *c, const char *fname, mode_t mode);
- int (*rmdir) (struct _SMBCCTX *c, const char *fname);
- off_t (*telldir) (struct _SMBCCTX *c, SMBCFILE *dir);
- int (*lseekdir)(struct _SMBCCTX *c, SMBCFILE *dir, off_t offset);
- int (*fstatdir)(struct _SMBCCTX *c, SMBCFILE *dir, struct stat *st);
+ int (*mkdir) (SMBCCTX *c, const char *fname, mode_t mode);
+ int (*rmdir) (SMBCCTX *c, const char *fname);
+ off_t (*telldir) (SMBCCTX *c, SMBCFILE *dir);
+ int (*lseekdir)(SMBCCTX *c, SMBCFILE *dir, off_t offset);
+ int (*fstatdir)(SMBCCTX *c, SMBCFILE *dir, struct stat *st);
/** callable functions for printing
*/
- int (*print_file)(struct _SMBCCTX *c_file, const char *fname,
- struct _SMBCCTX *c_print, const char *printq);
- SMBCFILE * (*open_print_job)(struct _SMBCCTX *c, const char *fname);
- int (*list_print_jobs)(struct _SMBCCTX *c, const char *fname, void (*fn)(struct print_job_info *));
- int (*unlink_print_job)(struct _SMBCCTX *c, const char *fname, int id);
+ int (*print_file)(SMBCCTX *c_file, const char *fname,
+ SMBCCTX *c_print, const char *printq);
+ SMBCFILE * (*open_print_job)(SMBCCTX *c, const char *fname);
+ int (*list_print_jobs)(SMBCCTX *c, const char *fname, smbc_list_print_job_fn fn);
+ int (*unlink_print_job)(SMBCCTX *c, const char *fname, int id);
/** Callbacks
- * These callbacks _always_ have to be intialized because they will not be checked
+ * These callbacks _always_ have to be initialized because they will not be checked
* at dereference for increased speed.
*/
struct _smbc_callbacks {
@@ -300,11 +380,11 @@ typedef struct _SMBCCTX {
/** check if a server is still good
*/
- int (*check_server_fn)(struct _SMBCCTX * c, SMBCSRV *srv);
+ smbc_check_server_fn check_server_fn;
/** remove a server if unused
*/
- int (*remove_unused_server_fn)(struct _SMBCCTX * c, SMBCSRV *srv);
+ smbc_remove_unused_server_fn remove_unused_server_fn;
/** Cache subsystem
* For an example cache system see samba/source/libsmb/libsmb_cache.c
@@ -313,21 +393,19 @@ typedef struct _SMBCCTX {
/** server cache addition
*/
- int (*add_cached_srv_fn) (struct _SMBCCTX * c, SMBCSRV *srv,
- char * server, char * share,
- char * workgroup, char * username);
+ smbc_add_cached_srv_fn add_cached_srv_fn;
+
/** server cache lookup
*/
- SMBCSRV * (*get_cached_srv_fn) (struct _SMBCCTX * c, char * server,
- char * share, char * workgroup, char * username);
+ smbc_get_cached_srv_fn get_cached_srv_fn;
+
/** server cache removal
*/
- int (*remove_cached_srv_fn)(struct _SMBCCTX * c, SMBCSRV *srv);
+ smbc_remove_cached_srv_fn remove_cached_srv_fn;
/** server cache purging, try to remove all cached servers (disconnect)
*/
- int (*purge_cached_fn) (struct _SMBCCTX * c);
-
+ smbc_purge_cached_fn purge_cached_fn;
} callbacks;
@@ -335,27 +413,12 @@ typedef struct _SMBCCTX {
*/
struct smbc_server_cache * server_cache;
- /** INTERNAL functions
- * do _NOT_ touch these from your program !
- */
-
- /** INTERNAL: is this handle initialized ?
- */
- int _initialized;
-
- /** INTERNAL: dirent pointer location
+ /** INTERNAL DATA
+ * do _NOT_ touch this from your program !
*/
- char _dirent[512];
-
- /** INTERNAL: server connection list
- */
- SMBCSRV * _servers;
+ struct smbc_internal_data * internal;
- /** INTERNAL: open file/dir list
- */
- SMBCFILE * _files;
-
-} SMBCCTX;
+};
/**@ingroup misc
@@ -990,7 +1053,7 @@ int smbc_open_print_job(const char *fname);
* - EINVAL fname was NULL or smbc_init not called
* - EACCES ???
*/
-int smbc_list_print_jobs(const char *purl, smbc_get_print_job_info fn);
+int smbc_list_print_jobs(const char *purl, smbc_list_print_job_fn fn);
/**@ingroup print
* Delete a print job
diff --git a/source3/libsmb/libsmb_compat.c b/source3/libsmb/libsmb_compat.c
index bba90c648e..27b274953a 100644
--- a/source3/libsmb/libsmb_compat.c
+++ b/source3/libsmb/libsmb_compat.c
@@ -24,11 +24,7 @@
#include "includes.h"
-/*
- * Define this to get the real SMBCFILE and SMBCSRV structures
- */
-#define _SMBC_INTERNAL
-#include "../include/libsmbclient.h"
+#include "../include/libsmb_internal.h"
struct smbc_compat_fdlist {
SMBCFILE * file;
@@ -272,7 +268,7 @@ int smbc_open_print_job(const char *fname)
return (int) file;
}
-int smbc_list_print_jobs(const char *purl, smbc_get_print_job_info fn)
+int smbc_list_print_jobs(const char *purl, smbc_list_print_job_fn fn)
{
return statcont->list_print_jobs(statcont, purl, fn);
}
diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c
index faa4191e6d..dd46749a5a 100644
--- a/source3/libsmb/libsmbclient.c
+++ b/source3/libsmb/libsmbclient.c
@@ -23,7 +23,7 @@
#include "includes.h"
-#include "../include/libsmbclient.h"
+#include "../include/libsmb_internal.h"
/*
* Functions exported by libsmb_cache.c that we need here
@@ -219,7 +219,7 @@ int smbc_check_server(SMBCCTX * context, SMBCSRV * server)
}
/*
- * Remove a server from the list server_table if it's unused.
+ * Remove a server from the cached server list it's unused.
* On success, 0 is returned. 1 is returned if the server could not be removed.
*
* Also useable outside libsmbclient
@@ -229,11 +229,12 @@ int smbc_remove_unused_server(SMBCCTX * context, SMBCSRV * srv)
SMBCFILE * file;
/* are we being fooled ? */
- if (!context || !context->_initialized || !srv) return 1;
+ if (!context || !context->internal ||
+ !context->internal->_initialized || !srv) return 1;
/* Check all open files/directories for a relation with this server */
- for (file = context->_files; file; file=file->next) {
+ for (file = context->internal->_files; file; file=file->next) {
if (file->srv == srv) {
/* Still used */
DEBUG(3, ("smbc_remove_usused_server: %p still used by %p.\n",
@@ -242,7 +243,7 @@ int smbc_remove_unused_server(SMBCCTX * context, SMBCSRV * srv)
}
}
- DLIST_REMOVE(context->_servers, srv);
+ DLIST_REMOVE(context->internal->_servers, srv);
cli_shutdown(&srv->cli);
@@ -475,7 +476,8 @@ static SMBCFILE *smbc_open_ctx(SMBCCTX *context, const char *fname, int flags, m
SMBCFILE *file = NULL;
int fd;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL; /* Best I can think of ... */
return NULL;
@@ -542,7 +544,7 @@ static SMBCFILE *smbc_open_ctx(SMBCCTX *context, const char *fname, int flags, m
file->offset = 0;
file->file = True;
- DLIST_ADD(context->_files, file);
+ DLIST_ADD(context->internal->_files, file);
return file;
}
@@ -573,7 +575,8 @@ static int creat_bits = O_WRONLY | O_CREAT | O_TRUNC; /* FIXME: Do we need this
static SMBCFILE *smbc_creat_ctx(SMBCCTX *context, const char *path, mode_t mode)
{
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return NULL;
@@ -591,7 +594,8 @@ static ssize_t smbc_read_ctx(SMBCCTX *context, SMBCFILE *file, void *buf, size_t
{
int ret;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -600,7 +604,7 @@ static ssize_t smbc_read_ctx(SMBCCTX *context, SMBCFILE *file, void *buf, size_t
DEBUG(4, ("smbc_read(%p, %d)\n", file, (int)count));
- if (!file || !DLIST_CONTAINS(context->_files, file)) {
+ if (!file || !DLIST_CONTAINS(context->internal->_files, file)) {
errno = EBADF;
return -1;
@@ -641,14 +645,15 @@ static ssize_t smbc_write_ctx(SMBCCTX *context, SMBCFILE *file, void *buf, size_
{
int ret;
- if (!context || context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!file || !DLIST_CONTAINS(context->_files, file)) {
+ if (!file || !DLIST_CONTAINS(context->internal->_files, file)) {
errno = EBADF;
return -1;
@@ -686,14 +691,15 @@ static int smbc_close_ctx(SMBCCTX *context, SMBCFILE *file)
{
SMBCSRV *srv;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!file || !DLIST_CONTAINS(context->_files, file)) {
+ if (!file || !DLIST_CONTAINS(context->internal->_files, file)) {
errno = EBADF;
return -1;
@@ -715,7 +721,7 @@ static int smbc_close_ctx(SMBCCTX *context, SMBCFILE *file)
* from the server cache if unused */
errno = smbc_errno(context, &file->srv->cli);
srv = file->srv;
- DLIST_REMOVE(context->_files, file);
+ DLIST_REMOVE(context->internal->_files, file);
SAFE_FREE(file->fname);
SAFE_FREE(file);
context->callbacks.remove_unused_server_fn(context, srv);
@@ -737,7 +743,7 @@ static int smbc_close_ctx(SMBCCTX *context, SMBCFILE *file)
* from the server cache if unused */
errno = smbc_errno(context, &file->srv->cli);
srv = file->srv;
- DLIST_REMOVE(context->_files, file);
+ DLIST_REMOVE(context->internal->_files, file);
SAFE_FREE(file->fname);
SAFE_FREE(file);
context->callbacks.remove_unused_server_fn(context, srv);
@@ -745,7 +751,7 @@ static int smbc_close_ctx(SMBCCTX *context, SMBCFILE *file)
return -1;
}
- DLIST_REMOVE(context->_files, file);
+ DLIST_REMOVE(context->internal->_files, file);
SAFE_FREE(file->fname);
SAFE_FREE(file);
@@ -762,7 +768,8 @@ static BOOL smbc_getatr(SMBCCTX * context, SMBCSRV *srv, char *path,
SMB_INO_T *ino)
{
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -798,7 +805,8 @@ static int smbc_unlink_ctx(SMBCCTX *context, const char *fname)
pstring path;
SMBCSRV *srv = NULL;
- if (!context || context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL; /* Best I can think of ... */
return -1;
@@ -892,8 +900,10 @@ static int smbc_rename_ctx(SMBCCTX *ocontext, const char *oname,
pstring path1, path2;
SMBCSRV *srv = NULL;
- if (!ocontext || !ncontext ||
- !ocontext->_initialized || !ncontext->_initialized) {
+ if (!ocontext || !ncontext ||
+ !ocontext->internal || !ncontext->internal ||
+ !ocontext->internal->_initialized ||
+ !ncontext->internal->_initialized) {
errno = EINVAL; /* Best I can think of ... */
return -1;
@@ -961,14 +971,15 @@ static off_t smbc_lseek_ctx(SMBCCTX *context, SMBCFILE *file, off_t offset, int
{
size_t size;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!file || !DLIST_CONTAINS(context->_files, file)) {
+ if (!file || !DLIST_CONTAINS(context->internal->_files, file)) {
errno = EBADF;
return -1;
@@ -1021,7 +1032,8 @@ static
ino_t smbc_inode(SMBCCTX *context, const char *name)
{
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -1089,7 +1101,8 @@ static int smbc_stat_ctx(SMBCCTX *context, const char *fname, struct stat *st)
uint16 mode = 0;
SMB_INO_T ino = 0;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL; /* Best I can think of ... */
return -1;
@@ -1172,14 +1185,15 @@ static int smbc_fstat_ctx(SMBCCTX *context, SMBCFILE *file, struct stat *st)
uint16 mode;
SMB_INO_T ino = 0;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!file || !DLIST_CONTAINS(context->_files, file)) {
+ if (!file || !DLIST_CONTAINS(context->internal->_files, file)) {
errno = EBADF;
return -1;
@@ -1272,9 +1286,6 @@ static int add_dirent(SMBCFILE *dir, const char *name, const char *comment, uint
ZERO_STRUCTP(dirent);
- ZERO_STRUCTP(dirent);
-
-
if (dir->dir_list == NULL) {
dir->dir_list = malloc(sizeof(struct smbc_dir_list));
@@ -1355,8 +1366,6 @@ list_fn(const char *name, uint32 type, const char *comment, void *state)
dirent_type = SMBC_FILE_SHARE; /* FIXME, error? */
break;
}
- ZERO_STRUCTP(dir->dir_list);
-
}
else dirent_type = dir->dir_type;
@@ -1391,9 +1400,9 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
SMBCSRV *srv = NULL;
SMBCFILE *dir = NULL;
struct in_addr rem_ip;
- int slot = 0;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return NULL;
@@ -1489,7 +1498,6 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
return NULL;
}
- ZERO_STRUCTP(dir->dir_end);
dir->srv = srv;
@@ -1669,7 +1677,7 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
}
- DLIST_ADD(context->_files, dir);
+ DLIST_ADD(context->internal->_files, dir);
return dir;
}
@@ -1681,14 +1689,15 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
static int smbc_closedir_ctx(SMBCCTX *context, SMBCFILE *dir)
{
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!dir || !DLIST_CONTAINS(context->_files, dir)) {
+ if (!dir || !DLIST_CONTAINS(context->internal->_files, dir)) {
errno = EBADF;
return -1;
@@ -1697,7 +1706,7 @@ static int smbc_closedir_ctx(SMBCCTX *context, SMBCFILE *dir)
smbc_remove_dir(dir); /* Clean it up */
- DLIST_REMOVE(context->_files, dir);
+ DLIST_REMOVE(context->internal->_files, dir);
if (dir) {
@@ -1720,14 +1729,15 @@ struct smbc_dirent *smbc_readdir_ctx(SMBCCTX *context, SMBCFILE *dir)
/* Check that all is ok first ... */
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return NULL;
}
- if (!dir || !DLIST_CONTAINS(context->_files, dir)) {
+ if (!dir || !DLIST_CONTAINS(context->internal->_files, dir)) {
errno = EBADF;
return NULL;
@@ -1756,12 +1766,12 @@ struct smbc_dirent *smbc_readdir_ctx(SMBCCTX *context, SMBCFILE *dir)
/* Hmmm, do I even need to copy it? */
- memcpy(context->_dirent, dirent, dirent->dirlen); /* Copy the dirent */
- dirp = (struct smbc_dirent *)context->_dirent;
+ memcpy(context->internal->_dirent, dirent, dirent->dirlen); /* Copy the dirent */
+ dirp = (struct smbc_dirent *)context->internal->_dirent;
dirp->comment = (char *)(&dirp->name + dirent->namelen + 1);
dir->dir_next = dir->dir_next->next;
- return (struct smbc_dirent *)context->_dirent;
+ return (struct smbc_dirent *)context->internal->_dirent;
}
}
@@ -1778,14 +1788,15 @@ static int smbc_getdents_ctx(SMBCCTX *context, SMBCFILE *dir, struct smbc_dirent
/* Check that all is ok first ... */
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!dir || !DLIST_CONTAINS(context->_files, dir)) {
+ if (!dir || !DLIST_CONTAINS(context->internal->_files, dir)) {
errno = EBADF;
return -1;
@@ -1864,7 +1875,8 @@ static int smbc_mkdir_ctx(SMBCCTX *context, const char *fname, mode_t mode)
fstring server, share, user, password, workgroup;
pstring path;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -1950,7 +1962,8 @@ static int smbc_rmdir_ctx(SMBCCTX *context, const char *fname)
fstring server, share, user, password, workgroup;
pstring path;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -2047,14 +2060,15 @@ static int smbc_rmdir_ctx(SMBCCTX *context, const char *fname)
static off_t smbc_telldir_ctx(SMBCCTX *context, SMBCFILE *dir)
{
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
}
- if (!dir || !DLIST_CONTAINS(context->_files, dir)) {
+ if (!dir || !DLIST_CONTAINS(context->internal->_files, dir)) {
errno = EBADF;
return -1;
@@ -2111,7 +2125,8 @@ static int smbc_lseekdir_ctx(SMBCCTX *context, SMBCFILE *dir, off_t offset)
struct smbc_dirent *dirent = (struct smbc_dirent *)offset;
struct smbc_dir_list *list_ent = NULL;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -2157,7 +2172,8 @@ static int smbc_lseekdir_ctx(SMBCCTX *context, SMBCFILE *dir, off_t offset)
static int smbc_fstatdir_ctx(SMBCCTX *context, SMBCFILE *dir, struct stat *st)
{
- if (context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -2179,7 +2195,8 @@ static SMBCFILE *smbc_open_print_job_ctx(SMBCCTX *context, const char *fname)
fstring server, share, user, password;
pstring path;
- if (!context || context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return NULL;
@@ -2216,8 +2233,8 @@ static int smbc_print_file_ctx(SMBCCTX *c_file, const char *fname, SMBCCTX *c_pr
int bytes, saverr, tot_bytes = 0;
char buf[4096];
- if (!c_file || !c_file->_initialized || !c_print ||
- !c_print->_initialized) {
+ if (!c_file || !c_file->internal->_initialized || !c_print ||
+ !c_print->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -2286,13 +2303,14 @@ static int smbc_print_file_ctx(SMBCCTX *c_file, const char *fname, SMBCCTX *c_pr
* Routine to list print jobs on a printer share ...
*/
-static int smbc_list_print_jobs_ctx(SMBCCTX *context, const char *fname, void (*fn)(struct print_job_info *))
+static int smbc_list_print_jobs_ctx(SMBCCTX *context, const char *fname, smbc_list_print_job_fn fn)
{
SMBCSRV *srv;
fstring server, share, user, password, workgroup;
pstring path;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -2322,7 +2340,7 @@ static int smbc_list_print_jobs_ctx(SMBCCTX *context, const char *fname, void (*
}
- if (cli_print_queue(&srv->cli, fn) < 0) {
+ if (cli_print_queue(&srv->cli, (void (*)(struct print_job_info *))fn) < 0) {
errno = smbc_errno(context, &srv->cli);
return -1;
@@ -2344,7 +2362,8 @@ static int smbc_unlink_print_job_ctx(SMBCCTX *context, const char *fname, int id
pstring path;
int err;
- if (!context || !context->_initialized) {
+ if (!context || !context->internal ||
+ !context->internal->_initialized) {
errno = EINVAL;
return -1;
@@ -2395,14 +2414,23 @@ SMBCCTX * smbc_new_context(void)
{
SMBCCTX * context;
- context = malloc(sizeof(*context));
+ context = malloc(sizeof(SMBCCTX));
if (!context) {
errno = ENOMEM;
return NULL;
}
-
+
ZERO_STRUCTP(context);
+ context->internal = malloc(sizeof(struct smbc_internal_data));
+ if (!context->internal) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ ZERO_STRUCTP(context->internal);
+
+
/* ADD REASONABLE DEFAULTS */
context->debug = 0;
context->timeout = 20000; /* 20 seconds */
@@ -2457,25 +2485,25 @@ int smbc_free_context(SMBCCTX * context, int shutdown_ctx)
SMBCFILE * f;
DEBUG(1,("Performing aggressive shutdown.\n"));
- f = context->_files;
+ f = context->internal->_files;
while (f) {
context->close(context, f);
f = f->next;
}
- context->_files = NULL;
+ context->internal->_files = NULL;
/* First try to remove the servers the nice way. */
if (context->callbacks.purge_cached_fn(context)) {
SMBCSRV * s;
DEBUG(1, ("Could not purge all servers, Nice way shutdown failed.\n"));
- s = context->_servers;
+ s = context->internal->_servers;
while (s) {
cli_shutdown(&s->cli);
context->callbacks.remove_cached_srv_fn(context, s);
SAFE_FREE(s);
s = s->next;
}
- context->_servers = NULL;
+ context->internal->_servers = NULL;
}
}
else {
@@ -2485,12 +2513,12 @@ int smbc_free_context(SMBCCTX * context, int shutdown_ctx)
errno = EBUSY;
return 1;
}
- if (context->_servers) {
+ if (context->internal->_servers) {
DEBUG(1, ("Active servers in context, free_context failed.\n"));
errno = EBUSY;
return 1;
}
- if (context->_files) {
+ if (context->internal->_files) {
DEBUG(1, ("Active files in context, free_context failed.\n"));
errno = EBUSY;
return 1;
@@ -2503,6 +2531,7 @@ int smbc_free_context(SMBCCTX * context, int shutdown_ctx)
SAFE_FREE(context->user);
DEBUG(3, ("Context %p succesfully freed\n", context));
+ SAFE_FREE(context->internal);
SAFE_FREE(context);
return 0;
}
@@ -2521,13 +2550,13 @@ SMBCCTX * smbc_init_context(SMBCCTX * context)
int pid;
char *user = NULL, *home = NULL;
- if (!context) {
+ if (!context || !context->internal) {
errno = EBADF;
return NULL;
}
/* Do not initialise the same client twice */
- if (context->_initialized) {
+ if (context->internal->_initialized) {
return 0;
}
@@ -2634,7 +2663,7 @@ SMBCCTX * smbc_init_context(SMBCCTX * context)
* FIXME: Should we check the function pointers here?
*/
- context->_initialized = 1;
+ context->internal->_initialized = 1;
return context;
}