service control manager API completed. svcenum -i works, but does not
authorLuke Leighton <lkcl@samba.org>
Wed, 24 Nov 1999 23:11:03 +0000 (23:11 +0000)
committerLuke Leighton <lkcl@samba.org>
Wed, 24 Nov 1999 23:11:03 +0000 (23:11 +0000)
do so twice.  possible memory corruption, revolving around getopt().
(This used to be commit 7cacf8bd026f1ee274f1d352c68cf79cf4f3b499)

source3/include/proto.h
source3/lib/util_hnd.c
source3/rpc_client/cli_svcctl.c
source3/rpc_parse/parse_svc.c
source3/rpc_server/srv_lsa_hnd.c
source3/rpcclient/cmd_svcctl.c
source3/rpcclient/rpcclient.c

index 475c1a2bac9973ccdc3087fc2851b5a6f329d491..f986cc7c2d845f6c3cf7b445b486702b2e96c7da 100644 (file)
@@ -481,7 +481,8 @@ int set_maxfiles(int requested_max);
 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  */
 
@@ -2137,35 +2138,28 @@ BOOL do_srv_net_remote_tod(struct cli_state *cli, uint16 fnum,
 
 /*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,
@@ -3415,7 +3409,7 @@ BOOL srv_io_r_net_remote_tod(char *desc, SRV_R_NET_REMOTE_TOD *r_n, prs_struct *
 /*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,
@@ -3693,12 +3687,11 @@ void cmd_time(struct client_info *info, int argc, char *argv[]);
 /*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),
@@ -3852,7 +3845,6 @@ void display_job_info_ctr(FILE *out_hnd, enum action_type action,
 
 /*The following definitions come from  rpcclient/rpcclient.c  */
 
-void rpcclient_init(void);
 
 /*The following definitions come from  smbd/blocking.c  */
 
index 8e4620f8dc5fa68889f344aab4071d016a45d311..b32b3322b33d4bb9df5cdbd222ffecddcd8cf8b7 100644 (file)
@@ -462,6 +462,7 @@ BOOL close_policy_hnd(POLICY_HND *hnd)
                                p->dev.cli->free(p->dev.cli->cli,
                                                 p->dev.cli->fnum);
                        }
+                       free(p->dev.cli);
                        break;
                }
        }
index f85e37dcb5c5d3a89a1df0bb3320f48a686200b7..ed470f57580ebf6e98514c3a9055e2bebc32c3e3 100644 (file)
@@ -34,8 +34,7 @@ extern int DEBUGLEVEL;
 /****************************************************************************
 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)
 {
@@ -44,6 +43,14 @@ BOOL svc_open_sc_man(struct cli_state *cli, uint16 fnum,
        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);
@@ -81,6 +88,9 @@ BOOL svc_open_sc_man(struct cli_state *cli, uint16 fnum,
                        /* 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);
                }
        }
 
@@ -94,8 +104,7 @@ BOOL svc_open_sc_man(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 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)
@@ -105,6 +114,14 @@ BOOL svc_open_service(struct cli_state *cli, uint16 fnum,
        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);
@@ -141,7 +158,9 @@ BOOL svc_open_service(struct cli_state *cli, uint16 fnum,
                {
                        /* 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);
                }
        }
 
@@ -155,8 +174,7 @@ BOOL svc_open_service(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 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,
@@ -167,6 +185,14 @@ BOOL svc_enum_svcs(struct cli_state *cli, uint16 fnum,
        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;
@@ -232,8 +258,7 @@ BOOL svc_enum_svcs(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 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;
@@ -241,6 +266,14 @@ BOOL svc_stop_service(struct cli_state *cli, uint16 fnum,
        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 */
@@ -290,8 +323,7 @@ BOOL svc_stop_service(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 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)
 {
@@ -300,6 +332,14 @@ BOOL svc_start_service(struct cli_state *cli, uint16 fnum,
        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 */
@@ -349,8 +389,7 @@ BOOL svc_start_service(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 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)
 {
@@ -359,6 +398,14 @@ BOOL svc_query_svc_cfg(struct cli_state *cli, uint16 fnum,
        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 */
@@ -411,13 +458,21 @@ BOOL svc_query_svc_cfg(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 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 */
@@ -472,6 +527,8 @@ BOOL svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
                }
        }
 
+       close_policy_hnd(hnd);
+
        prs_mem_free(&rbuf);
        prs_mem_free(&buf );
 
@@ -481,8 +538,7 @@ BOOL svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd)
 /****************************************************************************
 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,
@@ -497,6 +553,14 @@ BOOL svc_change_svc_cfg(struct cli_state *cli, uint16 fnum,
        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 */
@@ -547,5 +611,3 @@ BOOL svc_change_svc_cfg(struct cli_state *cli, uint16 fnum,
 
        return valid_cfg;
 }
-
-
index 93ad0dcced259afb03f97643fa231dd1e132d0ff..08fed7d47c747b19b515bbae150fd527020979f0 100644 (file)
@@ -31,7 +31,7 @@ extern int DEBUGLEVEL;
  make_svc_q_open_sc_man
  ********************************************************************/
 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)  
 {
        DEBUG(5,("make_svc_q_open_sc_man\n"));
index 8e4620f8dc5fa68889f344aab4071d016a45d311..b32b3322b33d4bb9df5cdbd222ffecddcd8cf8b7 100644 (file)
@@ -462,6 +462,7 @@ BOOL close_policy_hnd(POLICY_HND *hnd)
                                p->dev.cli->free(p->dev.cli->cli,
                                                 p->dev.cli->fnum);
                        }
+                       free(p->dev.cli);
                        break;
                }
        }
