[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha8-895-g50f5425

Stefan Metzmacher metze at samba.org
Fri Aug 7 06:18:41 MDT 2009


The branch, master has been updated
       via  50f54250f4b566e10d0be40dc2d0117c6cb7a73d (commit)
       via  59c3f5e3ca8885266fef65261ecae3f51ce78729 (commit)
       via  c50a03e4e2c47b828f81f2e4dc214ec84d9cae63 (commit)
       via  dfae090c5d0c238f2c620d77edc6bb6cf1bb027b (commit)
       via  862c6aa19fbfe45f8daaf738d7edbb319a674ff2 (commit)
       via  daa71c42369ca3586f6b5cf5c7c72cddcbcdf1ad (commit)
       via  70afd419a602ff4067bf3c25cf25a5d4084b4164 (commit)
       via  c54e6b19e395724eb84f6e7157073e8772bc8594 (commit)
      from  8300b255a5f88cc4ca23678595810d7caec50a00 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 50f54250f4b566e10d0be40dc2d0117c6cb7a73d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 6 12:15:51 2009 +0200

    s3:smbd: split the dir entry marshalling into smbd_marshall_dir_entry()
    
    So that we can reuse it for SMB2 Find.
    
    metze

commit 59c3f5e3ca8885266fef65261ecae3f51ce78729
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 6 12:15:51 2009 +0200

    s3:smbd: move dptr globals into struct smbd_server_connection
    
    metze

commit c50a03e4e2c47b828f81f2e4dc214ec84d9cae63
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 7 09:31:45 2009 +0200

    s3:smbd: remove dirptr and dirpath from connection_struct
    
    They're both only used in the context of a function,
    so we can make them stack variables.
    
    metze

commit dfae090c5d0c238f2c620d77edc6bb6cf1bb027b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 7 08:55:35 2009 +0200

    s3:smbd: implement get_lanman2_dir_entry() on top of smbd_dirptr_get_entry()
    
    metze

commit 862c6aa19fbfe45f8daaf738d7edbb319a674ff2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 7 08:54:06 2009 +0200

    s3:smbd: let get_dir_entry() use smbd_dirptr_get_entry()
    
    metze

commit daa71c42369ca3586f6b5cf5c7c72cddcbcdf1ad
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 6 20:53:13 2009 +0200

    s3:smbd: add generic smbd_dirptr_get_entry()
    
    metze

commit 70afd419a602ff4067bf3c25cf25a5d4084b4164
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 7 11:48:03 2009 +0200

    s3:smbd: conn_free_internal() can be static now
    
    metze

commit c54e6b19e395724eb84f6e7157073e8772bc8594
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 6 13:22:33 2009 +0200

    s3:smbd: add a smbd_server_connection pointer to connection_struct
    
    This can be NULL for faked connection structs used in the rpc server
    or printing code.
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h            |   31 +-
 source3/include/smb.h              |    3 +-
 source3/printing/nt_printing.c     |    6 +-
 source3/rpc_server/srv_srvsvc_nt.c |    8 +-
 source3/smbd/conn.c                |   29 +-
 source3/smbd/dir.c                 |  494 +++++++++-----
 source3/smbd/globals.c             |    4 -
 source3/smbd/globals.h             |   32 +-
 source3/smbd/ipc.c                 |    3 +-
 source3/smbd/msdfs.c               |   22 +-
 source3/smbd/posix_acls.c          |    8 +-
 source3/smbd/process.c             |    3 +
 source3/smbd/reply.c               |   61 +-
 source3/smbd/server.c              |    2 -
 source3/smbd/service.c             |   35 +-
 source3/smbd/smb2_tcon.c           |    2 +-
 source3/smbd/trans2.c              | 1284 ++++++++++++++++++------------------
 17 files changed, 1107 insertions(+), 920 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index ccd8746..e8bfe8e 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6144,9 +6144,7 @@ connection_struct *conn_new(struct smbd_server_connection *sconn);
 bool conn_close_all(struct smbd_server_connection *sconn);
 bool conn_idle_all(struct smbd_server_connection *sconn, time_t t);
 void conn_clear_vuid_caches(struct smbd_server_connection *sconn, uint16 vuid);
-void conn_free_internal(connection_struct *conn);
-void conn_free(struct smbd_server_connection *sconn,
-	       connection_struct *conn);
+void conn_free(connection_struct *conn);
 void msg_force_tdis(struct messaging_context *msg,
 		    void *private_data,
 		    uint32_t msg_type,
@@ -6183,14 +6181,15 @@ bool make_dir_struct(TALLOC_CTX *ctx,
 			uint32 mode,
 			time_t date,
 			bool uc);
-void init_dptrs(void);
-char *dptr_path(int key);
-char *dptr_wcard(int key);
-uint16 dptr_attr(int key);
-void dptr_close(int *key);
+bool init_dptrs(struct smbd_server_connection *sconn);
+char *dptr_path(struct smbd_server_connection *sconn, int key);
+char *dptr_wcard(struct smbd_server_connection *sconn, int key);
+uint16 dptr_attr(struct smbd_server_connection *sconn, int key);
+void dptr_close(struct smbd_server_connection *sconn, int *key);
 void dptr_closecnum(connection_struct *conn);
 void dptr_idlecnum(connection_struct *conn);
-void dptr_closepath(char *path,uint16 spid);
+void dptr_closepath(struct smbd_server_connection *sconn,
+		    char *path,uint16 spid);
 NTSTATUS dptr_create(connection_struct *conn, const char *path, bool old_handle, bool expect_close,uint16 spid,
 		const char *wcard, bool wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret);
 int dptr_CloseDir(struct dptr_struct *dptr);
@@ -6205,12 +6204,15 @@ char *dptr_ReadDirName(TALLOC_CTX *ctx,
 bool dptr_SearchDir(struct dptr_struct *dptr, const char *name, long *poffset, SMB_STRUCT_STAT *pst);
 void dptr_DirCacheAdd(struct dptr_struct *dptr, const char *name, long offset);
 void dptr_init_search_op(struct dptr_struct *dptr);
-bool dptr_fill(char *buf1,unsigned int key);
-struct dptr_struct *dptr_fetch(char *buf,int *num);
-struct dptr_struct *dptr_fetch_lanman2(int dptr_num);
+bool dptr_fill(struct smbd_server_connection *sconn,
+	       char *buf1,unsigned int key);
+struct dptr_struct *dptr_fetch(struct smbd_server_connection *sconn,
+			       char *buf,int *num);
+struct dptr_struct *dptr_fetch_lanman2(struct smbd_server_connection *sconn,
+				       int dptr_num);
 bool dir_check_ftype(connection_struct *conn, uint32 mode, uint32 dirtype);
 bool get_dir_entry(TALLOC_CTX *ctx,
-		connection_struct *conn,
+		struct dptr_struct *dirptr,
 		const char *mask,
 		uint32 dirtype,
 		char **pp_fname_out,
@@ -6984,8 +6986,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
 				   const char *service_in, DATA_BLOB password,
 				   const char *pdev, uint16 vuid,
 				   NTSTATUS *status);
-void close_cnum(struct smbd_server_connection *sconn,
-		connection_struct *conn, uint16 vuid);
+void close_cnum(connection_struct *conn, uint16 vuid);
 
 /* The following definitions come from smbd/session.c  */
 
diff --git a/source3/include/smb.h b/source3/include/smb.h
index e2d670f..b53735d 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -546,16 +546,15 @@ struct share_iterator {
 
 typedef struct connection_struct {
 	struct connection_struct *next, *prev;
+	struct smbd_server_connection *sconn; /* can be NULL */
 	unsigned cnum; /* an index passed over the wire */
 	struct share_params *params;
 	bool force_user;
 	struct vuid_cache vuid_cache;
-	struct dptr_struct *dirptr;
 	bool printer;
 	bool ipc;
 	bool read_only; /* Attributes for the current user of the share. */
 	bool admin_user; /* Attributes for the current user of the share. */
-	char *dirpath;
 	char *connectpath;
 	char *origpath;
 
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 26b8d9d..b2815c2 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -1590,7 +1590,7 @@ static uint32 get_correct_cversion(struct pipes_struct *p,
 	}
 	if (conn != NULL) {
 		vfs_ChDir(conn, oldcwd);
-		conn_free_internal(conn);
+		conn_free(conn);
 	}
 	if (cversion != -1) {
 		*perr = WERR_OK;
@@ -2072,7 +2072,7 @@ WERROR move_driver_to_download_area(struct pipes_struct *p,
 
 	if (conn != NULL) {
 		vfs_ChDir(conn, oldcwd);
-		conn_free_internal(conn);
+		conn_free(conn);
 	}
 
 	if (W_ERROR_EQUAL(*perr, WERR_OK)) {
@@ -5267,7 +5267,7 @@ static bool delete_driver_files(struct pipes_struct *rpc_pipe,
  done:
 	if (conn != NULL) {
 		vfs_ChDir(conn, oldcwd);
-		conn_free_internal(conn);
+		conn_free(conn);
 	}
 	return ret;
 }
diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c
index 15b2290..01ffcd8 100644
--- a/source3/rpc_server/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srv_srvsvc_nt.c
@@ -2133,7 +2133,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p,
 
 	close_file(NULL, fsp, NORMAL_CLOSE);
 	vfs_ChDir(conn, oldcwd);
-	conn_free_internal(conn);
+	conn_free(conn);
 	werr = WERR_OK;
 	goto done;
 
@@ -2148,7 +2148,7 @@ error_exit:
 	}
 
 	if (conn) {
-		conn_free_internal(conn);
+		conn_free(conn);
 	}
 
  done:
@@ -2267,7 +2267,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p,
 
 	close_file(NULL, fsp, NORMAL_CLOSE);
 	vfs_ChDir(conn, oldcwd);
-	conn_free_internal(conn);
+	conn_free(conn);
 	werr = WERR_OK;
 	goto done;
 
@@ -2282,7 +2282,7 @@ error_exit:
 	}
 
 	if (conn) {
-		conn_free_internal(conn);
+		conn_free(conn);
 	}
 
  done:
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c
index af6e091..959fcd7 100644
--- a/source3/smbd/conn.c
+++ b/source3/smbd/conn.c
@@ -101,6 +101,7 @@ connection_struct *conn_new(struct smbd_server_connection *sconn)
 			TALLOC_FREE(conn);
 			return NULL;
 		}
+		conn->sconn = sconn;
 		return conn;
 	}
 
@@ -154,6 +155,7 @@ find_again:
 		TALLOC_FREE(conn);
 		return NULL;
 	}
+	conn->sconn = sconn;
 	conn->cnum = i;
 	conn->force_group_gid = (gid_t)-1;
 
@@ -161,7 +163,6 @@ find_again:
 
 	sconn->smb1.tcons.num_open++;
 
-	string_set(&conn->dirpath,"");
 	string_set(&conn->connectpath,"");
 	string_set(&conn->origpath,"");
 	
@@ -181,7 +182,7 @@ bool conn_close_all(struct smbd_server_connection *sconn)
 	for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
 		next=conn->next;
 		set_current_service(conn, 0, True);
-		close_cnum(sconn, conn, conn->vuid);
+		close_cnum(conn, conn->vuid);
 		ret = true;
 	}
 	return ret;
@@ -255,9 +256,9 @@ void conn_clear_vuid_caches(struct smbd_server_connection *sconn,uint16_t vuid)
  Free a conn structure - internal part.
 ****************************************************************************/
 
-void conn_free_internal(connection_struct *conn)
+static void conn_free_internal(connection_struct *conn)
 {
- 	vfs_handle_struct *handle = NULL, *thandle = NULL;
+	vfs_handle_struct *handle = NULL, *thandle = NULL;
 	struct trans_state *state = NULL;
 
 	/* Free vfs_connection_struct */
@@ -282,7 +283,6 @@ void conn_free_internal(connection_struct *conn)
 	free_namearray(conn->veto_oplock_list);
 	free_namearray(conn->aio_write_behind_list);
 	
-	string_free(&conn->dirpath);
 	string_free(&conn->connectpath);
 	string_free(&conn->origpath);
 
@@ -294,19 +294,24 @@ void conn_free_internal(connection_struct *conn)
  Free a conn structure.
 ****************************************************************************/
 
-void conn_free(struct smbd_server_connection *sconn, connection_struct *conn)
+void conn_free(connection_struct *conn)
 {
-	if (sconn->allow_smb2) {
+	if (conn->sconn == NULL) {
+		conn_free_internal(conn);
+		return;
+	}
+
+	if (conn->sconn->allow_smb2) {
 		conn_free_internal(conn);
 		return;
 	}
 
-	DLIST_REMOVE(sconn->smb1.tcons.Connections, conn);
+	DLIST_REMOVE(conn->sconn->smb1.tcons.Connections, conn);
 
-	bitmap_clear(sconn->smb1.tcons.bmap, conn->cnum);
+	bitmap_clear(conn->sconn->smb1.tcons.bmap, conn->cnum);
 
-	SMB_ASSERT(sconn->smb1.tcons.num_open > 0);
-	sconn->smb1.tcons.num_open--;
+	SMB_ASSERT(conn->sconn->smb1.tcons.num_open > 0);
+	conn->sconn->smb1.tcons.num_open--;
 
 	conn_free_internal(conn);
 }
@@ -340,7 +345,7 @@ void msg_force_tdis(struct messaging_context *msg,
 		if (strequal(lp_servicename(SNUM(conn)), sharename)) {
 			DEBUG(1,("Forcing close of share %s cnum=%d\n",
 				 sharename, conn->cnum));
-			close_cnum(sconn, conn, (uint16)-1);
+			close_cnum(conn, (uint16)-1);
 		}
 	}
 }
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 7acd349..73c4cbb 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -115,15 +115,19 @@ bool make_dir_struct(TALLOC_CTX *ctx,
  Initialise the dir bitmap.
 ****************************************************************************/
 
-void init_dptrs(void)
+bool init_dptrs(struct smbd_server_connection *sconn)
 {
-	if (dptr_bmap)
-		return;
+	if (sconn->smb1.searches.dptr_bmap) {
+		return true;
+	}
+
+	sconn->smb1.searches.dptr_bmap = bitmap_allocate(MAX_DIRECTORY_HANDLES);
 
-	dptr_bmap = bitmap_allocate(MAX_DIRECTORY_HANDLES);
+	if (sconn->smb1.searches.dptr_bmap == NULL) {
+		return false;
+	}
 
-	if (!dptr_bmap)
-		exit_server("out of memory in init_dptrs");
+	return true;
 }
 
 /****************************************************************************
@@ -142,14 +146,14 @@ static void dptr_idle(struct dptr_struct *dptr)
  Idle the oldest dptr.
 ****************************************************************************/
 
-static void dptr_idleoldest(void)
+static void dptr_idleoldest(struct smbd_server_connection *sconn)
 {
 	struct dptr_struct *dptr;
 
 	/*
 	 * Go to the end of the list.
 	 */
-	for(dptr = dirptrs; dptr && dptr->next; dptr = dptr->next)
+	for(dptr = sconn->smb1.searches.dirptrs; dptr && dptr->next; dptr = dptr->next)
 		;
 
 	if(!dptr) {
@@ -173,15 +177,16 @@ static void dptr_idleoldest(void)
  Get the struct dptr_struct for a dir index.
 ****************************************************************************/
 
-static struct dptr_struct *dptr_get(int key, bool forclose)
+static struct dptr_struct *dptr_get(struct smbd_server_connection *sconn,
+				    int key, bool forclose)
 {
 	struct dptr_struct *dptr;
 
-	for(dptr = dirptrs; dptr; dptr = dptr->next) {
+	for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = dptr->next) {
 		if(dptr->dnum == key) {
 			if (!forclose && !dptr->dir_hnd) {
-				if (dirhandles_open >= MAX_OPEN_DIRECTORIES)
-					dptr_idleoldest();
+				if (sconn->smb1.searches.dirhandles_open >= MAX_OPEN_DIRECTORIES)
+					dptr_idleoldest(sconn);
 				DEBUG(4,("dptr_get: Reopening dptr key %d\n",key));
 				if (!(dptr->dir_hnd = OpenDir(
 					      NULL, dptr->conn, dptr->path,
@@ -191,7 +196,7 @@ static struct dptr_struct *dptr_get(int key, bool forclose)
 					return False;
 				}
 			}
-			DLIST_PROMOTE(dirptrs,dptr);
+			DLIST_PROMOTE(sconn->smb1.searches.dirptrs,dptr);
 			return dptr;
 		}
 	}
@@ -202,9 +207,9 @@ static struct dptr_struct *dptr_get(int key, bool forclose)
  Get the dir path for a dir index.
 ****************************************************************************/
 
-char *dptr_path(int key)
+char *dptr_path(struct smbd_server_connection *sconn, int key)
 {
-	struct dptr_struct *dptr = dptr_get(key, False);
+	struct dptr_struct *dptr = dptr_get(sconn, key, false);
 	if (dptr)
 		return(dptr->path);
 	return(NULL);
@@ -214,9 +219,9 @@ char *dptr_path(int key)
  Get the dir wcard for a dir index.
 ****************************************************************************/
 
-char *dptr_wcard(int key)
+char *dptr_wcard(struct smbd_server_connection *sconn, int key)
 {
-	struct dptr_struct *dptr = dptr_get(key, False);
+	struct dptr_struct *dptr = dptr_get(sconn, key, false);
 	if (dptr)
 		return(dptr->wcard);
 	return(NULL);
@@ -226,9 +231,9 @@ char *dptr_wcard(int key)
  Get the dir attrib for a dir index.
 ****************************************************************************/
 
-uint16 dptr_attr(int key)
+uint16 dptr_attr(struct smbd_server_connection *sconn, int key)
 {
-	struct dptr_struct *dptr = dptr_get(key, False);
+	struct dptr_struct *dptr = dptr_get(sconn, key, false);
 	if (dptr)
 		return(dptr->attr);
 	return(0);
@@ -240,22 +245,29 @@ uint16 dptr_attr(int key)
 
 static void dptr_close_internal(struct dptr_struct *dptr)
 {
+	struct smbd_server_connection *sconn = dptr->conn->sconn;
+
 	DEBUG(4,("closing dptr key %d\n",dptr->dnum));
 
-	DLIST_REMOVE(dirptrs, dptr);
+	if (sconn == NULL) {
+		goto done;
+	}
+
+	DLIST_REMOVE(sconn->smb1.searches.dirptrs, dptr);
 
 	/*
 	 * Free the dnum in the bitmap. Remember the dnum value is always 
 	 * biased by one with respect to the bitmap.
 	 */
 
-	if(bitmap_query( dptr_bmap, dptr->dnum - 1) != True) {
+	if(bitmap_query(sconn->smb1.searches.dptr_bmap, dptr->dnum - 1) != true) {
 		DEBUG(0,("dptr_close_internal : Error - closing dnum = %d and bitmap not set !\n",
 			dptr->dnum ));
 	}
 
-	bitmap_clear(dptr_bmap, dptr->dnum - 1);
+	bitmap_clear(sconn->smb1.searches.dptr_bmap, dptr->dnum - 1);
 
+done:
 	TALLOC_FREE(dptr->dir_hnd);
 
 	/* Lanman 2 specific code */
@@ -268,7 +280,7 @@ static void dptr_close_internal(struct dptr_struct *dptr)
  Close a dptr given a key.
 ****************************************************************************/
 
-void dptr_close(int *key)
+void dptr_close(struct smbd_server_connection *sconn, int *key)
 {
 	struct dptr_struct *dptr;
 
@@ -278,7 +290,7 @@ void dptr_close(int *key)
 	/* OS/2 seems to use -1 to indicate "close all directories" */
 	if (*key == -1) {
 		struct dptr_struct *next;
-		for(dptr = dirptrs; dptr; dptr = next) {
+		for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = next) {
 			next = dptr->next;
 			dptr_close_internal(dptr);
 		}
@@ -286,7 +298,7 @@ void dptr_close(int *key)
 		return;
 	}
 
-	dptr = dptr_get(*key, True);
+	dptr = dptr_get(sconn, *key, true);
 
 	if (!dptr) {
 		DEBUG(0,("Invalid key %d given to dptr_close\n", *key));
@@ -305,10 +317,17 @@ void dptr_close(int *key)
 void dptr_closecnum(connection_struct *conn)
 {
 	struct dptr_struct *dptr, *next;
-	for(dptr = dirptrs; dptr; dptr = next) {
+	struct smbd_server_connection *sconn = conn->sconn;
+
+	if (sconn == NULL) {
+		return;
+	}
+
+	for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = next) {
 		next = dptr->next;
-		if (dptr->conn == conn)
+		if (dptr->conn == conn) {
 			dptr_close_internal(dptr);
+		}
 	}
 }
 
@@ -319,9 +338,16 @@ void dptr_closecnum(connection_struct *conn)
 void dptr_idlecnum(connection_struct *conn)
 {
 	struct dptr_struct *dptr;
-	for(dptr = dirptrs; dptr; dptr = dptr->next) {
-		if (dptr->conn == conn && dptr->dir_hnd)
+	struct smbd_server_connection *sconn = conn->sconn;
+
+	if (sconn == NULL) {
+		return;
+	}
+
+	for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = dptr->next) {
+		if (dptr->conn == conn && dptr->dir_hnd) {
 			dptr_idle(dptr);
+		}
 	}
 }
 
@@ -329,10 +355,11 @@ void dptr_idlecnum(connection_struct *conn)
  Close a dptr that matches a given path, only if it matches the spid also.
 ****************************************************************************/
 
-void dptr_closepath(char *path,uint16 spid)
+void dptr_closepath(struct smbd_server_connection *sconn,
+		    char *path,uint16 spid)
 {
 	struct dptr_struct *dptr, *next;
-	for(dptr = dirptrs; dptr; dptr = next) {
+	for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = next) {
 		next = dptr->next;
 		if (spid == dptr->spid && strequal(dptr->path,path))
 			dptr_close_internal(dptr);
@@ -345,14 +372,15 @@ void dptr_closepath(char *path,uint16 spid)
  finished with that one.
 ****************************************************************************/
 
-static void dptr_close_oldest(bool old)
+static void dptr_close_oldest(struct smbd_server_connection *sconn,
+			      bool old)
 {
 	struct dptr_struct *dptr;
 
 	/*
 	 * Go to the end of the list.
 	 */
-	for(dptr = dirptrs; dptr && dptr->next; dptr = dptr->next)
+	for(dptr = sconn->smb1.searches.dirptrs; dptr && dptr->next; dptr = dptr->next)
 		;
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list