1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

r17338: Add support for multiple shares test inspired by Samba 4 torture's --unclist option. Triggered by -b sharelist_file option.

Based on Peter Samogyi's work. I'm not sure what concept for fstring replacement is currently in place though (talloc-ed strings? or it was for pstring only?)
(This used to be commit c9f8fafad6)
This commit is contained in:
Alexander Bokovoy 2006-07-31 09:41:25 +00:00 committed by Gerald (Jerry) Carter
parent 175ac9f7db
commit 5fbe298b5a
5 changed files with 160 additions and 51 deletions

View File

@ -1412,7 +1412,7 @@ BOOL torture_denytest1(int dummy)
BOOL correct = True;
const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"};
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -1498,7 +1498,7 @@ BOOL torture_denytest2(int dummy)
BOOL correct = True;
const char *fnames[2] = {"\\denytest2.dat", "\\denytest2.exe"};
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}

View File

@ -167,7 +167,7 @@ BOOL torture_mangle(int dummy)
printf("starting mangle test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}

View File

@ -196,7 +196,7 @@ BOOL torture_trans2_scan(int dummy)
printf("starting trans2 scan test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -398,7 +398,7 @@ BOOL torture_nttrans_scan(int dummy)
printf("starting nttrans scan test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}

View File

@ -36,6 +36,8 @@ static BOOL use_oplocks;
static BOOL use_level_II_oplocks;
static const char *client_txt = "client_oplocks.txt";
static BOOL use_kerberos;
static fstring multishare_conn_fname;
static BOOL use_multishare_conn = False;
BOOL torture_showall = False;
@ -44,6 +46,7 @@ static double create_procs(BOOL (*fn)(int), BOOL *result);
static struct timeval tp1,tp2;
void start_timer(void)
{
GetTimeOfDay(&tp1);
@ -146,7 +149,67 @@ static struct cli_state *open_nbt_connection(void)
return c;
}
BOOL torture_open_connection(struct cli_state **c)
/* Insert a NULL at the first separator of the given path and return a pointer
* to the remainder of the string.
*/
static char *
terminate_path_at_separator(char * path)
{
char * p;
if (!path) {
return NULL;
}
if ((p = strchr_m(path, '/'))) {
*p = '\0';
return p + 1;
}
if ((p = strchr_m(path, '\\'))) {
*p = '\0';
return p + 1;
}
/* No separator. */
return NULL;
}
/*
parse a //server/share type UNC name
*/
BOOL smbcli_parse_unc(const char *unc_name, TALLOC_CTX *mem_ctx,
char **hostname, char **sharename)
{
char *p;
*hostname = *sharename = NULL;
if (strncmp(unc_name, "\\\\", 2) &&
strncmp(unc_name, "//", 2)) {
return False;
}
*hostname = talloc_strdup(mem_ctx, &unc_name[2]);
p = terminate_path_at_separator(*hostname);
if (p && *p) {
*sharename = talloc_strdup(mem_ctx, p);
terminate_path_at_separator(*sharename);
}
if (*hostname && *sharename) {
return True;
}
TALLOC_FREE(*hostname);
TALLOC_FREE(*sharename);
return False;
}
static BOOL torture_open_connection_share(struct cli_state **c,
const char *hostname,
const char *sharename)
{
BOOL retry;
int flags = 0;
@ -154,10 +217,10 @@ BOOL torture_open_connection(struct cli_state **c)
if (use_kerberos)
flags |= CLI_FULL_CONNECTION_USE_KERBEROS;
status = cli_full_connection(c, myname,
host, NULL, port_to_use,
share, "?????",
hostname, NULL, port_to_use,
sharename, "?????",
username, workgroup,
password, flags, Undefined, &retry);
if (!NT_STATUS_IS_OK(status)) {
@ -171,6 +234,47 @@ BOOL torture_open_connection(struct cli_state **c)
return True;
}
void torture_open_connection_free_unclist(char **unc_list)
{
if (unc_list!=NULL)
{
SAFE_FREE(unc_list[0]);
SAFE_FREE(unc_list);
}
}
BOOL torture_open_connection(struct cli_state **c, int conn_index)
{
char **unc_list = NULL;
int num_unc_names = 0;
BOOL result;
if (use_multishare_conn==True) {
char *h, *s;
unc_list = file_lines_load(multishare_conn_fname, &num_unc_names, 0);
if (!unc_list || num_unc_names <= 0) {
printf("Failed to load unc names list from '%s'\n", multishare_conn_fname);
exit(1);
}
if (!smbcli_parse_unc(unc_list[conn_index % num_unc_names],
NULL, &h, &s)) {
printf("Failed to parse UNC name %s\n",
unc_list[conn_index % num_unc_names]);
torture_open_connection_free_unclist(unc_list);
exit(1);
}
result = torture_open_connection_share(c, h, s);
/* h, s were copied earlier */
torture_open_connection_free_unclist(unc_list);
return result;
}
return torture_open_connection_share(c, host, share);
}
BOOL torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
{
uint16 old_vuid = cli->vuid;
@ -539,7 +643,7 @@ static BOOL run_readwritetest(int dummy)
static struct cli_state *cli1, *cli2;
BOOL test1, test2 = False;
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}
cli_sockopt(cli1, sockops);
@ -594,7 +698,7 @@ static BOOL run_readwritelarge(int dummy)
char buf[126*1024];
BOOL correct = True;
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
cli_sockopt(cli1, sockops);
@ -825,7 +929,7 @@ static BOOL run_locktest1(int dummy)
time_t t1, t2;
unsigned lock_timeout;
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}
cli_sockopt(cli1, sockops);
@ -940,7 +1044,7 @@ static BOOL run_tcon_test(int dummy)
char buf[4];
BOOL ret = True;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
cli_sockopt(cli, sockops);
@ -1042,7 +1146,7 @@ static BOOL run_tcon2_test(int dummy)
char *service;
NTSTATUS status;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
cli_sockopt(cli, sockops);
@ -1195,7 +1299,7 @@ static BOOL run_locktest2(int dummy)
int fnum1, fnum2, fnum3;
BOOL correct = True;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -1334,7 +1438,7 @@ static BOOL run_locktest3(int dummy)
#define NEXT_OFFSET offset += (~(uint32)0) / torture_numops
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}
cli_sockopt(cli1, sockops);
@ -1458,7 +1562,7 @@ static BOOL run_locktest4(int dummy)
char buf[1000];
BOOL correct = True;
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}
@ -1629,7 +1733,7 @@ static BOOL run_locktest5(int dummy)
char buf[1000];
BOOL correct = True;
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}
@ -1752,7 +1856,7 @@ static BOOL run_locktest6(int dummy)
int fnum;
NTSTATUS status;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -1792,7 +1896,7 @@ static BOOL run_locktest7(int dummy)
char buf[200];
BOOL correct = False;
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -1928,7 +2032,7 @@ static BOOL run_fdpasstest(int dummy)
int fnum1;
pstring buf;
if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli1, 0) || !torture_open_connection(&cli2, 1)) {
return False;
}
cli_sockopt(cli1, sockops);
@ -1983,7 +2087,7 @@ static BOOL run_fdsesstest(int dummy)
pstring buf;
BOOL ret = True;
if (!torture_open_connection(&cli))
if (!torture_open_connection(&cli, 0))
return False;
cli_sockopt(cli, sockops);
@ -2065,7 +2169,7 @@ static BOOL run_unlinktest(int dummy)
int fnum;
BOOL correct = True;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -2210,7 +2314,7 @@ static BOOL run_randomipc(int dummy)
printf("starting random ipc test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -2263,7 +2367,7 @@ static BOOL run_browsetest(int dummy)
printf("starting browse test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -2301,7 +2405,7 @@ static BOOL run_attrtest(int dummy)
printf("starting attrib test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -2369,7 +2473,7 @@ static BOOL run_trans2test(int dummy)
printf("starting trans2 test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -2518,7 +2622,7 @@ static BOOL run_w2ktest(int dummy)
printf("starting w2k test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -2553,7 +2657,7 @@ static BOOL run_oplock1(int dummy)
printf("starting oplock test 1\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -2611,7 +2715,7 @@ static BOOL run_oplock2(int dummy)
printf("starting oplock test 2\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
use_level_II_oplocks = False;
use_oplocks = saved_use_oplocks;
return False;
@ -2620,7 +2724,7 @@ static BOOL run_oplock2(int dummy)
cli1->use_oplocks = True;
cli1->use_level_II_oplocks = True;
if (!torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli2, 1)) {
use_level_II_oplocks = False;
use_oplocks = saved_use_oplocks;
return False;
@ -2754,7 +2858,7 @@ static BOOL run_oplock3(int dummy)
/* Child code */
use_oplocks = True;
use_level_II_oplocks = True;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
*shared_correct = False;
exit(0);
}
@ -2768,7 +2872,7 @@ static BOOL run_oplock3(int dummy)
/* parent code */
use_oplocks = True;
use_level_II_oplocks = True;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 1)) { /* other is forked */
return False;
}
cli_oplock_handler(cli, oplock3_handler);
@ -2801,7 +2905,7 @@ static BOOL run_deletetest(int dummy)
printf("starting delete test\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -3115,7 +3219,7 @@ static BOOL run_deletetest(int dummy)
cli_setatr(cli1, fname, 0, 0);
cli_unlink(cli1, fname);
if (!torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli2, 1)) {
printf("[8] failed to open second connection.\n");
correct = False;
goto fail;
@ -3282,7 +3386,7 @@ static BOOL run_properties(int dummy)
ZERO_STRUCT(cli);
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -3330,7 +3434,7 @@ static BOOL run_xcopy(int dummy)
printf("starting xcopy test\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -3373,7 +3477,7 @@ static BOOL run_rename(int dummy)
printf("starting rename test\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -3559,7 +3663,7 @@ static BOOL run_pipe_number(int dummy)
int num_pipes = 0;
printf("starting pipenumber test\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -3596,7 +3700,7 @@ static BOOL run_opentest(int dummy)
printf("starting open test\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -3743,7 +3847,7 @@ static BOOL run_opentest(int dummy)
/* Test the non-io opens... */
if (!torture_open_connection(&cli2)) {
if (!torture_open_connection(&cli2, 1)) {
return False;
}
@ -4044,7 +4148,7 @@ static BOOL run_openattrtest(int dummy)
printf("starting open attr test\n");
if (!torture_open_connection(&cli1)) {
if (!torture_open_connection(&cli1, 0)) {
return False;
}
@ -4156,7 +4260,7 @@ static BOOL run_dirtest(int dummy)
printf("starting directory test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -4229,7 +4333,7 @@ BOOL torture_ioctl_test(int dummy)
DATA_BLOB blob;
NTSTATUS status;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -4281,7 +4385,7 @@ BOOL torture_chkpath_test(int dummy)
int fnum;
BOOL ret;
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -4366,7 +4470,7 @@ static BOOL run_eatest(int dummy)
printf("starting eatest\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -4478,7 +4582,7 @@ static BOOL run_dirtest1(int dummy)
printf("starting directory test\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -4731,7 +4835,7 @@ static double create_procs(BOOL (*fn)(int), BOOL *result)
slprintf(myname,sizeof(myname),"CLIENT%d", i);
while (1) {
if (torture_open_connection(&current_cli)) break;
if (torture_open_connection(&current_cli, i)) break;
if (tries-- == 0) {
printf("pid %d failed to start\n", (int)getpid());
_exit(1);
@ -4923,6 +5027,7 @@ static void usage(void)
printf("\t-A showall\n");
printf("\t-p port\n");
printf("\t-s seed\n");
printf("\t-b unclist_filename specify multiple shares for multiple connections\n");
printf("\n\n");
printf("tests are:");
@ -4991,7 +5096,7 @@ static void usage(void)
fstrcpy(workgroup, lp_workgroup());
while ((opt = getopt(argc, argv, "p:hW:U:n:N:O:o:m:Ld:Ac:ks:")) != EOF) {
while ((opt = getopt(argc, argv, "p:hW:U:n:N:O:o:m:Ld:Ac:ks:b:")) != EOF) {
switch (opt) {
case 'p':
port_to_use = atoi(optarg);
@ -5047,6 +5152,10 @@ static void usage(void)
gotpass = 1;
}
break;
case 'b':
fstrcpy(multishare_conn_fname, optarg);
use_multishare_conn = True;
break;
default:
printf("Unknown option %c (%d)\n", (char)opt, opt);
usage();

View File

@ -32,7 +32,7 @@ BOOL torture_utable(int dummy)
printf("starting utable\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}
@ -121,7 +121,7 @@ BOOL torture_casetable(int dummy)
smb_ucs2_t equiv[0x10000][MAX_EQUIVALENCE];
printf("starting casetable\n");
if (!torture_open_connection(&cli)) {
if (!torture_open_connection(&cli, 0)) {
return False;
}