📄 torture.c
字号:
printf("Passed readwritetest v1: %s\n", BOOLSTR(test1)); if (test1) { test2 = rw_torture2(cli1, cli1); printf("Passed readwritetest v2: %s\n", BOOLSTR(test2)); } if (!torture_close_connection(cli1)) { test1 = False; } if (!torture_close_connection(cli2)) { test2 = False; } return (test1 && test2);}static BOOL run_readwritemulti(int dummy){ struct cli_state *cli; BOOL test; cli = current_cli; cli_sockopt(cli, sockops); printf("run_readwritemulti: fname %s\n", randomfname); test = rw_torture3(cli, randomfname); if (!torture_close_connection(cli)) { test = False; } return test;}static BOOL run_readwritelarge(int dummy){ static struct cli_state *cli1; int fnum1; const char *lockfname = "\\large.dat"; SMB_OFF_T fsize; char buf[126*1024]; BOOL correct = True; if (!torture_open_connection(&cli1)) { return False; } cli_sockopt(cli1, sockops); memset(buf,'\0',sizeof(buf)); cli1->max_xmit = 128*1024; printf("starting readwritelarge\n"); cli_unlink(cli1, lockfname); fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE); if (fnum1 == -1) { printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1)); return False; } cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf)); if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) { printf("qfileinfo failed (%s)\n", cli_errstr(cli1)); correct = False; } if (fsize == sizeof(buf)) printf("readwritelarge test 1 succeeded (size = %lx)\n", (unsigned long)fsize); else { printf("readwritelarge test 1 failed (size = %lx)\n", (unsigned long)fsize); correct = False; } if (!cli_close(cli1, fnum1)) { printf("close failed (%s)\n", cli_errstr(cli1)); correct = False; } if (!cli_unlink(cli1, lockfname)) { printf("unlink failed (%s)\n", cli_errstr(cli1)); correct = False; } fnum1 = cli_open(cli1, lockfname, O_RDWR | O_CREAT | O_EXCL, DENY_NONE); if (fnum1 == -1) { printf("open read/write of %s failed (%s)\n", lockfname, cli_errstr(cli1)); return False; } cli1->max_xmit = 4*1024; cli_smbwrite(cli1, fnum1, buf, 0, sizeof(buf)); if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) { printf("qfileinfo failed (%s)\n", cli_errstr(cli1)); correct = False; } if (fsize == sizeof(buf)) printf("readwritelarge test 2 succeeded (size = %lx)\n", (unsigned long)fsize); else { printf("readwritelarge test 2 failed (size = %lx)\n", (unsigned long)fsize); correct = False; }#if 0 /* ToDo - set allocation. JRA */ if(!cli_set_allocation_size(cli1, fnum1, 0)) { printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1)); return False; } if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) { printf("qfileinfo failed (%s)\n", cli_errstr(cli1)); correct = False; } if (fsize != 0) printf("readwritelarge test 3 (truncate test) succeeded (size = %x)\n", fsize);#endif if (!cli_close(cli1, fnum1)) { printf("close failed (%s)\n", cli_errstr(cli1)); correct = False; } if (!torture_close_connection(cli1)) { correct = False; } return correct;}int line_count = 0;int nbio_id;#define ival(s) strtol(s, NULL, 0)/* run a test that simulates an approximate netbench client load */static BOOL run_netbench(int client){ struct cli_state *cli; int i; pstring line; char cname[20]; FILE *f; const char *params[20]; BOOL correct = True; cli = current_cli; nbio_id = client; cli_sockopt(cli, sockops); nb_setup(cli); slprintf(cname,sizeof(cname)-1, "client%d", client); f = fopen(client_txt, "r"); if (!f) { perror(client_txt); return False; } while (fgets(line, sizeof(line)-1, f)) { line_count++; line[strlen(line)-1] = 0; /* printf("[%d] %s\n", line_count, line); */ all_string_sub(line,"client1", cname, sizeof(line)); /* parse the command parameters */ params[0] = strtok(line," "); i = 0; while (params[i]) params[++i] = strtok(NULL," "); params[i] = ""; if (i < 2) continue; if (!strncmp(params[0],"SMB", 3)) { printf("ERROR: You are using a dbench 1 load file\n"); exit(1); } if (!strcmp(params[0],"NTCreateX")) { nb_createx(params[1], ival(params[2]), ival(params[3]), ival(params[4])); } else if (!strcmp(params[0],"Close")) { nb_close(ival(params[1])); } else if (!strcmp(params[0],"Rename")) { nb_rename(params[1], params[2]); } else if (!strcmp(params[0],"Unlink")) { nb_unlink(params[1]); } else if (!strcmp(params[0],"Deltree")) { nb_deltree(params[1]); } else if (!strcmp(params[0],"Rmdir")) { nb_rmdir(params[1]); } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) { nb_qpathinfo(params[1]); } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) { nb_qfileinfo(ival(params[1])); } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) { nb_qfsinfo(ival(params[1])); } else if (!strcmp(params[0],"FIND_FIRST")) { nb_findfirst(params[1]); } else if (!strcmp(params[0],"WriteX")) { nb_writex(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])); } else if (!strcmp(params[0],"ReadX")) { nb_readx(ival(params[1]), ival(params[2]), ival(params[3]), ival(params[4])); } else if (!strcmp(params[0],"Flush")) { nb_flush(ival(params[1])); } else { printf("Unknown operation %s\n", params[0]); exit(1); } } fclose(f); nb_cleanup(); if (!torture_close_connection(cli)) { correct = False; } return correct;}/* run a test that simulates an approximate netbench client load */static BOOL run_nbench(int dummy){ double t; BOOL correct = True; nbio_shmem(nprocs); nbio_id = -1; signal(SIGALRM, nb_alarm); alarm(1); t = create_procs(run_netbench, &correct); alarm(0); printf("\nThroughput %g MB/sec\n", 1.0e-6 * nbio_total() / t); return correct;}/* This test checks for two things: 1) correct support for retaining locks over a close (ie. the server must not use posix semantics) 2) support for lock timeouts */static BOOL run_locktest1(int dummy){ struct cli_state *cli1, *cli2; const char *fname = "\\lockt1.lck"; int fnum1, fnum2, fnum3; time_t t1, t2; unsigned lock_timeout; if (!torture_open_connection(&cli1) || !torture_open_connection(&cli2)) { return False; } cli_sockopt(cli1, sockops); cli_sockopt(cli2, sockops); printf("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)); return False; } fnum2 = cli_open(cli1, fname, O_RDWR, DENY_NONE); if (fnum2 == -1) { printf("open2 of %s failed (%s)\n", fname, cli_errstr(cli1)); return False; } fnum3 = cli_open(cli2, fname, O_RDWR, DENY_NONE); if (fnum3 == -1) { printf("open3 of %s failed (%s)\n", fname, cli_errstr(cli2)); return False; } if (!cli_lock(cli1, fnum1, 0, 4, 0, WRITE_LOCK)) { printf("lock1 failed (%s)\n", cli_errstr(cli1)); return False; } if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) { printf("lock2 succeeded! This is a locking bug\n"); return False; } else { if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False; } lock_timeout = (1 + (random() % 20)); printf("Testing lock timeout with timeout=%u\n", lock_timeout); t1 = time(NULL); if (cli_lock(cli2, fnum3, 0, 4, lock_timeout * 1000, WRITE_LOCK)) { printf("lock3 succeeded! This is a locking bug\n"); return False; } else { if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT)) return False; } t2 = time(NULL); if (ABS(t2 - t1) < lock_timeout-1) { printf("error: This server appears not to support timed lock requests\n"); } printf("server slept for %u seconds for a %u second timeout\n", (unsigned int)(t2-t1), lock_timeout); if (!cli_close(cli1, fnum2)) { printf("close1 failed (%s)\n", cli_errstr(cli1)); return False; } if (cli_lock(cli2, fnum3, 0, 4, 0, WRITE_LOCK)) { printf("lock4 succeeded! This is a locking bug\n"); return False; } else { if (!check_error(__LINE__, cli2, ERRDOS, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT)) return False; } if (!cli_close(cli1, fnum1)) { printf("close2 failed (%s)\n", cli_errstr(cli1)); return False; } if (!cli_close(cli2, fnum3)) { printf("close3 failed (%s)\n", cli_errstr(cli2)); return False; } if (!cli_unlink(cli1, fname)) { printf("unlink failed (%s)\n", cli_errstr(cli1)); return False; } if (!torture_close_connection(cli1)) { return False; } if (!torture_close_connection(cli2)) { return False; } printf("Passed locktest1\n"); return True;}/* this checks to see if a secondary tconx can use open files from an earlier tconx */static BOOL run_tcon_test(int dummy){ static struct cli_state *cli; const char *fname = "\\tcontest.tmp"; int fnum1; uint16 cnum1, cnum2, cnum3; uint16 vuid1, vuid2; char buf[4]; BOOL ret = True; if (!torture_open_connection(&cli)) { return False; } cli_sockopt(cli, sockops); printf("starting tcontest\n"); cli_unlink(cli, fname); 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)); return False; } cnum1 = cli->cnum; vuid1 = cli->vuid; if (cli_write(cli, fnum1, 0, buf, 130, 4) != 4) { printf("initial write failed (%s)", cli_errstr(cli)); return False; } if (!cli_send_tconX(cli, share, "?????", password, strlen(password)+1)) { printf("%s refused 2nd tree connect (%s)\n", host, cli_errstr(cli)); cli_shutdown(cli); return False; } cnum2 = cli->cnum; cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */ vuid2 = cli->vuid + 1; /* try a write with the wrong tid */ cli->cnum = cnum2; if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) { printf("* server allows write with wrong TID\n"); ret = False; } else { printf("server fails write with wrong TID : %s\n", cli_errstr(cli)); } /* try a write with an invalid tid */ cli->cnum = cnum3; if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) { printf("* server allows write with invalid TID\n"); ret = False; } else { printf("server fails write with invalid TID : %s\n", cli_errstr(cli)); } /* try a write with an invalid vuid */ cli->vuid = vuid2; cli->cnum = cnum1; if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) { printf("* server allows write with invalid VUID\n"); ret = False; } else { printf("server fails write with invalid VUID : %s\n", cli_errstr(cli)); } cli->cnum = cnum1; cli->vuid = vuid1; if (!cli_close(cli, fnum1)) { printf("close failed (%s)\n", cli_errstr(cli)); return False; } cli->cnum = cnum2; if (!cli_tdis(cli)) { printf("secondary tdis failed (%s)\n", cli_errstr(cli)); return False; } cli->cnum = cnum1; if (!torture_close_connection(cli)) { return False; } return ret;}/* checks for old style tcon support */static BOOL run_tcon2_test(int dummy){ static struct cli_state *cli; uint16 cnum, max_xmit; char *service; NTSTATUS status; if (!torture_open_connection(&cli)) { return False; } cli_sockopt(cli, sockops); printf("starting tcon2 test\n"); asprintf(&service, "\\\\%s\\%s", host, share); status = cli_raw_tcon(cli, service, password, "?????", &max_xmit, &cnum); if (!NT_STATUS_IS_OK(status)) { printf("tcon2 failed : %s\n", cli_errstr(cli)); } else { printf("tcon OK : max_xmit=%d cnum=%d tid=%d\n", (int)max_xmit, (int)cnum, SVAL(cli->inbuf, smb_tid)); } if (!torture_close_connection(cli)) { return False; } printf("Passed tcon2 test\n"); return True;}static BOOL tcon_devtest(struct cli_state *cli, const char *myshare, const char *devtype, const char *return_devtype, NTSTATUS expected_error){ BOOL status; BOOL ret; status = cli_send_tconX(cli, myshare, devtype, password, strlen(password)+1); if (NT_STATUS_IS_OK(expected_error)) { if (status) { if (strcmp(cli->dev, return_devtype) == 0) { ret = True; } else { printf("tconX to share %s with type %s " "succeeded but returned the wrong " "device type (got [%s] but should have got [%s])\n", myshare, devtype, cli->dev, return_devtype); ret = False; } } else { printf("tconX to share %s with type %s " "should have succeeded but failed\n", myshare, devtype); ret = False; } cli_tdis(cli); } else { if (status) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -