1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-26 01:49:31 +03:00

Clean up the VFS module loading logic by making the parameter an P_LIST,

rather than a runtime-parsed string.

Andrew Bartlett
(This used to be commit 3465cd6cd9)
This commit is contained in:
Andrew Bartlett
2003-03-15 06:41:31 +00:00
parent c3221b8377
commit 44f9f1042c
2 changed files with 36 additions and 59 deletions

View File

@ -548,7 +548,6 @@ static int default_server_announce;
/* prototypes for the special type handlers */
static BOOL handle_include(const char *pszParmValue, char **ptr);
static BOOL handle_copy(const char *pszParmValue, char **ptr);
static BOOL handle_vfs_object(const char *pszParmValue, char **ptr);
static BOOL handle_source_env(const char *pszParmValue, char **ptr);
static BOOL handle_netbios_name(const char *pszParmValue, char **ptr);
static BOOL handle_winbind_uid(const char *pszParmValue, char **ptr);
@ -1104,7 +1103,7 @@ static struct parm_struct parm_table[] = {
{"VFS module options", P_SEP, P_SEPARATOR},
{"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, FLAG_SHARE},
{"vfs object", P_LIST, P_LOCAL, &sDefault.szVfsObjectFile, NULL, NULL, FLAG_SHARE},
{"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, FLAG_SHARE},
{"vfs path", P_STRING, P_LOCAL, &sDefault.szVfsPath, NULL, NULL, FLAG_SHARE},
@ -1774,7 +1773,7 @@ FN_LOCAL_LIST(lp_readlist, readlist)
FN_LOCAL_LIST(lp_writelist, writelist)
FN_LOCAL_LIST(lp_printer_admin, printer_admin)
FN_LOCAL_STRING(lp_fstype, fstype)
FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
FN_LOCAL_LIST(lp_vfsobj, szVfsObjectFile)
FN_LOCAL_STRING(lp_vfs_options, szVfsOptions)
FN_LOCAL_STRING(lp_vfs_path, szVfsPath)
FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
@ -2738,22 +2737,6 @@ static BOOL handle_source_env(const char *pszParmValue, char **ptr)
return (result);
}
/***************************************************************************
Handle the interpretation of the vfs object parameter.
*************************************************************************/
static BOOL handle_vfs_object(const char *pszParmValue, char **ptr)
{
/* Set string value */
string_set(ptr, pszParmValue);
/* Do any other initialisation required for vfs. Note that
anything done here may have linking repercussions in nmbd. */
return True;
}
/***************************************************************************
Handle the include operation.
***************************************************************************/

View File

@ -215,54 +215,48 @@ Proceeding in compatibility mode, new operations (since version #%d) will fallba
BOOL smbd_vfs_init(connection_struct *conn)
{
char **vfs_objects, *vfsobj, *vfs_module, *vfs_path;
int nobj, i;
const char **vfs_objects;
char *vfs_module, *vfs_path;
unsigned int i;
unsigned int j = 0;
struct smb_vfs_handle_struct *handle;
/* Normal share - initialise with disk access functions */
vfs_init_default(conn);
vfs_objects = lp_vfsobj(SNUM(conn));
/* Override VFS functions if 'vfs object' was specified*/
if (*lp_vfsobj(SNUM(conn))) {
vfsobj = NULL;
for(i=0; i<SMB_VFS_OP_LAST; i++) {
vfs_opaque_ops[i].op = ((void**)&default_vfs_ops)[i];
vfs_opaque_ops[i].type = i;
vfs_opaque_ops[i].layer = SMB_VFS_LAYER_OPAQUE;
if (!vfs_objects)
return True;
for(i=0; i<SMB_VFS_OP_LAST; i++) {
vfs_opaque_ops[i].op = ((void**)&default_vfs_ops)[i];
vfs_opaque_ops[i].type = i;
vfs_opaque_ops[i].layer = SMB_VFS_LAYER_OPAQUE;
}
vfs_path = lp_vfs_path(SNUM(conn));
for (j=0; vfs_objects[j]; j++) {
conn->vfs_private = NULL;
handle = (struct smb_vfs_handle_struct *) smb_xmalloc(sizeof(smb_vfs_handle_struct));
/* Loadable object file */
handle->handle = NULL;
DLIST_ADD(conn->vfs_private, handle);
vfs_module = NULL;
if (vfs_path) {
asprintf(&vfs_module, "%s/%s", vfs_path, vfs_objects[j]);
} else {
asprintf(&vfs_module, "%s", vfs_objects[j]);
}
if (string_set(&vfsobj, lp_vfsobj(SNUM(conn)))) {
/* Parse passed modules specification to array of modules */
set_first_token(vfsobj);
/* We are using default separators: ' \t\r\n' */
vfs_objects = toktocliplist(&nobj, NULL);
if (vfs_objects) {
vfs_path = lp_vfs_path(SNUM(conn));
conn->vfs_private = NULL;
for(i=nobj-1; i>=0; i--) {
handle = (struct smb_vfs_handle_struct *) smb_xmalloc(sizeof(smb_vfs_handle_struct));
/* Loadable object file */
handle->handle = NULL;
DLIST_ADD(conn->vfs_private, handle)
vfs_module = NULL;
if (vfs_path) {
asprintf(&vfs_module, "%s/%s", vfs_path, vfs_objects[i]);
} else {
asprintf(&vfs_module, "%s", vfs_objects[i]);
}
if (!vfs_init_custom(conn, vfs_module)) {
DEBUG(0, ("smbd_vfs_init: vfs_init_custom failed for %s\n", vfs_module));
string_free(&vfsobj);
SAFE_FREE(vfs_module);
DLIST_REMOVE(conn->vfs_private, handle);
SAFE_FREE(handle);
return False;
}
SAFE_FREE(vfs_module);
}
}
string_free(&vfsobj);
return True;
if (!vfs_init_custom(conn, vfs_module)) {
DEBUG(0, ("smbd_vfs_init: vfs_init_custom failed for %s\n", vfs_module));
SAFE_FREE(vfs_module);
DLIST_REMOVE(conn->vfs_private, handle);
SAFE_FREE(handle);
return False;
}
SAFE_FREE(vfs_module);
}
return True;
}