okay :) all cmd_() functions now take int argc, char **argv :) that
authorLuke Leighton <lkcl@samba.org>
Mon, 22 Nov 1999 19:02:39 +0000 (19:02 +0000)
committerLuke Leighton <lkcl@samba.org>
Mon, 22 Nov 1999 19:02:39 +0000 (19:02 +0000)
means that some commands need more work, as they still use next_token(),
the use of which i wish to avoid.

plus, i was getting fed up of the poor command-line processing in some
of these commands.  i'm starting to need getopt() in them, especially
in samsetuser.

WARNING: only cmd_samr has been modded to use getopt() so far!  reg
commands won't work, esp.

13 files changed:
source/include/proto.h
source/rpcclient/cmd_atsvc.c
source/rpcclient/cmd_brs.c
source/rpcclient/cmd_eventlog.c
source/rpcclient/cmd_lsarpc.c
source/rpcclient/cmd_netlogon.c
source/rpcclient/cmd_reg.c
source/rpcclient/cmd_samr.c
source/rpcclient/cmd_spoolss.c
source/rpcclient/cmd_srvsvc.c
source/rpcclient/cmd_svcctl.c
source/rpcclient/cmd_wkssvc.c
source/rpcclient/rpcclient.c

index a8be8bad9744069a29006b9d1c62bb751c4374ca..153f301f315a8de762c3675953737bb74c2cc645 100644 (file)
@@ -3531,29 +3531,29 @@ BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data);
 
 /*The following definitions come from  rpcclient/cmd_atsvc.c  */
 
