📄 open.c
字号:
CHECK_TIME(basetime, write_time); smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); /* make sure file_attrs works */ io.mknew.in.attrib = FILE_ATTRIBUTE_HIDDEN; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.mknew.out.file.fnum; CHECK_ALL_INFO(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_ARCHIVE, attrib & ~FILE_ATTRIBUTE_NONINDEXED); done: smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); return ret;}/* test RAW_OPEN_CREATE*/static bool test_create(struct smbcli_state *cli, struct torture_context *tctx){ union smb_open io; const char *fname = BASEDIR "\\torture_create.txt"; NTSTATUS status; int fnum = -1; bool ret = true; time_t basetime = (time(NULL) + 3600*24*3) & ~1; union smb_fileinfo finfo; printf("Checking RAW_OPEN_CREATE\n"); io.create.level = RAW_OPEN_CREATE; io.create.in.attrib = 0; io.create.in.write_time = 0; io.create.in.fname = fname; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.create.out.file.fnum; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); smbcli_close(cli->tree, io.create.out.file.fnum); smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); /* make sure write_time works */ io.create.in.write_time = basetime; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.create.out.file.fnum; CHECK_TIME(basetime, write_time); smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); /* make sure file_attrs works */ io.create.in.attrib = FILE_ATTRIBUTE_HIDDEN; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.create.out.file.fnum; CHECK_ALL_INFO(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_ARCHIVE, attrib & ~FILE_ATTRIBUTE_NONINDEXED); done: smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); return ret;}/* test RAW_OPEN_CTEMP*/static bool test_ctemp(struct smbcli_state *cli, TALLOC_CTX *tctx){ union smb_open io; NTSTATUS status; int fnum = -1; bool ret = true; time_t basetime = (time(NULL) + 3600*24*3) & ~1; union smb_fileinfo finfo; const char *name, *fname = NULL; printf("Checking RAW_OPEN_CTEMP\n"); io.ctemp.level = RAW_OPEN_CTEMP; io.ctemp.in.attrib = FILE_ATTRIBUTE_HIDDEN; io.ctemp.in.write_time = basetime; io.ctemp.in.directory = BASEDIR; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.ctemp.out.file.fnum; name = io.ctemp.out.name; finfo.generic.level = RAW_FILEINFO_NAME_INFO; finfo.generic.in.file.fnum = fnum; status = smb_raw_fileinfo(cli->tree, tctx, &finfo); CHECK_STATUS(status, NT_STATUS_OK); fname = finfo.name_info.out.fname.s; d_printf("ctemp name=%s real name=%s\n", name, fname);done: smbcli_close(cli->tree, fnum); if (fname) { smbcli_unlink(cli->tree, fname); } return ret;}/* test chained RAW_OPEN_OPENX_READX*/static bool test_chained(struct smbcli_state *cli, TALLOC_CTX *tctx){ union smb_open io; const char *fname = BASEDIR "\\torture_chained.txt"; NTSTATUS status; int fnum = -1; bool ret = true; const char *buf = "test"; char buf2[4]; printf("Checking RAW_OPEN_OPENX chained with READX\n"); smbcli_unlink(cli->tree, fname); fnum = create_complex_file(cli, tctx, fname); smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf)); smbcli_close(cli->tree, fnum); io.openxreadx.level = RAW_OPEN_OPENX_READX; io.openxreadx.in.fname = fname; io.openxreadx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO; io.openxreadx.in.open_mode = OPENX_MODE_ACCESS_RDWR; io.openxreadx.in.open_func = OPENX_OPEN_FUNC_OPEN; io.openxreadx.in.search_attrs = 0; io.openxreadx.in.file_attrs = 0; io.openxreadx.in.write_time = 0; io.openxreadx.in.size = 1024*1024; io.openxreadx.in.timeout = 0; io.openxreadx.in.offset = 0; io.openxreadx.in.mincnt = sizeof(buf); io.openxreadx.in.maxcnt = sizeof(buf); io.openxreadx.in.remaining = 0; io.openxreadx.out.data = (uint8_t *)buf2; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.openxreadx.out.file.fnum; if (memcmp(buf, buf2, sizeof(buf)) != 0) { d_printf("wrong data in reply buffer\n"); ret = false; }done: smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); return ret;}/* test RAW_OPEN_OPENX without a leading slash on the path. NetApp filers are known to fail on this. */static bool test_no_leading_slash(struct smbcli_state *cli, TALLOC_CTX *tctx){ union smb_open io; const char *fname = BASEDIR "\\torture_no_leading_slash.txt"; NTSTATUS status; int fnum = -1; bool ret = true; const char *buf = "test"; printf("Checking RAW_OPEN_OPENX without leading slash on path\n"); smbcli_unlink(cli->tree, fname); /* Create the file */ fnum = create_complex_file(cli, tctx, fname); smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf)); smbcli_close(cli->tree, fnum); /* Prepare to open the file using path without leading slash */ io.openx.level = RAW_OPEN_OPENX; io.openx.in.fname = fname + 1; io.openx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO; io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR; io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN; io.openx.in.search_attrs = 0; io.openx.in.file_attrs = 0; io.openx.in.write_time = 0; io.openx.in.size = 1024*1024; io.openx.in.timeout = 0; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.openx.out.file.fnum;done: smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); return ret;}/* A little torture test to expose a race condition in Samba 3.0.20 ... :-) */static bool test_raw_open_multi(struct torture_context *tctx){ struct smbcli_state *cli; TALLOC_CTX *mem_ctx = talloc_init("torture_test_oplock_multi"); const char *fname = "\\test_oplock.dat"; NTSTATUS status; bool ret = true; union smb_open io; struct smbcli_state **clients; struct smbcli_request **requests; union smb_open *ios; const char *host = torture_setting_string(tctx, "host", NULL); const char *share = torture_setting_string(tctx, "share", NULL); int i, num_files = 3; int num_ok = 0; int num_collision = 0; clients = talloc_array(mem_ctx, struct smbcli_state *, num_files); requests = talloc_array(mem_ctx, struct smbcli_request *, num_files); ios = talloc_array(mem_ctx, union smb_open, num_files); if ((tctx->ev == NULL) || (clients == NULL) || (requests == NULL) || (ios == NULL)) { DEBUG(0, ("talloc failed\n")); return false; } if (!torture_open_connection_share(mem_ctx, &cli, tctx, host, share, tctx->ev)) { return false; } cli->tree->session->transport->options.request_timeout = 60; for (i=0; i<num_files; i++) { if (!torture_open_connection_share(mem_ctx, &(clients[i]), tctx, host, share, tctx->ev)) { DEBUG(0, ("Could not open %d'th connection\n", i)); return false; } clients[i]->tree->session->transport->options.request_timeout = 60; } /* cleanup */ smbcli_unlink(cli->tree, fname); /* base ntcreatex parms */ io.generic.level = RAW_OPEN_NTCREATEX; io.ntcreatex.in.root_fid = 0; io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; io.ntcreatex.in.alloc_size = 0; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.create_options = 0; io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; io.ntcreatex.in.security_flags = 0; io.ntcreatex.in.fname = fname; io.ntcreatex.in.flags = 0; for (i=0; i<num_files; i++) { ios[i] = io; requests[i] = smb_raw_open_send(clients[i]->tree, &ios[i]); if (requests[i] == NULL) { DEBUG(0, ("could not send %d'th request\n", i)); return false; } } DEBUG(10, ("waiting for replies\n")); while (1) { bool unreplied = false; for (i=0; i<num_files; i++) { if (requests[i] == NULL) { continue; } if (requests[i]->state < SMBCLI_REQUEST_DONE) { unreplied = true; break; } status = smb_raw_open_recv(requests[i], mem_ctx, &ios[i]); DEBUG(0, ("File %d returned status %s\n", i, nt_errstr(status))); if (NT_STATUS_IS_OK(status)) { num_ok += 1; } if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { num_collision += 1; } requests[i] = NULL; } if (!unreplied) { break; } if (event_loop_once(tctx->ev) != 0) { DEBUG(0, ("event_loop_once failed\n")); return false; } } if ((num_ok != 1) || (num_ok + num_collision != num_files)) { ret = false; } for (i=0; i<num_files; i++) { torture_close_connection(clients[i]); } talloc_free(mem_ctx); return ret;}/* basic testing of all RAW_OPEN_* calls */bool torture_raw_open(struct torture_context *torture, struct smbcli_state *cli){ bool ret = true; if (!torture_setup_dir(cli, BASEDIR)) { return false; } ret &= test_ntcreatex_brlocked(cli, torture); ret &= test_open(cli, torture); ret &= test_raw_open_multi(torture); ret &= test_openx(cli, torture); ret &= test_ntcreatex(cli, torture); ret &= test_nttrans_create(cli, torture); ret &= test_t2open(cli, torture); ret &= test_mknew(cli, torture); ret &= test_create(cli, torture); ret &= test_ctemp(cli, torture); ret &= test_chained(cli, torture); ret &= test_no_leading_slash(cli, torture); smb_raw_exit(cli->session); smbcli_deltree(cli->tree, BASEDIR); return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -