Clean up the VFS module loading logic by making the parameter an P_LIST,
authorAndrew Bartlett <abartlet@samba.org>
Sat, 15 Mar 2003 06:41:31 +0000 (06:41 +0000)
committerAndrew Bartlett <abartlet@samba.org>
Sat, 15 Mar 2003 06:41:31 +0000 (06:41 +0000)
rather than a runtime-parsed string.

Andrew Bartlett

source/param/loadparm.c
source/smbd/vfs.c

index 3878dabb60a544b9352c3615a4bf2e925f4c542b..d558b09d240ea7471c4f52eedf4c4524834ff1f8 100644 (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.
 ***************************************************************************/
index 533c64b229fc8b0851ac96c8bf7fbec43f411fb9..3bbe8a737a888766cc4205b63c831c7e43c30ec6 100644 (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;
 }