[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-141-g128637b

Günther Deschner gd at samba.org
Fri Mar 7 20:03:21 GMT 2008


The branch, v3-2-test has been updated
       via  128637bdd7c37ca166a7d478b33b00c39f0ede62 (commit)
      from  966d7244d7765d285a7026b97e6093fd1f8d83ce (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 128637bdd7c37ca166a7d478b33b00c39f0ede62
Author: Günther Deschner <gd at samba.org>
Date:   Fri Mar 7 16:19:43 2008 +0100

    Use pidl for _srvsvc_NetShareGetInfo, _srvsvc_NetShareEnum and srvsvc_NetShareEnumAll.
    
    Fixing resume handling while we are there.
    
    Guenther

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

Summary of changes:
 source/rpc_server/srv_srvsvc.c    |   69 +----
 source/rpc_server/srv_srvsvc_nt.c |  599 ++++++++++++++++--------------------
 2 files changed, 269 insertions(+), 399 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/rpc_server/srv_srvsvc.c b/source/rpc_server/srv_srvsvc.c
index 41fc39b..39548c5 100644
--- a/source/rpc_server/srv_srvsvc.c
+++ b/source/rpc_server/srv_srvsvc.c
@@ -180,28 +180,7 @@ static bool api_srv_net_sess_del(pipes_struct *p)
 
 static bool api_srv_net_share_enum_all(pipes_struct *p)
 {
-	SRV_Q_NET_SHARE_ENUM q_u;
-	SRV_R_NET_SHARE_ENUM r_u;
-	prs_struct *data = &p->in_data.data;
-	prs_struct *rdata = &p->out_data.rdata;
-
-	ZERO_STRUCT(q_u);
-	ZERO_STRUCT(r_u);
-
-	/* Unmarshall the net server get enum. */
-	if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
-		DEBUG(0,("api_srv_net_share_enum_all: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
-		return False;
-	}
-
-	r_u.status = _srv_net_share_enum_all(p, &q_u, &r_u);
-
-	if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
-		DEBUG(0,("api_srv_net_share_enum_all: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
-		return False;
-	}
-
-	return True;
+	return proxy_srvsvc_call(p, NDR_SRVSVC_NETSHAREENUMALL);
 }
 
 /*******************************************************************
@@ -210,28 +189,7 @@ static bool api_srv_net_share_enum_all(pipes_struct *p)
 
 static bool api_srv_net_share_enum(pipes_struct *p)
 {
-	SRV_Q_NET_SHARE_ENUM q_u;
-	SRV_R_NET_SHARE_ENUM r_u;
-	prs_struct *data = &p->in_data.data;
-	prs_struct *rdata = &p->out_data.rdata;
-
-	ZERO_STRUCT(q_u);
-	ZERO_STRUCT(r_u);
-
-	/* Unmarshall the net server get enum. */
-	if(!srv_io_q_net_share_enum("", &q_u, data, 0)) {
-		DEBUG(0,("api_srv_net_share_enum: Failed to unmarshall SRV_Q_NET_SHARE_ENUM.\n"));
-		return False;
-	}
-
-	r_u.status = _srv_net_share_enum(p, &q_u, &r_u);
-
-	if (!srv_io_r_net_share_enum("", &r_u, rdata, 0)) {
-		DEBUG(0,("api_srv_net_share_enum: Failed to marshall SRV_R_NET_SHARE_ENUM.\n"));
-		return False;
-	}
-
-	return True;
+	return proxy_srvsvc_call(p, NDR_SRVSVC_NETSHAREENUM);
 }
 
 /*******************************************************************
@@ -240,28 +198,7 @@ static bool api_srv_net_share_enum(pipes_struct *p)
 
 static bool api_srv_net_share_get_info(pipes_struct *p)
 {
-	SRV_Q_NET_SHARE_GET_INFO q_u;
-	SRV_R_NET_SHARE_GET_INFO r_u;
-	prs_struct *data = &p->in_data.data;
-	prs_struct *rdata = &p->out_data.rdata;
-
-	ZERO_STRUCT(q_u);
-	ZERO_STRUCT(r_u);
-
-	/* Unmarshall the net server get info. */
-	if(!srv_io_q_net_share_get_info("", &q_u, data, 0)) {
-		DEBUG(0,("api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO.\n"));
-		return False;
-	}
-
-	r_u.status = _srv_net_share_get_info(p, &q_u, &r_u);
-
-	if(!srv_io_r_net_share_get_info("", &r_u, rdata, 0)) {
-		DEBUG(0,("api_srv_net_share_get_info: Failed to marshall SRV_R_NET_SHARE_GET_INFO.\n"));
-		return False;
-	}
-
-	return True;
+	return proxy_srvsvc_call(p, NDR_SRVSVC_NETSHAREGETINFO);
 }
 
 /*******************************************************************
diff --git a/source/rpc_server/srv_srvsvc_nt.c b/source/rpc_server/srv_srvsvc_nt.c
index 4efea33..3c5d1e4 100644
--- a/source/rpc_server/srv_srvsvc_nt.c
+++ b/source/rpc_server/srv_srvsvc_nt.c
@@ -242,19 +242,18 @@ static uint32 get_share_type(int snum)
  Fill in a share info level 0 structure.
  ********************************************************************/
 
-static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum)
+static void init_srv_share_info_0(pipes_struct *p, struct srvsvc_NetShareInfo0 *r, int snum)
 {
 	const char *net_name = lp_servicename(snum);
 
-	init_srv_share_info0(&sh0->info_0, net_name);
-	init_srv_share_info0_str(&sh0->info_0_str, net_name);
+	init_srvsvc_NetShareInfo0(r, net_name);
 }
 
 /*******************************************************************
  Fill in a share info level 1 structure.
  ********************************************************************/
 
-static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum)
+static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 *r, int snum)
 {
 	char *net_name = lp_servicename(snum);
 	char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
@@ -265,20 +264,16 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn
 				remark);
 	}
 
