summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Chapman <matty@samba.org>1999-06-24 13:30:55 +0000
committerMatthew Chapman <matty@samba.org>1999-06-24 13:30:55 +0000
commit2cf4484abb6e461a9858a80988dd317e479bdade (patch)
tree90cbb8fce7f6206363560503c140b9445cc89b57
parent559f41832f3e1e00d10e1e6b93cb1c47b1305183 (diff)
downloadsamba-2cf4484abb6e461a9858a80988dd317e479bdade.tar.gz
Adding Win2k browsing fix to release 2.0.4c.
-rw-r--r--WHATSNEW.txt2
-rw-r--r--source/include/proto.h23
-rw-r--r--source/include/rpc_srvsvc.h81
-rw-r--r--source/rpc_client/cli_srvsvc.c31
-rw-r--r--source/rpc_parse/parse_srv.c397
-rw-r--r--source/rpc_server/srv_srvsvc.c324
-rw-r--r--source/rpcclient/display.c131
7 files changed, 457 insertions, 532 deletions
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index ccdf458d092..566e6b3e58e 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -100,6 +100,8 @@ opens were denied has been fixed.
4). Fix for glibc2.1 bug on 32-bit systems being reported as 64
bit.
5). Prevent timestamps of 0 or -1 corrupting file timestamps.
+6). Fix for unusual delays when browsing shares using Windows
+2000.
Changes in 2.0.4b
-----------------
diff --git a/source/include/proto.h b/source/include/proto.h
index 6892f706b51..0f9ce0aa7bf 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -1448,8 +1448,7 @@ BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
char *server_name,
uint32 switch_value, SRV_R_NET_SHARE_ENUM *r_o,
- uint32 preferred_len,
- ENUM_HND *hnd);
+ uint32 preferred_len, ENUM_HND *hnd);
BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
char *server_name, char *qual_name,
uint32 switch_value, SRV_FILE_INFO_CTR *ctr,
@@ -2014,7 +2013,6 @@ BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth
void init_srv_share_info1_str(SH_INFO_1_STR *sh1, char *net_name, char *remark);
void init_srv_share_info1(SH_INFO_1 *sh1, char *net_name, uint32 type, char *remark);
-void free_srv_share_info_1(SRV_SHARE_INFO_1 *sh1);
void init_srv_share_info2_str(SH_INFO_2_STR *sh2,
char *net_name, char *remark,
char *path, char *passwd);
@@ -2022,17 +2020,18 @@ void init_srv_share_info2(SH_INFO_2 *sh2,
char *net_name, uint32 type, char *remark,
uint32 perms, uint32 max_uses, uint32 num_uses,
char *path, char *passwd);
-void free_srv_share_info_2(SRV_SHARE_INFO_2 *sh2);
void free_srv_share_info_ctr(SRV_SHARE_INFO_CTR *ctr);
void free_srv_q_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n);
void free_srv_r_net_share_enum(SRV_R_NET_SHARE_ENUM *r_n);
void init_srv_q_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n,
- char *srv_name,
- uint32 share_level, SRV_SHARE_INFO_CTR *ctr,
- uint32 preferred_len,
- ENUM_HND *hnd);
+ char *srv_name, uint32 info_level,
+ uint32 preferred_len, ENUM_HND *hnd);
BOOL srv_io_q_net_share_enum(char *desc, SRV_Q_NET_SHARE_ENUM *q_n, prs_struct *ps, int depth);
BOOL srv_io_r_net_share_enum(char *desc, SRV_R_NET_SHARE_ENUM *r_n, prs_struct *ps, int depth);
+void free_srv_q_net_share_get_info(SRV_Q_NET_SHARE_GET_INFO *q_n);
+void free_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n);
+BOOL srv_io_q_net_share_get_info(char *desc, SRV_Q_NET_SHARE_GET_INFO *q_n, prs_struct *ps, int depth);
+BOOL srv_io_r_net_share_get_info(char *desc, SRV_R_NET_SHARE_GET_INFO *r_n, prs_struct *ps, int depth);
void init_srv_sess_info0_str(SESS_INFO_0_STR *ss0, char *name);
void init_srv_sess_info0(SESS_INFO_0 *ss0, char *name);
void init_srv_sess_info1_str(SESS_INFO_1_STR *ss1, char *name, char *user);
@@ -2238,13 +2237,9 @@ void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action,
void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action,
SRV_CONN_INFO_CTR *ctr);
void display_share_info_1(FILE *out_hnd, enum action_type action,
- SH_INFO_1 *info1, SH_INFO_1_STR *str1);
+ SRV_SHARE_INFO_1 *info1);
void display_share_info_2(FILE *out_hnd, enum action_type action,
- SH_INFO_2 *info2, SH_INFO_2_STR *str2);
-void display_srv_share_info_1_ctr(FILE *out_hnd, enum action_type action,
- SRV_SHARE_INFO_1 *ctr);
-void display_srv_share_info_2_ctr(FILE *out_hnd, enum action_type action,
- SRV_SHARE_INFO_2 *ctr);
+ SRV_SHARE_INFO_2 *info2);
void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action,
SRV_SHARE_INFO_CTR *ctr);
void display_file_info_3(FILE *out_hnd, enum action_type action,
diff --git a/source/include/rpc_srvsvc.h b/source/include/rpc_srvsvc.h
index f4263117c4f..78949a7a7d9 100644
--- a/source/include/rpc_srvsvc.h
+++ b/source/include/rpc_srvsvc.h
@@ -26,13 +26,14 @@
/* srvsvc pipe */
-#define SRV_NETCONNENUM 0x08
-#define SRV_NETFILEENUM 0x09
-#define SRV_NETSESSENUM 0x0c
-#define SRV_NETSHAREENUM 0x0f
-#define SRV_NET_SRV_GET_INFO 0x15
-#define SRV_NET_SRV_SET_INFO 0x16
-#define SRV_NET_REMOTE_TOD 0x1c
+#define SRV_NETCONNENUM 0x08
+#define SRV_NETFILEENUM 0x09
+#define SRV_NETSESSENUM 0x0c
+#define SRV_NETSHAREENUM 0x0f
+#define SRV_NET_SHARE_GET_INFO 0x10
+#define SRV_NET_SRV_GET_INFO 0x15
+#define SRV_NET_SRV_SET_INFO 0x16
+#define SRV_NET_REMOTE_TOD 0x1c
/* SESS_INFO_0 (pointers to level 0 session info strings) */
typedef struct ptr_sess_info0
@@ -267,12 +268,8 @@ typedef struct str_share_info1
/* SRV_SHARE_INFO_1 */
typedef struct share_info_1_info
{
- uint32 num_entries_read; /* EntriesRead */
- uint32 ptr_share_info; /* Buffer */
- uint32 num_entries_read2; /* EntriesRead */
-
- SH_INFO_1 *info_1; /* share entry pointers */
- SH_INFO_1_STR *info_1_str; /* share entry strings */
+ SH_INFO_1 info_1;
+ SH_INFO_1_STR info_1_str;
} SRV_SHARE_INFO_1;
@@ -303,23 +300,27 @@ typedef struct str_share_info2
/* SRV_SHARE_INFO_2 */
typedef struct share_info_2_info
{
- uint32 num_entries_read; /* EntriesRead */
- uint32 ptr_share_info; /* Buffer */
- uint32 num_entries_read2; /* EntriesRead */
-
- SH_INFO_2 *info_2; /* share entry pointers */
- SH_INFO_2_STR *info_2_str; /* share entry strings */
+ SH_INFO_2 info_2;
+ SH_INFO_2_STR info_2_str;
} SRV_SHARE_INFO_2;
/* SRV_SHARE_INFO_CTR */
-typedef struct srv_share_info_1_info
+typedef struct srv_share_info_ctr_info
{
- uint32 switch_value; /* switch value */
- uint32 ptr_share_ctr; /* pointer to share info union */
+ uint32 info_level;
+ uint32 switch_value;
+ uint32 ptr_share_info;
+
+ uint32 num_entries;
+ uint32 ptr_entries;
+ uint32 num_entries2;
+
union {
- SRV_SHARE_INFO_1 info1; /* share info level 1 */
- SRV_SHARE_INFO_2 info2; /* share info level 2 */
+ SRV_SHARE_INFO_1 *info1; /* share info level 1 */
+ SRV_SHARE_INFO_2 *info2; /* share info level 2 */
+ void *info;
+
} share;
} SRV_SHARE_INFO_CTR;
@@ -330,8 +331,6 @@ typedef struct q_net_share_enum_info
uint32 ptr_srv_name; /* pointer (to server name?) */
UNISTR2 uni_srv_name; /* server name */
- uint32 share_level; /* share level */
-
SRV_SHARE_INFO_CTR ctr; /* share info container */
uint32 preferred_len; /* preferred maximum length (0xffff ffff) */
@@ -344,7 +343,6 @@ typedef struct q_net_share_enum_info
/* SRV_R_NET_SHARE_ENUM */
typedef struct r_net_share_enum_info
{
- uint32 share_level; /* share level */
SRV_SHARE_INFO_CTR ctr; /* share info container */
uint32 total_entries; /* total number of entries */
@@ -354,6 +352,35 @@ typedef struct r_net_share_enum_info
} SRV_R_NET_SHARE_ENUM;
+
+/* SRV_Q_NET_SHARE_GET_INFO */
+typedef struct q_net_share_get_info_info
+{
+ uint32 ptr_srv_name;
+ UNISTR2 uni_srv_name;
+
+ UNISTR2 uni_share_name;
+ uint32 info_level;
+
+} SRV_Q_NET_SHARE_GET_INFO;
+
+/* SRV_R_NET_SHARE_GET_INFO */
+typedef struct r_net_share_get_info_info
+{
+ uint32 switch_value;
+ uint32 ptr_share_ctr;
+
+ union {
+ SRV_SHARE_INFO_1 info1;
+ SRV_SHARE_INFO_2 info2;
+
+ } share;
+
+ uint32 status;
+
+} SRV_R_NET_SHARE_GET_INFO;
+
+
/* FILE_INFO_3 (level 3 file info strings) */
typedef struct file_info3_info
{
diff --git a/source/rpc_client/cli_srvsvc.c b/source/rpc_client/cli_srvsvc.c
index 912508ecd53..b883cc19425 100644
--- a/source/rpc_client/cli_srvsvc.c
+++ b/source/rpc_client/cli_srvsvc.c
@@ -93,7 +93,7 @@ BOOL do_srv_net_srv_conn_enum(struct cli_state *cli,
if (r_o.status != 0) {
/* report error code */
- DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
+ DEBUG(0,("SRV_R_NET_SRV_CONN_ENUM: %s\n", get_nt_error_msg(r_o.status)));
prs_mem_free(&rdata);
return False;
}
@@ -173,7 +173,7 @@ BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
if (r_o.status != 0) {
/* report error code */
- DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
+ DEBUG(0,("SRV_R_NET_SRV_SESS_ENUM: %s\n", get_nt_error_msg(r_o.status)));
prs_mem_free(&rdata);
return False;
}
@@ -197,13 +197,11 @@ do a server net share enum
BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
char *server_name,
uint32 switch_value, SRV_R_NET_SHARE_ENUM *r_o,
- uint32 preferred_len,
- ENUM_HND *hnd)
+ uint32 preferred_len, ENUM_HND *hnd)
{
prs_struct data;
prs_struct rdata;
SRV_Q_NET_SHARE_ENUM q_o;
- SRV_SHARE_INFO_CTR ctr;
if (server_name == NULL || preferred_len == 0)
return False;
@@ -216,20 +214,9 @@ BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
DEBUG(4,("SRV Get Share Info (%s), level %d, enum:%8x\n",
server_name, switch_value, get_enum_hnd(hnd)));
- q_o.share_level = switch_value;
-
- memset(&ctr, '\0', sizeof(SRV_SHARE_INFO_CTR));
-
- ctr.switch_value = switch_value;
- ctr.ptr_share_ctr = 1;
- ctr.share.info1.num_entries_read = 0;
- ctr.share.info1.ptr_share_info = 1;
-
/* store the parameters */
- init_srv_q_net_share_enum(&q_o, server_name,
- switch_value, &ctr,
- preferred_len,
- hnd);
+ init_srv_q_net_share_enum(&q_o, server_name, switch_value,
+ preferred_len, hnd);
/* turn parameters into data stream */
if(!srv_io_q_net_share_enum("", &q_o, &data, 0)) {
@@ -254,7 +241,7 @@ BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
if (r_o->status != 0) {
/* report error code */
- DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o->status)));
+ DEBUG(0,("SRV_R_NET_SHARE_ENUM: %s\n", get_nt_error_msg(r_o->status)));
prs_mem_free(&rdata);
free_srv_r_net_share_enum(r_o);
return False;
@@ -262,7 +249,7 @@ BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
if (r_o->ctr.switch_value != switch_value) {
/* different switch levels. oops. */
- DEBUG(0,("SRV_R_NET_SRV_SHARE_ENUM: info class %d does not match request %d\n",
+ DEBUG(0,("SRV_R_NET_SHARE_ENUM: info class %d does not match request %d\n",
r_o->ctr.switch_value, switch_value));
prs_mem_free(&rdata);
free_srv_r_net_share_enum(r_o);
@@ -338,14 +325,14 @@ BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
if (r_o.status != 0) {
/* report error code */
- DEBUG(0,("SRV_R_NET_SRV_GET_INFO: %s\n", get_nt_error_msg(r_o.status)));
+ DEBUG(0,("SRV_R_NET_FILE_ENUM: %s\n", get_nt_error_msg(r_o.status)));
prs_mem_free(&rdata);
return False;
}
if (r_o.ctr->switch_value != switch_value) {
/* different switch levels. oops. */
- DEBUG(0,("SRV_R_NET_SRV_FILE_ENUM: info class %d does not match request %d\n",
+ DEBUG(0,("SRV_R_NET_FILE_ENUM: info class %d does not match request %d\n",
r_o.ctr->switch_value, switch_value));
prs_mem_free(&rdata);
return False;
diff --git a/source/rpc_parse/parse_srv.c b/source/rpc_parse/parse_srv.c
index 23319c5dcc5..8997b05e0b7 100644
--- a/source/rpc_parse/parse_srv.c
+++ b/source/rpc_parse/parse_srv.c
@@ -102,95 +102,6 @@ static BOOL srv_io_share_info1(char *desc, SH_INFO_1 *sh1, prs_struct *ps, int d
}
/*******************************************************************
- Free a share info level 1 structure.
- ********************************************************************/
-
-void free_srv_share_info_1(SRV_SHARE_INFO_1 *sh1)
-{
- if(!sh1)
- return;
- if(sh1->info_1)
- free(sh1->info_1);
- sh1->info_1 = NULL;
- if(sh1->info_1_str)
- free(sh1->info_1_str);
- sh1->info_1_str = NULL;
- memset(sh1, '\0', sizeof(SRV_SHARE_INFO_1) );
-}
-
-/*******************************************************************
- Reads or writes a structure.
-********************************************************************/
-
-static BOOL srv_io_srv_share_info_1(char *desc, SRV_SHARE_INFO_1 *ctr, prs_struct *ps, int depth)
-{
- if (ctr == NULL)
- return False;
-
- prs_debug(ps, depth, desc, "srv_io_share_1_ctr");
- depth++;
-
- if(!prs_align(ps))
- return False;
-
- if(!prs_uint32("num_entries_read", ps, depth, &ctr->num_entries_read))
- return False;
- if(!prs_uint32("ptr_share_info", ps, depth, &ctr->ptr_share_info))
- return False;
-
- if (ctr->ptr_share_info != 0) {
- int i;
- int num_entries = ctr->num_entries_read;
-
- /*
- * Allocate the num_entries arrays on demand if reading.
- */
-
- if(UNMARSHALLING(ps) && ctr->info_1 == NULL) {
- if(!(ctr->info_1 = malloc(num_entries * sizeof(SH_INFO_1)))) {
- DEBUG(0,("srv_io_srv_share_info_1: malloc failed for %d SH_INFO_1.\n",
- num_entries ));
- return False;
- }
- memset(ctr->info_1, '\0', num_entries * sizeof(SH_INFO_1) );
- }
-
- if(UNMARSHALLING(ps) && ctr->info_1_str == NULL) {
- if(!(ctr->info_1_str = malloc(num_entries * sizeof(SH_INFO_1_STR)))) {
- DEBUG(0,("srv_io_srv_share_info_1: malloc failed for %d SH_INFO_1_STR.\n",
- num_entries ));
- free(ctr->info_1);
- ctr->info_1 = NULL;
- return False;
- }
- memset(ctr->info_1_str, '\0', num_entries * sizeof(SH_INFO_1_STR) );
- }
-
- if(!prs_uint32("num_entries_read2", ps, depth, &ctr->num_entries_read2))
- if(!prs_uint32("num_entries_read2", ps, depth, &ctr->num_entries_read2))
- return False;
-
- for (i = 0; i < num_entries; i++) {
- if(!srv_io_share_info1("", &ctr->info_1[i], ps, depth))
- return False;
- }
-
- for (i = 0; i < num_entries; i++) {
- if(!srv_io_share_info1_str("", &ctr->info_1_str[i], ps, depth))
- return False;
- }
-
- if(!prs_align(ps))
- return False;
- } else {
- if(UNMARSHALLING(ps))
- memset(ctr, '\0', sizeof(SRV_SHARE_INFO_1));
- }
-
- return True;
-}
-
-/*******************************************************************
Inits a SH_INFO_2_STR structure
********************************************************************/
@@ -256,23 +167,6 @@ void init_srv_share_info2(SH_INFO_2 *sh2,
}
/*******************************************************************
- Free a share info level 2 structure.
- ********************************************************************/
-
-void free_srv_share_info_2(SRV_SHARE_INFO_2 *sh2)
-{
- if(!sh2)
- return;
- if(sh2->info_2)
- free(sh2->info_2);
- sh2->info_2 = NULL;
- if(sh2->info_2_str)
- free(sh2->info_2_str);
- sh2->info_2_str = NULL;
- memset(sh2, '\0', sizeof(SRV_SHARE_INFO_2) );
-}
-
-/*******************************************************************
Reads or writes a structure.
********************************************************************/
@@ -311,111 +205,110 @@ static BOOL srv_io_share_info2(char *desc, SH_INFO_2 *sh2, prs_struct *ps, int d
Reads or writes a structure.
********************************************************************/
-static BOOL srv_io_srv_share_info_2(char *desc, SRV_SHARE_INFO_2 *ctr, prs_struct *ps, int depth)
+static BOOL srv_io_srv_share_ctr(char *desc, SRV_SHARE_INFO_CTR *ctr, prs_struct *ps, int depth)
{
if (ctr == NULL)
return False;
- prs_debug(ps, depth, desc, "srv_io_share_2_ctr");
+ prs_debug(ps, depth, desc, "srv_io_srv_share_ctr");
depth++;
+ if (UNMARSHALLING(ps)) {
+ memset(ctr, '\0', sizeof(SRV_SHARE_INFO_CTR));
+ }
+
if(!prs_align(ps))
return False;
- if(!prs_uint32("num_entries_read", ps, depth, &ctr->num_entries_read))
+ if(!prs_uint32("info_level", ps, depth, &ctr->info_level))
+ return False;
+
+ if (ctr->info_level == 0)
+ return True;
+
+ if(!prs_uint32("switch_value", ps, depth, &ctr->switch_value))
return False;
if(!prs_uint32("ptr_share_info", ps, depth, &ctr->ptr_share_info))
return False;
- if (ctr->ptr_share_info != 0) {
- int i;
- int num_entries = ctr->num_entries_read;
+ if (ctr->ptr_share_info == 0)
+ return True;
- /*
- * Allocate the num_entries arrays on demand if reading.
- */
+ if(!prs_uint32("num_entries", ps, depth, &ctr->num_entries))
+ return False;
+ if(!prs_uint32("ptr_entries", ps, depth, &ctr->ptr_entries))
+ return False;
- if(UNMARSHALLING(ps) && ctr->info_2 == NULL) {
- if(!(ctr->info_2 = malloc(num_entries * sizeof(SH_INFO_2)))) {
- DEBUG(0,("srv_io_srv_share_info_2: malloc failed for %d SH_INFO_2.\n",
- num_entries ));
- return False;
- }
- memset(ctr->info_2, '\0', num_entries * sizeof(SH_INFO_2) );
- }
+ if (ctr->ptr_entries == 0) {
+ if (ctr->num_entries == 0)
+ return True;
+ else
+ return False;
+ }
+
+ if(!prs_uint32("num_entries2", ps, depth, &ctr->num_entries2))
+ return False;
+
+ if (ctr->num_entries2 != ctr->num_entries)
+ return False;
+
+ switch (ctr->switch_value) {
+ case 1:
+ {
+ SRV_SHARE_INFO_1 *info1 = ctr->share.info1;
+ int num_entries = ctr->num_entries;
+ int i;
- if(UNMARSHALLING(ps) && ctr->info_2_str == NULL) {
- if(!(ctr->info_2_str = malloc(num_entries * sizeof(SH_INFO_2_STR)))) {
- DEBUG(0,("srv_io_srv_share_info_2: malloc failed for %d SH_INFO_2_STR.\n",
- num_entries ));
- free(ctr->info_2);
- ctr->info_2 = NULL;
+ if (UNMARSHALLING(ps)) {
+ if (!(info1 = malloc(num_entries * sizeof(SRV_SHARE_INFO_1))))
return False;
- }
- memset(ctr->info_2_str, '\0', num_entries * sizeof(SH_INFO_2_STR) );
+ memset(info1, '\0', num_entries * sizeof(SRV_SHARE_INFO_1));
+ ctr->share.info1 = info1;
}
- if(!prs_uint32("num_entries_read2", ps, depth, &ctr->num_entries_read2))
- return False;
-
for (i = 0; i < num_entries; i++) {
- if(!srv_io_share_info2("", &ctr->info_2[i], ps, depth))
+ if(!srv_io_share_info1("", &info1[i].info_1, ps, depth))
return False;
}
for (i = 0; i < num_entries; i++) {
- if(!srv_io_share_info2_str("", &ctr->info_2_str[i], ps, depth))
+ if(!srv_io_share_info1_str("", &info1[i].info_1_str, ps, depth))
return False;
}
- if(!prs_align(ps))
- return False;
- } else {
- if(UNMARSHALLING(ps))
- memset(ctr, '\0', sizeof(SRV_SHARE_INFO_2));
+ break;
}
- return True;
-}
-
-/*******************************************************************
- Reads or writes a structure.
-********************************************************************/
-
-static BOOL srv_io_srv_share_ctr(char *desc, SRV_SHARE_INFO_CTR *ctr, prs_struct *ps, int depth)
-{
- if (ctr == NULL)
- return False;
-
- prs_debug(ps, depth, desc, "srv_io_srv_share_ctr");
- depth++;
-
- if(!prs_align(ps))
- return False;
+ case 2:
+ {
+ SRV_SHARE_INFO_2 *info2 = ctr->share.info2;
+ int num_entries = ctr->num_entries;
+ int i;
- if(!prs_uint32("switch_value", ps, depth, &ctr->switch_value))
- return False;
- if(!prs_uint32("ptr_share_ctr", ps, depth, &ctr->ptr_share_ctr))
- return False;
+ if (UNMARSHALLING(ps)) {
+ if (!(info2 = malloc(num_entries * sizeof(SRV_SHARE_INFO_2))))
+ return False;
+ memset(info2, '\0', num_entries * sizeof(SRV_SHARE_INFO_2));
+ ctr->share.info2 = info2;
+ }
- if (ctr->ptr_share_ctr != 0) {
- switch (ctr->switch_value) {
- case 2:
- if(!srv_io_srv_share_info_2("", &ctr->share.info2, ps, depth))
+ for (i = 0; i < num_entries; i++) {
+ if(!srv_io_share_info2("", &info2[i].info_2, ps, depth))
return False;
- break;
- case 1:
- if(!srv_io_srv_share_info_1("", &ctr->share.info1, ps, depth))
+ }
+
+ for (i = 0; i < num_entries; i++) {
+ if(!srv_io_share_info2_str("", &info2[i].info_2_str, ps, depth))
return False;
- break;
- default:
- DEBUG(5,("%s no share info at switch_value %d\n",
- tab_depth(depth), ctr->switch_value));
- break;
}
- } else {
- if(UNMARSHALLING(ps))
- memset(ctr, '\0', sizeof(SRV_SHARE_INFO_CTR));
+
+ break;
+ }
+
+ default:
+ DEBUG(5,("%s no share info at switch_value %d\n",
+ tab_depth(depth), ctr->switch_value));
+ break;
}
return True;
@@ -429,14 +322,8 @@ void free_srv_share_info_ctr(SRV_SHARE_INFO_CTR *ctr)
{
if(!ctr)
return;
- switch (ctr->switch_value) {
- case 1:
- free_srv_share_info_1(&ctr->share.info1);
- break;
- case 2:
- free_srv_share_info_2(&ctr->share.info2);
- break;
- }
+ if(ctr->share.info)
+ free(ctr->share.info);
memset(ctr, '\0', sizeof(SRV_SHARE_INFO_CTR));
}
@@ -469,18 +356,16 @@ void free_srv_r_net_share_enum(SRV_R_NET_SHARE_ENUM *r_n)
********************************************************************/
void init_srv_q_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n,
- char *srv_name,
- uint32 share_level, SRV_SHARE_INFO_CTR *ctr,
- uint32 preferred_len,
- ENUM_HND *hnd)
+ char *srv_name, uint32 info_level,
+ uint32 preferred_len, ENUM_HND *hnd)
{
- q_n->ctr = *ctr;
DEBUG(5,("init_q_net_share_enum\n"));
init_buf_unistr2(&q_n->uni_srv_name, &q_n->ptr_srv_name, srv_name);
- q_n->share_level = share_level;
+ q_n->ctr.info_level = q_n->ctr.switch_value = info_level;
+ q_n->ctr.ptr_share_info = 0;
q_n->preferred_len = preferred_len;
memcpy(&q_n->enum_hnd, hnd, sizeof(*hnd));
@@ -506,20 +391,12 @@ BOOL srv_io_q_net_share_enum(char *desc, SRV_Q_NET_SHARE_ENUM *q_n, prs_struct *
if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
return False;
- if(!prs_align(ps))
+ if(!srv_io_srv_share_ctr("share_ctr", &q_n->ctr, ps, depth))
return False;
- if(!prs_uint32("share_level", ps, depth, &q_n->share_level))
+ if(!prs_align(ps))
return False;
- if (q_n->share_level != -1) {
- if(!srv_io_srv_share_ctr("share_ctr", &q_n->ctr, ps, depth))
- return False;
- } else {
- if(UNMARSHALLING(ps))
- memset(&q_n->ctr, '\0', sizeof(SRV_SHARE_INFO_CTR));
- }
-
if(!prs_uint32("preferred_len", ps, depth, &q_n->preferred_len))
return False;
@@ -541,17 +418,12 @@ BOOL srv_io_r_net_share_enum(char *desc, SRV_R_NET_SHARE_ENUM *r_n, prs_struct *
prs_debug(ps, depth, desc, "srv_io_r_net_share_enum");
depth++;
- if(!prs_align(ps))
+ if(!srv_io_srv_share_ctr("share_ctr", &r_n->ctr, ps, depth))
return False;
- if(!prs_uint32("share_level", ps, depth, &r_n->share_level))
+ if(!prs_align(ps))
return False;
- if (r_n->share_level != 0) {
- if(!srv_io_srv_share_ctr("share_ctr", &r_n->ctr, ps, depth))
- return False;
- }
-
if(!prs_uint32("total_entries", ps, depth, &r_n->total_entries))
return False;
if(!smb_io_enum_hnd("enum_hnd", &r_n->enum_hnd, ps, depth))
@@ -563,6 +435,115 @@ BOOL srv_io_r_net_share_enum(char *desc, SRV_R_NET_SHARE_ENUM *r_n, prs_struct *
}
/*******************************************************************
+ Frees a SRV_Q_NET_SHARE_GET_INFO structure.
+********************************************************************/
+
+void free_srv_q_net_share_get_info(SRV_Q_NET_SHARE_GET_INFO *q_n)
+{
+ if(!q_n)
+ return;
+ memset(q_n, '\0', sizeof(SRV_Q_NET_SHARE_GET_INFO));
+}
+
+/*******************************************************************
+ Frees a SRV_R_NET_SHARE_GET_INFO structure.
+********************************************************************/
+
+void free_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n)
+{
+ if(!r_n)
+ return;
+ memset(r_n, '\0', sizeof(SRV_R_NET_SHARE_GET_INFO));
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_q_net_share_get_info(char *desc, SRV_Q_NET_SHARE_GET_INFO *q_n, prs_struct *ps, int depth)
+{
+ if (q_n == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "srv_io_q_net_share_get_info");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+ return False;
+ if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+ return False;
+
+ if(!smb_io_unistr2("", &q_n->uni_share_name, True, ps, depth))
+ return False;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("info_level", ps, depth, &q_n->info_level))
+ return False;
+
+ return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+********************************************************************/
+
+BOOL srv_io_r_net_share_get_info(char *desc, SRV_R_NET_SHARE_GET_INFO *r_n, prs_struct *ps, int depth)
+{
+ if (r_n == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "srv_io_r_net_share_get_info");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("switch_value ", ps, depth, &r_n->switch_value ))
+ return False;
+
+ if(!prs_uint32("ptr_share_ctr", ps, depth, &r_n->ptr_share_ctr))
+ return False;
+
+ if (r_n->ptr_share_ctr != 0) {
+ switch (r_n->switch_value) {
+ case 1:
+ if(!srv_io_share_info1("", &r_n->share.info1.info_1, ps, depth))
+ return False;
+
+ if(!srv_io_share_info1_str("", &r_n->share.info1.info_1_str, ps, depth))
+ return False;
+
+ break;
+ case 2:
+ if(!srv_io_share_info2("", &r_n->share.info2.info_2, ps, depth))
+ return False;
+
+ if(!srv_io_share_info2_str("", &r_n->share.info2.info_2_str, ps, depth))
+ return False;
+
+ break;
+ default:
+ DEBUG(5,("%s no share info at switch_value %d\n",
+ tab_depth(depth), r_n->switch_value));
+ break;
+ }
+ }
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("status", ps, depth, &r_n->status))
+ return False;
+
+ return True;
+}
+
+/*******************************************************************
Inits a SESS_INFO_0_STR structure
********************************************************************/
diff --git a/source/rpc_server/srv_srvsvc.c b/source/rpc_server/srv_srvsvc.c
index d0d4c33c640..5402d6f71fd 100644
--- a/source/rpc_server/srv_srvsvc.c
+++ b/source/rpc_server/srv_srvsvc.c
@@ -31,10 +31,9 @@ extern pstring global_myname;
/*******************************************************************
Fill in a share info level 1 structure.
- See ipc.c:fill_share_info()
********************************************************************/
-static void init_srv_share_1_info(SH_INFO_1 *sh1, SH_INFO_1_STR *str1, int snum)
+static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum)
{
int len_net_name;
pstring net_name;
@@ -55,77 +54,15 @@ static void init_srv_share_1_info(SH_INFO_1 *sh1, SH_INFO_1_STR *str1, int snum)
if (net_name[len_net_name] == '$')
type |= STYPE_HIDDEN;
- init_srv_share_info1(sh1, net_name, type, remark);
- init_srv_share_info1_str(str1, net_name, remark);
-}
-
-/*******************************************************************
- Fill in a share info level 1 structure.
- ********************************************************************/
-
-static BOOL init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, uint32 *snum, uint32 *svcs)
-{
- uint32 num_entries = 0;
- uint32 res_handle;
- int i;
-
- DEBUG(5,("init_srv_share_info_1\n"));
-
- memset(sh1, '\0', sizeof(SRV_SHARE_INFO_1));
-
- /* First count the number of entries. */
-
- res_handle = *snum;
- *svcs = lp_numservices();
-
- for (; *snum < *svcs; (*snum)++) {
- if (lp_browseable(*snum) && lp_snum_ok(*snum))
- num_entries++;
- }
-
- if(num_entries) {
- if(!(sh1->info_1 = (SH_INFO_1 *)malloc(num_entries * sizeof(SH_INFO_1)))) {
- DEBUG(0,("init_srv_share_info_1: malloc fail for %d SH_INFO_1.",
- num_entries ));
- return False;
- }
-
- memset(sh1->info_1, '\0', num_entries * sizeof(SH_INFO_1));
-
- if(!(sh1->info_1_str = (SH_INFO_1_STR *)malloc(num_entries * sizeof(SH_INFO_1_STR)))) {
- DEBUG(0,("init_srv_share_info_1: malloc fail for %d SH_INFO_1_STR.",
- num_entries ));
- free(sh1->info_1);
- sh1->info_1 = NULL;
- return False;
- }
-
- memset(sh1->info_1_str, '\0', num_entries * sizeof(SH_INFO_1_STR));
- }
-
- for (*snum = res_handle, i = 0; *snum < *svcs; (*snum)++) {
- if (lp_browseable(*snum) && lp_snum_ok(*snum)) {
- init_srv_share_1_info(&sh1->info_1[i], &sh1->info_1_str[i], *snum);
- i++;
- }
- }
-
- sh1->num_entries_read = num_entries;
- sh1->ptr_share_info = (num_entries > 0) ? 1 : 0;
- sh1->num_entries_read2 = num_entries;
-
- if ((*snum) >= (*svcs))
- (*snum) = 0;
-
- return True;
+ init_srv_share_info1(&sh1->info_1, net_name, type, remark);
+ init_srv_share_info1_str(&sh1->info_1_str, net_name, remark);
}
/*******************************************************************
Fill in a share info level 2 structure.
- See ipc.c:fill_share_info()
********************************************************************/
-static void init_srv_share_2_info(SH_INFO_2 *sh2, SH_INFO_2_STR *str2, int snum)
+static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum)
{
int len_net_name;
pstring net_name;
@@ -150,113 +87,82 @@ static void init_srv_share_2_info(SH_INFO_2 *sh2, SH_INFO_2_STR *str2, int snum)
if (net_name[len_net_name] == '$')
type |= STYPE_HIDDEN;
- init_srv_share_info2(sh2, net_name, type, remark, 0, 0xffffffff, 1, path, passwd);
- init_srv_share_info2_str(str2, net_name, remark, path, passwd);
+ init_srv_share_info2(&sh2->info_2, net_name, type, remark, 0, 0xffffffff, 1, path, passwd);
+ init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd);
}
/*******************************************************************
- Fill in a share info level 2 structure.
+ Fill in a share info structure.
********************************************************************/
-static BOOL init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, uint32 *snum, uint32 *svcs)
+static BOOL init_srv_share_info_ctr(SRV_SHARE_INFO_CTR *ctr,
+ uint32 info_level, uint32 *resume_hnd, uint32 *total_entries)
{
- uint32 num_entries = 0;
- uint32 res_handle;
- int i;
+ int num_entries = 0;
+ int num_services = lp_numservices();
+ int snum;
- DEBUG(5,("init_srv_share_info_2\n"));
+ DEBUG(5,("init_srv_share_info_ctr\n"));
- memset(sh2, '\0', sizeof(SRV_SHARE_INFO_2));
+ ZERO_STRUCTPN(ctr);
- /* Count the number of entries. */
-
- res_handle = *snum;
- *svcs = lp_numservices();
+ ctr->info_level = ctr->switch_value = info_level;
+ *resume_hnd = 0;
- for (; *snum < *svcs; (*snum)++) {
- if (lp_browseable((*snum)) && lp_snum_ok((*snum)))
+ /* Count the number of entries. */
+ for (snum = 0; snum < num_services; snum++) {
+ if (lp_browseable(snum) && lp_snum_ok(snum))
num_entries++;
}
- if(num_entries) {
- if(!(sh2->info_2 = (SH_INFO_2 *)malloc(num_entries * sizeof(SH_INFO_2)))) {
- DEBUG(0,("init_srv_share_info_2: malloc fail for %d SH_INFO_2.",
- num_entries ));
- return False;
- }
+ *total_entries = num_entries;
+ ctr->num_entries2 = ctr->num_entries = num_entries;
+ ctr->ptr_share_info = ctr->ptr_entries = 1;
- memset(sh2->info_2, '\0', num_entries * sizeof(SH_INFO_2));
+ if (!num_entries)
+ return True;
- if(!(sh2->info_2_str = (SH_INFO_2_STR *)malloc(num_entries * sizeof(SH_INFO_2_STR)))) {
- DEBUG(0,("init_srv_share_info_2: malloc fail for %d SH_INFO_2_STR.",
- num_entries ));
- free(sh2->info_2);
- sh2->info_2 = NULL;
- return False;
- }
+ switch (info_level) {
+ case 1:
+ {
+ SRV_SHARE_INFO_1 *info1;
+ int i = 0;
- memset(sh2->info_2_str, '\0', num_entries * sizeof(SH_INFO_2_STR));
- }
+ info1 = malloc(num_entries * sizeof(SRV_SHARE_INFO_1));
- for (i = 0, *snum = res_handle; *snum < *svcs; (*snum)++) {
- if (lp_browseable((*snum)) && lp_snum_ok((*snum))) {
- init_srv_share_2_info(&sh2->info_2[i], &sh2->info_2_str[i], *snum);
- i++;
+ for (snum = *resume_hnd; snum < num_services; snum++) {
+ if (lp_browseable(snum) && lp_snum_ok(snum)) {
+ init_srv_share_info_1(&info1[i++], snum);
+ }
}
- }
-
- sh2->num_entries_read = num_entries;
- sh2->ptr_share_info = num_entries > 0 ? 1 : 0;
- sh2->num_entries_read2 = num_entries;
-
- if (*snum >= *svcs)
- *snum = 0;
-
- return True;
-}
-/*******************************************************************
- makes a SRV_R_NET_SHARE_ENUM structure.
-********************************************************************/
+ ctr->share.info1 = info1;
+ break;
+ }
-static uint32 init_srv_share_info_ctr(SRV_SHARE_INFO_CTR *ctr,
- int switch_value, uint32 *resume_hnd, uint32 *total_entries)
-{
- uint32 status = 0x0;
- DEBUG(5,("init_srv_share_info_ctr: %d\n", __LINE__));
+ case 2:
+ {
+ SRV_SHARE_INFO_2 *info2;
+ int i = 0;
- ctr->switch_value = switch_value;
+ info2 = malloc(num_entries * sizeof(SRV_SHARE_INFO_2));
- switch (switch_value) {
- case 1:
- if(!init_srv_share_info_1(&ctr->share.info1, resume_hnd, total_entries)) {
- *resume_hnd = 0;
- *total_entries = 0;
- ctr->ptr_share_ctr = 0;
- return (status = 0xC0000000 | NT_STATUS_NO_MEMORY);
- }
- ctr->ptr_share_ctr = 1;
- break;
- case 2:
- if(!init_srv_share_info_2(&ctr->share.info2, resume_hnd, total_entries)) {
- *resume_hnd = 0;
- *total_entries = 0;
- ctr->ptr_share_ctr = 0;
- return (status = 0xC0000000 | NT_STATUS_NO_MEMORY);
+ for (snum = *resume_hnd; snum < num_services; snum++) {
+ if (lp_browseable(snum) && lp_snum_ok(snum)) {
+ init_srv_share_info_2(&info2[i++], snum);
+ }
}
- ctr->ptr_share_ctr = 2;
+
+ ctr->share.info2 = info2;
break;
+ }
+
default:
- DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n",
- switch_value));
- *resume_hnd = 0;
- *total_entries = 0;
- ctr->ptr_share_ctr = 0;
- status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS;
- break;
+ DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level));
+ return False;
}
- return status;
+ return True;
}
/*******************************************************************
@@ -264,19 +170,16 @@ static uint32 init_srv_share_info_ctr(SRV_SHARE_INFO_CTR *ctr,
********************************************************************/
static void init_srv_r_net_share_enum(SRV_R_NET_SHARE_ENUM *r_n,
- uint32 resume_hnd, int share_level, int switch_value)
+ uint32 info_level, uint32 resume_hnd)
{
DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
- r_n->share_level = share_level;
- if (share_level == 0)
+ if (init_srv_share_info_ctr(&r_n->ctr, info_level,
+ &resume_hnd, &r_n->total_entries)) {
+ r_n->status = 0x0;
+ } else {
r_n->status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS;
- else
- r_n->status = init_srv_share_info_ctr(&r_n->ctr, switch_value,
- &resume_hnd, &r_n->total_entries);
-
- if (r_n->status != 0x0)
- resume_hnd = 0;
+ }
init_enum_hnd(&r_n->enum_hnd, resume_hnd);
}
@@ -295,9 +198,8 @@ static BOOL srv_reply_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n,
/* Create the list of shares for the response. */
init_srv_r_net_share_enum(&r_n,
- get_enum_hnd(&q_n->enum_hnd),
- q_n->share_level,
- q_n->ctr.switch_value);
+ q_n->ctr.info_level,
+ get_enum_hnd(&q_n->enum_hnd));
/* store the response in the SMB stream */
ret = srv_io_r_net_share_enum("", &r_n, rdata, 0);
@@ -311,6 +213,71 @@ static BOOL srv_reply_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n,
}
/*******************************************************************
+ Inits a SRV_R_NET_SHARE_GET_INFO structure.
+********************************************************************/
+
+static void init_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n,
+ char *share_name, uint32 info_level)
+{
+ uint32 status = 0x0;
+ int snum;
+
+ DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
+
+ r_n->switch_value = info_level;
+
+ snum = find_service(share_name);
+
+ if (snum >= 0) {
+ switch (info_level) {
+ case 1:
+ init_srv_share_info_1(&r_n->share.info1, snum);
+ break;
+ case 2:
+ init_srv_share_info_2(&r_n->share.info2, snum);
+ break;
+ default:
+ DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level));
+ status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS;
+ break;
+ }
+ } else {
+ status = 0xC0000000 | NT_STATUS_BAD_NETWORK_NAME;
+ }
+
+ r_n->ptr_share_ctr = (status == 0x0) ? 1 : 0;
+ r_n->status = status;
+}
+
+/*******************************************************************
+ Net share get info.
+********************************************************************/
+
+static BOOL srv_reply_net_share_get_info(SRV_Q_NET_SHARE_GET_INFO *q_n,
+ prs_struct *rdata)
+{
+ SRV_R_NET_SHARE_GET_INFO r_n;
+ char *share_name;
+ BOOL ret;
+
+ DEBUG(5,("srv_net_share_get_info: %d\n", __LINE__));
+
+ /* Create the list of shares for the response. */
+ share_name = unistr2_to_str(&q_n->uni_share_name);
+ init_srv_r_net_share_get_info(&r_n, share_name, q_n->info_level);
+
+ /* store the response in the SMB stream */
+ ret = srv_io_r_net_share_get_info("", &r_n, rdata, 0);
+
+ /* Free the memory used by the response. */
+ free_srv_r_net_share_get_info(&r_n);
+
+ DEBUG(5,("srv_net_share_get_info: %d\n", __LINE__));
+
+ return ret;
+}
+
+/*******************************************************************
fill in a sess info level 1 structure.
this function breaks the rule that i'd like to be in place, namely
@@ -1041,6 +1008,30 @@ static BOOL api_srv_net_share_enum( uint16 vuid, prs_struct *data,
}
/*******************************************************************
+ RPC to return share information.
+********************************************************************/
+
+static BOOL api_srv_net_share_get_info( uint16 vuid, prs_struct *data,
+ prs_struct *rdata )
+{
+ SRV_Q_NET_SHARE_GET_INFO q_n;
+ BOOL ret;
+
+ /* Unmarshall the net server get info. */
+ if(!srv_io_q_net_share_get_info("", &q_n, data, 0)) {
+ DEBUG(0,("api_srv_net_share_get_info: Failed to unmarshall SRV_Q_NET_SHARE_GET_INFO.\n"));
+ return False;
+ }
+
+ ret = srv_reply_net_share_get_info(&q_n, rdata);
+
+ /* Free any data allocated in the unmarshalling. */
+ free_srv_q_net_share_get_info(&q_n);
+
+ return ret;
+}
+
+/*******************************************************************
time of day
********************************************************************/
static BOOL srv_reply_net_remote_tod(SRV_Q_NET_REMOTE_TOD *q_n,
@@ -1103,13 +1094,14 @@ static BOOL api_srv_net_remote_tod( uint16 vuid, prs_struct *data,
********************************************************************/
struct api_struct api_srv_cmds[] =
{
- { "SRV_NETCONNENUM" , SRV_NETCONNENUM , api_srv_net_conn_enum },
- { "SRV_NETSESSENUM" , SRV_NETSESSENUM , api_srv_net_sess_enum },
- { "SRV_NETSHAREENUM" , SRV_NETSHAREENUM , api_srv_net_share_enum },
- { "SRV_NETFILEENUM" , SRV_NETFILEENUM , api_srv_net_file_enum },
- { "SRV_NET_SRV_GET_INFO", SRV_NET_SRV_GET_INFO, api_srv_net_srv_get_info },
- { "SRV_NET_REMOTE_TOD" , SRV_NET_REMOTE_TOD , api_srv_net_remote_tod },
- { NULL , 0 , NULL }
+ { "SRV_NETCONNENUM" , SRV_NETCONNENUM , api_srv_net_conn_enum },
+ { "SRV_NETSESSENUM" , SRV_NETSESSENUM , api_srv_net_sess_enum },
+ { "SRV_NETSHAREENUM" , SRV_NETSHAREENUM , api_srv_net_share_enum },
+ { "SRV_NET_SHARE_GET_INFO", SRV_NET_SHARE_GET_INFO, api_srv_net_share_get_info },
+ { "SRV_NETFILEENUM" , SRV_NETFILEENUM , api_srv_net_file_enum },
+ { "SRV_NET_SRV_GET_INFO" , SRV_NET_SRV_GET_INFO , api_srv_net_srv_get_info },
+ { "SRV_NET_REMOTE_TOD" , SRV_NET_REMOTE_TOD , api_srv_net_remote_tod },
+ { NULL , 0 , NULL }
};
/*******************************************************************
diff --git a/source/rpcclient/display.c b/source/rpcclient/display.c
index 75c9930ebb0..6916f1b616f 100644
--- a/source/rpcclient/display.c
+++ b/source/rpcclient/display.c
@@ -460,9 +460,9 @@ void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action,
share info level 1 display function
****************************************************************************/
void display_share_info_1(FILE *out_hnd, enum action_type action,
- SH_INFO_1 *info1, SH_INFO_1_STR *str1)
+ SRV_SHARE_INFO_1 *info1)
{
- if (info1 == NULL || str1 == NULL)
+ if (info1 == NULL)
{
return;
}
@@ -480,10 +480,10 @@ void display_share_info_1(FILE *out_hnd, enum action_type action,
fstring remark ;
fstring net_name;
- fstrcpy(net_name, unistrn2(str1->uni_netname.buffer, str1->uni_netname.uni_str_len));
- fstrcpy(remark , unistrn2(str1->uni_remark .buffer, str1->uni_remark .uni_str_len));
+ fstrcpy(net_name, unistrn2(info1->info_1_str.uni_netname.buffer, info1->info_1_str.uni_netname.uni_str_len));
+ fstrcpy(remark , unistrn2(info1->info_1_str.uni_remark .buffer, info1->info_1_str.uni_remark .uni_str_len));
- display_share(out_hnd, action, net_name, info1->type, remark);
+ display_share(out_hnd, action, net_name, info1->info_1.type, remark);
break;
}
@@ -500,9 +500,9 @@ void display_share_info_1(FILE *out_hnd, enum action_type action,
share info level 2 display function
****************************************************************************/
void display_share_info_2(FILE *out_hnd, enum action_type action,
- SH_INFO_2 *info2, SH_INFO_2_STR *str2)
+ SRV_SHARE_INFO_2 *info2)
{
- if (info2 == NULL || str2 == NULL)
+ if (info2 == NULL)
{
return;
}
@@ -522,14 +522,15 @@ void display_share_info_2(FILE *out_hnd, enum action_type action,
fstring path ;
fstring passwd ;
- fstrcpy(net_name, unistrn2(str2->uni_netname.buffer, str2->uni_netname.uni_str_len));
- fstrcpy(remark , unistrn2(str2->uni_remark .buffer, str2->uni_remark .uni_str_len));
- fstrcpy(path , unistrn2(str2->uni_path .buffer, str2->uni_path .uni_str_len));
- fstrcpy(passwd , unistrn2(str2->uni_passwd .buffer, str2->uni_passwd .uni_str_len));
+ fstrcpy(net_name, unistrn2(info2->info_2_str.uni_netname.buffer, info2->info_2_str.uni_netname.uni_str_len));
+ fstrcpy(remark , unistrn2(info2->info_2_str.uni_remark .buffer, info2->info_2_str.uni_remark .uni_str_len));
+ fstrcpy(path , unistrn2(info2->info_2_str.uni_path .buffer, info2->info_2_str.uni_path .uni_str_len));
+ fstrcpy(passwd , unistrn2(info2->info_2_str.uni_passwd .buffer, info2->info_2_str.uni_passwd .uni_str_len));
- display_share2(out_hnd, action, net_name, info2->type, remark,
- info2->perms, info2->max_uses, info2->num_uses,
- path, passwd);
+ display_share2(out_hnd, action, net_name,
+ info2->info_2.type, remark, info2->info_2.perms,
+ info2->info_2.max_uses, info2->info_2.num_uses,
+ path, passwd);
break;
}
@@ -543,52 +544,15 @@ void display_share_info_2(FILE *out_hnd, enum action_type action,
}
/****************************************************************************
-share info level 1 container display function
-****************************************************************************/
-void display_srv_share_info_1_ctr(FILE *out_hnd, enum action_type action,
- SRV_SHARE_INFO_1 *ctr)
-{
- if (ctr == NULL)
- {
- fprintf(out_hnd, "display_srv_share_info_1_ctr: unavailable due to an internal error\n");
- return;
- }
-
- switch (action)
- {
- case ACTION_HEADER:
- {
- break;
- }
- case ACTION_ENUMERATE:
- {
- int i;
-
- for (i = 0; i < ctr->num_entries_read; i++)
- {
- display_share_info_1(out_hnd, ACTION_HEADER , &(ctr->info_1[i]), &(ctr->info_1_str[i]));
- display_share_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->info_1[i]), &(ctr->info_1_str[i]));
- display_share_info_1(out_hnd, ACTION_FOOTER , &(ctr->info_1[i]), &(ctr->info_1_str[i]));
- }
- break;
- }
- case ACTION_FOOTER:
- {
- break;
- }
- }
-}
-
-/****************************************************************************
-share info level 2 container display function
+share info container display function
****************************************************************************/
-void display_srv_share_info_2_ctr(FILE *out_hnd, enum action_type action,
- SRV_SHARE_INFO_2 *ctr)
+void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action,
+ SRV_SHARE_INFO_CTR *ctr)
{
if (ctr == NULL)
{
- fprintf(out_hnd, "display_srv_share_info_2_ctr: unavailable due to an internal error\n");
- return;
+ fprintf(out_hnd, "display_srv_share_info_ctr: unavailable due to an internal error\n");
+ return;
}
switch (action)
@@ -601,11 +565,23 @@ void display_srv_share_info_2_ctr(FILE *out_hnd, enum action_type action,
{
int i;
- for (i = 0; i < ctr->num_entries_read; i++)
+ for (i = 0; i < ctr->num_entries; i++)
{
- display_share_info_2(out_hnd, ACTION_HEADER , &(ctr->info_2[i]), &(ctr->info_2_str[i]));
- display_share_info_2(out_hnd, ACTION_ENUMERATE, &(ctr->info_2[i]), &(ctr->info_2_str[i]));
- display_share_info_2(out_hnd, ACTION_FOOTER , &(ctr->info_2[i]), &(ctr->info_2_str[i]));
+ switch (ctr->info_level) {
+ case 1:
+ display_share_info_1(out_hnd, ACTION_HEADER , &(ctr->share.info1[i]));
+ display_share_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->share.info1[i]));
+ display_share_info_1(out_hnd, ACTION_FOOTER , &(ctr->share.info1[i]));
+ break;
+ case 2:
+ display_share_info_2(out_hnd, ACTION_HEADER , &(ctr->share.info2[i]));
+ display_share_info_2(out_hnd, ACTION_ENUMERATE, &(ctr->share.info2[i]));
+ display_share_info_2(out_hnd, ACTION_FOOTER , &(ctr->share.info2[i]));
+ break;
+ default:
+ fprintf(out_hnd, "display_srv_share_info_ctr: Unknown Info Level\n");
+ break;
+ }
}
break;
}
@@ -617,41 +593,6 @@ void display_srv_share_info_2_ctr(FILE *out_hnd, enum action_type action,
}
/****************************************************************************
-share info container display function
-****************************************************************************/
-void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action,
- SRV_SHARE_INFO_CTR *ctr)
-{
- if (ctr == NULL || ctr->ptr_share_ctr == 0)
- {
- fprintf(out_hnd, "display_srv_share_info_ctr: unavailable due to an internal error\n");
- return;
- }
-
- switch (ctr->switch_value)
- {
- case 1:
- {
- display_srv_share_info_1_ctr(out_hnd, action,
- &(ctr->share.info1));
- break;
- }
- case 2:
- {
- display_srv_share_info_2_ctr(out_hnd, action,
- &(ctr->share.info2));
- break;
- }
- default:
- {
- fprintf(out_hnd, "display_srv_share_info_ctr: Unknown Info Level\n");
- break;
- }
- }
-}
-
-
-/****************************************************************************
file info level 3 display function
****************************************************************************/
void display_file_info_3(FILE *out_hnd, enum action_type action,