diff options
author | Andrew Tridgell <tridge@samba.org> | 1999-12-13 13:27:58 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1999-12-13 13:27:58 +0000 |
commit | 3db52feb1f3b2c07ce0b06ad4a7099fa6efe3fc7 (patch) | |
tree | 866dd15416c3d8554bb207709f433a87ad0c012d /source3/utils/rpctorture.c | |
parent | f6276724bafdb6145c0c7b565172d80cb04516ea (diff) | |
download | samba-3db52feb1f3b2c07ce0b06ad4a7099fa6efe3fc7.tar.gz samba-3db52feb1f3b2c07ce0b06ad4a7099fa6efe3fc7.tar.bz2 samba-3db52feb1f3b2c07ce0b06ad4a7099fa6efe3fc7.zip |
first pass at updating head branch to be to be the same as the SAMBA_2_0 branch
(This used to be commit 453a822a76780063dff23526c35408866d0c0154)
Diffstat (limited to 'source3/utils/rpctorture.c')
-rw-r--r-- | source3/utils/rpctorture.c | 515 |
1 files changed, 55 insertions, 460 deletions
diff --git a/source3/utils/rpctorture.c b/source3/utils/rpctorture.c index 0933cf38c1..fb08d70011 100644 --- a/source3/utils/rpctorture.c +++ b/source3/utils/rpctorture.c @@ -49,61 +49,16 @@ struct cli_state *smb_cli = &smbcli; FILE *out_hnd; -static pstring user_name; /* local copy only, if one is entered */ static pstring password; /* local copy only, if one is entered */ -static pstring domain; /* local copy only, if one is entered */ -BOOL got_pass = False; - -static struct nmb_name calling; -static struct nmb_name called; - -static void get_passwd(void) -{ - /* set the password cache info */ - if (got_pass) - { - if (password[0] == 0) - { - pwd_set_nullpwd(&(smb_cli->pwd)); - } - else - { - pwd_make_lm_nt_16(&(smb_cli->pwd), password); /* generate 16 byte hashes */ - } - } - else - { - char *pwd = getpass("Enter Password:"); - safe_strcpy(password, pwd, sizeof(password)); - pwd_make_lm_nt_16(&(smb_cli->pwd), password); /* generate 16 byte hashes */ - got_pass = True; - } -} /**************************************************************************** initialise smb client structure ****************************************************************************/ void rpcclient_init(void) { - bzero(smb_cli, sizeof(smb_cli)); + memset((char *)smb_cli, '\0', sizeof(smb_cli)); cli_initialise(smb_cli); smb_cli->capabilities |= CAP_NT_SMBS; - smb_cli->capabilities |= CAP_STATUS32; - - pstrcpy(smb_cli->user_name, user_name); - - get_passwd(); - - if (*domain == 0) - { - pstrcpy(smb_cli->domain,lp_workgroup()); - } - else - { - pstrcpy(smb_cli->domain, domain); - } - - strupper(smb_cli->domain); } /**************************************************************************** @@ -111,9 +66,11 @@ make smb client connection ****************************************************************************/ static BOOL rpcclient_connect(struct client_info *info) { - rpcclient_init(); + struct nmb_name calling; + struct nmb_name called; - smb_cli->use_ntlmv2 = lp_client_ntlmv2(); + make_nmb_name(&called , dns_to_netbios_name(info->dest_host ), info->name_type, scope); + make_nmb_name(&calling, dns_to_netbios_name(info->myhostname), 0x0 , scope); if (!cli_establish_connection(smb_cli, info->dest_host, &info->dest_ip, @@ -140,7 +97,7 @@ static void rpcclient_stop(void) /**************************************************************************** log in as an nt user, log out again. ****************************************************************************/ -void run_enums_test(int num_ops, struct client_info *cli_info) +void run_enums_test(int num_ops, struct client_info *cli_info, struct cli_state *cli) { pstring cmd; int i; @@ -148,8 +105,8 @@ void run_enums_test(int num_ops, struct client_info *cli_info) /* establish connections. nothing to stop these being re-established. */ rpcclient_connect(cli_info); - DEBUG(5,("rpcclient_connect: smb_cli->fd:%d\n", smb_cli->fd)); - if (smb_cli->fd <= 0) + DEBUG(5,("rpcclient_connect: cli->fd:%d\n", cli->fd)); + if (cli->fd <= 0) { fprintf(out_hnd, "warning: connection could not be established to %s<%02x>\n", cli_info->dest_host, cli_info->name_type); @@ -184,7 +141,7 @@ void run_enums_test(int num_ops, struct client_info *cli_info) /**************************************************************************** log in as an nt user, log out again. ****************************************************************************/ -void run_ntlogin_test(int num_ops, struct client_info *cli_info) +void run_ntlogin_test(int num_ops, struct client_info *cli_info, struct cli_state *cli) { pstring cmd; int i; @@ -192,8 +149,8 @@ void run_ntlogin_test(int num_ops, struct client_info *cli_info) /* establish connections. nothing to stop these being re-established. */ rpcclient_connect(cli_info); - DEBUG(5,("rpcclient_connect: smb_cli->fd:%d\n", smb_cli->fd)); - if (smb_cli->fd <= 0) + DEBUG(5,("rpcclient_connect: cli->fd:%d\n", cli->fd)); + if (cli->fd <= 0) { fprintf(out_hnd, "warning: connection could not be established to %s<%02x>\n", cli_info->dest_host, cli_info->name_type); @@ -202,7 +159,7 @@ void run_ntlogin_test(int num_ops, struct client_info *cli_info) for (i = 0; i < num_ops; i++) { - slprintf(cmd, sizeof(cmd)-1, "%s %s", smb_cli->user_name, password); + slprintf(cmd, sizeof(cmd)-1, "%s %s", cli->user_name, password); set_first_token(cmd); cmd_netlogon_login_test(cli_info); @@ -212,382 +169,12 @@ void run_ntlogin_test(int num_ops, struct client_info *cli_info) } -/* generate a random buffer */ -static void rand_buf(char *buf, int len) -{ - while (len--) { - *buf = sys_random(); - buf++; - } -} - -/**************************************************************************** -do a random rpc command -****************************************************************************/ -BOOL do_random_rpc(struct cli_state *cli, uint16 nt_pipe_fnum, int max_len) -{ - prs_struct rbuf; - prs_struct buf; - uint8 opcode; - int param_len; - BOOL response = False; - - if ((sys_random() % 20) == 0) - { - param_len = (sys_random() % 256) + 4; - } - else - { - param_len = (sys_random() % max_len) + 4; - } - - prs_init(&buf , param_len, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - opcode = sys_random() % 256; - - /* turn parameters into data stream */ - rand_buf(mem_data(&buf.data, 0), param_len); - buf.offset = param_len; - - /* send the data on \PIPE\ */ - if (rpc_api_pipe_req(cli, nt_pipe_fnum, opcode, &buf, &rbuf)) - { - response = rbuf.offset != 0; - - if (response) - { - DEBUG(0,("response! opcode: 0x%x\n", opcode)); - DEBUG(0,("request: length %d\n", param_len)); - dump_data(0, mem_data(&buf.data , 0), MIN(param_len, 128)); - DEBUG(0,("response: length %d\n", rbuf.data->offset.end)); - dump_data(0, mem_data(&rbuf.data, 0), rbuf.data->offset.end); - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return response; -} - - -/* send random IPC commands */ -static void random_rpc_pipe_enc(char *pipe_name, struct client_info *cli_info, - int numops) -{ - uint16 nt_pipe_fnum; - int i; - - DEBUG(0,("starting random rpc test on %s (encryped)\n", pipe_name)); - - /* establish connections. nothing to stop these being re-established. */ - if (!rpcclient_connect(cli_info)) - { - DEBUG(0,("random rpc test: connection failed\n")); - return; - } - - cli_nt_set_ntlmssp_flgs(smb_cli, - NTLMSSP_NEGOTIATE_UNICODE | - NTLMSSP_NEGOTIATE_OEM | - NTLMSSP_NEGOTIATE_SIGN | - NTLMSSP_NEGOTIATE_SEAL | - NTLMSSP_NEGOTIATE_LM_KEY | - NTLMSSP_NEGOTIATE_NTLM | - NTLMSSP_NEGOTIATE_ALWAYS_SIGN | - NTLMSSP_NEGOTIATE_00001000 | - NTLMSSP_NEGOTIATE_00002000); - - for (i = 1; i <= numops * 100; i++) - { - /* open session. */ - cli_nt_session_open(smb_cli, pipe_name, &nt_pipe_fnum); - - do_random_rpc(smb_cli, nt_pipe_fnum, 1024); - if (i % 500 == 0) - { - DEBUG(0,("calls: %i\n", i)); - } - - /* close the session */ - cli_nt_session_close(smb_cli, nt_pipe_fnum); - } - - /* close the rpc pipe */ - rpcclient_stop(); - - DEBUG(0,("finished random rpc test on %s\n", pipe_name)); -} - -/* send random IPC commands */ -static void random_rpc_pipe(char *pipe_name, struct client_info *cli_info, - int numops) -{ - uint16 nt_pipe_fnum; - int i; - - DEBUG(0,("starting random rpc test on %s\n", pipe_name)); - - /* establish connections. nothing to stop these being re-established. */ - if (!rpcclient_connect(cli_info)) - { - DEBUG(0,("random rpc test: connection failed\n")); - return; - } - - /* open session. */ - if (!cli_nt_session_open(smb_cli, pipe_name, &nt_pipe_fnum)) - { - DEBUG(0,("random rpc test: session open failed\n")); - return; - } - - for (i = 1; i <= numops * 100; i++) - { - do_random_rpc(smb_cli, nt_pipe_fnum, 8192); - if (i % 500 == 0) - { - DEBUG(0,("calls: %i\n", i)); - } - } - - /* close the session */ - cli_nt_session_close(smb_cli, nt_pipe_fnum); - - /* close the rpc pipe */ - rpcclient_stop(); - - DEBUG(0,("finished random rpc test on %s\n", pipe_name)); -} - -static void run_randomrpc(int numops, struct client_info *cli_info) -{ - char *pipes[] = - { - PIPE_SAMR , - PIPE_WINREG , - PIPE_SRVSVC , - PIPE_WKSSVC , - PIPE_NETLOGON , - PIPE_NTSVCS , - PIPE_LSARPC , - NULL - }; - - int i = 0; - - while (pipes[i] != NULL) - { - random_rpc_pipe(pipes[i], cli_info, numops); -#if 0 - random_rpc_pipe_enc(pipes[i], cli_info, numops); -#endif - - i++; - } -} - - -static void run_samhandles(int numops, struct client_info *cli_info) -{ - uint16 nt_pipe_fnum; - int i; - int count = 0; - int failed = 0; - int retry = 500; - fstring srv_name; - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, cli_info->dest_host); - strupper(srv_name); - - DEBUG(0,("starting sam handle test\n")); - - /* establish connections. nothing to stop these being re-established. */ - while (retry > 0 && !rpcclient_connect(cli_info)) - { - retry--; - } - - if (retry == 0) - { - DEBUG(0,("samhandle test: connection failed\n")); - return; - } - - /* open session. */ - if (!cli_nt_session_open(smb_cli, PIPE_SAMR, &nt_pipe_fnum)) - { - DEBUG(0,("samhandle test: session open failed\n")); - return; - } - - for (i = 1; i <= numops * 100; i++) - { - POLICY_HND pol; - POLICY_HND dom; - if (!samr_connect(smb_cli, nt_pipe_fnum, srv_name, 0x20, &pol)) - { - failed++; - } -/* - if (!samr_open_domain(smb_cli, nt_pipe_fnum, srv_name, 0x00000020, &pol)) - { - DEBUG(0,("samhandle domain open test (%i): failed\n", i)); - } - */ - if (i % 500 == 0) - { - DEBUG(0,("calls: %i\n", i)); - } - count++; - } - - /* close the session */ - cli_nt_session_close(smb_cli, nt_pipe_fnum); - - /* close the rpc pipe */ - rpcclient_stop(); - - DEBUG(0,("finished samhandle test. count: %d failed: %d\n", count, failed)); -} - - -static void run_lsahandles(int numops, struct client_info *cli_info) -{ - uint16 nt_pipe_fnum; - int i; - int count = 0; - int failed = 0; - int retry = 500; - fstring srv_name; - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, cli_info->myhostname); - strupper(srv_name); - - DEBUG(0,("starting lsa handle test\n")); - - /* establish connections. nothing to stop these being re-established. */ - while (retry > 0 && !rpcclient_connect(cli_info)) - { - retry--; - } - - if (retry == 0) - { - DEBUG(0,("lsahandle test: connection failed\n")); - return; - } - for (i = 1; i <= numops * 100; i++) - { - extern struct cli_state *rpc_smb_cli; - rpc_smb_cli = smb_cli; - POLICY_HND pol; - if (!lsa_open_policy(srv_name, &pol, False)) - { - failed++; - } - if (i % 500 == 0) - { - DEBUG(0,("calls: %i\n", i)); - } - count++; - } - - /* close the rpc pipe */ - rpcclient_stop(); - - DEBUG(0,("finished lsahandle test. count: %d failed: %d\n", count, failed)); -} - - -static void run_pipegobble(int numops, struct client_info *cli_info, char *pipe_name) -{ - uint16 nt_pipe_fnum; - int i; - int count = 0; - int failed = 0; - int retry = 500; - fstring srv_name; - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, cli_info->myhostname); - strupper(srv_name); - - DEBUG(0,("starting pipe gobble test (%s)\n", pipe_name)); - - /* establish connections. nothing to stop these being re-established. */ - while (retry > 0 && !rpcclient_connect(cli_info)) - { - retry--; - } - - if (retry == 0) - { - DEBUG(0,("pipe gobble test: connection failed\n")); - return; - } - for (i = 1; i <= numops * 100; i++) - { - /* open session. */ - if (!cli_nt_session_open(smb_cli, pipe_name, &nt_pipe_fnum)) - { - DEBUG(0,("pipe gobble test: session open failed\n")); - } - - if (i % 500 == 0) - { - DEBUG(0,("calls: %i\n", i)); - } - count++; - } - - rpcclient_stop(); - - DEBUG(0,("finished pipe gobble test (%s). count: %d failed: %d\n", - pipe_name, count, failed)); -} - - -static void run_handles(int numops, struct client_info *cli_info) -{ - run_lsahandles(numops, cli_info); - run_samhandles(numops, cli_info); -} - -static void run_pipegobbler(int numops, struct client_info *cli_info) -{ - run_pipegobble(numops, cli_info, PIPE_SAMR); - run_pipegobble(numops, cli_info, PIPE_LSARPC); -} - -/**************************************************************************** -make tcp connection -****************************************************************************/ -static void run_tcpconnect(int numops, struct client_info *info) -{ - int i; - int failed = 0; - - for (i = 0; i < numops; i++) - { - rpcclient_init(); - - if (!cli_connect(smb_cli, info->dest_host, &info->dest_ip)) - { - failed++; - } - cli_shutdown(smb_cli); - } - - DEBUG(0,("tcp connections: count: %d failed: %d\n", numops, failed)); -} - /**************************************************************************** runs n simultaneous functions. ****************************************************************************/ static void create_procs(int nprocs, int numops, - struct client_info *cli_info, - void (*fn)(int, struct client_info *)) + struct client_info *cli_info, struct cli_state *cli, + void (*fn)(int, struct client_info *, struct cli_state *)) { int i, status; @@ -595,10 +182,10 @@ static void create_procs(int nprocs, int numops, { if (fork() == 0) { - int mypid = getpid(); + pid_t mypid = getpid(); sys_srandom(mypid ^ time(NULL)); - fn(numops, cli_info); - dbgflush(); + fn(numops, cli_info, cli); + fflush(out_hnd); _exit(0); } } @@ -608,8 +195,6 @@ static void create_procs(int nprocs, int numops, waitpid(0, &status, 0); } } - - /**************************************************************************** usage on the program - OUT OF DATE! ****************************************************************************/ @@ -628,8 +213,6 @@ static void usage(char *pname) fprintf(out_hnd, "\t-U username set the network username\n"); fprintf(out_hnd, "\t-W workgroup set the workgroup name\n"); fprintf(out_hnd, "\t-t terminal code terminal i/o code {sjis|euc|jis7|jis8|junet|hex}\n"); - fprintf(out_hnd, "\t-N processes number of processes\n"); - fprintf(out_hnd, "\t-o operations number of operations\n"); fprintf(out_hnd, "\n"); } @@ -652,6 +235,7 @@ enum client_action extern int optind; static pstring servicesf = CONFIGFILE; pstring term_code; + BOOL got_pass = False; char *cmd_str=""; mode_t myumask = 0755; enum client_action cli_action = CLIENT_NONE; @@ -662,6 +246,8 @@ enum client_action out_hnd = stdout; + rpcclient_init(); + #ifdef KANJI pstrcpy(term_code, KANJI); #else /* KANJI */ @@ -699,6 +285,8 @@ enum client_action pstrcpy(cli_info.cur_dir , "\\"); pstrcpy(cli_info.file_sel, ""); pstrcpy(cli_info.base_dir, ""); + pstrcpy(smb_cli->domain, ""); + pstrcpy(smb_cli->user_name, ""); pstrcpy(cli_info.myhostname, ""); pstrcpy(cli_info.dest_host, ""); @@ -711,6 +299,7 @@ enum client_action ZERO_STRUCT(cli_info.dom.level5_sid); pstrcpy(cli_info.dom.level5_dom, ""); + smb_cli->nt_pipe_fnum = 0xffff; setup_logging(pname, True); @@ -720,7 +309,7 @@ enum client_action myumask = umask(0); umask(myumask); - if (!get_myname(global_myname, NULL)) + if (!get_myname(global_myname)) { fprintf(stderr, "Failed to get my hostname.\n"); } @@ -771,7 +360,7 @@ enum client_action cli_action = CLIENT_SVC; } - while ((opt = getopt(argc, argv,"s:B:O:M:S:i:N:o:n:d:l:hI:EB:U:L:t:m:W:T:D:c:")) != EOF) + while ((opt = getopt(argc, argv,"s:O:M:S:i:N:o:n:d:l:hI:EB:U:L:t:m:W:T:D:c:")) != EOF) { switch (opt) { @@ -799,12 +388,6 @@ enum client_action break; } - case 'B': - { - iface_set_default(NULL,optarg,NULL); - break; - } - case 'i': { pstrcpy(scope, optarg); @@ -814,8 +397,8 @@ enum client_action case 'U': { char *lp; - pstrcpy(user_name,optarg); - if ((lp=strchr(user_name,'%'))) + pstrcpy(smb_cli->user_name,optarg); + if ((lp=strchr(smb_cli->user_name,'%'))) { *lp = 0; pstrcpy(password,lp+1); @@ -827,7 +410,7 @@ enum client_action case 'W': { - pstrcpy(domain,optarg); + pstrcpy(smb_cli->domain,optarg); break; } @@ -925,7 +508,13 @@ enum client_action strupper(global_myname); fstrcpy(cli_info.myhostname, global_myname); - DEBUG(3,("%s client started (version %s)\n",timestring(),VERSION)); + DEBUG(3,("%s client started (version %s)\n",timestring(False),VERSION)); + + if (*smb_cli->domain == 0) + { + pstrcpy(smb_cli->domain,lp_workgroup()); + } + strupper(smb_cli->domain); load_interfaces(); @@ -939,25 +528,31 @@ enum client_action strupper(cli_info.mach_acct); fstrcat(cli_info.mach_acct, "$"); - make_nmb_name(&called , dns_to_netbios_name(cli_info.dest_host ), cli_info.name_type, scope); - make_nmb_name(&calling, dns_to_netbios_name(cli_info.myhostname), 0x0 , scope); + /* set the password cache info */ + if (got_pass) + { + if (password[0] == 0) + { + pwd_set_nullpwd(&(smb_cli->pwd)); + } + else + { + pwd_make_lm_nt_16(&(smb_cli->pwd), password); /* generate 16 byte hashes */ + } + } + else + { + char *pwd = getpass("Enter Password:"); + safe_strcpy(password, pwd, sizeof(password)); + pwd_make_lm_nt_16(&(smb_cli->pwd), password); /* generate 16 byte hashes */ + } - get_passwd(); -/* - create_procs(nprocs, numops, &cli_info, run_enums_test); + create_procs(nprocs, numops, &cli_info, smb_cli, run_enums_test); if (password[0] != 0) { - create_procs(nprocs, numops, &cli_info, run_ntlogin_test); + create_procs(nprocs, numops, &cli_info, smb_cli, run_ntlogin_test); } -*/ - -/* - create_procs(nprocs, numops, &cli_info, run_randomrpc); - create_procs(nprocs, numops, &cli_info, run_pipegobbler); - create_procs(nprocs, numops, &cli_info, run_tcpconnect); -*/ - create_procs(nprocs, numops, &cli_info, run_handles); fflush(out_hnd); |