-	init_srv_share_info1(&sh1->info_1,
-			net_name,
-			get_share_type(snum),
-			remark ? remark: "");
-	init_srv_share_info1_str(&sh1->info_1_str,
-			net_name,
-			remark ? remark: "");
+	init_srvsvc_NetShareInfo1(r, net_name,
+				  get_share_type(snum),
+				  remark ? remark : "");
 }
 
 /*******************************************************************
  Fill in a share info level 2 structure.
  ********************************************************************/
 
-static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum)
+static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 *r, int snum)
 {
 	char *remark = NULL;
 	char *path = NULL;
@@ -307,21 +302,15 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn
 	}
 
 	count = count_current_connections(net_name, false);
-	init_srv_share_info2(&sh2->info_2,
-				net_name,
-				get_share_type(snum),
-				remark ? remark : "",
-				0,
-				max_uses,
-				count,
-				path ? path : "",
-				"");
-
-	init_srv_share_info2_str(&sh2->info_2_str,
-				net_name,
-				remark ? remark : "",
-				path ? path : "",
-				"");
+
+	init_srvsvc_NetShareInfo2(r, net_name,
+				  get_share_type(snum),
+				  remark ? remark : "",
+				  0,
+				  max_uses,
+				  count,
+				  path ? path : "",
+				  "");
 }
 
 /*******************************************************************
@@ -353,7 +342,7 @@ static void map_generic_share_sd_bits(SEC_DESC *psd)
  Fill in a share info level 501 structure.
 ********************************************************************/
 
-static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum)
+static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo501 *r, int snum)
 {
 	const char *net_name = lp_servicename(snum);
 	char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
@@ -362,17 +351,17 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501,
 		remark = standard_sub_conn(p->mem_ctx, p->conn, remark);
 	}
 
-	init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum),
-			remark ? remark : "", (lp_csc_policy(snum) << 4));
-	init_srv_share_info501_str(&sh501->info_501_str,
-			net_name, remark ? remark : "");
+	init_srvsvc_NetShareInfo501(r, net_name,
+				    get_share_type(snum),
+				    remark ? remark : "",
+				    (lp_csc_policy(snum) << 4));
 }
 
 /*******************************************************************
  Fill in a share info level 502 structure.
  ********************************************************************/
 
