diff options
author | Luke Leighton <lkcl@samba.org> | 1998-11-17 16:19:04 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 1998-11-17 16:19:04 +0000 |
commit | 74d539f5573a3ed3ff1b96c54752a389da4c3e14 (patch) | |
tree | cc4cee5bc8c5ff3e7ebfef04c4ed3ff6a199df48 /source3/utils/torture.c | |
parent | b7c4cd9fc6460c2138750237ee4525f929e93a76 (diff) | |
download | samba-74d539f5573a3ed3ff1b96c54752a389da4c3e14.tar.gz samba-74d539f5573a3ed3ff1b96c54752a389da4c3e14.tar.xz 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/torture.c')
-rw-r--r-- | source3/utils/torture.c | 421 |
1 files changed, 268 insertions, 153 deletions
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); } |