diff options
-rw-r--r-- | source3/include/proto.h | 6 | ||||
-rw-r--r-- | source3/rpc_client/cli_svcctl.c | 17 | ||||
-rw-r--r-- | source3/rpcclient/cmd_svcctl.c | 51 | ||||
-rw-r--r-- | source3/rpcclient/display.c | 24 |
4 files changed, 61 insertions, 37 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 2f43cd1edb..6f2c9934e8 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1785,8 +1785,9 @@ BOOL do_svc_open_sc_man(struct cli_state *cli, uint16 fnum, BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd, uint32 services_type, uint32 services_state, - uint32 buf_size, uint32 *resume_hnd, - ENUM_SRVC_STATUS **svcs); + uint32 *buf_size, uint32 *resume_hnd, + uint32 *dos_error, + ENUM_SRVC_STATUS **svcs, uint32 *num_svcs); BOOL do_svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd); /*The following definitions come from rpc_client/cli_wkssvc.c */ @@ -2768,6 +2769,7 @@ void display_reg_value_info(FILE *out_hnd, enum action_type action, char *val_name, uint32 val_type, BUFFER2 *value); void display_reg_key_info(FILE *out_hnd, enum action_type action, char *key_name, time_t key_mod_time); +void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *svc); /*The following definitions come from rpcclient/rpcclient.c */ diff --git a/source3/rpc_client/cli_svcctl.c b/source3/rpc_client/cli_svcctl.c index 3535c90391..f14a699802 100644 --- a/source3/rpc_client/cli_svcctl.c +++ b/source3/rpc_client/cli_svcctl.c @@ -97,15 +97,19 @@ do a SVC Enumerate Services BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd, uint32 services_type, uint32 services_state, - uint32 buf_size, uint32 *resume_hnd, - ENUM_SRVC_STATUS **svcs) + uint32 *buf_size, uint32 *resume_hnd, + uint32 *dos_error, + ENUM_SRVC_STATUS **svcs, uint32 *num_svcs) { prs_struct rbuf; prs_struct buf; SVC_Q_ENUM_SVCS_STATUS q_o; BOOL valid_pol = False; - if (hnd == NULL) return False; + if (hnd == NULL || buf_size == NULL || dos_error == NULL || num_svcs == NULL) + { + return False; + } prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); @@ -116,7 +120,7 @@ BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum, make_svc_q_enum_svcs_status(&q_o, hnd, services_type, services_state, - buf_size, *resume_hnd); + *buf_size, *resume_hnd); /* turn parameters into data stream */ svc_io_q_enum_svcs_status("", &q_o, &buf, 0); @@ -136,13 +140,16 @@ BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum, { /* report error code */ DEBUG(0,("SVC_ENUM_SVCS_STATUS: %s\n", smb_err_msg(ERRDOS, r_o.dos_status))); - p = r_o.dos_status != ERRmoredata; + p = r_o.dos_status == ERRmoredata; } if (p) { (*svcs) = r_o.svcs; + (*num_svcs) = r_o.num_svcs; (*resume_hnd) = get_enum_hnd(&r_o.resume_hnd); + (*buf_size) = r_o.more_buf_size; + (*dos_error) = r_o.dos_status; valid_pol = True; } } diff --git a/source3/rpcclient/cmd_svcctl.c b/source3/rpcclient/cmd_svcctl.c index 8ee454aaf5..162b0204b7 100644 --- a/source3/rpcclient/cmd_svcctl.c +++ b/source3/rpcclient/cmd_svcctl.c @@ -46,10 +46,13 @@ void cmd_svc_enum(struct client_info *info) BOOL res1 = True; int i; uint32 resume_hnd = 0; + uint32 buf_size = 0; + uint32 dos_error = 0; ENUM_SRVC_STATUS *svcs = NULL; + uint32 num_svcs = 0; POLICY_HND sc_man_pol; - fstring full_keyname; + fstring srv_name; fstrcpy(srv_name, "\\\\"); @@ -68,50 +71,38 @@ void cmd_svc_enum(struct client_info *info) do { + buf_size += 0x800; + /* enumerate services */ res1 = res ? do_svc_enum_svcs(smb_cli, fnum, &sc_man_pol, 0x00000030, 0x00000003, - 0x00000080, &resume_hnd, &svcs) : False; - - } while (resume_hnd != 0); + &buf_size, &resume_hnd, &dos_error, + &svcs, &num_svcs) : False; - if (svcs != NULL) - { - free(svcs); - } + } while (dos_error == ERRmoredata); -#if 0 - if (res1 && num_subkeys > 0) + if (res1 && dos_error == 0x0 && num_svcs > 0 && svcs != NULL) { - fprintf(out_hnd,"Subkeys\n"); - fprintf(out_hnd,"-------\n"); + fprintf(out_hnd,"Services\n"); + fprintf(out_hnd,"--------\n"); } - for (i = 0; i < num_subkeys; i++) + for (i = 0; i < num_svcs && svcs != NULL; i++) { - BOOL res2 = True; - /* - * enumerate key - */ - - /* enum key */ - res2 = res2 ? do_svc_enum_key(smb_cli, fnum, &key_pol, - i, enum_name, - &enum_unk1, &enum_unk2, - &key_mod_time) : False; - - if (res2) + if (res1) { - display_svc_key_info(out_hnd, ACTION_HEADER , enum_name, key_mod_time); - display_svc_key_info(out_hnd, ACTION_ENUMERATE, enum_name, key_mod_time); - display_svc_key_info(out_hnd, ACTION_FOOTER , enum_name, key_mod_time); + display_svc_info(out_hnd, ACTION_HEADER , &svcs[i]); + display_svc_info(out_hnd, ACTION_ENUMERATE, &svcs[i]); + display_svc_info(out_hnd, ACTION_FOOTER , &svcs[i]); } - } + if (svcs != NULL) + { + free(svcs); } -#endif + res = res ? do_svc_close(smb_cli, fnum, &sc_man_pol) : False; /* close the session */ diff --git a/source3/rpcclient/display.c b/source3/rpcclient/display.c index 8a5844f943..800b89e563 100644 --- a/source3/rpcclient/display.c +++ b/source3/rpcclient/display.c @@ -1535,6 +1535,30 @@ void display_reg_key_info(FILE *out_hnd, enum action_type action, } } +/**************************************************************************** + display structure + ****************************************************************************/ +void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *svc) +{ + switch (action) + { + case ACTION_HEADER: + { + break; + } + case ACTION_ENUMERATE: + { + fprintf(out_hnd, "\t%s:", unistr2(svc->uni_srvc_name .buffer)); /* service name unicode string */ + fprintf(out_hnd, "\t%s\n", unistr2(svc->uni_disp_name .buffer)); /* display name unicode string */ + break; + } + case ACTION_FOOTER: + { + break; + } + } +} + #if COPY_THIS_TEMPLATE /**************************************************************************** display structure |