-static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum)
+static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo502 *r, int snum)
 {
 	const char *net_name = lp_servicename(snum);
 	char *path = NULL;
@@ -381,8 +370,6 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502,
 	TALLOC_CTX *ctx = p->mem_ctx;
 	char *remark = talloc_strdup(ctx, lp_comment(snum));;
 
-	ZERO_STRUCTP(sh502);
-
 	if (remark) {
 		remark = standard_sub_conn(ctx, p->conn, remark);
 	}
@@ -397,31 +384,23 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502,
 
 	sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
 
-	init_srv_share_info502(&sh502->info_502,
-			net_name,
-			get_share_type(snum),
-			remark ? remark : "",
-			0,
-			0xffffffff,
-			1,
-			path ? path : "",
-			"",
-			sd,
-			sd_size);
-	init_srv_share_info502_str(&sh502->info_502_str,
-			net_name,
-			remark ? remark : "",
-			path ? path : "",
-			"",
-			sd,
-			sd_size);
+	init_srvsvc_NetShareInfo502(r, net_name,
+				    get_share_type(snum),
+				    remark ? remark : "",
+				    0,
+				    0xffffffff,
+				    1,
+				    path ? path : "",
+				    "",
+				    0,
+				    sd);
 }
 
 /***************************************************************************
  Fill in a share info level 1004 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum)
+static void init_srv_share_info_1004(pipes_struct *p, struct srvsvc_NetShareInfo1004 *r, int snum)
 {
 	char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
 
@@ -429,65 +408,59 @@ static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh100
 		remark = standard_sub_conn(p->mem_ctx, p->conn, remark);
 	}
 
-	ZERO_STRUCTP(sh1004);
-
-	init_srv_share_info1004(&sh1004->info_1004, remark ? remark : "");
-	init_srv_share_info1004_str(&sh1004->info_1004_str,
-			remark ? remark : "");
+	init_srvsvc_NetShareInfo1004(r, remark ? remark : "");
 }
 
 /***************************************************************************
  Fill in a share info level 1005 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum)
+static void init_srv_share_info_1005(pipes_struct *p, struct srvsvc_NetShareInfo1005 *r, int snum)
 {
-	sh1005->share_info_flags = 0;
+	uint32_t dfs_flags = 0;
+
+	if (lp_host_msdfs() && lp_msdfs_root(snum)) {
+		dfs_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
+	}
 
-	if(lp_host_msdfs() && lp_msdfs_root(snum))
-		sh1005->share_info_flags |=
-			SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
-	sh1005->share_info_flags |=
-		lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
+	dfs_flags |= lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
+
+	init_srvsvc_NetShareInfo1005(r, dfs_flags);
 }
+
 /***************************************************************************
  Fill in a share info level 1006 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum)
+static void init_srv_share_info_1006(pipes_struct *p, struct srvsvc_NetShareInfo1006 *r, int snum)
 {
-	sh1006->max_uses = -1;
+	init_srvsvc_NetShareInfo1006(r, 0xffffffff);
 }
 
 /***************************************************************************
  Fill in a share info level 1007 structure.
  ***************************************************************************/
 
-static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum)
+static void init_srv_share_info_1007(pipes_struct *p, struct srvsvc_NetShareInfo1007 *r, int snum)
 {
 	uint32 flags = 0;
 
-	ZERO_STRUCTP(sh1007);
-
-	init_srv_share_info1007(&sh1007->info_1007, flags, "");
-	init_srv_share_info1007_str(&sh1007->info_1007_str, "");
+	init_srvsvc_NetShareInfo1007(r, flags, "");
 }
 
 /*******************************************************************
  Fill in a share info level 1501 structure.
  ********************************************************************/
 
-static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum)
+static void init_srv_share_info_1501(pipes_struct *p, struct sec_desc_buf *r, int snum)
 {
 	SEC_DESC *sd;
 	size_t sd_size;
 	TALLOC_CTX *ctx = p->mem_ctx;
 
-	ZERO_STRUCTP(sh1501);
-
 	sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
 
-	sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
+	r = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
 }
 
 /*******************************************************************
@@ -505,21 +478,24 @@ static bool is_hidden_share(int snum)
  Fill in a share info structure.
  ********************************************************************/
 
