mirror of
https://github.com/samba-team/samba.git
synced 2025-08-03 04:22:09 +03:00
Now that I am running config.developer, I decided to get rif of some warnings:
1. reboot in parse_reg and cli_reg was shadowing a definition on FreeBSD 4.3 from system includes. 2. Added a bit of const to places. 3. Made sure internal functions were declared where needed.
This commit is contained in:
@ -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;
|
||||
|
||||
struct _SMBCSRV *next, *prev;
|
||||
|
||||
} SMBCSRV;
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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 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;
|
||||
typedef int (*smbc_check_server_fn)(SMBCCTX * c, SMBCSRV *srv);
|
||||
|
||||
/**@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);
|
||||
|
||||
|
||||
/**@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 int (*smbc_purge_cached_fn) (SMBCCTX * c);
|
||||
|
||||
|
||||
|
||||
struct _SMBCFILE *next, *prev;
|
||||
} SMBCFILE;
|
||||
|
||||
/**@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 DATA
|
||||
* do _NOT_ touch this from your program !
|
||||
*/
|
||||
|
||||
/** INTERNAL: is this handle initialized ?
|
||||
*/
|
||||
int _initialized;
|
||||
|
||||
/** INTERNAL: dirent pointer location
|
||||
*/
|
||||
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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user