/*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 */
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 */
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,
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 */
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 */
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
****************************************************************************/
-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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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
/****************************************************************************
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;
/****************************************************************************
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];
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
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 */
/****************************************************************************
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;
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");
&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]);
}
}
/****************************************************************************
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;
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 */
/****************************************************************************
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;
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. */
/****************************************************************************
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);
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))
/****************************************************************************
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;
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",
/****************************************************************************
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;
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");
&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)
/****************************************************************************
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;
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 */
/****************************************************************************
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;
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 */
/****************************************************************************
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;
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");
/****************************************************************************
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;
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;
+ }
}
}
/****************************************************************************
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;
BOOL res = True;
BOOL res1 = True;
- fstring group_name;
+ char *group_name;
char *names[1];
uint32 num_rids;
uint32 rid[MAX_LOOKUP_SIDS];
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);
/****************************************************************************
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;
BOOL res = True;
BOOL res1 = True;
- fstring group_name;
+ char *group_name;
char *names[1];
uint32 num_rids;
uint32 rid[MAX_LOOKUP_SIDS];
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);
/****************************************************************************
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;
BOOL res = True;
BOOL res1 = True;
- fstring user_name;
+ char *user_name;
char *names[1];
uint32 num_rids;
uint32 rid[MAX_LOOKUP_SIDS];
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);
/****************************************************************************
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;
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;
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)
{
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;
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;
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;
}
else
{
- optind = -1;
- while ((opt = getopt(cp_argc, cp_argv,"p:")) != EOF)
+ while ((opt = getopt(argc, argv,"p:")) != EOF)
{
switch (opt)
{
/****************************************************************************
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;
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;
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);
/****************************************************************************
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;
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);
/****************************************************************************
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;
BOOL res = True;
BOOL res1 = True;
- fstring alias_name;
+ char *alias_name;
char *names[1];
uint32 num_rids;
uint32 rid[MAX_LOOKUP_SIDS];
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);
/****************************************************************************
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;
BOOL res = True;
BOOL res1 = True;
- fstring alias_name;
+ char *alias_name;
char *names[1];
uint32 num_rids;
uint32 rid[MAX_LOOKUP_SIDS];
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);
/****************************************************************************
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;
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;
+ }
}
}
/****************************************************************************
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;
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;
+ }
}
}
/****************************************************************************
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;
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;
+ }
}
}
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
/****************************************************************************
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;
#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;
struct
{
char *name;
- void (*fn)(struct client_info*);
+ void (*fn)(struct client_info*, int, char*[]);
char *description;
char compl_args[2];
}
/****************************************************************************
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
/****************************************************************************
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
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;
/****************************************************************************
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)
{
{
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
if (cmd[0] != '\0') while (cmd[0] != '\0')
{
char *p;
- fstring tok;
if ((p = strchr(cmd, ';')) == 0)
{
/* 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
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);
add_chars_to_array(®_list_len, ®_name, name);
}
-static char **cmd_argv;
-static uint32 cmd_argc;
-
static char *complete_regenum(char *text, int state)
{
pstring full_keyname;
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)
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];