-void cmd_at(struct client_info *info);
+void cmd_at(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_brs.c  */
 
-void cmd_brs_query_info(struct client_info *info);
+void cmd_brs_query_info(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_eventlog.c  */
 
-void cmd_eventlog(struct client_info *info);
+void cmd_eventlog(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_lsarpc.c  */
 
-void cmd_lsa_enum_trust_dom(struct client_info *info);
-void cmd_lsa_query_info(struct client_info *info);
-void cmd_lsa_lookup_names(struct client_info *info);
-void cmd_lsa_lookup_sids(struct client_info *info);
-void cmd_lsa_query_secret(struct client_info *info);
+void cmd_lsa_enum_trust_dom(struct client_info *info, int argc, char *argv[]);
+void cmd_lsa_query_info(struct client_info *info, int argc, char *argv[]);
+void cmd_lsa_lookup_names(struct client_info *info, int argc, char *argv[]);
+void cmd_lsa_lookup_sids(struct client_info *info, int argc, char *argv[]);
+void cmd_lsa_query_secret(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_netlogon.c  */
 
-void cmd_netlogon_login_test(struct client_info *info);
-void cmd_netlogon_domain_test(struct client_info *info);
-void cmd_sam_sync(struct client_info *info);
+void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[]);
+void cmd_netlogon_domain_test(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_sync(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_reg.c  */
 
@@ -3561,44 +3561,44 @@ BOOL msrpc_reg_enum_key(struct cli_state *cli, const char* full_keyname,
                                REG_FN(reg_fn),
                                REG_KEY_FN(reg_key_fn),
                                REG_VAL_FN(reg_val_fn));
-void cmd_reg_enum(struct client_info *info);
-void cmd_reg_query_info(struct client_info *info);
-void cmd_reg_query_key(struct client_info *info);
-void cmd_reg_create_val(struct client_info *info);
-void cmd_reg_delete_val(struct client_info *info);
-void cmd_reg_delete_key(struct client_info *info);
-void cmd_reg_create_key(struct client_info *info);
-void cmd_reg_test_key_sec(struct client_info *info);
-void cmd_reg_get_key_sec(struct client_info *info);
-void cmd_reg_shutdown(struct client_info *info);
+void cmd_reg_enum(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_query_info(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_query_key(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_create_val(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_delete_val(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_delete_key(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_create_key(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_test_key_sec(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_get_key_sec(struct client_info *info, int argc, char *argv[]);
+void cmd_reg_shutdown(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_samr.c  */
 
-void cmd_sam_ntchange_pwd(struct client_info *info);
-void cmd_sam_test(struct client_info *info);
-void cmd_sam_lookup_domain(struct client_info *info);
-void cmd_sam_del_aliasmem(struct client_info *info);
-void cmd_sam_delete_dom_alias(struct client_info *info);
-void cmd_sam_add_aliasmem(struct client_info *info);
-void cmd_sam_create_dom_user(struct client_info *info);
-void cmd_sam_create_dom_alias(struct client_info *info);
-void cmd_sam_del_groupmem(struct client_info *info);
-void cmd_sam_delete_dom_group(struct client_info *info);
-void cmd_sam_add_groupmem(struct client_info *info);
-void cmd_sam_create_dom_group(struct client_info *info);
-void cmd_sam_enum_users(struct client_info *info);
-void cmd_sam_query_groupmem(struct client_info *info);
-void cmd_sam_query_group(struct client_info *info);
-void cmd_sam_query_user(struct client_info *info);
-void cmd_sam_set_userinfo2(struct client_info *info);
-void cmd_sam_set_userinfo(struct client_info *info);
-void cmd_sam_query_dispinfo(struct client_info *info);
-void cmd_sam_query_dominfo(struct client_info *info);
-void cmd_sam_query_aliasmem(struct client_info *info);
-void cmd_sam_query_alias(struct client_info *info);
-void cmd_sam_enum_aliases(struct client_info *info);
-void cmd_sam_enum_groups(struct client_info *info);
-void cmd_sam_enum_domains(struct client_info *info);
+void cmd_sam_ntchange_pwd(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_test(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_lookup_domain(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_del_aliasmem(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_delete_dom_alias(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_add_aliasmem(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_create_dom_user(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_create_dom_alias(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_del_groupmem(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_delete_dom_group(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_add_groupmem(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_create_dom_group(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_enum_users(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_groupmem(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_group(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_user(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_set_userinfo2(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_set_userinfo(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_dispinfo(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_dominfo(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_aliasmem(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_alias(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_enum_aliases(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_enum_groups(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_enum_domains(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_spoolss.c  */
 
@@ -3608,8 +3608,8 @@ BOOL msrpc_spoolss_enum_printers(struct cli_state *cli,
                                uint32 *num,
                                void ***ctr,
                                PRINT_INFO_FN(fn));
-void cmd_spoolss_enum_printers(struct client_info *info);
-void cmd_spoolss_open_printer_ex(struct client_info *info);
+void cmd_spoolss_enum_printers(struct client_info *info, int argc, char *argv[]);
+void cmd_spoolss_open_printer_ex(struct client_info *info, int argc, char *argv[]);
 BOOL msrpc_spoolss_enum_jobs(struct cli_state *cli,
                                const char* srv_name,
                                const char* user_name,
@@ -3618,25 +3618,25 @@ BOOL msrpc_spoolss_enum_jobs(struct cli_state *cli,
                                uint32 *num,
                                void ***ctr,
                                JOB_INFO_FN(fn));
-void cmd_spoolss_enum_jobs(struct client_info *info);
+void cmd_spoolss_enum_jobs(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_srvsvc.c  */
 
 BOOL net_srv_get_info(struct client_info *info,
                uint32 info_level,
                SRV_INFO_CTR *ctr);
-void cmd_srv_query_info(struct client_info *info);
+void cmd_srv_query_info(struct client_info *info, int argc, char *argv[]);
 BOOL msrpc_srv_enum_tprt(struct cli_state *cli,
                                const char* dest_srv,
                                uint32 info_level,
                                SRV_TPRT_INFO_CTR *ctr,
                                TPRT_INFO_FN(tprt_fn));
-void cmd_srv_enum_tprt(struct client_info *info);
-void cmd_srv_enum_conn(struct client_info *info);
-void cmd_srv_enum_shares(struct client_info *info);
-void cmd_srv_enum_sess(struct client_info *info);
-void cmd_srv_enum_files(struct client_info *info);
-void cmd_time(struct client_info *info);
+void cmd_srv_enum_tprt(struct client_info *info, int argc, char *argv[]);
+void cmd_srv_enum_conn(struct client_info *info, int argc, char *argv[]);
+void cmd_srv_enum_shares(struct client_info *info, int argc, char *argv[]);
+void cmd_srv_enum_sess(struct client_info *info, int argc, char *argv[]);
+void cmd_srv_enum_files(struct client_info *info, int argc, char *argv[]);
+void cmd_time(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_svcctl.c  */
 
@@ -3645,19 +3645,19 @@ BOOL svc_query_service(struct cli_state *cli, uint16 fnum,
                                POLICY_HND *pol_scm,
                                const char *svc_name,
                                SVC_QUERY_FN(svc_query_fn));
-void cmd_svc_info(struct client_info *info);
+void cmd_svc_info(struct client_info *info, int argc, char *argv[]);
 BOOL msrpc_svc_enum(struct client_info *info,
                                ENUM_SRVC_STATUS **svcs,
                                uint32 *num_svcs,
                                SVC_INFO_FN(info_fn),
                                SVC_QUERY_FN(query_fn));
-void cmd_svc_enum(struct client_info *info);
-void cmd_svc_stop(struct client_info *info);
-void cmd_svc_start(struct client_info *info);
+void cmd_svc_enum(struct client_info *info, int argc, char *argv[]);
+void cmd_svc_stop(struct client_info *info, int argc, char *argv[]);
+void cmd_svc_start(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/cmd_wkssvc.c  */
 
-void cmd_wks_query_info(struct client_info *info);
+void cmd_wks_query_info(struct client_info *info, int argc, char *argv[]);
 
 /*The following definitions come from  rpcclient/display.c  */
 
index 64f045a2a0aa93481e0cb0a77e85f192534f7964..b10c55ad8aa73b710b8a12de6b0725bfa7e62821 100644 (file)
@@ -166,7 +166,7 @@ static BOOL at_soon(char *dest_srv, uint32 *hours, uint32 *minutes, uint32 *seco
 /****************************************************************************
 scheduler add job
 ****************************************************************************/
-void cmd_at(struct client_info *info)
+void cmd_at(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        pstring temp;
index f01ebc8f95e3527eb2e7175d99fea09dec1faa08..428a5c93ba1a37d4827afe76a8b870d99153568f 100644 (file)
@@ -41,7 +41,7 @@ extern FILE* out_hnd;
 /****************************************************************************
 Browser get info query
 ****************************************************************************/
-void cmd_brs_query_info(struct client_info *info)
+void cmd_brs_query_info(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring dest_brs;
index e3179ee043ca48edfbae4c4728275f8a14d7e2ef..c836564007a87938626d581cab3843ec35b1783f 100644 (file)
@@ -38,7 +38,7 @@ extern FILE* out_hnd;
 
 /****************************************************************************
 ****************************************************************************/
-void cmd_eventlog(struct client_info *info)
+void cmd_eventlog(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        BOOL res  = True;
index 53ffb24cfd9ded28e61a9c65f71f4e8f3d4f6aee..079cd803ea8740ff90d9c5872d72b3bbc98b75f9 100644 (file)
@@ -40,7 +40,7 @@ extern int smb_tidx;
 /****************************************************************************
 nt enumerate trusted domains
 ****************************************************************************/
-void cmd_lsa_enum_trust_dom(struct client_info *info)
+void cmd_lsa_enum_trust_dom(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring srv_name;
@@ -106,7 +106,7 @@ void cmd_lsa_enum_trust_dom(struct client_info *info)
 /****************************************************************************
 nt lsa query
 ****************************************************************************/
-void cmd_lsa_query_info(struct client_info *info)
+void cmd_lsa_query_info(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring srv_name;
@@ -188,7 +188,7 @@ void cmd_lsa_query_info(struct client_info *info)
 /****************************************************************************
 lookup names
 ****************************************************************************/
-void cmd_lsa_lookup_names(struct client_info *info)
+void cmd_lsa_lookup_names(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring temp;
@@ -279,7 +279,7 @@ void cmd_lsa_lookup_names(struct client_info *info)
 /****************************************************************************
 lookup sids
 ****************************************************************************/
-void cmd_lsa_lookup_sids(struct client_info *info)
+void cmd_lsa_lookup_sids(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring temp;
@@ -376,7 +376,7 @@ void cmd_lsa_lookup_sids(struct client_info *info)
 /****************************************************************************
 nt lsa query
 ****************************************************************************/
-void cmd_lsa_query_secret(struct client_info *info)
+void cmd_lsa_query_secret(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring srv_name;
index 5c17e5c3da76292d8a97a87f80e0e3970d9d3243..ed30a3122a652c3145f19b12fd85ebc73320e654 100644 (file)
@@ -42,7 +42,7 @@ extern pstring global_myname;
 /****************************************************************************
 experimental nt login.
 ****************************************************************************/
-void cmd_netlogon_login_test(struct client_info *info)
+void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
 #if 0
@@ -142,7 +142,7 @@ void cmd_netlogon_login_test(struct client_info *info)
 /****************************************************************************
 experimental nt login.
 ****************************************************************************/
-void cmd_netlogon_domain_test(struct client_info *info)
+void cmd_netlogon_domain_test(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
 
@@ -183,7 +183,7 @@ void cmd_netlogon_domain_test(struct client_info *info)
 /****************************************************************************
 experimental SAM synchronisation.
 ****************************************************************************/
-void cmd_sam_sync(struct client_info *info)
+void cmd_sam_sync(struct client_info *info, int argc, char *argv[])
 {
        SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS];
        SAM_DELTA_CTR deltas[MAX_SAM_DELTAS];
index 02544987ece3d098af47219cbcf3f14534ada33e..305440c3c5855aa7f7807b8aabfc820181f50c69 100644 (file)
@@ -286,7 +286,7 @@ static void reg_display_val_info(const char *full_name,
 /****************************************************************************
 nt registry enum
 ****************************************************************************/
-void cmd_reg_enum(struct client_info *info)
+void cmd_reg_enum(struct client_info *info, int argc, char *argv[])
 {
        fstring full_keyname;
 
@@ -308,7 +308,7 @@ void cmd_reg_enum(struct client_info *info)
 /****************************************************************************
 nt registry query value info
 ****************************************************************************/
-void cmd_reg_query_info(struct client_info *info)
+void cmd_reg_query_info(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -394,7 +394,7 @@ void cmd_reg_query_info(struct client_info *info)
 /****************************************************************************
 nt registry query key
 ****************************************************************************/
-void cmd_reg_query_key(struct client_info *info)
+void cmd_reg_query_key(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -496,7 +496,7 @@ void cmd_reg_query_key(struct client_info *info)
 /****************************************************************************
 nt registry create value
 ****************************************************************************/
-void cmd_reg_create_val(struct client_info *info)
+void cmd_reg_create_val(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -644,7 +644,7 @@ void cmd_reg_create_val(struct client_info *info)
 /****************************************************************************
 nt registry delete value
 ****************************************************************************/
-void cmd_reg_delete_val(struct client_info *info)
+void cmd_reg_delete_val(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -721,7 +721,7 @@ void cmd_reg_delete_val(struct client_info *info)
 /****************************************************************************
 nt registry delete key
 ****************************************************************************/
-void cmd_reg_delete_key(struct client_info *info)
+void cmd_reg_delete_key(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -801,7 +801,7 @@ void cmd_reg_delete_key(struct client_info *info)
 /****************************************************************************
 nt registry create key
 ****************************************************************************/
-void cmd_reg_create_key(struct client_info *info)
+void cmd_reg_create_key(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -896,7 +896,7 @@ void cmd_reg_create_key(struct client_info *info)
 /****************************************************************************
 nt registry security info
 ****************************************************************************/
-void cmd_reg_test_key_sec(struct client_info *info)
+void cmd_reg_test_key_sec(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -998,7 +998,7 @@ void cmd_reg_test_key_sec(struct client_info *info)
 /****************************************************************************
 nt registry security info
 ****************************************************************************/
-void cmd_reg_get_key_sec(struct client_info *info)
+void cmd_reg_get_key_sec(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -1096,7 +1096,7 @@ void cmd_reg_get_key_sec(struct client_info *info)
 /****************************************************************************
 nt registry shutdown
 ****************************************************************************/
-void cmd_reg_shutdown(struct client_info *info)
+void cmd_reg_shutdown(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
index 0f0a19f2d1b4dd2f5f5350dc5edc2a023c574123..fd1e3595cb5eef4e87d66d88770a5776e9dad928 100644 (file)
@@ -118,7 +118,7 @@ static void sam_display_user(const char *domain, const DOM_SID *sid,
 /****************************************************************************
 SAM password change
 ****************************************************************************/
-void cmd_sam_ntchange_pwd(struct client_info *info)
+void cmd_sam_ntchange_pwd(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -196,7 +196,7 @@ void cmd_sam_ntchange_pwd(struct client_info *info)
 /****************************************************************************
 experimental SAM encryted rpc test connection
 ****************************************************************************/
-void cmd_sam_test(struct client_info *info)
+void cmd_sam_test(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -253,11 +253,11 @@ void cmd_sam_test(struct client_info *info)
 /****************************************************************************
 Lookup domain in SAM server.
 ****************************************************************************/
-void cmd_sam_lookup_domain(struct client_info *info)
+void cmd_sam_lookup_domain(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
-       fstring domain;
+       char *domain;
        fstring str_sid;
        DOM_SID dom_sid;
        BOOL res = True;
@@ -267,12 +267,14 @@ void cmd_sam_lookup_domain(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, domain, NULL, sizeof(domain)))
+       if (argc < 2)
        {
                report(out_hnd, "lookupdomain: <name>\n");
                return;
        }
 
+       domain = argv[1];
+
        report(out_hnd, "Lookup Domain in SAM Server\n");
 
        /* open SAMR session.  negotiate credentials */
@@ -310,12 +312,11 @@ void cmd_sam_lookup_domain(struct client_info *info)
 /****************************************************************************
 SAM delete alias member.
 ****************************************************************************/
-void cmd_sam_del_aliasmem(struct client_info *info)
+void cmd_sam_del_aliasmem(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring tmp;
        fstring sid;
        DOM_SID sid1;
        POLICY_HND alias_pol;
@@ -342,12 +343,16 @@ void cmd_sam_del_aliasmem(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, tmp, NULL, sizeof(tmp)))
+       if (argc < 2)
        {
                report(out_hnd, "delaliasmem: <alias rid> [member sid1] [member sid2] ...\n");
                return;
        }
-       alias_rid = get_number(tmp);
+
+       argc--;
+       argv++;
+
+       alias_rid = get_number(argv[0]);
 
        report(out_hnd, "SAM Domain Alias Member\n");
 
@@ -369,15 +374,17 @@ void cmd_sam_del_aliasmem(struct client_info *info)
                    &pol_dom,
                    0x000f001f, alias_rid, &alias_pol) : False;
 
-       while (next_token(NULL, tmp, NULL, sizeof(tmp)) && res2 && res1)
+       while (argc > 0 && res2 && res1)
        {
+               argc--;
+               argv++;
                /* get a sid, delete a member from the alias */
-               res2 = res2 ? string_to_sid(&member_sid, tmp) : False;
+               res2 = res2 ? string_to_sid(&member_sid, argv[0]) : False;
                res2 = res2 ? samr_del_aliasmem(smb_cli, fnum, &alias_pol, &member_sid) : False;
 
                if (res2)
                {
-                       report(out_hnd, "SID deleted from Alias 0x%x: %s\n", alias_rid, tmp);
+                       report(out_hnd, "SID deleted from Alias 0x%x: %s\n", alias_rid, argv[0]);
                }
        }
 
@@ -403,12 +410,12 @@ void cmd_sam_del_aliasmem(struct client_info *info)
 /****************************************************************************
 SAM delete alias.
 ****************************************************************************/
-void cmd_sam_delete_dom_alias(struct client_info *info)
+void cmd_sam_delete_dom_alias(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring name;
+       char *name;
        fstring sid;
        DOM_SID sid1;
        POLICY_HND alias_pol;
@@ -438,12 +445,14 @@ void cmd_sam_delete_dom_alias(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, name, NULL, sizeof(name)))
+       if (argc < 2)
        {
                report(out_hnd, "delalias <alias name>\n");
                return;
        }
 
+       name = argv[1];
+
        report(out_hnd, "SAM Delete Domain Alias\n");
 
        /* open SAMR session.  negotiate credentials */
@@ -500,7 +509,7 @@ void cmd_sam_delete_dom_alias(struct client_info *info)
 /****************************************************************************
 SAM add alias member.
 ****************************************************************************/
-void cmd_sam_add_aliasmem(struct client_info *info)
+void cmd_sam_add_aliasmem(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        uint16 fnum_lsa;
@@ -540,20 +549,15 @@ void cmd_sam_add_aliasmem(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       while (next_token(NULL, tmp, NULL, sizeof(tmp)))
-       {
-               if (add_chars_to_array(&num_names, &names, tmp) == NULL)
-               {
-                       return;
-               }
-       }
-
-       if (num_names < 2)
+       if (argc < 2)
        {
                report(out_hnd, "addaliasmem <group name> [member name1] [member name2] ...\n");
                return;
        }
        
+       num_names = argc+1;
+       names = argv+1;
+
        report(out_hnd, "SAM Domain Alias Member\n");
 
        /* open LSARPC session. */
@@ -656,14 +660,15 @@ void cmd_sam_add_aliasmem(struct client_info *info)
 /****************************************************************************
 SAM create domain user.
 ****************************************************************************/
-void cmd_sam_create_dom_user(struct client_info *info)
+void cmd_sam_create_dom_user(struct client_info *info, int argc, char *argv[])
 {
        fstring domain;
        fstring acct_name;
        fstring sid;
        DOM_SID sid1;
        uint32 user_rid; 
-       uint16 acb_info;
+       uint16 acb_info = ACB_NORMAL;
+       int opt;
 
        sid_copy(&sid1, &info->dom.level5_sid);
        sid_to_string(sid, &sid1);
@@ -675,23 +680,45 @@ void cmd_sam_create_dom_user(struct client_info *info)
                return;
        }
 
-
-       if (!next_token(NULL, acct_name, NULL, sizeof(acct_name)))
+       if (argc < 2)
        {
-               report(out_hnd, "createuser: <acct name>\n");
+               report(out_hnd, "createuser: <acct name> [-i] [-s]\n");
+               return;
        }
 
+       argc--;
+       argv++;
+
+       safe_strcpy(acct_name, argv[0], sizeof(acct_name));
        if (acct_name[strlen(acct_name)-1] == '$')
        {
                acb_info = ACB_WSTRUST;
        }
-       else
+
+       argc--;
+       argv++;
+
+       while ((opt = getopt(argc, argv,"is")) != EOF)
        {
-               acb_info = ACB_NORMAL;
+               switch (opt)
+               {
+                       case 'i':
+                       {
+                               acb_info = ACB_DOMTRUST;
+                               break;
+                       }
+                       case 's':
+                       {
+                               acb_info = ACB_SVRTRUST;
+                               break;
+                       }
+               }
        }
+
        report(out_hnd, "SAM Create Domain User\n");
-       report(out_hnd, "Domain: %s Name: %s\n",
-                         domain, acct_name);
+       report(out_hnd, "Domain: %s Name: %s ACB: %s\n",
+                         domain, acct_name,
+           pwdb_encode_acct_ctrl(acb_info, NEW_PW_FORMAT_SPACE_PADDED_LEN));
 
        if (msrpc_sam_create_dom_user(smb_cli, &sid1,
                                      acct_name, acb_info, &user_rid))
@@ -708,12 +735,12 @@ void cmd_sam_create_dom_user(struct client_info *info)
 /****************************************************************************
 SAM create domain alias.
 ****************************************************************************/
-void cmd_sam_create_dom_alias(struct client_info *info)
+void cmd_sam_create_dom_alias(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring acct_name;
+       char *acct_name;
        fstring acct_desc;
        fstring sid;
        DOM_SID sid1;
@@ -739,16 +766,21 @@ void cmd_sam_create_dom_alias(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, acct_name, NULL, sizeof(acct_name)))
+       if (argc < 2)
        {
                report(out_hnd, "createalias: <acct name> [acct description]\n");
        }
 
-       if (!next_token(NULL, acct_desc, NULL, sizeof(acct_desc)))
+       acct_name = argv[1];
+
+       if (argc < 3)
        {
                acct_desc[0] = 0;
        }
-
+       else
+       {
+               safe_strcpy(acct_desc, argv[2], sizeof(acct_desc)-1);
+       }
 
        report(out_hnd, "SAM Create Domain Alias\n");
        report(out_hnd, "Domain: %s Name: %s Description: %s\n",
@@ -797,12 +829,11 @@ void cmd_sam_create_dom_alias(struct client_info *info)
 /****************************************************************************
 SAM delete group member.
 ****************************************************************************/
-void cmd_sam_del_groupmem(struct client_info *info)
+void cmd_sam_del_groupmem(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring tmp;
        fstring sid;
        DOM_SID sid1;
        POLICY_HND pol_grp;
@@ -829,12 +860,16 @@ void cmd_sam_del_groupmem(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, tmp, NULL, sizeof(tmp)))
+       if (argc < 2)
        {
                report(out_hnd, "delgroupmem: <group rid> [member rid1] [member rid2] ...\n");
                return;
        }
-       group_rid = get_number(tmp);
+
+       argc--;
+       argv++;
+
+       group_rid = get_number(argv[0]);
 
        report(out_hnd, "SAM Add Domain Group member\n");
 
@@ -856,10 +891,13 @@ void cmd_sam_del_groupmem(struct client_info *info)
                    &pol_dom,
                    0x0000001f, group_rid, &pol_grp) : False;
 
-       while (next_token(NULL, tmp, NULL, sizeof(tmp)) && res2 && res1)
+       while (argc > 0 && res2 && res1)
        {
+               argc--;
+               argv++;
+
                /* get a rid, delete a member from the group */
-               member_rid = get_number(tmp);
+               member_rid = get_number(argv[0]);
                res2 = res2 ? samr_del_groupmem(smb_cli, fnum, &pol_grp, member_rid) : False;
 
                if (res2)
@@ -891,12 +929,12 @@ void cmd_sam_del_groupmem(struct client_info *info)
 /****************************************************************************
 SAM delete group.
 ****************************************************************************/
-void cmd_sam_delete_dom_group(struct client_info *info)
+void cmd_sam_delete_dom_group(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring name;
+       char *name;
        fstring sid;
        DOM_SID sid1;
        POLICY_HND pol_grp;
@@ -926,12 +964,14 @@ void cmd_sam_delete_dom_group(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, name, NULL, sizeof(name)))
+       if (argc < 2)
        {
                report(out_hnd, "delgroup <group name>\n");
                return;
        }
 
+       name = argv[1];
+
        report(out_hnd, "SAM Delete Domain Group\n");
 
        /* open SAMR session.  negotiate credentials */
@@ -989,12 +1029,11 @@ void cmd_sam_delete_dom_group(struct client_info *info)
 /****************************************************************************
 SAM add group member.
 ****************************************************************************/
-void cmd_sam_add_groupmem(struct client_info *info)
+void cmd_sam_add_groupmem(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring tmp;
        fstring sid;
        DOM_SID sid1;
        POLICY_HND pol_grp;
@@ -1036,23 +1075,23 @@ void cmd_sam_add_groupmem(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       res = next_token(NULL, group_name, NULL, sizeof(group_name));
-       group_names[0] = group_name;
-
-       while (res && next_token(NULL, tmp, NULL, sizeof(tmp)))
-       {
-               if (add_chars_to_array(&num_names, &names, tmp) == NULL)
-               {
-                       return;
-               }
-       }
-
-       if (num_names < 1)
+       if (argc < 3)
        {
                report(out_hnd, "addgroupmem <group name> [member name1] [member name2] ...\n");
                return;
        }
        
+       argc--;
+       argv++;
+
+       group_names[0] = argv[0];
+
+       argc--;
+       argv++;
+
+       num_names = argc;
+       names = argv;
+
        report(out_hnd, "SAM Add Domain Group member\n");
 
        /* open SAMR session.  negotiate credentials */
@@ -1163,12 +1202,12 @@ void cmd_sam_add_groupmem(struct client_info *info)
 /****************************************************************************
 SAM create domain group.
 ****************************************************************************/
-void cmd_sam_create_dom_group(struct client_info *info)
+void cmd_sam_create_dom_group(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
        fstring domain;
-       fstring acct_name;
+       char *acct_name;
        fstring acct_desc;
        fstring sid;
        DOM_SID sid1;
@@ -1194,15 +1233,21 @@ void cmd_sam_create_dom_group(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (!next_token(NULL, acct_name, NULL, sizeof(acct_name)))
+       if (argc < 2)
        {
                report(out_hnd, "creategroup: <acct name> [acct description]\n");
        }
 
-       if (!next_token(NULL, acct_desc, NULL, sizeof(acct_desc)))
+       acct_name = argv[1];
+
+       if (argc < 3)
        {
                acct_desc[0] = 0;
        }
+       else
+       {
+               safe_strcpy(acct_desc, argv[2], sizeof(acct_desc)-1);
+       }
 
 
        report(out_hnd, "SAM Create Domain Group\n");
@@ -1251,15 +1296,14 @@ void cmd_sam_create_dom_group(struct client_info *info)
 /****************************************************************************
 experimental SAM users enum.
 ****************************************************************************/
-void cmd_sam_enum_users(struct client_info *info)
+void cmd_sam_enum_users(struct client_info *info, int argc, char *argv[])
 {
        BOOL request_user_info  = False;
        BOOL request_group_info = False;
        BOOL request_alias_info = False;
-       fstring tmp;
        struct acct_info *sam = NULL;
        uint32 num_sam_entries = 0;
-       int i;
+       int opt;
 
        fstring srv_name;
        fstring domain;
@@ -1279,18 +1323,28 @@ void cmd_sam_enum_users(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       for (i = 0; i < 3; i++)
+       argc--;
+       argv++;
+
+       while ((opt = getopt(argc, argv, "uga")) != EOF)
        {
-               /* a bad way to do token parsing... */
-               if (next_token(NULL, tmp, NULL, sizeof(tmp)))
-               {
-                       request_user_info  |= strequal(tmp, "-u");
-                       request_group_info |= strequal(tmp, "-g");
-                       request_alias_info |= strequal(tmp, "-a");
-               }
-               else
+               switch (opt)
                {
-                       break;
+                       case 'u':
+                       {
+                               request_user_info  = True;
+                               break;
+                       }
+                       case 'g':
+                       {
+                               request_group_info = True;
+                               break;
+                       }
+                       case 'a':
+                       {
+                               request_alias_info = True;
+                               break;
+                       }
                }
        }
 
@@ -1313,7 +1367,7 @@ void cmd_sam_enum_users(struct client_info *info)
 /****************************************************************************
 experimental SAM group query members.
 ****************************************************************************/
-void cmd_sam_query_groupmem(struct client_info *info)
+void cmd_sam_query_groupmem(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -1323,7 +1377,7 @@ void cmd_sam_query_groupmem(struct client_info *info)
        BOOL res = True;
        BOOL res1 = True;
 
-       fstring group_name;
+       char *group_name;
        char *names[1];
        uint32 num_rids;
        uint32 rid[MAX_LOOKUP_SIDS];
@@ -1340,12 +1394,14 @@ void cmd_sam_query_groupmem(struct client_info *info)
                return;
        }
 
-       if (!next_token(NULL, group_name, NULL, sizeof(group_name)))
+       if (argc < 2)
        {
-               report(out_hnd, "samgroup <name>\n");
+               report(out_hnd, "samgroupmem <name>\n");
                return;
        }
 
+       group_name = argv[1];
+
        fstrcpy(srv_name, "\\\\");
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
@@ -1410,7 +1466,7 @@ void cmd_sam_query_groupmem(struct client_info *info)
 /****************************************************************************
 experimental SAM group query.
 ****************************************************************************/
-void cmd_sam_query_group(struct client_info *info)
+void cmd_sam_query_group(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -1420,7 +1476,7 @@ void cmd_sam_query_group(struct client_info *info)
        BOOL res = True;
        BOOL res1 = True;
 
-       fstring group_name;
+       char *group_name;
        char *names[1];
        uint32 num_rids;
        uint32 rid[MAX_LOOKUP_SIDS];
@@ -1437,12 +1493,14 @@ void cmd_sam_query_group(struct client_info *info)
                return;
        }
 
-       if (!next_token(NULL, group_name, NULL, sizeof(group_name)))
+       if (argc < 2)
        {
                report(out_hnd, "samgroup <name>\n");
                return;
        }
 
+       group_name = argv[1];
+
        fstrcpy(srv_name, "\\\\");
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
@@ -1506,7 +1564,7 @@ void cmd_sam_query_group(struct client_info *info)
 /****************************************************************************
 experimental SAM user query.
 ****************************************************************************/
-void cmd_sam_query_user(struct client_info *info)
+void cmd_sam_query_user(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -1516,7 +1574,7 @@ void cmd_sam_query_user(struct client_info *info)
        BOOL res = True;
        BOOL res1 = True;
 
-       fstring user_name;
+       char *user_name;
        char *names[1];
        uint32 num_rids;
        uint32 rid[MAX_LOOKUP_SIDS];
@@ -1533,12 +1591,14 @@ void cmd_sam_query_user(struct client_info *info)
                return;
        }
 
-       if (!next_token(NULL, user_name, NULL, sizeof(user_name)))
+       if (argc < 2)
        {
                report(out_hnd, "samuser <name>\n");
                return;
        }
 
+       user_name = argv[1];
+
        fstrcpy(srv_name, "\\\\");
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
@@ -1602,7 +1662,7 @@ void cmd_sam_query_user(struct client_info *info)
 /****************************************************************************
 experimental SAM user set.
 ****************************************************************************/
-void cmd_sam_set_userinfo2(struct client_info *info)
+void cmd_sam_set_userinfo2(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -1611,16 +1671,10 @@ void cmd_sam_set_userinfo2(struct client_info *info)
        DOM_SID sid;
        BOOL res = True;
        BOOL res1 = True;
-       uint32 argc = 0;
-       char **argv = NULL;
-       uint32 cp_argc = 0;
-       char **cp_argv = NULL;
-       extern int optind;
        int opt;
        BOOL set_acb_bits = False;
 
        fstring user_name;
-       fstring tmp;
 
        char *names[1];
        uint32 num_rids;
@@ -1640,28 +1694,21 @@ void cmd_sam_set_userinfo2(struct client_info *info)
                return;
        }
 
-       /* create arguments array */
-       while (next_token(NULL, tmp, NULL, sizeof(tmp)))
-       {
-               add_chars_to_array(&argc, &argv, tmp);
-       }
-
-       cp_argc = argc;
-       cp_argv = argv;
-
-       if (cp_argc < 2)
+       if (argc < 2)
        {
                report(out_hnd, "samuserset2 <name> [-s <acb_bits>]\n");
                return;
        }
 
-       safe_strcpy(user_name, cp_argv[0], sizeof(user_name));
+       argc--;
+       argv++;
+
+       safe_strcpy(user_name, argv[0], sizeof(user_name));
 
-       cp_argc--;
-       cp_argv++;
+       argc--;
+       argv++;
 
-       optind = -1;
-       while ((opt = getopt(cp_argc, cp_argv,"s:")) != EOF)
+       while ((opt = getopt(argc, argv,"s:")) != EOF)
        {
                switch (opt)
                {
@@ -1751,14 +1798,12 @@ void cmd_sam_set_userinfo2(struct client_info *info)
                report(out_hnd, "Set User Info: Failed\n");
                DEBUG(5,("cmd_sam_query_user: failed\n"));
        }
-
-       free_char_array(argc, argv);
 }
 
 /****************************************************************************
 experimental SAM user set.
 ****************************************************************************/
-void cmd_sam_set_userinfo(struct client_info *info)
+void cmd_sam_set_userinfo(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -1767,17 +1812,11 @@ void cmd_sam_set_userinfo(struct client_info *info)
        DOM_SID sid;
        BOOL res = True;
        BOOL res1 = True;
-       uint32 argc = 0;
-       char **argv = NULL;
-       uint32 cp_argc = 0;
-       char **cp_argv = NULL;
-       extern int optind;
        int opt;
        BOOL set_passwd = False;
 
        fstring user_name;
        fstring password;
-       fstring tmp;
 
        char *names[1];
        uint32 num_rids;
@@ -1796,27 +1835,21 @@ void cmd_sam_set_userinfo(struct client_info *info)
                return;
        }
 
-       /* create arguments array */
-       while (next_token(NULL, tmp, NULL, sizeof(tmp)))
-       {
-               add_chars_to_array(&argc, &argv, tmp);
-       }
+       argc--;
+       argv++;
 
-       cp_argc = argc;
-       cp_argv = argv;
-
-       if (cp_argc == 0)
+       if (argc == 0)
        {
                report(out_hnd, "samuserset <name> [-p password]\n");
                return;
        }
 
-       safe_strcpy(user_name, cp_argv[0], sizeof(user_name));
+       safe_strcpy(user_name, argv[0], sizeof(user_name));
 
-       cp_argc--;
-       cp_argv++;
+       argc--;
+       argv++;
 
-       if (cp_argc == 0)
+       if (argc == 0)
        {
                fstring pass_str;
                char *pass;
@@ -1833,8 +1866,7 @@ void cmd_sam_set_userinfo(struct client_info *info)
        }
        else
        {
-               optind = -1;
-               while ((opt = getopt(cp_argc, cp_argv,"p:")) != EOF)
+               while ((opt = getopt(argc, argv,"p:")) != EOF)
                {
                        switch (opt)
                        {
@@ -1977,7 +2009,7 @@ void cmd_sam_set_userinfo(struct client_info *info)
 /****************************************************************************
 experimental SAM query display info.
 ****************************************************************************/
-void cmd_sam_query_dispinfo(struct client_info *info)
+void cmd_sam_query_dispinfo(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -1985,7 +2017,6 @@ void cmd_sam_query_dispinfo(struct client_info *info)
        fstring sid;
        DOM_SID sid1;
        BOOL res = True;
-       fstring info_str;
        uint16 switch_value = 1;
        uint32 ace_perms = 0x304; /* absolutely no idea. */
        SAM_DISPINFO_CTR ctr;
@@ -2009,9 +2040,9 @@ void cmd_sam_query_dispinfo(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       if (next_token(NULL, info_str, NULL, sizeof(info_str)))
+       if (argc > 1)
        {
-               switch_value = strtoul(info_str, (char**)NULL, 10);
+               switch_value = strtoul(argv[1], (char**)NULL, 10);
        }
 
        fprintf(out_hnd, "SAM Query Domain Info: info level %d\n", switch_value);
@@ -2065,12 +2096,11 @@ void cmd_sam_query_dispinfo(struct client_info *info)
 /****************************************************************************
 experimental SAM domain info query.
 ****************************************************************************/
-void cmd_sam_query_dominfo(struct client_info *info)
+void cmd_sam_query_dominfo(struct client_info *info, int argc, char *argv[])
 {
        fstring domain;
        fstring sid;
        DOM_SID sid1;
-       fstring info_str;
        uint32 switch_value = 2;
        SAM_UNK_CTR ctr;
 
@@ -2085,9 +2115,9 @@ void cmd_sam_query_dominfo(struct client_info *info)
 
        string_to_sid(&sid1, sid);
 
-       if (next_token(NULL, info_str, NULL, sizeof(info_str)))
+       if (argc > 1)
        {
-               switch_value = strtoul(info_str, (char**)NULL, 10);
+               switch_value = strtoul(argv[1], (char**)NULL, 10);
        }
 
        report(out_hnd, "SAM Query Domain Info: info level %d\n", switch_value);
@@ -2110,7 +2140,7 @@ void cmd_sam_query_dominfo(struct client_info *info)
 /****************************************************************************
 experimental SAM alias query members.
 ****************************************************************************/
-void cmd_sam_query_aliasmem(struct client_info *info)
+void cmd_sam_query_aliasmem(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -2120,7 +2150,7 @@ void cmd_sam_query_aliasmem(struct client_info *info)
        BOOL res = True;
        BOOL res1 = True;
 
-       fstring alias_name;
+       char *alias_name;
        char *names[1];
        uint32 num_rids;
        uint32 rid[MAX_LOOKUP_SIDS];
@@ -2137,12 +2167,14 @@ void cmd_sam_query_aliasmem(struct client_info *info)
                return;
        }
 
-       if (!next_token(NULL, alias_name, NULL, sizeof(alias_name)))
+       if (argc < 2)
        {
-               report(out_hnd, "samalias <name>\n");
+               report(out_hnd, "samaliasmem <name>\n");
                return;
        }
 
+       alias_name = argv[1];
+
        fstrcpy(srv_name, "\\\\");
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
@@ -2207,7 +2239,7 @@ void cmd_sam_query_aliasmem(struct client_info *info)
 /****************************************************************************
 experimental SAM alias query.
 ****************************************************************************/
-void cmd_sam_query_alias(struct client_info *info)
+void cmd_sam_query_alias(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring srv_name;
@@ -2217,7 +2249,7 @@ void cmd_sam_query_alias(struct client_info *info)
        BOOL res = True;
        BOOL res1 = True;
 
-       fstring alias_name;
+       char *alias_name;
        char *names[1];
        uint32 num_rids;
        uint32 rid[MAX_LOOKUP_SIDS];
@@ -2234,12 +2266,14 @@ void cmd_sam_query_alias(struct client_info *info)
                return;
        }
 
-       if (!next_token(NULL, alias_name, NULL, sizeof(alias_name)))
+       if (argc < 2)
        {
                report(out_hnd, "samalias <name>\n");
                return;
        }
 
+       alias_name = argv[1];
+
        fstrcpy(srv_name, "\\\\");
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
@@ -2303,14 +2337,13 @@ void cmd_sam_query_alias(struct client_info *info)
 /****************************************************************************
 SAM aliases query.
 ****************************************************************************/
-void cmd_sam_enum_aliases(struct client_info *info)
+void cmd_sam_enum_aliases(struct client_info *info, int argc, char *argv[])
 {
        BOOL request_member_info = False;
        BOOL request_alias_info = False;
-       fstring tmp;
-       int i;
        struct acct_info *sam = NULL;
        uint32 num_sam_entries = 0;
+       int opt;
 
        fstring domain;
        fstring srv_name;
@@ -2330,17 +2363,23 @@ void cmd_sam_enum_aliases(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       for (i = 0; i < 2; i++)
+       argc--;
+       argv++;
+
+       while ((opt = getopt(argc, argv, "ma")) != EOF)
        {
-               /* a bad way to do token parsing... */
-               if (next_token(NULL, tmp, NULL, sizeof(tmp)))
-               {
-                       request_member_info |= strequal(tmp, "-m");
-                       request_alias_info  |= strequal(tmp, "-a");
-               }
-               else
+               switch (opt)
                {
-                       break;
+                       case 'm':
+                       {
+                               request_member_info  = True;
+                               break;
+                       }
+                       case 'a':
+                       {
+                               request_alias_info = True;
+                               break;
+                       }
                }
        }
 
@@ -2361,14 +2400,13 @@ void cmd_sam_enum_aliases(struct client_info *info)
 /****************************************************************************
 experimental SAM groups enum.
 ****************************************************************************/
-void cmd_sam_enum_groups(struct client_info *info)
+void cmd_sam_enum_groups(struct client_info *info, int argc, char *argv[])
 {
        BOOL request_member_info = False;
        BOOL request_group_info = False;
-       fstring tmp;
-       int i;
        struct acct_info *sam = NULL;
        uint32 num_sam_entries = 0;
+       int opt;
 
        fstring srv_name;
        fstring domain;
@@ -2388,17 +2426,23 @@ void cmd_sam_enum_groups(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       for (i = 0; i < 3; i++)
+       argc--;
+       argv++;
+
+       while ((opt = getopt(argc, argv, "mg")) != EOF)
        {
-               /* a bad way to do token parsing... */
-               if (next_token(NULL, tmp, NULL, sizeof(tmp)))
-               {
-                       request_member_info |= strequal(tmp, "-m");
-                       request_group_info  |= strequal(tmp, "-g");
-               }
-               else
+               switch (opt)
                {
-                       break;
+                       case 'm':
+                       {
+                               request_member_info  = True;
+                               break;
+                       }
+                       case 'g':
+                       {
+                               request_group_info = True;
+                               break;
+                       }
                }
        }
 
@@ -2419,13 +2463,12 @@ void cmd_sam_enum_groups(struct client_info *info)
 /****************************************************************************
 experimental SAM domains enum.
 ****************************************************************************/
-void cmd_sam_enum_domains(struct client_info *info)
+void cmd_sam_enum_domains(struct client_info *info, int argc, char *argv[])
 {
        BOOL request_domain_info = False;
-       fstring tmp;
-       int i;
        struct acct_info *sam = NULL;
        uint32 num_sam_entries = 0;
+       int opt;
 
        fstring srv_name;
 
@@ -2433,16 +2476,18 @@ void cmd_sam_enum_domains(struct client_info *info)
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
-       for (i = 0; i < 3; i++)
+       argc--;
+       argv++;
+
+       while ((opt = getopt(argc, argv, "i")) != EOF)
        {
-               /* a bad way to do token parsing... */
-               if (next_token(NULL, tmp, NULL, sizeof(tmp)))
-               {
-                       request_domain_info  |= strequal(tmp, "-i");
-               }
-               else
+               switch (opt)
                {
-                       break;
+                       case 'i':
+                       {
+                               request_domain_info= True;
+                               break;
+                       }
                }
        }
 
index 9b5aa5b3e07b712d80a1b72ec77e06114d39a2be..91a6ff0966d44504238fd399a96ae85ce2c48ed2 100644 (file)
@@ -78,7 +78,7 @@ static void spool_print_info_ctr(const char* srv_name, uint32 level,
 /****************************************************************************
 nt spoolss query
 ****************************************************************************/
-void cmd_spoolss_enum_printers(struct client_info *info)
+void cmd_spoolss_enum_printers(struct client_info *info, int argc, char *argv[])
 {
        void **ctr = NULL;
        uint32 num = 0;
@@ -105,7 +105,7 @@ void cmd_spoolss_enum_printers(struct client_info *info)
 /****************************************************************************
 nt spoolss query
 ****************************************************************************/
-void cmd_spoolss_open_printer_ex(struct client_info *info)
+void cmd_spoolss_open_printer_ex(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring srv_name;
@@ -231,7 +231,7 @@ static void spool_job_info_ctr(const char* srv_name, const char* printer_name,
 /****************************************************************************
 nt spoolss query
 ****************************************************************************/
-void cmd_spoolss_enum_jobs(struct client_info *info)
+void cmd_spoolss_enum_jobs(struct client_info *info, int argc, char *argv[])
 {
        fstring srv_name;
        fstring printer_name;
index c0cf56de510d01a3156d6e0536aa6dd8833937ae..ca2a8f4dc3e457b026fed8423aeec0e43eb2ef62 100644 (file)
@@ -73,7 +73,7 @@ BOOL net_srv_get_info(struct client_info *info,
 /****************************************************************************
 server get info query
 ****************************************************************************/
-void cmd_srv_query_info(struct client_info *info)
+void cmd_srv_query_info(struct client_info *info, int argc, char *argv[])
 {
        uint32 info_level = 101;
        SRV_INFO_CTR ctr;
@@ -149,7 +149,7 @@ static void srv_display_tprt_ctr(const SRV_TPRT_INFO_CTR *ctr)
 /****************************************************************************
 server enum transports
 ****************************************************************************/
-void cmd_srv_enum_tprt(struct client_info *info)
+void cmd_srv_enum_tprt(struct client_info *info, int argc, char *argv[])
 {
        fstring dest_srv;
        fstring tmp;
@@ -181,7 +181,7 @@ void cmd_srv_enum_tprt(struct client_info *info)
 /****************************************************************************
 server enum connections
 ****************************************************************************/
-void cmd_srv_enum_conn(struct client_info *info)
+void cmd_srv_enum_conn(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring dest_srv;
@@ -247,7 +247,7 @@ void cmd_srv_enum_conn(struct client_info *info)
 /****************************************************************************
 server enum shares
 ****************************************************************************/
-void cmd_srv_enum_shares(struct client_info *info)
+void cmd_srv_enum_shares(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring dest_srv;
@@ -308,7 +308,7 @@ void cmd_srv_enum_shares(struct client_info *info)
 /****************************************************************************
 server enum sessions
 ****************************************************************************/
-void cmd_srv_enum_sess(struct client_info *info)
+void cmd_srv_enum_sess(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring dest_srv;
@@ -368,7 +368,7 @@ void cmd_srv_enum_sess(struct client_info *info)
 /****************************************************************************
 server enum files
 ****************************************************************************/
-void cmd_srv_enum_files(struct client_info *info)
+void cmd_srv_enum_files(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring dest_srv;
@@ -428,7 +428,7 @@ void cmd_srv_enum_files(struct client_info *info)
 /****************************************************************************
 display remote time
 ****************************************************************************/
-void cmd_time(struct client_info *info)
+void cmd_time(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        fstring dest_srv;
index 07bebe2bdaedbf43f2a38db930fccf6c6d52e4b6..f20d8e30d63bee736210f496645a0106bc104169 100644 (file)
@@ -75,7 +75,7 @@ BOOL svc_query_service(struct cli_state *cli, uint16 fnum,
 /****************************************************************************
 nt service info
 ****************************************************************************/
-void cmd_svc_info(struct client_info *info)
+void cmd_svc_info(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -216,7 +216,7 @@ BOOL msrpc_svc_enum(struct client_info *info,
 /****************************************************************************
 nt service enum
 ****************************************************************************/
-void cmd_svc_enum(struct client_info *info)
+void cmd_svc_enum(struct client_info *info, int argc, char *argv[])
 {
        ENUM_SRVC_STATUS *svcs = NULL;
        uint32 num_svcs = 0;
@@ -244,7 +244,7 @@ void cmd_svc_enum(struct client_info *info)
 /****************************************************************************
 nt stop service 
 ****************************************************************************/
-void cmd_svc_stop(struct client_info *info)
+void cmd_svc_stop(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
@@ -303,7 +303,7 @@ void cmd_svc_stop(struct client_info *info)
 /****************************************************************************
 nt start service 
 ****************************************************************************/
-void cmd_svc_start(struct client_info *info)
+void cmd_svc_start(struct client_info *info, int argc, char *argv[])
 {
        uint16 fnum;
        BOOL res = True;
index 79150366096bea4d32e6b989ad857f8cc1edbc7c..426e6690a03b2e3d12db28c8e77e90527aaa5e74 100644 (file)
@@ -41,7 +41,7 @@ extern FILE* out_hnd;
 /****************************************************************************
 workstation get info query
 ****************************************************************************/
-void cmd_wks_query_info(struct client_info *info)
+void cmd_wks_query_info(struct client_info *info, int argc, char *argv[])
 {
        uint16 nt_pipe_fnum;
        fstring dest_wks;
index 7e246b1bfc09d6ba22a5283d5508c41eebe3da57..4888e720b16e684d79993d8b984b0fe73f56beda 100644 (file)
@@ -43,14 +43,16 @@ extern int DEBUGLEVEL;
 #define CNV_INPUT(s) unix2dos_format(s,True)
 
 static int process_tok(fstring tok);
-static void cmd_help(struct client_info *info);
-static void cmd_quit(struct client_info *info);
+static void cmd_help(struct client_info *info, int argc, char *argv[]);
+static void cmd_quit(struct client_info *info, int argc, char *argv[]);
 
 static struct cli_state smbcli;
 struct cli_state *smb_cli = &smbcli;
 
 static struct client_info cli_info;
 
+static char  **cmd_argv = NULL;
+static uint32 cmd_argc = 0;
 
 FILE *out_hnd;
 
@@ -113,7 +115,7 @@ static void rpcclient_stop(void)
 struct
 {
        char *name;
-       void (*fn)(struct client_info*);
+       void (*fn)(struct client_info*, int, char*[]);
        char *description;
        char compl_args[2];
 }
@@ -605,7 +607,7 @@ commands[] =
 /****************************************************************************
 do a (presumably graceful) quit...
 ****************************************************************************/
-static void cmd_quit(struct client_info *info)
+static void cmd_quit(struct client_info *info, int argc, char *argv[])
 {
        rpcclient_stop();
 #ifdef MEM_MAN
@@ -623,14 +625,13 @@ static void cmd_quit(struct client_info *info)
 /****************************************************************************
 help
 ****************************************************************************/
-static void cmd_help(struct client_info *info)
+static void cmd_help(struct client_info *info, int argc, char *argv[])
 {
   int i=0,j;
-  fstring buf;
 
-  if (next_token(NULL,buf,NULL, sizeof(buf)))
+  if (argc > 1)
     {
-      if ((i = process_tok(buf)) >= 0)
+      if ((i = process_tok(argv[1])) >= 0)
        fprintf(out_hnd, "HELP %s:\n\t%s\n\n",commands[i].name,commands[i].description);                    
     }
   else
@@ -648,7 +649,7 @@ static void cmd_help(struct client_info *info)
   lookup a command string in the list of commands, including 
   abbreviations
   ******************************************************************/
-static int process_tok(fstring tok)
+static int process_tok(char *tok)
 {
   int i = 0, matches = 0;
   int cmd=0;
@@ -681,13 +682,33 @@ static int process_tok(fstring tok)
 /****************************************************************************
   process commands from the client
 ****************************************************************************/
-static void do_command(struct client_info *info, char *tok, char *line)
+static BOOL do_command(struct client_info *info, char *line)
 {
        int i;
+       char *ptr = line;
+       pstring tok;
 
-       if ((i = process_tok(tok)) >= 0)
+       /* get the first part of the command */
+       if (!next_token(&ptr,tok,NULL, sizeof(tok)))
        {
-               commands[i].fn(info);
+               return False;
+       }
+
+       do
+       {
+               add_chars_to_array(&cmd_argc, &cmd_argv, tok);
+
+       } while (next_token(NULL, tok, NULL, sizeof(tok)));
+
+       if (cmd_argc == 0)
+       {
+               return False;
+       }
+
+       if ((i = process_tok(cmd_argv[0])) >= 0)
+       {
+               optind = -1;
+               commands[i].fn(info, (uint32)cmd_argc, cmd_argv);
        }
        else if (i == -2)
        {
@@ -697,6 +718,12 @@ static void do_command(struct client_info *info, char *tok, char *line)
        {
                fprintf(out_hnd, "%s: command not found\n", CNV_LANG(tok));
        }
+
+       free_char_array(cmd_argc, cmd_argv);
+       cmd_argc = 0;
+       cmd_argv = NULL;
+
+       return True;
 }
 
 #ifndef HAVE_LIBREADLINE
@@ -741,7 +768,6 @@ static BOOL process( struct client_info *info, char *cmd_str)
        if (cmd[0] != '\0') while (cmd[0] != '\0')
        {
                char *p;
-               fstring tok;
 
                if ((p = strchr(cmd, ';')) == 0)
                {
@@ -760,20 +786,13 @@ static BOOL process( struct client_info *info, char *cmd_str)
                /* input language code to internal one */
                CNV_INPUT (line);
 
-               /* get the first part of the command */
-               {
-                       char *ptr = line;
-                       if (!next_token(&ptr,tok,NULL, sizeof(tok))) continue;
-               }
-
-               do_command(info, tok, line);
+               if (!do_command(info, line)) continue;
        }
        else while (!feof(stdin))
        {
 #ifdef HAVE_LIBREADLINE
                pstring promptline;
 #endif
-               fstring tok;
 
 #ifndef HAVE_LIBREADLINE
 
@@ -831,13 +850,7 @@ static BOOL process( struct client_info *info, char *cmd_str)
 
                fprintf(out_hnd, "%s\n", line);
 
-               /* get the first part of the command */
-               {
-                       char *ptr = line;
-                       if (!next_token(&ptr,tok,NULL, sizeof(tok))) continue;
-               }
-
-               do_command(info, tok, line);
+               if (!do_command(info, line)) continue;
        }
 
        return(True);
@@ -920,9 +933,6 @@ static void reg_val_list(const char *full_name,
        add_chars_to_array(&reg_list_len, &reg_name, name);
 }
 
-static char **cmd_argv;
-static uint32 cmd_argc;
-
 static char *complete_regenum(char *text, int state)
 {
        pstring full_keyname;
@@ -1248,27 +1258,16 @@ static char *complete_cmd(char *text, int state)
 
 static char **completion_fn(char *text, int start, int end)
 {
-       pstring tmp;
        pstring cmd_partial;
        int cmd_index;
        int num_words;
-       char *ptr = cmd_partial;
 
     int i;
     char lastch = ' ';
 
-       free_char_array(cmd_argc, cmd_argv);
-       cmd_argc = 0;
-       cmd_argv = NULL;
-
        safe_strcpy(cmd_partial, rl_line_buffer,
                    MAX(sizeof(cmd_partial),end)-1);
 
-       if (next_token(&ptr, tmp, NULL, sizeof(tmp)))
-       {
-               add_chars_to_array(&cmd_argc, &cmd_argv, tmp);
-       }
-
     /* Complete rpcclient command */
 
     if (start == 0)
@@ -1282,10 +1281,6 @@ static char **completion_fn(char *text, int start, int end)
     for (i = 0; i <= end; i++) {
        if ((rl_line_buffer[i] != ' ') && (lastch == ' '))
        {
-               if (next_token(NULL, tmp, NULL, sizeof(tmp)))
-               {
-                       add_chars_to_array(&cmd_argc, &cmd_argv, tmp);
-               }
                num_words++;
        }
        lastch = rl_line_buffer[i];