diff options
-rw-r--r-- | source3/include/libsmbclient.h | 257 | ||||
-rw-r--r-- | source3/libsmb/libsmb_compat.c | 8 | ||||
-rw-r--r-- | source3/libsmb/libsmbclient.c | 173 | ||||
-rw-r--r-- | source3/rpc_client/cli_reg.c | 4 | ||||
-rw-r--r-- | source3/rpc_parse/parse_reg.c | 4 |
5 files changed, 267 insertions, 179 deletions
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 a1fb380c37..5ceb36795a 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 @@ -70,7 +70,7 @@ smbc_parse_path(SMBCCTX *context, const char *fname, char *server, char *share, { static pstring s; pstring userinfo; - char *p; + const char *p; char *q, *r; int len; @@ -119,7 +119,7 @@ smbc_parse_path(SMBCCTX *context, const char *fname, char *server, char *share, r = strchr_m(p, '/'); if (q && (!r || q < r)) { pstring username, passwd, domain; - char *u = userinfo; + const char *u = userinfo; next_token(&p, userinfo, "@", sizeof(fstring)); @@ -218,7 +218,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 @@ -228,11 +228,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", @@ -241,7 +242,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); @@ -474,7 +475,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; @@ -541,7 +543,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; } @@ -572,7 +574,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; @@ -590,7 +593,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; @@ -599,7 +603,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; @@ -640,14 +644,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; @@ -685,14 +690,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; @@ -714,7 +720,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); @@ -736,7 +742,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); @@ -744,7 +750,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); @@ -761,7 +767,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; @@ -797,7 +804,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; @@ -891,8 +899,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; @@ -960,14 +970,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; @@ -1020,7 +1031,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; @@ -1088,7 +1100,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; @@ -1171,14 +1184,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; @@ -1271,9 +1285,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)); @@ -1354,8 +1365,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; @@ -1390,9 +1399,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; @@ -1488,7 +1497,6 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) return NULL; } - ZERO_STRUCTP(dir->dir_end); dir->srv = srv; @@ -1668,7 +1676,7 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) } - DLIST_ADD(context->_files, dir); + DLIST_ADD(context->internal->_files, dir); return dir; } @@ -1680,14 +1688,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; @@ -1696,7 +1705,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) { @@ -1719,14 +1728,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; @@ -1755,12 +1765,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; } } @@ -1777,14 +1787,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; @@ -1863,7 +1874,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; @@ -1949,7 +1961,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; @@ -2046,14 +2059,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; @@ -2110,7 +2124,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; @@ -2156,7 +2171,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; @@ -2178,7 +2194,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; @@ -2215,8 +2232,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; @@ -2285,13 +2302,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; @@ -2321,7 +2339,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; @@ -2343,7 +2361,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; @@ -2394,14 +2413,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 */ @@ -2456,25 +2484,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 { @@ -2484,12 +2512,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; @@ -2502,6 +2530,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; } @@ -2520,13 +2549,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; } @@ -2633,7 +2662,7 @@ SMBCCTX * smbc_init_context(SMBCCTX * context) * FIXME: Should we check the function pointers here? */ - context->_initialized = 1; + context->internal->_initialized = 1; return context; } diff --git a/source3/rpc_client/cli_reg.c b/source3/rpc_client/cli_reg.c index 1e83295414..5cfbf68fb3 100644 --- a/source3/rpc_client/cli_reg.c +++ b/source3/rpc_client/cli_reg.c @@ -28,7 +28,7 @@ /* Shutdown a server */ NTSTATUS cli_reg_shutdown(struct cli_state * cli, TALLOC_CTX *mem_ctx, - const char *msg, uint32 timeout, BOOL reboot, + const char *msg, uint32 timeout, BOOL do_reboot, BOOL force) { prs_struct qbuf; @@ -47,7 +47,7 @@ NTSTATUS cli_reg_shutdown(struct cli_state * cli, TALLOC_CTX *mem_ctx, /* Marshall data and send request */ - init_reg_q_shutdown(&q_s, msg, timeout, reboot, force); + init_reg_q_shutdown(&q_s, msg, timeout, do_reboot, force); if (!reg_io_q_shutdown("", &q_s, &qbuf, 0) || !rpc_api_pipe_req(cli, REG_SHUTDOWN, &qbuf, &rbuf)) diff --git a/source3/rpc_parse/parse_reg.c b/source3/rpc_parse/parse_reg.c index 456fad69b4..b4d20bf2ba 100644 --- a/source3/rpc_parse/parse_reg.c +++ b/source3/rpc_parse/parse_reg.c @@ -1737,7 +1737,7 @@ BOOL reg_io_r_open_entry(const char *desc, REG_R_OPEN_ENTRY *r_r, prs_struct *p Inits a structure. ********************************************************************/ void init_reg_q_shutdown(REG_Q_SHUTDOWN * q_s, const char *msg, - uint32 timeout, BOOL reboot, BOOL force) + uint32 timeout, BOOL do_reboot, BOOL force) { int msg_len; msg_len = strlen(msg); @@ -1751,7 +1751,7 @@ void init_reg_q_shutdown(REG_Q_SHUTDOWN * q_s, const char *msg, q_s->timeout = timeout; - q_s->reboot = reboot ? 1 : 0; + q_s->reboot = do_reboot ? 1 : 0; q_s->force = force ? 1 : 0; } |