diff options
author | Matthew Chapman <matty@samba.org> | 1999-06-24 13:30:55 +0000 |
---|---|---|
committer | Matthew Chapman <matty@samba.org> | 1999-06-24 13:30:55 +0000 |
commit | 2cf4484abb6e461a9858a80988dd317e479bdade (patch) | |
tree | 90cbb8fce7f6206363560503c140b9445cc89b57 | |
parent | 559f41832f3e1e00d10e1e6b93cb1c47b1305183 (diff) | |
download | samba-2cf4484abb6e461a9858a80988dd317e479bdade.tar.gz |
Adding Win2k browsing fix to release 2.0.4c.
-rw-r--r-- | WHATSNEW.txt | 2 | ||||
-rw-r--r-- | source/include/proto.h | 23 | ||||
-rw-r--r-- | source/include/rpc_srvsvc.h | 81 | ||||
-rw-r--r-- | source/rpc_client/cli_srvsvc.c | 31 | ||||
-rw-r--r-- | source/rpc_parse/parse_srv.c | 397 | ||||
-rw-r--r-- | source/rpc_server/srv_srvsvc.c | 324 | ||||
-rw-r--r-- | source/rpcclient/display.c | 131 |
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, |