void reg_get_subkey(char *full_keyname, char *key_name, char *subkey_name);
BOOL reg_split_key(const char *full_keyname, uint32 *reg_type, char *key_name);
BOOL become_user_permanently(uid_t uid, gid_t gid);
-BOOL resolve_srv_name(const char* srv_name, fstring dest_host, struct in_addr *ip);
+BOOL resolve_srv_name(const char* srv_name, fstring dest_host,
+ struct in_addr *ip);
/*The following definitions come from lib/util_array.c */
/*The following definitions come from rpc_client/cli_svcctl.c */
-BOOL svc_open_sc_man(struct cli_state *cli, uint16 fnum,
- char *srv_name, char *db_name,
+BOOL svc_open_sc_man( const char *srv_name, char *db_name,
uint32 des_access,
POLICY_HND *hnd);
-BOOL svc_open_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *scm_hnd,
+BOOL svc_open_service( POLICY_HND *scm_hnd,
const char *srv_name,
uint32 des_access,
POLICY_HND *hnd);
-BOOL svc_enum_svcs(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_enum_svcs( POLICY_HND *hnd,
uint32 services_type, uint32 services_state,
uint32 *buf_size, uint32 *resume_hnd,
uint32 *dos_error,
ENUM_SRVC_STATUS **svcs, uint32 *num_svcs);
-BOOL svc_stop_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_stop_service( POLICY_HND *hnd,
uint32 unknown);
-BOOL svc_start_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_start_service( POLICY_HND *hnd,
uint32 argc,
char **argv);
-BOOL svc_query_svc_cfg(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_query_svc_cfg( POLICY_HND *hnd,
QUERY_SERVICE_CONFIG *cfg,
uint32 *buf_size);
-BOOL svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd);
-BOOL svc_change_svc_cfg(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_close(POLICY_HND *hnd);
+BOOL svc_change_svc_cfg( POLICY_HND *hnd,
uint32 service_type, uint32 start_type,
uint32 unknown_0,
uint32 error_control,
/*The following definitions come from rpc_parse/parse_svc.c */
BOOL make_svc_q_open_sc_man(SVC_Q_OPEN_SC_MAN *q_u,
- char *server, char *database,
+ const char *server, const char *database,
uint32 des_access) ;
BOOL svc_io_q_open_sc_man(char *desc, SVC_Q_OPEN_SC_MAN *q_u, prs_struct *ps, int depth);
BOOL make_svc_r_open_sc_man(SVC_R_OPEN_SC_MAN *r_u, POLICY_HND *hnd,
/*The following definitions come from rpcclient/cmd_svcctl.c */
void svc_display_query_svc_cfg(const QUERY_SERVICE_CONFIG *cfg);
-BOOL svc_query_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *pol_scm,
+BOOL svc_query_service( POLICY_HND *pol_scm,
const char *svc_name,
SVC_QUERY_FN(svc_query_fn));
void cmd_svc_info(struct client_info *info, int argc, char *argv[]);
-BOOL msrpc_svc_enum(struct client_info *info,
+BOOL msrpc_svc_enum(const char* srv_name,
ENUM_SRVC_STATUS **svcs,
uint32 *num_svcs,
SVC_INFO_FN(info_fn),
/*The following definitions come from rpcclient/rpcclient.c */
-void rpcclient_init(void);
/*The following definitions come from smbd/blocking.c */
/****************************************************************************
do a SVC Open Policy
****************************************************************************/
-BOOL svc_open_sc_man(struct cli_state *cli, uint16 fnum,
- char *srv_name, char *db_name,
+BOOL svc_open_sc_man( const char *srv_name, char *db_name,
uint32 des_access,
POLICY_HND *hnd)
{
SVC_Q_OPEN_SC_MAN q_o;
BOOL valid_pol = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_init(srv_name, PIPE_SVCCTL, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL) return False;
prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
/* ok, at last: we're happy. return the policy handle */
memcpy(hnd, r_o.pol.data, sizeof(hnd->data));
valid_pol = True;
+ valid_pol = register_policy_hnd(hnd) &&
+ set_policy_cli_state(hnd, cli, fnum,
+ cli_state_free);
}
}
/****************************************************************************
do a SVC Open Service
****************************************************************************/
-BOOL svc_open_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *scm_hnd,
+BOOL svc_open_service( POLICY_HND *scm_hnd,
const char *srv_name,
uint32 des_access,
POLICY_HND *hnd)
SVC_Q_OPEN_SERVICE q_o;
BOOL valid_pol = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(scm_hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL || scm_hnd == NULL) return False;
prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
{
/* ok, at last: we're happy. return the policy handle */
memcpy(hnd, r_o.pol.data, sizeof(hnd->data));
- valid_pol = True;
+ valid_pol = register_policy_hnd(hnd) &&
+ set_policy_cli_state(hnd, cli, fnum,
+ NULL);
}
}
/****************************************************************************
do a SVC Enumerate Services
****************************************************************************/
-BOOL svc_enum_svcs(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_enum_svcs( POLICY_HND *hnd,
uint32 services_type, uint32 services_state,
uint32 *buf_size, uint32 *resume_hnd,
uint32 *dos_error,
SVC_Q_ENUM_SVCS_STATUS q_o;
BOOL valid_pol = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL || buf_size == NULL || dos_error == NULL || num_svcs == NULL)
{
return False;
/****************************************************************************
do a SVC Stop Service
****************************************************************************/
-BOOL svc_stop_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_stop_service( POLICY_HND *hnd,
uint32 unknown)
{
prs_struct rbuf;
SVC_Q_STOP_SERVICE q_c;
BOOL valid_cfg = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL) return False;
/* create and send a MSRPC command with api SVC_STOP_SERVICE */
/****************************************************************************
do a SVC Start Service
****************************************************************************/
-BOOL svc_start_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_start_service( POLICY_HND *hnd,
uint32 argc,
char **argv)
{
SVC_Q_START_SERVICE q_c;
BOOL valid_cfg = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL) return False;
/* create and send a MSRPC command with api SVC_START_SERVICE */
/****************************************************************************
do a SVC Query Service Config
****************************************************************************/
-BOOL svc_query_svc_cfg(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_query_svc_cfg( POLICY_HND *hnd,
QUERY_SERVICE_CONFIG *cfg,
uint32 *buf_size)
{
SVC_Q_QUERY_SVC_CONFIG q_c;
BOOL valid_cfg = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL || buf_size == NULL) return False;
/* create and send a MSRPC command with api SVC_QUERY_SVC_CONFIG */
/****************************************************************************
do a SVC Close
****************************************************************************/
-BOOL svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
+BOOL svc_close(POLICY_HND *hnd)
{
prs_struct rbuf;
prs_struct buf;
SVC_Q_CLOSE q_c;
BOOL valid_close = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL) return False;
/* create and send a MSRPC command with api SVC_CLOSE */
}
}
+ close_policy_hnd(hnd);
+
prs_mem_free(&rbuf);
prs_mem_free(&buf );
/****************************************************************************
do a SVC Change Service Config
****************************************************************************/
-BOOL svc_change_svc_cfg(struct cli_state *cli, uint16 fnum,
- POLICY_HND *hnd,
+BOOL svc_change_svc_cfg( POLICY_HND *hnd,
uint32 service_type, uint32 start_type,
uint32 unknown_0,
uint32 error_control,
SVC_Q_CHANGE_SVC_CONFIG q_c;
BOOL valid_cfg = False;
+ struct cli_state *cli = NULL;
+ uint16 fnum = 0xffff;
+
+ if (!cli_state_get(hnd, &cli, &fnum))
+ {
+ return False;
+ }
+
if (hnd == NULL) return False;
/* create and send a MSRPC command with api SVC_CHANGE_SVC_CONFIG */
return valid_cfg;
}
-
-
extern int DEBUGLEVEL;
-extern struct cli_state *smb_cli;
-extern int smb_tidx;
-
extern FILE* out_hnd;
void svc_display_query_svc_cfg(const QUERY_SERVICE_CONFIG *cfg)
display_query_svc_cfg(out_hnd, ACTION_FOOTER , cfg);
}
-BOOL svc_query_service(struct cli_state *cli, uint16 fnum,
- POLICY_HND *pol_scm,
+BOOL svc_query_service( POLICY_HND *pol_scm,
const char *svc_name,
SVC_QUERY_FN(svc_query_fn))
{
QUERY_SERVICE_CONFIG cfg;
uint32 svc_buf_size = 0x8000;
- res2 = res2 ? svc_open_service(cli, fnum,
- pol_scm,
+ res2 = res2 ? svc_open_service( pol_scm,
svc_name, 0x80000001,
&pol_svc) : False;
- res3 = res2 ? svc_query_svc_cfg(cli, fnum,
- &pol_svc, &cfg,
+ res3 = res2 ? svc_query_svc_cfg( &pol_svc, &cfg,
&svc_buf_size) : False;
if (res3 && svc_query_fn != NULL)
svc_query_fn(&cfg);
}
- res2 = res2 ? svc_close(cli, fnum, &pol_svc) : False;
+ res2 = res2 ? svc_close(&pol_svc) : False;
return res3;
}
****************************************************************************/
void cmd_svc_info(struct client_info *info, int argc, char *argv[])
{
- uint16 fnum;
BOOL res = True;
BOOL res1 = True;
char *svc_name;
fstring srv_name;
fstrcpy(srv_name, "\\\\");
- fstrcat(srv_name, info->myhostname);
+ fstrcat(srv_name, info->dest_host);
strupper(srv_name);
DEBUG(4,("cmd_svc_info: server:%s\n", srv_name));
svc_name = argv[1];
- /* open SVCCTL session. */
- res = res ? cli_nt_session_open(smb_cli, PIPE_SVCCTL, &fnum) : False;
-
/* open service control manager receive a policy handle */
- res = res ? svc_open_sc_man(smb_cli, fnum,
- srv_name, NULL, 0x80000004,
+ res = res ? svc_open_sc_man( srv_name, NULL, 0x80000004,
&pol_scm) : False;
- res1 = svc_query_service(smb_cli, fnum, &pol_scm, svc_name,
+ res1 = svc_query_service(&pol_scm, svc_name,
svc_display_query_svc_cfg);
- res = res ? svc_close(smb_cli, fnum, &pol_scm) : False;
-
- /* close the session */
- cli_nt_session_close(smb_cli, fnum);
+ res = res ? svc_close(&pol_scm) : False;
if (res && res1)
{
/****************************************************************************
nt service enum
****************************************************************************/
-BOOL msrpc_svc_enum(struct client_info *info,
+BOOL msrpc_svc_enum(const char* srv_name,
ENUM_SRVC_STATUS **svcs,
uint32 *num_svcs,
SVC_INFO_FN(info_fn),
SVC_QUERY_FN(query_fn))
{
- uint16 fnum;
BOOL res = True;
BOOL res1 = False;
int i;
POLICY_HND pol_scm;
- fstring srv_name;
-
(*svcs) = NULL;
(*num_svcs) = 0;
- fstrcpy(srv_name, "\\\\");
- fstrcat(srv_name, info->myhostname);
- strupper(srv_name);
-
- /* open SVCCTL session. */
- res = res ? cli_nt_session_open(smb_cli, PIPE_SVCCTL, &fnum) : False;
-
/* open service control manager receive a policy handle */
- res = res ? svc_open_sc_man(smb_cli, fnum,
- srv_name, NULL, 0x80000004,
+ res = res ? svc_open_sc_man( srv_name, NULL, 0x80000004,
&pol_scm) : False;
do
buf_size += 0x800;
/* enumerate services */
- res1 = res ? svc_enum_svcs(smb_cli, fnum,
- &pol_scm,
+ res1 = res ? svc_enum_svcs( &pol_scm,
0x00000030, 0x00000003,
&buf_size, &resume_hnd, &dos_error,
svcs, num_svcs) : False;
if (query_fn != NULL)
{
- res1 = svc_query_service(smb_cli, fnum, &pol_scm,
+ res1 = svc_query_service(&pol_scm,
svc_name, query_fn);
}
else if (info_fn != NULL)
}
}
- res = res ? svc_close(smb_cli, fnum, &pol_scm) : False;
-
- /* close the session */
- cli_nt_session_close(smb_cli, fnum);
+ res = res ? svc_close(&pol_scm) : False;
return res1;
}
uint32 num_svcs = 0;
BOOL request_info = False;
int opt;
+ fstring srv_name;
+
+ fstrcpy(srv_name, "\\\\");
+ fstrcat(srv_name, info->dest_host);
+ strupper(srv_name);
argc--;
argv++;
report(out_hnd,"Services\n");
report(out_hnd,"--------\n");
- msrpc_svc_enum(info, &svcs, &num_svcs,
+ msrpc_svc_enum(srv_name, &svcs, &num_svcs,
request_info ? NULL : svc_display_svc_info,
request_info ? svc_display_query_svc_cfg : NULL);
****************************************************************************/
void cmd_svc_stop(struct client_info *info, int argc, char *argv[])
{
- uint16 fnum;
BOOL res = True;
BOOL res1 = True;
char *svc_name;
fstring srv_name;
fstrcpy(srv_name, "\\\\");
- fstrcat(srv_name, info->myhostname);
+ fstrcat(srv_name, info->dest_host);
strupper(srv_name);
DEBUG(4,("cmd_svc_stop: server:%s\n", srv_name));
svc_name = argv[1];
- /* open SVCCTL session. */
- res = res ? cli_nt_session_open(smb_cli, PIPE_SVCCTL, &fnum) : False;
-
/* open service control manager receive a policy handle */
- res = res ? svc_open_sc_man(smb_cli, fnum,
- srv_name, NULL, 0x80000000,
+ res = res ? svc_open_sc_man( srv_name, NULL, 0x80000000,
&pol_scm) : False;
- res1 = res ? svc_open_service(smb_cli, fnum,
- &pol_scm,
+ res1 = res ? svc_open_service( &pol_scm,
svc_name, 0x00000020,
&pol_svc) : False;
- res2 = res1 ? svc_stop_service(smb_cli, fnum, &pol_svc, 0x1) : False;
+ res2 = res1 ? svc_stop_service(&pol_svc, 0x1) : False;
- res1 = res1 ? svc_close(smb_cli, fnum, &pol_svc) : False;
- res = res ? svc_close(smb_cli, fnum, &pol_scm) : False;
-
- /* close the session */
- cli_nt_session_close(smb_cli, fnum);
+ res1 = res1 ? svc_close(&pol_svc) : False;
+ res = res ? svc_close(&pol_scm) : False;
if (res2)
{
****************************************************************************/
void cmd_svc_start(struct client_info *info, int argc, char *argv[])
{
- uint16 fnum;
BOOL res = True;
BOOL res1 = True;
char *svc_name;
fstring srv_name;
fstrcpy(srv_name, "\\\\");
- fstrcat(srv_name, info->myhostname);
+ fstrcat(srv_name, info->dest_host);
strupper(srv_name);
DEBUG(4,("cmd_svc_start: server:%s\n", srv_name));
argv++;
argc--;
- /* open SVCCTL session. */
- res = res ? cli_nt_session_open(smb_cli, PIPE_SVCCTL, &fnum) : False;
-
/* open service control manager receive a policy handle */
- res = res ? svc_open_sc_man(smb_cli, fnum,
- srv_name, NULL, 0x80000000,
+ res = res ? svc_open_sc_man( srv_name, NULL, 0x80000000,
&pol_scm) : False;
- res1 = res ? svc_open_service(smb_cli, fnum,
- &pol_scm,
+ res1 = res ? svc_open_service( &pol_scm,
svc_name, 0x80000010,
&pol_svc) : False;
- res2 = res1 ? svc_start_service(smb_cli, fnum,
- &pol_svc, argc, argv) : False;
-
- res1 = res1 ? svc_close(smb_cli, fnum, &pol_svc) : False;
- res = res ? svc_close(smb_cli, fnum, &pol_scm) : False;
+ res2 = res1 ? svc_start_service( &pol_svc, argc, argv) : False;
- /* close the session */
- cli_nt_session_close(smb_cli, fnum);
+ res1 = res1 ? svc_close(&pol_svc) : False;
+ res = res ? svc_close(&pol_scm) : False;
if (res2)
{
****************************************************************************/
void cmd_svc_set(struct client_info *info, int argc, char *argv[])
{
- uint16 fnum;
BOOL res = True;
BOOL res2 = True;
BOOL res3;
fstring srv_name;
fstrcpy(srv_name, "\\\\");
- fstrcat(srv_name, info->myhostname);
+ fstrcat(srv_name, info->dest_host);
strupper(srv_name);
DEBUG(4,("cmd_svc_set: server:%s\n", srv_name));
svc_name = argv[1];
- /* open SVCCTL session. */
- res = res ? cli_nt_session_open(smb_cli, PIPE_SVCCTL, &fnum) : False;
-
/* open service control manager receive a policy handle */
- res = res ? svc_open_sc_man(smb_cli, fnum,
- srv_name, NULL, 0x80000004,
+ res = res ? svc_open_sc_man( srv_name, NULL, 0x80000004,
&pol_scm) : False;
- res2 = res ? svc_open_service(smb_cli, fnum,
- &pol_scm,
+ res2 = res ? svc_open_service( &pol_scm,
svc_name, 0x80000001,
&pol_svc) : False;
- res3 = res2 ? svc_query_svc_cfg(smb_cli, fnum,
- &pol_svc, &cfg,
+ res3 = res2 ? svc_query_svc_cfg( &pol_svc, &cfg,
&svc_buf_size) : False;
if (res3)
{
- res3 = svc_change_svc_cfg(smb_cli, fnum, &pol_svc,
+ res3 = svc_change_svc_cfg(&pol_svc,
cfg.service_type,
cfg.start_type,
0xffffffff,
}
- res2 = res2 ? svc_close(smb_cli, fnum, &pol_svc) : False;
-
- res = res ? svc_close(smb_cli, fnum, &pol_scm) : False;
+ res2 = res2 ? svc_close(&pol_svc) : False;
- /* close the session */
- cli_nt_session_close(smb_cli, fnum);
+ res = res ? svc_close(&pol_scm) : False;
if (res3)
{