summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/rpc_server/srv_srvsvc_nt.c304
1 files changed, 119 insertions, 185 deletions
diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c
index a313bbb881..9e1556b618 100644
--- a/source3/rpc_server/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srv_srvsvc_nt.c
@@ -513,8 +513,10 @@ 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,
+ SRV_SHARE_INFO_CTR *ctr,
+ uint32 info_level, uint32 *resume_hnd,
+ uint32 *total_entries, BOOL all_shares)
{
int num_entries = 0;
int num_services = 0;
@@ -523,7 +525,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
DEBUG(5,("init_srv_share_info_ctr\n"));
- ZERO_STRUCTPN(ctr);
+ ZERO_STRUCT(ctr->share);
ctr->info_level = ctr->switch_value = info_level;
*resume_hnd = 0;
@@ -533,218 +535,153 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
num_services = load_usershare_shares();
unbecome_root();
- /* 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)) )
- 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;
-
- switch (info_level) {
- case 0:
- {
- SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries);
- int i = 0;
+ num_entries = 0;
- if (!info0) {
- return False;
- }
+ ZERO_STRUCT(ctr->share);
- 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 = *resume_hnd; snum < num_services; snum++) {
+ if (!lp_snum_ok(snum) || !lp_browseable(snum)) {
+ continue;
}
-
- ctr->share.info0 = info0;
- break;
-
- }
-
- case 1:
- {
- SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries);
- int i = 0;
-
- if (!info1) {
- return False;
+ if (!all_shares && is_hidden_share(snum)) {
+ continue;
}
- 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);
+ switch (info_level) {
+ case 0:
+ {
+ SRV_SHARE_INFO_0 i;
+ init_srv_share_info_0(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i,
+ &ctr->share.info0, &num_entries);
+ if (ctr->share.info0 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info1 = info1;
- break;
- }
-
- case 2:
- {
- SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries);
- int i = 0;
-
- if (!info2) {
- return False;
- }
-
- 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);
+ case 1:
+ {
+ SRV_SHARE_INFO_1 i;
+ init_srv_share_info_1(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i,
+ &ctr->share.info1, &num_entries);
+ if (ctr->share.info1 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info2 = info2;
- break;
- }
-
- case 501:
- {
- SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries);
- int i = 0;
-
- if (!info501) {
- return False;
- }
-
- 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_501(p, &info501[i++], snum);
+ case 2:
+ {
+ SRV_SHARE_INFO_2 i;
+ init_srv_share_info_2(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i,
+ &ctr->share.info2, &num_entries);
+ if (ctr->share.info2 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
-
- ctr->share.info501 = info501;
- break;
- }
-
- case 502:
- {
- SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries);
- int i = 0;
- if (!info502) {
- return False;
+ case 501:
+ {
+ SRV_SHARE_INFO_501 i;
+ init_srv_share_info_501(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i,
+ &ctr->share.info501, &num_entries);
+ if (ctr->share.info501 == NULL) {
+ return WERR_NOMEM;
+ }
+ break;
}
- 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_502(p, &info502[i++], snum);
+ case 502:
+ {
+ SRV_SHARE_INFO_502 i;
+ init_srv_share_info_502(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i,
+ &ctr->share.info502, &num_entries);
+ if (ctr->share.info502 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info502 = info502;
- break;
- }
-
- /* here for completeness but not currently used with enum (1004 - 1501)*/
+ /* here for completeness but not currently used with enum
+ * (1004 - 1501)*/
- case 1004:
- {
- SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries);
- int i = 0;
-
- if (!info1004) {
- return False;
- }
-
- 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_1004(p, &info1004[i++], snum);
+ case 1004:
+ {
+ SRV_SHARE_INFO_1004 i;
+ init_srv_share_info_1004(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i,
+ &ctr->share.info1004, &num_entries);
+ if (ctr->share.info1004 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info1004 = info1004;
- break;
- }
-
- case 1005:
- {
- SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries);
- int i = 0;
-
- if (!info1005) {
- return False;
- }
-
- 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_1005(p, &info1005[i++], snum);
+ case 1005:
+ {
+ SRV_SHARE_INFO_1005 i;
+ init_srv_share_info_1005(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i,
+ &ctr->share.info1005, &num_entries);
+ if (ctr->share.info1005 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info1005 = info1005;
- break;
- }
-
- case 1006:
- {
- SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries);
- int i = 0;
-
- if (!info1006) {
- return False;
- }
-
- 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_1006(p, &info1006[i++], snum);
+ case 1006:
+ {
+ SRV_SHARE_INFO_1006 i;
+ init_srv_share_info_1006(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i,
+ &ctr->share.info1006, &num_entries);
+ if (ctr->share.info1006 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info1006 = info1006;
- break;
- }
-
- case 1007:
- {
- SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries);
- int i = 0;
-
- if (!info1007) {
- return False;
- }
-
- 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_1007(p, &info1007[i++], snum);
+ case 1007:
+ {
+ SRV_SHARE_INFO_1007 i;
+ init_srv_share_info_1007(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i,
+ &ctr->share.info1007, &num_entries);
+ if (ctr->share.info1007 == NULL) {
+ return WERR_NOMEM;
}
+ break;
}
- ctr->share.info1007 = info1007;
- break;
- }
-
- case 1501:
- {
- SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries);
- int i = 0;
-
- if (!info1501) {
- return False;
- }
-
- 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_1501(p, &info1501[i++], snum);
+ case 1501:
+ {
+ SRV_SHARE_INFO_1501 i;
+ init_srv_share_info_1501(p, &i, snum);
+ ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i,
+ &ctr->share.info1501, &num_entries);
+ if (ctr->share.info1501 == NULL) {
+ return WERR_NOMEM;
}
+ break;
+ }
+ default:
+ DEBUG(5,("init_srv_share_info_ctr: unsupported switch "
+ "value %d\n", info_level));
+ return WERR_UNKNOWN_LEVEL;
}
-
- ctr->share.info1501 = info1501;
- break;
- }
- default:
- DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level));
- return False;
}
- return True;
+ *total_entries = num_entries;
+ ctr->num_entries2 = ctr->num_entries = num_entries;
+ ctr->ptr_share_info = ctr->ptr_entries = 1;
+
+ return WERR_OK;
}
/*******************************************************************
@@ -756,12 +693,9 @@ static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n
{
DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
- if (init_srv_share_info_ctr(p, &r_n->ctr, info_level,
- &resume_hnd, &r_n->total_entries, all)) {
- r_n->status = WERR_OK;
- } else {
- r_n->status = WERR_UNKNOWN_LEVEL;
- }
+ r_n->status = init_srv_share_info_ctr(p, &r_n->ctr, info_level,
+ &resume_hnd,
+ &r_n->total_entries, all);
init_enum_hnd(&r_n->enum_hnd, resume_hnd);
}