Author: vlendec
Date: 2006-07-09 12:17:15 +0000 (Sun, 09 Jul 2006)
New Revision: 16892

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16892

Log:
When we want more flexibility in configuring Samba, I think that we need to
get rid of the global share array in loadparm.c. Even right now with
usershares this is a little awkward.

Step zero in a looong way there: This encapsulates the service number in
connection_struct into a 'struct share_params'. I want to get rid of the use
of anything like an index number for a share outside of loadparm.c. Inside
loadparm.c it can be organized as an array if necessary, but the rest of Samba
should only see share names and struct share_params where we can then hide the
current share definitions or some dynamic backend or whatever.

Does this sound like a reasonable plan?

Volker

Modified:
   trunk/source/include/smb.h
   trunk/source/include/smb_macros.h
   trunk/source/smbd/conn.c
   trunk/source/smbd/msdfs.c
   trunk/source/smbd/open.c
   trunk/source/smbd/posix_acls.c
   trunk/source/smbd/service.c
   trunk/source/smbd/uid.c
   trunk/source/torture/cmd_vfs.c


Changeset:
Modified: trunk/source/include/smb.h
===================================================================
--- trunk/source/include/smb.h  2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/include/smb.h  2006-07-09 12:17:15 UTC (rev 16892)
@@ -540,11 +540,15 @@
 
 struct dptr_struct;
 
+struct share_params {
+       int service;
+};
+
 typedef struct connection_struct {
        struct connection_struct *next, *prev;
        TALLOC_CTX *mem_ctx;
        unsigned cnum; /* an index passed over the wire */
-       int service;
+       struct share_params *params;
        BOOL force_user;
        BOOL force_group;
        struct vuid_cache vuid_cache;

Modified: trunk/source/include/smb_macros.h
===================================================================
--- trunk/source/include/smb_macros.h   2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/include/smb_macros.h   2006-07-09 12:17:15 UTC (rev 16892)
@@ -124,7 +124,7 @@
 /* the service number for the [globals] defaults */ 
 #define GLOBAL_SECTION_SNUM    (-1)
 /* translates a connection number into a service number */
-#define SNUM(conn)             ((conn)?(conn)->service:GLOBAL_SECTION_SNUM)
+#define SNUM(conn)             
((conn)?(conn)->params->service:GLOBAL_SECTION_SNUM)
 
 
 /* access various service details */
@@ -135,10 +135,10 @@
 #define GUEST_OK(snum)     (VALID_SNUM(snum) && lp_guest_ok(snum))
 #define GUEST_ONLY(snum)   (VALID_SNUM(snum) && lp_guest_only(snum))
 #define CAN_SETDIR(snum)   (!lp_no_set_dir(snum))
-#define CAN_PRINT(conn)    ((conn) && lp_print_ok((conn)->service))
-#define MAP_HIDDEN(conn)   ((conn) && lp_map_hidden((conn)->service))
-#define MAP_SYSTEM(conn)   ((conn) && lp_map_system((conn)->service))
-#define MAP_ARCHIVE(conn)   ((conn) && lp_map_archive((conn)->service))
+#define CAN_PRINT(conn)    ((conn) && lp_print_ok(SNUM(conn)))
+#define MAP_HIDDEN(conn)   ((conn) && lp_map_hidden(SNUM(conn)))
+#define MAP_SYSTEM(conn)   ((conn) && lp_map_system(SNUM(conn)))
+#define MAP_ARCHIVE(conn)   ((conn) && lp_map_archive(SNUM(conn)))
 #define IS_HIDDEN_PATH(conn,path)  ((conn) && 
is_in_path((path),(conn)->hide_list,(conn)->case_sensitive))
 #define IS_VETO_PATH(conn,path)  ((conn) && 
is_in_path((path),(conn)->veto_list,(conn)->case_sensitive))
 #define IS_VETO_OPLOCK_PATH(conn,path)  ((conn) && 
is_in_path((path),(conn)->veto_oplock_list,(conn)->case_sensitive))

