summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h6
-rw-r--r--source3/rpc_client/cli_svcctl.c17
-rw-r--r--source3/rpcclient/cmd_svcctl.c51
-rw-r--r--source3/rpcclient/display.c24
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