index 708dd49de1437df896ea6ba78c7ff7159fd9cf7d..7f3f8532a5e1784f2a12a0982c8dc675f8a1a787 100644 (file)
@@ -31,9 +31,6 @@
 
 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)
@@ -43,8 +40,7 @@ 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))
 {
@@ -54,12 +50,10 @@ BOOL svc_query_service(struct cli_state *cli, uint16 fnum,
        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)
@@ -67,7 +61,7 @@ BOOL svc_query_service(struct cli_state *cli, uint16 fnum,
                svc_query_fn(&cfg);
        }
 
-       res2 = res2 ? svc_close(cli, fnum, &pol_svc) : False;
+       res2 = res2 ? svc_close(&pol_svc) : False;
 
        return res3;
 }
@@ -77,7 +71,6 @@ nt service info
 ****************************************************************************/
 void cmd_svc_info(struct client_info *info, int argc, char *argv[])
 {
-       uint16 fnum;
        BOOL res = True;
        BOOL res1 = True;
        char *svc_name;
@@ -87,7 +80,7 @@ void cmd_svc_info(struct client_info *info, int argc, char *argv[])
        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));
@@ -100,21 +93,14 @@ void cmd_svc_info(struct client_info *info, int argc, char *argv[])
 
        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)
        {
@@ -136,13 +122,12 @@ static void svc_display_svc_info(const ENUM_SRVC_STATUS *svc)
 /****************************************************************************
 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;
@@ -152,21 +137,11 @@ BOOL msrpc_svc_enum(struct client_info *info,
 
        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
@@ -181,8 +156,7 @@ BOOL msrpc_svc_enum(struct client_info *info,
                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;
@@ -198,7 +172,7 @@ BOOL msrpc_svc_enum(struct client_info *info,
 
                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)
@@ -207,10 +181,7 @@ BOOL msrpc_svc_enum(struct client_info *info,
                }
        }
 
-       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;
 }
@@ -224,6 +195,11 @@ void cmd_svc_enum(struct client_info *info, int argc, char *argv[])
        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++;
@@ -243,7 +219,7 @@ void cmd_svc_enum(struct client_info *info, int argc, char *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);
 
@@ -258,7 +234,6 @@ nt stop service
 ****************************************************************************/
 void cmd_svc_stop(struct client_info *info, int argc, char *argv[])
 {
-       uint16 fnum;
        BOOL res = True;
        BOOL res1 = True;
        char *svc_name;
@@ -269,7 +244,7 @@ void cmd_svc_stop(struct client_info *info, int argc, char *argv[])
        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));
@@ -282,25 +257,17 @@ void cmd_svc_stop(struct client_info *info, int argc, char *argv[])
 
        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)
        {
@@ -319,7 +286,6 @@ nt start service
 ****************************************************************************/
 void cmd_svc_start(struct client_info *info, int argc, char *argv[])
 {
-       uint16 fnum;
        BOOL res = True;
        BOOL res1 = True;
        char *svc_name;
@@ -330,7 +296,7 @@ void cmd_svc_start(struct client_info *info, int argc, char *argv[])
        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));
@@ -349,26 +315,17 @@ void cmd_svc_start(struct client_info *info, int argc, char *argv[])
        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)
        {
@@ -387,7 +344,6 @@ nt service set
 ****************************************************************************/
 void cmd_svc_set(struct client_info *info, int argc, char *argv[])
 {
-       uint16 fnum;
        BOOL res = True;
        BOOL res2 = True;
        BOOL res3;
@@ -402,7 +358,7 @@ void cmd_svc_set(struct client_info *info, int argc, char *argv[])
        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));
@@ -415,25 +371,19 @@ void cmd_svc_set(struct client_info *info, int argc, char *argv[])
 
        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,
@@ -444,12 +394,9 @@ void cmd_svc_set(struct client_info *info, int argc, char *argv[])
                        
        }
 
-       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)
        {
index 5fa103a57f4ca86d04a186f29302ea97de840829..6891d4435b380f4fb4c13fcfeeaf606d99c99184 100644 (file)
@@ -1112,6 +1112,12 @@ static char *complete_svcenum(char *text, int state)
        static uint32 i = 0;
        static uint32 num_svcs = 0;
        static ENUM_SRVC_STATUS *svc = NULL;
+       fstring srv_name;
+
+       fstrcpy(srv_name, "\\\\");
+       fstrcat(srv_name, cli_info.dest_host);
+       strupper(srv_name);
+
     
        if (state == 0)
        {
@@ -1120,7 +1126,7 @@ static char *complete_svcenum(char *text, int state)
                num_svcs = 0;
 
                /* Iterate all users */
-               if (msrpc_svc_enum(&cli_info, &svc, &num_svcs,
+               if (msrpc_svc_enum(srv_name, &svc, &num_svcs,
                                   NULL, NULL) == 0)
                {
                        return NULL;