summaryrefslogtreecommitdiff
path: root/source3/utils
diff options
context:
space:
mode:
authorLuke Leighton <lkcl@samba.org>1998-11-17 16:19:04 +0000
committerLuke Leighton <lkcl@samba.org>1998-11-17 16:19:04 +0000
commit74d539f5573a3ed3ff1b96c54752a389da4c3e14 (patch)
treecc4cee5bc8c5ff3e7ebfef04c4ed3ff6a199df48 /source3/utils
parentb7c4cd9fc6460c2138750237ee4525f929e93a76 (diff)
downloadsamba-74d539f5573a3ed3ff1b96c54752a389da4c3e14.tar.gz
samba-74d539f5573a3ed3ff1b96c54752a389da4c3e14.tar.bz2
samba-74d539f5573a3ed3ff1b96c54752a389da4c3e14.zip
- group database API. oops and oh dear, the threat has been carried out:
the pre-alpha "domain group" etc parameters have disappeared. - interactive debug detection - re-added mem_man (andrew's memory management, detects memory corruption) - american spellings of "initialise" replaced with english spelling of "initialise". - started on "lookup_name()" and "lookup_sid()" functions. proper ones. - moved lots of functions around. created some modules of commonly used code. e.g the password file locking code, which is used in groupfile.c and aliasfile.c and smbpass.c - moved RID_TYPE_MASK up another bit. this is really unfortunate, but there is no other "fast" way to identify users from groups from aliases. i do not believe that this code saves us anything (the multipliers) and puts us at a disadvantage (reduces the useable rid space). the designers of NT aren't silly: if they can get away with a user- interface-speed LsaLookupNames / LsaLookupSids, then so can we. i spoke with isaac at the cifs conference, the only time for example that they do a security context check is on file create. certainly not on individual file reads / writes, which would drastically hit their performance and ours, too. - renamed myworkgroup to global_sam_name, amongst other things, when used in the rpc code. there is also a global_member_name, as we are always responsible for a SAM database, the scope of which is limited by the role of the machine (e.g if a member of a workgroup, your SAM is for _local_ logins only, and its name is the name of your server. you even still have a SID. see LsaQueryInfoPolicy, levels 3 and 5). - updated functionality of groupname.c to be able to cope with names like DOMAIN\group and SERVER\alias. used this code to be able to do aliases as well as groups. this code may actually be better off being used in username mapping, too. - created a connect to serverlist function in clientgen.c and used it in password.c - initialisation in server.c depends on the role of the server. well, it does now. - rpctorture. smbtorture. EXERCISE EXTREME CAUTION. (This used to be commit 0d21e1e6090b933f396c764af535ca3388a562db)
Diffstat (limited to 'source3/utils')
-rw-r--r--source3/utils/rpctorture.c503
-rw-r--r--source3/utils/smbpasswd.c2
-rw-r--r--source3/utils/torture.c421
3 files changed, 721 insertions, 205 deletions
diff --git a/source3/utils/rpctorture.c b/source3/utils/rpctorture.c
index 96d1181ca0..dac64a22e3 100644
--- a/source3/utils/rpctorture.c
+++ b/source3/utils/rpctorture.c
@@ -49,7 +49,36 @@ 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
@@ -59,6 +88,23 @@ void rpcclient_init(void)
bzero(smb_cli, 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);
+ smb_cli->nt_pipe_fnum = 0xffff;
+
+ get_passwd();
+
+ if (*domain == 0)
+ {
+ pstrcpy(smb_cli->domain,lp_workgroup());
+ }
+ else
+ {
+ pstrcpy(smb_cli->domain, domain);
+ }
+
+ strupper(smb_cli->domain);
}
/****************************************************************************
@@ -66,11 +112,7 @@ make smb client connection
****************************************************************************/
static BOOL rpcclient_connect(struct client_info *info)
{
- struct nmb_name calling;
- struct nmb_name called;
-
- 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);
+ rpcclient_init();
if (!cli_establish_connection(smb_cli,
info->dest_host, &info->dest_ip,
@@ -97,7 +139,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, struct cli_state *cli)
+void run_enums_test(int num_ops, struct client_info *cli_info)
{
pstring cmd;
int i;
@@ -105,8 +147,8 @@ void run_enums_test(int num_ops, struct client_info *cli_info, struct cli_state
/* establish connections. nothing to stop these being re-established. */
rpcclient_connect(cli_info);
- DEBUG(5,("rpcclient_connect: cli->fd:%d\n", cli->fd));
- if (cli->fd <= 0)
+ DEBUG(5,("rpcclient_connect: smb_cli->fd:%d\n", smb_cli->fd));
+ if (smb_cli->fd <= 0)
{
fprintf(out_hnd, "warning: connection could not be established to %s<%02x>\n",
cli_info->dest_host, cli_info->name_type);
@@ -141,7 +183,7 @@ void run_enums_test(int num_ops, struct client_info *cli_info, struct cli_state
/****************************************************************************
log in as an nt user, log out again.
****************************************************************************/
-void run_ntlogin_test(int num_ops, struct client_info *cli_info, struct cli_state *cli)
+void run_ntlogin_test(int num_ops, struct client_info *cli_info)
{
pstring cmd;
int i;
@@ -149,8 +191,8 @@ void run_ntlogin_test(int num_ops, struct client_info *cli_info, struct cli_stat
/* establish connections. nothing to stop these being re-established. */
rpcclient_connect(cli_info);
- DEBUG(5,("rpcclient_connect: cli->fd:%d\n", cli->fd));
- if (cli->fd <= 0)
+ DEBUG(5,("rpcclient_connect: smb_cli->fd:%d\n", smb_cli->fd));
+ if (smb_cli->fd <= 0)
{
fprintf(out_hnd, "warning: connection could not be established to %s<%02x>\n",
cli_info->dest_host, cli_info->name_type);
@@ -159,7 +201,7 @@ void run_ntlogin_test(int num_ops, struct client_info *cli_info, struct cli_stat
for (i = 0; i < num_ops; i++)
{
- slprintf(cmd, sizeof(cmd)-1, "%s %s", cli->user_name, password);
+ slprintf(cmd, sizeof(cmd)-1, "%s %s", smb_cli->user_name, password);
set_first_token(cmd);
cmd_netlogon_login_test(cli_info);
@@ -169,12 +211,387 @@ void run_ntlogin_test(int num_ops, struct client_info *cli_info, struct cli_stat
}
+/* 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, 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, 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)
+{
+ 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);
+
+ do_random_rpc(smb_cli, 1024);
+ if (i % 500 == 0)
+ {
+ DEBUG(0,("calls: %i\n", i));
+ }
+
+ /* close the session */
+ cli_nt_session_close(smb_cli);
+ }
+
+ /* 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)
+{
+ 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))
+ {
+ DEBUG(0,("random rpc test: session open failed\n"));
+ return;
+ }
+
+ for (i = 1; i <= numops * 100; i++)
+ {
+ do_random_rpc(smb_cli, 8192);
+ if (i % 500 == 0)
+ {
+ DEBUG(0,("calls: %i\n", i));
+ }
+ }
+
+ /* close the session */
+ cli_nt_session_close(smb_cli);
+
+ /* 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)
+{
+ 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))
+ {
+ DEBUG(0,("samhandle test: session open failed\n"));
+ return;
+ }
+
+ for (i = 1; i <= numops * 100; i++)
+ {
+ POLICY_HND pol;
+ POLICY_HND dom;
+ if (!do_samr_connect(smb_cli, srv_name, 0x20, &pol))
+ {
+ failed++;
+ }
+/*
+ if (!do_samr_open_domain(smb_cli, 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);
+
+ /* 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)
+{
+ 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;
+ }
+ /* open session. */
+ if (!cli_nt_session_open(smb_cli, PIPE_LSARPC))
+ {
+ DEBUG(0,("lsahandle test: session open failed\n"));
+ return;
+ }
+
+ for (i = 1; i <= numops * 100; i++)
+ {
+ POLICY_HND pol;
+ if (!do_lsa_open_policy(smb_cli, srv_name, &pol, False))
+ {
+ failed++;
+ }
+ if (i % 500 == 0)
+ {
+ DEBUG(0,("calls: %i\n", i));
+ }
+ count++;
+ }
+
+ /* close the session */
+ cli_nt_session_close(smb_cli);
+
+ /* 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)
+{
+ 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))
+ {
+ 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_samhandles(numops, cli_info);
+ run_lsahandles(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, struct cli_state *cli,
- void (*fn)(int, struct client_info *, struct cli_state *))
+ struct client_info *cli_info,
+ void (*fn)(int, struct client_info *))
{
int i, status;
@@ -184,8 +601,8 @@ static void create_procs(int nprocs, int numops,
{
int mypid = getpid();
sys_srandom(mypid ^ time(NULL));
- fn(numops, cli_info, cli);
- fflush(out_hnd);
+ fn(numops, cli_info);
+ dbgflush();
_exit(0);
}
}
@@ -195,6 +612,8 @@ static void create_procs(int nprocs, int numops,
waitpid(0, &status, 0);
}
}
+
+
/****************************************************************************
usage on the program - OUT OF DATE!
****************************************************************************/
@@ -235,7 +654,6 @@ 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;
@@ -246,8 +664,6 @@ enum client_action
out_hnd = stdout;
- rpcclient_init();
-
#ifdef KANJI
pstrcpy(term_code, KANJI);
#else /* KANJI */
@@ -285,8 +701,6 @@ 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, "");
@@ -299,7 +713,6 @@ 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);
@@ -403,8 +816,8 @@ enum client_action
case 'U':
{
char *lp;
- pstrcpy(smb_cli->user_name,optarg);
- if ((lp=strchr(smb_cli->user_name,'%')))
+ pstrcpy(user_name,optarg);
+ if ((lp=strchr(user_name,'%')))
{
*lp = 0;
pstrcpy(password,lp+1);
@@ -416,7 +829,7 @@ enum client_action
case 'W':
{
- pstrcpy(smb_cli->domain,optarg);
+ pstrcpy(domain,optarg);
break;
}
@@ -516,12 +929,6 @@ enum client_action
DEBUG(3,("%s client started (version %s)\n",timestring(),VERSION));
- if (*smb_cli->domain == 0)
- {
- pstrcpy(smb_cli->domain,lp_workgroup());
- }
- strupper(smb_cli->domain);
-
load_interfaces();
if (cli_action == CLIENT_IPC)
@@ -534,31 +941,25 @@ enum client_action
strupper(cli_info.mach_acct);
fstrcat(cli_info.mach_acct, "$");
- /* 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 */
- }
+ 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);
- create_procs(nprocs, numops, &cli_info, smb_cli, run_enums_test);
+ get_passwd();
+/*
+ create_procs(nprocs, numops, &cli_info, run_enums_test);
if (password[0] != 0)
{
- create_procs(nprocs, numops, &cli_info, smb_cli, run_ntlogin_test);
+ create_procs(nprocs, numops, &cli_info, run_ntlogin_test);
}
+*/
+
+ create_procs(nprocs, numops, &cli_info, run_tcpconnect);
+/*
+ create_procs(nprocs, numops, &cli_info, run_pipegobbler);
+ create_procs(nprocs, numops, &cli_info, run_handles);
+ create_procs(nprocs, numops, &cli_info, run_randomrpc);
+*/
fflush(out_hnd);
diff --git a/source3/utils/smbpasswd.c b/source3/utils/smbpasswd.c
index 902f59b245..3249103a27 100644
--- a/source3/utils/smbpasswd.c
+++ b/source3/utils/smbpasswd.c
@@ -554,7 +554,7 @@ int main(int argc, char **argv)
charset_initialise();
- if(!initialize_password_db()) {
+ if(!initialise_password_db()) {
fprintf(stderr, "Can't setup password database vectors.\n");
exit(1);
}
diff --git a/source3/utils/torture.c b/source3/utils/torture.c
index 81fa33fc75..fb09f515cf 100644
--- a/source3/utils/torture.c
+++ b/source3/utils/torture.c
@@ -23,6 +23,9 @@
#include "includes.h"
+extern int DEBUGLEVEL;
+extern pstring debugf;
+
static fstring host, workgroup, share, password, username, myname;
static int max_protocol = PROTOCOL_NT1;
static char *sockops="";
@@ -42,8 +45,27 @@ static double end_timer(void)
(tp2.tv_usec - tp1.tv_usec)*1.0e-6);
}
+#define FAILED_NO_ERROR 0
+#define FAILED_TCP_CONNECT 1
+#define FAILED_SESSION_REQ 2
+#define FAILED_SMB_SESS_SETUP 3
+#define FAILED_SMB_TCON 4
+#define FAILED_SMB_NEGPROT 5
+#define FAILED_CLI_STATE_INIT 6
+#define NUM_ERR_STATES 7
-static BOOL open_connection(struct cli_state *c)
+static char *smb_messages[] =
+{
+ "No errors in connection",
+ "TCP connection ",
+ "NetBIOS Session Request",
+ "SMB Session Setup ",
+ "SMB Tcon ",
+ "SMB Negprot ",
+ "Client initialisation "
+};
+
+static int open_connection(struct cli_state *c)
{
struct nmb_name called, calling;
@@ -52,48 +74,53 @@ static BOOL open_connection(struct cli_state *c)
make_nmb_name(&calling, myname, 0x0, "");
make_nmb_name(&called , host, 0x20, "");
- if (!cli_initialise(c) || !cli_connect(c, host, NULL)) {
- printf("Failed to connect with %s\n", host);
- return False;
+ if (!cli_initialise(c))
+ {
+ DEBUG(0,("Failed to connect with %s\n", host));
+ return FAILED_CLI_STATE_INIT;
+ }
+
+ if (!cli_connect(c, host, NULL)) {
+ DEBUG(0,("Failed to connect with %s\n", host));
+ return FAILED_TCP_CONNECT;
}
if (!cli_session_request(c, &calling, &called)) {
cli_shutdown(c);
- printf("%s rejected the session\n",host);
- return False;
+ DEBUG(0,("%s rejected the session\n",host));
+ return FAILED_SESSION_REQ;
}
if (!cli_negprot(c)) {
- printf("%s rejected the negprot (%s)\n",host, cli_errstr(c));
+ DEBUG(0,("%s rejected the negprot (%s)\n",host, cli_errstr(c)));
cli_shutdown(c);
- return False;
+ return FAILED_SMB_NEGPROT;
}
if (!cli_session_setup(c, username,
password, strlen(password),
password, strlen(password),
workgroup)) {
+ DEBUG(0,("%s rejected the sessionsetup (%s)\n", host, cli_errstr(c)));
cli_shutdown(c);
- printf("%s rejected the sessionsetup (%s)\n", host, cli_errstr(c));
- return False;
+ return FAILED_SMB_SESS_SETUP;
}
if (!cli_send_tconX(c, share, "?????",
password, strlen(password)+1)) {
- printf("%s refused tree connect (%s)\n", host, cli_errstr(c));
+ DEBUG(0,("%s refused tree connect (%s)\n", host, cli_errstr(c)));
cli_shutdown(c);
- return False;
+ return FAILED_SMB_TCON;
}
- return True;
+ return FAILED_NO_ERROR;
}
-
static void close_connection(struct cli_state *c)
{
if (!cli_tdis(c)) {
- printf("tdis failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("tdis failed (%s)\n", cli_errstr(c)));
}
cli_shutdown(c);
@@ -110,10 +137,10 @@ static BOOL check_error(struct cli_state *c,
eno = cli_error(c, &class, &num);
if ((eclass != class || ecode != num) &&
num != (nterr&0xFFFFFF)) {
- printf("unexpected error code class=%d code=%d\n",
- (int)class, (int)num);
- printf(" expected %d/%d %d\n",
- (int)eclass, (int)ecode, (int)nterr);
+ DEBUG(0,("unexpected error code class=%d code=%d\n",
+ (int)class, (int)num));
+ DEBUG(0,(" expected %d/%d %d\n",
+ (int)eclass, (int)ecode, (int)nterr));
return False;
}
return True;
@@ -144,7 +171,7 @@ static BOOL rw_torture(struct cli_state *c, int numops)
if (fnum2 == -1)
fnum2 = cli_open(c, lockfname, O_RDWR, DENY_NONE);
if (fnum2 == -1) {
- printf("open of %s failed (%s)\n", lockfname, cli_errstr(c));
+ DEBUG(0,("open of %s failed (%s)\n", lockfname, cli_errstr(c)));
return False;
}
@@ -152,7 +179,7 @@ static BOOL rw_torture(struct cli_state *c, int numops)
for (i=0;i<numops;i++) {
unsigned n = (unsigned)sys_random()%10;
if (i % 10 == 0) {
- printf("%d\r", i); fflush(stdout);
+ DEBUG(0,("%d\r", i));
}
slprintf(fname, sizeof(fstring) - 1, "\\torture.%u", n);
@@ -162,49 +189,49 @@ static BOOL rw_torture(struct cli_state *c, int numops)
fnum = cli_open(c, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_ALL);
if (fnum == -1) {
- printf("open failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("open failed (%s)\n", cli_errstr(c)));
break;
}
if (cli_write(c, fnum, 0, (char *)&pid, 0, sizeof(pid)) != sizeof(pid)) {
- printf("write failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("write failed (%s)\n", cli_errstr(c)));
}
for (j=0;j<50;j++) {
if (cli_write(c, fnum, 0, (char *)buf,
sizeof(pid)+(j*sizeof(buf)),
sizeof(buf)) != sizeof(buf)) {
- printf("write failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("write failed (%s)\n", cli_errstr(c)));
}
}
pid2 = 0;
if (cli_read(c, fnum, (char *)&pid2, 0, sizeof(pid)) != sizeof(pid)) {
- printf("read failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("read failed (%s)\n", cli_errstr(c)));
}
if (pid2 != pid) {
- printf("data corruption!\n");
+ DEBUG(0,("data corruption!\n"));
}
if (!cli_close(c, fnum)) {
- printf("close failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("close failed (%s)\n", cli_errstr(c)));
}
if (!cli_unlink(c, fname)) {
- printf("unlink failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("unlink failed (%s)\n", cli_errstr(c)));
}
if (!cli_unlock(c, fnum2, n*sizeof(int), sizeof(int), -1)) {
- printf("unlock failed (%s)\n", cli_errstr(c));
+ DEBUG(0,("unlock failed (%s)\n", cli_errstr(c)));
}
}
cli_close(c, fnum2);
cli_unlink(c, lockfname);
- printf("%d\n", i);
+ DEBUG(0,("%d\n", i));
return True;
}
@@ -231,15 +258,21 @@ static void run_torture(int numops)
{
static struct cli_state cli;
- if (open_connection(&cli)) {
+ if (open_connection(&cli) == 0)
+ {
cli_sockopt(&cli, sockops);
- printf("pid %d OK\n", getpid());
+ DEBUG(0,("pid %d OK\n", getpid()));
rw_torture(&cli, numops);
close_connection(&cli);
}
+ else
+ {
+ DEBUG(0,("pid %d failed\n", getpid()));
+ }
+
}
/*
@@ -256,50 +289,50 @@ static void run_locktest1(void)
int fnum1, fnum2, fnum3;
time_t t1, t2;
- if (!open_connection(&cli1) || !open_connection(&cli2)) {
+ if (open_connection(&cli1) != 0 || open_connection(&cli2) != 0) {
return;
}
cli_sockopt(&cli1, sockops);
cli_sockopt(&cli2, sockops);
- printf("starting locktest1\n");
+ DEBUG(0,("starting locktest1\n"));
cli_unlink(&cli1, fname);
fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
if (fnum1 == -1) {
- printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ DEBUG(0,("open of %s failed (%s)\n", fname, cli_errstr(&cli1)));
return;
}
fnum2 = cli_open(&cli1, fname, O_RDWR, DENY_NONE);
if (fnum2 == -1) {
- printf("open2 of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ DEBUG(0,("open2 of %s failed (%s)\n", fname, cli_errstr(&cli1)));
return;
}
fnum3 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
if (fnum3 == -1) {
- printf("open3 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+ DEBUG(0,("open3 of %s failed (%s)\n", fname, cli_errstr(&cli2)));
return;
}
if (!cli_lock(&cli1, fnum1, 0, 4, 0)) {
- printf("lock1 failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("lock1 failed (%s)\n", cli_errstr(&cli1)));
return;
}
if (cli_lock(&cli2, fnum3, 0, 4, 0)) {
- printf("lock2 succeeded! This is a locking bug\n");
+ DEBUG(0,("lock2 succeeded! This is a locking bug\n"));
return;
} else {
if (!check_error(&cli2, ERRDOS, ERRlock, 0)) return;
}
- printf("Testing lock timeouts\n");
+ DEBUG(0,("Testing lock timeouts\n"));
t1 = time(NULL);
if (cli_lock(&cli2, fnum3, 0, 4, 10*1000)) {
- printf("lock3 succeeded! This is a locking bug\n");
+ DEBUG(0,("lock3 succeeded! This is a locking bug\n"));
return;
} else {
if (!check_error(&cli2, ERRDOS, ERRlock, 0)) return;
@@ -307,33 +340,33 @@ static void run_locktest1(void)
t2 = time(NULL);
if (t2 - t1 < 5) {
- printf("error: This server appears not to support timed lock requests\n");
+ DEBUG(0,("error: This server appears not to support timed lock requests\n"));
}
if (!cli_close(&cli1, fnum2)) {
- printf("close1 failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("close1 failed (%s)\n", cli_errstr(&cli1)));
return;
}
if (cli_lock(&cli2, fnum3, 0, 4, 0)) {
- printf("lock4 succeeded! This is a locking bug\n");
+ DEBUG(0,("lock4 succeeded! This is a locking bug\n"));
return;
} else {
if (!check_error(&cli2, ERRDOS, ERRlock, 0)) return;
}
if (!cli_close(&cli1, fnum1)) {
- printf("close2 failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("close2 failed (%s)\n", cli_errstr(&cli1)));
return;
}
if (!cli_close(&cli2, fnum3)) {
- printf("close3 failed (%s)\n", cli_errstr(&cli2));
+ DEBUG(0,("close3 failed (%s)\n", cli_errstr(&cli2)));
return;
}
if (!cli_unlink(&cli1, fname)) {
- printf("unlink failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("unlink failed (%s)\n", cli_errstr(&cli1)));
return;
}
@@ -341,7 +374,7 @@ static void run_locktest1(void)
close_connection(&cli1);
close_connection(&cli2);
- printf("Passed locktest1\n");
+ DEBUG(0,("Passed locktest1\n"));
}
@@ -362,13 +395,13 @@ static void run_locktest2(void)
char *fname = "\\lockt2.lck";
int fnum1, fnum2, fnum3;
- if (!open_connection(&cli)) {
+ if (open_connection(&cli) != 0) {
return;
}
cli_sockopt(&cli, sockops);
- printf("starting locktest2\n");
+ DEBUG(0,("starting locktest2\n"));
cli_unlink(&cli, fname);
@@ -376,13 +409,13 @@ static void run_locktest2(void)
fnum1 = cli_open(&cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
if (fnum1 == -1) {
- printf("open of %s failed (%s)\n", fname, cli_errstr(&cli));
+ DEBUG(0,("open of %s failed (%s)\n", fname, cli_errstr(&cli)));
return;
}
fnum2 = cli_open(&cli, fname, O_RDWR, DENY_NONE);
if (fnum2 == -1) {
- printf("open2 of %s failed (%s)\n", fname, cli_errstr(&cli));
+ DEBUG(0,("open2 of %s failed (%s)\n", fname, cli_errstr(&cli)));
return;
}
@@ -390,19 +423,19 @@ static void run_locktest2(void)
fnum3 = cli_open(&cli, fname, O_RDWR, DENY_NONE);
if (fnum3 == -1) {
- printf("open3 of %s failed (%s)\n", fname, cli_errstr(&cli));
+ DEBUG(0,("open3 of %s failed (%s)\n", fname, cli_errstr(&cli)));
return;
}
cli_setpid(&cli, 1);
if (!cli_lock(&cli, fnum1, 0, 4, 0)) {
- printf("lock1 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("lock1 failed (%s)\n", cli_errstr(&cli)));
return;
}
if (cli_lock(&cli, fnum2, 0, 4, 0)) {
- printf("lock2 succeeded! This is a locking bug\n");
+ DEBUG(0,("lock2 succeeded! This is a locking bug\n"));
} else {
if (!check_error(&cli, ERRDOS, ERRlock, 0)) return;
}
@@ -410,11 +443,11 @@ static void run_locktest2(void)
cli_setpid(&cli, 2);
if (cli_unlock(&cli, fnum1, 0, 4, 0)) {
- printf("unlock1 succeeded! This is a locking bug\n");
+ DEBUG(0,("unlock1 succeeded! This is a locking bug\n"));
}
if (cli_lock(&cli, fnum3, 0, 4, 0)) {
- printf("lock3 succeeded! This is a locking bug\n");
+ DEBUG(0,("lock3 succeeded! This is a locking bug\n"));
} else {
if (!check_error(&cli, ERRDOS, ERRlock, 0)) return;
}
@@ -422,23 +455,23 @@ static void run_locktest2(void)
cli_setpid(&cli, 1);
if (!cli_close(&cli, fnum1)) {
- printf("close1 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("close1 failed (%s)\n", cli_errstr(&cli)));
return;
}
if (!cli_close(&cli, fnum2)) {
- printf("close2 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("close2 failed (%s)\n", cli_errstr(&cli)));
return;
}
if (!cli_close(&cli, fnum3)) {
- printf("close3 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("close3 failed (%s)\n", cli_errstr(&cli)));
return;
}
close_connection(&cli);
- printf("locktest2 finished\n");
+ DEBUG(0,("locktest2 finished\n"));
}
@@ -456,40 +489,40 @@ static void run_locktest3(int numops)
#define NEXT_OFFSET offset += (~(uint32)0) / numops
- if (!open_connection(&cli1) || !open_connection(&cli2)) {
+ if (open_connection(&cli1) != 0 || open_connection(&cli2) != 0) {
return;
}
cli_sockopt(&cli1, sockops);
cli_sockopt(&cli2, sockops);
- printf("starting locktest3\n");
+ DEBUG(0,("starting locktest3\n"));
cli_unlink(&cli1, fname);
fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
if (fnum1 == -1) {
- printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ DEBUG(0,("open of %s failed (%s)\n", fname, cli_errstr(&cli1)));
return;
}
fnum2 = cli_open(&cli2, fname, O_RDWR, DENY_NONE);
if (fnum2 == -1) {
- printf("open2 of %s failed (%s)\n", fname, cli_errstr(&cli2));
+ DEBUG(0,("open2 of %s failed (%s)\n", fname, cli_errstr(&cli2)));
return;
}
for (offset=i=0;i<numops;i++) {
NEXT_OFFSET;
if (!cli_lock(&cli1, fnum1, offset-1, 1, 0)) {
- printf("lock1 %d failed (%s)\n",
+ DEBUG(0,("lock1 %d failed (%s)\n",
i,
- cli_errstr(&cli1));
+ cli_errstr(&cli1)));
return;
}
if (!cli_lock(&cli2, fnum2, offset-2, 1, 0)) {
- printf("lock2 %d failed (%s)\n",
+ DEBUG(0,("lock2 %d failed (%s)\n",
i,
- cli_errstr(&cli1));
+ cli_errstr(&cli1)));
return;
}
}
@@ -498,22 +531,22 @@ static void run_locktest3(int numops)
NEXT_OFFSET;
if (cli_lock(&cli1, fnum1, offset-2, 1, 0)) {
- printf("error: lock1 %d succeeded!\n", i);
+ DEBUG(0,("error: lock1 %d succeeded!\n", i));
return;
}
if (cli_lock(&cli2, fnum2, offset-1, 1, 0)) {
- printf("error: lock2 %d succeeded!\n", i);
+ DEBUG(0,("error: lock2 %d succeeded!\n", i));
return;
}
if (cli_lock(&cli1, fnum1, offset-1, 1, 0)) {
- printf("error: lock3 %d succeeded!\n", i);
+ DEBUG(0,("error: lock3 %d succeeded!\n", i));
return;
}
if (cli_lock(&cli2, fnum2, offset-2, 1, 0)) {
- printf("error: lock4 %d succeeded!\n", i);
+ DEBUG(0,("error: lock4 %d succeeded!\n", i));
return;
}
}
@@ -522,37 +555,37 @@ static void run_locktest3(int numops)
NEXT_OFFSET;
if (!cli_unlock(&cli1, fnum1, offset-1, 1, 0)) {
- printf("unlock1 %d failed (%s)\n",
+ DEBUG(0,("unlock1 %d failed (%s)\n",
i,
- cli_errstr(&cli1));
+ cli_errstr(&cli1)));
return;
}
if (!cli_unlock(&cli2, fnum2, offset-2, 1, 0)) {
- printf("unlock2 %d failed (%s)\n",
+ DEBUG(0,("unlock2 %d failed (%s)\n",
i,
- cli_errstr(&cli1));
+ cli_errstr(&cli1)));
return;
}
}
if (!cli_close(&cli1, fnum1)) {
- printf("close1 failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("close1 failed (%s)\n", cli_errstr(&cli1)));
}
if (!cli_close(&cli2, fnum2)) {
- printf("close2 failed (%s)\n", cli_errstr(&cli2));
+ DEBUG(0,("close2 failed (%s)\n", cli_errstr(&cli2)));
}
if (!cli_unlink(&cli1, fname)) {
- printf("unlink failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("unlink failed (%s)\n", cli_errstr(&cli1)));
return;
}
close_connection(&cli1);
close_connection(&cli2);
- printf("finished locktest3\n");
+ DEBUG(0,("finished locktest3\n"));
}
@@ -567,24 +600,24 @@ static void run_fdpasstest(void)
int fnum1;
pstring buf;
- if (!open_connection(&cli1) || !open_connection(&cli2)) {
+ if (open_connection(&cli1) != 0 || open_connection(&cli2) != 0) {
return;
}
cli_sockopt(&cli1, sockops);
cli_sockopt(&cli2, sockops);
- printf("starting fdpasstest\n");
+ DEBUG(0,("starting fdpasstest\n"));
cli_unlink(&cli1, fname);
fnum1 = cli_open(&cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
if (fnum1 == -1) {
- printf("open of %s failed (%s)\n", fname, cli_errstr(&cli1));
+ DEBUG(0,("open of %s failed (%s)\n", fname, cli_errstr(&cli1)));
return;
}
if (cli_write(&cli1, fnum1, 0, "hello world\n", 0, 13) != 13) {
- printf("write failed (%s)\n", cli_errstr(&cli1));
+ DEBUG(0,("write failed (%s)\n", cli_errstr(&cli1)));
return;
}
@@ -594,8 +627,8 @@ static void run_fdpasstest(void)
if (cli_read(&cli2, fnum1, buf, 0, 13) == 13) {
- printf("read succeeded! nasty security hole [%s]\n",
- buf);
+ DEBUG(0,("read succeeded! nasty security hole [%s]\n",
+ buf));
return;
}
@@ -605,7 +638,7 @@ static void run_fdpasstest(void)
close_connection(&cli1);
close_connection(&cli2);
- printf("finished fdpasstest\n");
+ DEBUG(0,("finished fdpasstest\n"));
}
@@ -620,13 +653,13 @@ static void run_unlinktest(void)
char *fname = "\\unlink.tst";
int fnum;
- if (!open_connection(&cli)) {
+ if (open_connection(&cli) != 0) {
return;
}
cli_sockopt(&cli, sockops);
- printf("starting unlink test\n");
+ DEBUG(0,("starting unlink test\n"));
cli_unlink(&cli, fname);
@@ -634,12 +667,12 @@ static void run_unlinktest(void)
fnum = cli_open(&cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
if (fnum == -1) {
- printf("open of %s failed (%s)\n", fname, cli_errstr(&cli));
+ DEBUG(0,("open of %s failed (%s)\n", fname, cli_errstr(&cli)));
return;
}
if (cli_unlink(&cli, fname)) {
- printf("error: server allowed unlink on an open file\n");
+ DEBUG(0,("error: server allowed unlink on an open file\n"));
}
cli_close(&cli, fnum);
@@ -647,7 +680,7 @@ static void run_unlinktest(void)
close_connection(&cli);
- printf("unlink test finished\n");
+ DEBUG(0,("unlink test finished\n"));
}
@@ -664,16 +697,16 @@ static void run_maxfidtest(int n)
srandom(getpid());
- while (!open_connection(&cli) && retries--) msleep(random() % 2000);
+ while (open_connection(&cli) != 0 && retries--) msleep(random() % 2000);
if (retries <= 0) {
- printf("failed to connect\n");
+ DEBUG(0,("failed to connect\n"));
return;
}
cli_sockopt(&cli, sockops);
- printf("starting maxfid test\n");
+ DEBUG(0,("starting maxfid test\n"));
fnum = 0;
while (1) {
@@ -681,25 +714,25 @@ static void run_maxfidtest(int n)
if (cli_open(&cli, fname,
O_RDWR|O_CREAT|O_TRUNC, DENY_NONE) ==
-1) {
- printf("open of %s failed (%s)\n",
- fname, cli_errstr(&cli));
- printf("maximum fnum is %d\n", fnum);
+ DEBUG(0,("open of %s failed (%s)\n",
+ fname, cli_errstr(&cli)));
+ DEBUG(0,("maximum fnum is %d\n", fnum));
break;
}
fnum++;
}
- printf("cleaning up\n");
+ DEBUG(0,("cleaning up\n"));
while (fnum > n) {
fnum--;
slprintf(fname,sizeof(fname)-1,template, fnum,getpid());
if (cli_unlink(&cli, fname)) {
- printf("unlink of %s failed (%s)\n",
- fname, cli_errstr(&cli));
+ DEBUG(0,("unlink of %s failed (%s)\n",
+ fname, cli_errstr(&cli)));
}
}
- printf("maxfid test finished\n");
+ DEBUG(0,("maxfid test finished\n"));
close_connection(&cli);
}
@@ -713,24 +746,41 @@ static void rand_buf(char *buf, int len)
}
/* send random IPC commands */
-static void run_randomipc(void)
+static void run_randomipc(int numops)
{
char *rparam = NULL;
char *rdata = NULL;
int rdrcnt,rprcnt;
- pstring param;
+ char param[BUFFER_SIZE];
int api, param_len, i;
+ int reconnect_count = 50;
static struct cli_state cli;
- printf("starting random ipc test\n");
+ DEBUG(0,("starting random ipc test\n"));
+
+ while (reconnect_count > 0 && open_connection(&cli) != 0)
+ {
+ DEBUG(0,("connection failed: retrying %d\n", reconnect_count));
+ msleep(sys_random() % 1000);
+ reconnect_count--;
+ }
- if (!open_connection(&cli)) {
+ if (reconnect_count == 0)
+ {
return;
}
- for (i=0;i<50000;i++) {
+ for (i=0;i<numops * 100;i++)
+ {
api = sys_random() % 500;
- param_len = (sys_random() % 64);
+ if ((sys_random() % 10) == 0)
+ {
+ param_len = (sys_random() % BUFFER_SIZE);
+ }
+ else
+ {
+ param_len = (sys_random() % 64);
+ }
rand_buf(param, param_len);
@@ -745,7 +795,7 @@ static void run_randomipc(void)
close_connection(&cli);
- printf("finished random ipc test\n");
+ DEBUG(0,("finished random ipc test\n"));
}
@@ -753,7 +803,7 @@ static void run_randomipc(void)
static void browse_callback(const char *sname, uint32 stype,
const char *comment)
{
- printf("\t%20.20s %08x %s\n", sname, stype, comment);
+ DEBUG(0,("\t%20.20s %08x %s\n", sname, stype, comment));
}
@@ -766,25 +816,25 @@ static void run_browsetest(void)
{
static struct cli_state cli;
- printf("starting browse test\n");
+ DEBUG(0,("starting browse test\n"));
- if (!open_connection(&cli)) {
+ if (open_connection(&cli) != 0) {
return;
}
- printf("domain list:\n");
+ DEBUG(0,("domain list:\n"));
cli_NetServerEnum(&cli, workgroup,
SV_TYPE_DOMAIN_ENUM,
browse_callback);
- printf("machine list:\n");
+ DEBUG(0,("machine list:\n"));
cli_NetServerEnum(&cli, workgroup,
SV_TYPE_ALL,
browse_callback);
close_connection(&cli);
- printf("browse test finished\n");
+ DEBUG(0,("browse test finished\n"));
}
@@ -798,9 +848,9 @@ static void run_attrtest(void)
time_t t, t2;
char *fname = "\\attrib.tst";
- printf("starting attrib test\n");
+ DEBUG(0,("starting attrib test\n"));
- if (!open_connection(&cli)) {
+ if (open_connection(&cli) != 0) {
return;
}
@@ -809,36 +859,36 @@ static void run_attrtest(void)
O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
cli_close(&cli, fnum);
if (!cli_getatr(&cli, fname, NULL, NULL, &t)) {
- printf("getatr failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("getatr failed (%s)\n", cli_errstr(&cli)));
}
if (abs(t - time(NULL)) > 2) {
- printf("ERROR: SMBgetatr bug. time is %s",
- ctime(&t));
+ DEBUG(0,("ERROR: SMBgetatr bug. time is %s",
+ ctime(&t)));
t = time(NULL);
}
t2 = t-60*60*24; /* 1 day ago */
if (!cli_setatr(&cli, fname, 0, t2)) {
- printf("setatr failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("setatr failed (%s)\n", cli_errstr(&cli)));
}
if (!cli_getatr(&cli, fname, NULL, NULL, &t)) {
- printf("getatr failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("getatr failed (%s)\n", cli_errstr(&cli)));
}
if (t != t2) {
- printf("ERROR: getatr/setatr bug. times are\n%s",
- ctime(&t));
- printf("%s", ctime(&t2));
+ DEBUG(0,("ERROR: getatr/setatr bug. times are\n%s",
+ ctime(&t)));
+ DEBUG(0,("%s", ctime(&t2)));
}
cli_unlink(&cli, fname);
close_connection(&cli);
- printf("attrib test finished\n");
+ DEBUG(0,("attrib test finished\n"));
}
@@ -855,9 +905,9 @@ static void run_trans2test(void)
char *dname = "\\trans2";
char *fname2 = "\\trans2\\trans2.tst";
- printf("starting trans2 test\n");
+ DEBUG(0,("starting trans2 test\n"));
- if (!open_connection(&cli)) {
+ if (open_connection(&cli) != 0) {
return;
}
@@ -866,7 +916,7 @@ static void run_trans2test(void)
O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
if (!cli_qfileinfo(&cli, fnum, NULL, &size, &c_time, &a_time, &m_time,
NULL, NULL)) {
- printf("ERROR: qfileinfo failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("ERROR: qfileinfo failed (%s)\n", cli_errstr(&cli)));
}
cli_close(&cli, fnum);
@@ -878,20 +928,20 @@ static void run_trans2test(void)
cli_close(&cli, fnum);
if (!cli_qpathinfo(&cli, fname, &c_time, &a_time, &m_time, &size, NULL)) {
- printf("ERROR: qpathinfo failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("ERROR: qpathinfo failed (%s)\n", cli_errstr(&cli)));
} else {
if (c_time != m_time) {
- printf("create time=%s", ctime(&c_time));
- printf("modify time=%s", ctime(&m_time));
- printf("This system appears to have sticky create times\n");
+ DEBUG(0,("create time=%s", ctime(&c_time)));
+ DEBUG(0,("modify time=%s", ctime(&m_time)));
+ DEBUG(0,("This system appears to have sticky create times\n"));
}
if (a_time % (60*60) == 0) {
- printf("access time=%s", ctime(&a_time));
- printf("This system appears to set a midnight access time\n");
+ DEBUG(0,("access time=%s", ctime(&a_time)));
+ DEBUG(0,("This system appears to set a midnight access time\n"));
}
if (abs(m_time - time(NULL)) > 60*60*24*7) {
- printf("ERROR: totally incorrect times - maybe word reversed?\n");
+ DEBUG(0,("ERROR: totally incorrect times - maybe word reversed?\n"));
}
}
@@ -902,11 +952,11 @@ static void run_trans2test(void)
cli_close(&cli, fnum);
if (!cli_qpathinfo2(&cli, fname, &c_time, &a_time, &m_time,
&w_time, &size, NULL, NULL)) {
- printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli)));
} else {
if (w_time < 60*60*24*2) {
- printf("write time=%s", ctime(&w_time));
- printf("This system appears to set a initial 0 write time\n");
+ DEBUG(0,("write time=%s", ctime(&w_time)));
+ DEBUG(0,("This system appears to set a initial 0 write time\n"));
}
}
@@ -916,12 +966,12 @@ static void run_trans2test(void)
/* check if the server updates the directory modification time
when creating a new file */
if (!cli_mkdir(&cli, dname)) {
- printf("ERROR: mkdir failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("ERROR: mkdir failed (%s)\n", cli_errstr(&cli)));
}
sleep(3);
if (!cli_qpathinfo2(&cli, "\\trans2\\", &c_time, &a_time, &m_time,
&w_time, &size, NULL, NULL)) {
- printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli)));
}
fnum = cli_open(&cli, fname2,
@@ -930,10 +980,10 @@ static void run_trans2test(void)
cli_close(&cli, fnum);
if (!cli_qpathinfo2(&cli, "\\trans2\\", &c_time, &a_time, &m_time2,
&w_time, &size, NULL, NULL)) {
- printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli));
+ DEBUG(0,("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(&cli)));
} else {
if (m_time2 == m_time)
- printf("This system does not update directory modification times\n");
+ DEBUG(0,("This system does not update directory modification times\n"));
}
cli_unlink(&cli, fname2);
cli_rmdir(&cli, dname);
@@ -941,29 +991,83 @@ static void run_trans2test(void)
close_connection(&cli);
- printf("trans2 test finished\n");
+ DEBUG(0,("trans2 test finished\n"));
}
+static void run_connection(int numops)
+{
+ struct cli_state c;
+ int count = 0;
+ int failed[NUM_ERR_STATES];
+ int i;
+
+ DEBUG(0,("Connection test starts:\n"));
+
+ for (i = 0; i < NUM_ERR_STATES; i++)
+ {
+ failed[i] = 0;
+ }
+
+ for (i = 0; i < numops; i++)
+ {
+ int err;
+ DEBUG(0,("Connection test %d %d\n", i, numops));
+ if ((err = open_connection(&c)))
+ {
+ failed[err]++;
+ }
+ count++;
+ }
+
+ {
+ int failtotal = 0;
+
+ for (i = 0, failtotal = 0; i < NUM_ERR_STATES; i++)
+ {
+ failtotal += failed[i];
+ }
+ DEBUG(0,("Connection test results: count %d success %d\n", count, count-failtotal));
+ }
+ for (i = 0; i < NUM_ERR_STATES; i++)
+ {
+ DEBUG(0,("%s: failed: %d\n", smb_messages[i], failed[i]));
+ }
+}
+
static void create_procs(int nprocs, int numops, void (*fn)(int ))
{
int i, status;
- for (i=0;i<nprocs;i++) {
- if (fork() == 0) {
+ for (i=0;i<nprocs;i++)
+ {
+ if (fork() == 0)
+ {
int mypid = getpid();
sys_srandom(mypid ^ time(NULL));
+
+ if (!dbg_interactive())
+ {
+ slprintf(debugf, sizeof(debugf), "./log.torture.%d", mypid);
+ reopen_logs();
+ }
+
fn(numops);
+ dbgflush();
_exit(0);
}
}
for (i=0;i<nprocs;i++)
+ {
waitpid(0, &status, 0);
+ }
}
+#define DEBUG_INTERACTIVE True
+
/****************************************************************************
main program
****************************************************************************/
@@ -975,9 +1079,14 @@ static void create_procs(int nprocs, int numops, void (*fn)(int ))
int gotpass = 0;
extern char *optarg;
extern int optind;
- extern FILE *dbf;
+ extern BOOL append_log;
+ extern BOOL timestamp_log;
- dbf = stdout;
+ DEBUGLEVEL = 0;
+ pstrcpy(debugf,"./log.torture");
+ setup_logging(argv[0], DEBUG_INTERACTIVE);
+ append_log = True;
+ timestamp_log = False;
charset_initialise();
@@ -1055,8 +1164,12 @@ static void create_procs(int nprocs, int numops, void (*fn)(int ))
}
}
- printf("host=%s share=%s user=%s myname=%s\n",
- host, share, username, myname);
+ printf("host=%s share=%s user=%s myname=%s procs=%d ops=%d\n",
+ host, share, username, myname, nprocs, numops);
+
+ create_procs(nprocs, numops, run_connection);
+/*
+ create_procs(nprocs, numops, run_randomipc);
run_fdpasstest();
run_locktest1();
@@ -1069,11 +1182,13 @@ static void create_procs(int nprocs, int numops, void (*fn)(int ))
create_procs(nprocs, numops, run_maxfidtest);
+
+
start_timer();
create_procs(nprocs, numops, run_torture);
printf("rw_torture: %g secs\n", end_timer());
-
- run_randomipc();
+*/
+ dbgflush();
return(0);
}