-static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
-	       uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, bool all_shares)
+static WERROR init_srv_share_info_ctr(pipes_struct *p,
+				      struct srvsvc_NetShareInfoCtr *info_ctr,
+				      uint32_t *resume_handle_p,
+				      uint32_t *total_entries,
+				      bool all_shares)
 {
 	int num_entries = 0;
+	int alloc_entries = 0;
 	int num_services = 0;
 	int snum;
 	TALLOC_CTX *ctx = p->mem_ctx;
+	int i = 0;
+	int valid_share_count = 0;
+	union srvsvc_NetShareCtr ctr;
+	uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
 
 	DEBUG(5,("init_srv_share_info_ctr\n"));
 
-	ZERO_STRUCTPN(ctr);
-
-	ctr->info_level = ctr->switch_value = info_level;
-	*resume_hnd = 0;
-
 	/* Ensure all the usershares are loaded. */
 	become_root();
 	num_services = load_usershare_shares();
@@ -528,300 +504,202 @@ static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
 
 	/* Count the number of entries. */
 	for (snum = 0; snum < num_services; snum++) {
-		if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) )
+		if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
 			num_entries++;
+		}
 	}
 
-	*total_entries = num_entries;
-	ctr->num_entries2 = ctr->num_entries = num_entries;
-	ctr->ptr_share_info = ctr->ptr_entries = 1;
-
-	if (!num_entries)
-		return True;
+	if (!num_entries || (resume_handle >= num_entries)) {
+		return WERR_OK;
+	}
 
-	switch (info_level) {
+	/* Calculate alloc entries. */
+	alloc_entries = num_entries - resume_handle;
+	switch (info_ctr->level) {
 	case 0:
-	{
-		SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries);
-		int i = 0;
+		ctr.ctr0 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr0);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr0);
 
-		if (!info0) {
-			return False;
-		}
+		ctr.ctr0->count = alloc_entries;
+		ctr.ctr0->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo0, alloc_entries);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr0->array);
 
-		for (snum = *resume_hnd; snum < num_services; snum++) {
-			if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
-				init_srv_share_info_0(p, &info0[i++], snum);
+		for (snum = 0; snum < num_services; snum++) {
+			if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
+			    (resume_handle <= (i + valid_share_count++)) ) {
+				init_srv_share_info_0(p, &ctr.ctr0->array[i++], snum);
 			}
 		}
 
-		ctr->share.info0 = info0;
 		break;
 
-	}
-
 	case 1:
-	{
-		SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries);
-		int i = 0;
+		ctr.ctr1 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr1);
 
-		if (!info1) {
-			return False;
-		}
+		ctr.ctr1->count = alloc_entries;
+		ctr.ctr1->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1, alloc_entries);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr1->array);
 
-		for (snum = *resume_hnd; snum < num_services; snum++) {
-			if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
-				init_srv_share_info_1(p, &info1[i++], snum);
+		for (snum = 0; snum < num_services; snum++) {
+			if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
+			    (resume_handle <= (i + valid_share_count++)) ) {
+				init_srv_share_info_1(p, &ctr.ctr1->array[i++], snum);
 			}
 		}
 
-		ctr->share.info1 = info1;
 		break;
-	}
 
 	case 2:
-	{
-		SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries);
-		int i = 0;
+		ctr.ctr2 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr2);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr2);
 
-		if (!info2) {
-			return False;
-		}
+		ctr.ctr2->count = alloc_entries;
+		ctr.ctr2->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo2, alloc_entries);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr2->array);
 
-		for (snum = *resume_hnd; snum < num_services; snum++) {
-			if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
-				init_srv_share_info_2(p, &info2[i++], snum);
+		for (snum = 0; snum < num_services; snum++) {
+			if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
+			    (resume_handle <= (i + valid_share_count++)) ) {
+				init_srv_share_info_2(p, &ctr.ctr2->array[i++], snum);
 			}
 		}
 
-		ctr->share.info2 = info2;
 		break;
-	}
 
 	case 501:
-	{
-		SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries);
-		int i = 0;
+		ctr.ctr501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr501);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr501);
 
-		if (!info501) {
-			return False;
-		}
+		ctr.ctr501->count = alloc_entries;
+		ctr.ctr501->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo501, alloc_entries);
+		W_ERROR_HAVE_NO_MEMORY(ctr.ctr501->array);
 
-		for (snum = *resume_hnd; snum < num_services; snum++) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list