Modified: trunk/source/smbd/conn.c
===================================================================
--- trunk/source/smbd/conn.c    2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/smbd/conn.c    2006-07-09 12:17:15 UTC (rev 16892)
@@ -57,7 +57,7 @@
 {
        connection_struct *conn;
        for (conn=Connections;conn;conn=conn->next) {
-               if (conn->service == snum) {
+               if (conn->params->service == snum) {
                        return(True);
                }
        }
@@ -136,8 +136,10 @@
                return NULL;
        }
 
-       if ((conn=TALLOC_ZERO_P(mem_ctx, connection_struct))==NULL) {
+       if (!(conn=TALLOC_ZERO_P(mem_ctx, connection_struct)) ||
+           !(conn->params = TALLOC_P(mem_ctx, struct share_params))) {
                DEBUG(0,("talloc_zero() failed!\n"));
+               TALLOC_FREE(mem_ctx);
                return NULL;
        }
        conn->mem_ctx = mem_ctx;
@@ -314,7 +316,7 @@
 
        for (conn=Connections;conn;conn=next) {
                next=conn->next;
-               if (strequal(lp_servicename(conn->service), sharename)) {
+               if (strequal(lp_servicename(SNUM(conn)), sharename)) {
                        DEBUG(1,("Forcing close of share %s cnum=%d\n",
                                 sharename, conn->cnum));
                        close_cnum(conn, (uint16)-1);

Modified: trunk/source/smbd/msdfs.c
===================================================================
--- trunk/source/smbd/msdfs.c   2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/smbd/msdfs.c   2006-07-09 12:17:15 UTC (rev 16892)
@@ -135,7 +135,6 @@
 
        ZERO_STRUCTP(conn);
 
-       conn->service = snum;
        pstrcpy(connpath, path);
        pstring_sub(connpath , "%S", lp_servicename(snum));
 
@@ -145,7 +144,14 @@
                 DEBUG(0,("talloc_init(connection_struct) failed!\n"));
                 return False;
         }
+
+       if (!(conn->params = TALLOC_P(conn->mem_ctx, struct share_params))) {
+               DEBUG(0, ("TALLOC failed\n"));
+               return False;
+       }
        
+       conn->params->service = snum;
+       
        set_conn_connectpath(conn, connpath);
 
        if (!smbd_vfs_init(conn)) {

Modified: trunk/source/smbd/open.c
===================================================================
--- trunk/source/smbd/open.c    2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/smbd/open.c    2006-07-09 12:17:15 UTC (rev 16892)
@@ -1472,7 +1472,7 @@
 
                                /* this is a hack to speed up torture tests
                                   in 'make test' */
-                               timeout_usecs = lp_parm_int(conn->service,
+                               timeout_usecs = lp_parm_int(SNUM(conn),
                                                            "smbd","sharedelay",
                                                            
SHARING_VIOLATION_USEC_WAIT);
 

Modified: trunk/source/smbd/posix_acls.c
===================================================================
--- trunk/source/smbd/posix_acls.c      2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/smbd/posix_acls.c      2006-07-09 12:17:15 UTC (rev 16892)
@@ -4235,12 +4235,19 @@
        pstring filename;
        
        ZERO_STRUCT( conn );
-       conn.service = -1;
        
        if ( !(conn.mem_ctx = talloc_init( "novfs_get_nt_acl" )) ) {
                DEBUG(0,("get_nt_acl_no_snum: talloc() failed!\n"));
                return NULL;
        }
+
+       if (!(conn.params = TALLOC_P(conn.mem_ctx, struct share_params))) {
+               DEBUG(0,("get_nt_acl_no_snum: talloc() failed!\n"));
+               TALLOC_FREE(conn.mem_ctx);
+               return NULL;
+       }
+
+       conn.params->service = -1;
        
        pstrcpy( path, "/" );
        set_conn_connectpath(&conn, path);

Modified: trunk/source/smbd/service.c
===================================================================
--- trunk/source/smbd/service.c 2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/smbd/service.c 2006-07-09 12:17:15 UTC (rev 16892)
@@ -623,7 +623,7 @@
                    sizeof(conn->client_address)-1);
        conn->num_files_open = 0;
        conn->lastused = conn->lastused_count = time(NULL);
-       conn->service = snum;
+       conn->params->service = snum;
        conn->used = True;
        conn->printer = (strncmp(dev,"LPT",3) == 0);
        conn->ipc = ( (strncmp(dev,"IPC",3) == 0) ||
@@ -649,7 +649,7 @@
        string_set(&conn->dirpath,"");
        string_set(&conn->user,user);
 
-       conn->read_only = lp_readonly(conn->service);
+       conn->read_only = lp_readonly(SNUM(conn));
        conn->admin_user = False;
 
        /*

Modified: trunk/source/smbd/uid.c
===================================================================
--- trunk/source/smbd/uid.c     2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/smbd/uid.c     2006-07-09 12:17:15 UTC (rev 16892)
@@ -102,7 +102,7 @@
 
        readonly_share = is_share_read_only_for_token(vuser->user.unix_name,
                                                      vuser->nt_user_token,
-                                                     conn->service);
+                                                     SNUM(conn));
 
        if (!readonly_share &&
            !share_access_check(conn, snum, vuser, FILE_WRITE_DATA)) {
@@ -129,7 +129,7 @@
 
        ent->admin_user = token_contains_name_in_list(
                vuser->user.unix_name, NULL, vuser->nt_user_token,
-               lp_admin_users(conn->service));
+               lp_admin_users(SNUM(conn)));
 
        conn->read_only = ent->read_only;
        conn->admin_user = ent->admin_user;

Modified: trunk/source/torture/cmd_vfs.c
===================================================================
--- trunk/source/torture/cmd_vfs.c      2006-07-09 09:57:05 UTC (rev 16891)
+++ trunk/source/torture/cmd_vfs.c      2006-07-09 12:17:15 UTC (rev 16892)
@@ -94,7 +94,7 @@
 
 static NTSTATUS cmd_connect(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int 
argc, const char **argv)
 {
-       SMB_VFS_CONNECT(vfs->conn, lp_servicename(vfs->conn->service), 
"vfstest");
+       SMB_VFS_CONNECT(vfs->conn, lp_servicename(SNUM(vfs->conn)), "vfstest");
        return NT_STATUS_OK;
 }
 

Reply via email to