⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 samba3misc.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));	status = smbcli_chkpath(cli_nt->tree, "\t\\bla");	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_chkpath(cli_dos->tree, "\t\\bla");	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));	status = smbcli_chkpath(cli_nt->tree, "<");	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_chkpath(cli_dos->tree, "<");	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));	status = smbcli_chkpath(cli_nt->tree, "<\\bla");	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_chkpath(cli_dos->tree, "<\\bla");	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));	/*	 * .... And the same gang against getatr. Note that the DOS error codes	 * differ....	 */	status = smbcli_getatr(cli_nt->tree, fpath, NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OK);	status = smbcli_getatr(cli_dos->tree, fpath, NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OK);	status = smbcli_getatr(cli_nt->tree, "..", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);	status = smbcli_getatr(cli_dos->tree, "..", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath));	status = smbcli_getatr(cli_nt->tree, ".", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_getatr(cli_dos->tree, ".", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = smbcli_getatr(cli_nt->tree, "\t", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_getatr(cli_dos->tree, "\t", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = smbcli_getatr(cli_nt->tree, "\t\\bla", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_getatr(cli_dos->tree, "\t\\bla", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = smbcli_getatr(cli_nt->tree, "<", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_getatr(cli_dos->tree, "<", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = smbcli_getatr(cli_nt->tree, "<\\bla", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = smbcli_getatr(cli_dos->tree, "<\\bla", NULL, NULL, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	/* Try the same set with openX. */	status = raw_smbcli_open(cli_nt->tree, "..", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);	status = raw_smbcli_open(cli_dos->tree, "..", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath));	status = raw_smbcli_open(cli_nt->tree, ".", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = raw_smbcli_open(cli_dos->tree, ".", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = raw_smbcli_open(cli_nt->tree, "\t", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = raw_smbcli_open(cli_dos->tree, "\t", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = raw_smbcli_open(cli_nt->tree, "\t\\bla", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = raw_smbcli_open(cli_dos->tree, "\t\\bla", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = raw_smbcli_open(cli_nt->tree, "<", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = raw_smbcli_open(cli_dos->tree, "<", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	status = raw_smbcli_open(cli_nt->tree, "<\\bla", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);	status = raw_smbcli_open(cli_dos->tree, "<\\bla", O_RDONLY, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));	/* Let's test EEXIST error code mapping. */	status = raw_smbcli_open(cli_nt->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);	status = raw_smbcli_open(cli_dos->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));	status = raw_smbcli_t2open(cli_nt->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);	if (!NT_STATUS_EQUAL(status, NT_STATUS_EAS_NOT_SUPPORTED)	    || !torture_setting_bool(torture, "samba3", false)) {		/* Against samba3, treat EAS_NOT_SUPPORTED as acceptable */		CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);	}	status = raw_smbcli_t2open(cli_dos->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);	if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS,ERReasnotsupported))	    || !torture_setting_bool(torture, "samba3", false)) {		/* Against samba3, treat EAS_NOT_SUPPORTED as acceptable */		CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));	}	status = raw_smbcli_ntcreate(cli_nt->tree, fpath, NULL);	CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);	status = raw_smbcli_ntcreate(cli_dos->tree, fpath, NULL);	CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));	/* Try the rename test. */	{		union smb_rename io;		memset(&io, '\0', sizeof(io));		io.rename.in.pattern1 = fpath1;		io.rename.in.pattern2 = fpath;		/* Try with SMBmv rename. */		status = smb_raw_rename(cli_nt->tree, &io);		CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);		status = smb_raw_rename(cli_dos->tree, &io);		CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRrename));		/* Try with NT rename. */		io.generic.level = RAW_RENAME_NTRENAME;		io.ntrename.in.old_name = fpath1;		io.ntrename.in.new_name = fpath;		io.ntrename.in.attrib = 0;		io.ntrename.in.cluster_size = 0;		io.ntrename.in.flags = RENAME_FLAG_RENAME;		status = smb_raw_rename(cli_nt->tree, &io);		CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);		status = smb_raw_rename(cli_dos->tree, &io);		CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRrename));	}	goto done; fail:	ret = false; done:	if (cli_nt != NULL) {		smbcli_deltree(cli_nt->tree, dirname);		torture_close_connection(cli_nt);	}	if (cli_dos != NULL) {		torture_close_connection(cli_dos);	}	talloc_free(mem_ctx);	return ret;}static void count_fn(struct clilist_file_info *info, const char *name,		     void *private_data){	int *counter = (int *)private_data;	*counter += 1;}bool torture_samba3_caseinsensitive(struct torture_context *torture){	struct smbcli_state *cli;	TALLOC_CTX *mem_ctx;	NTSTATUS status;	const char *dirname = "insensitive";	const char *ucase_dirname = "InSeNsItIvE";	const char *fname = "foo";	char *fpath;	int fnum;	int counter = 0;	bool ret = true;	if (!(mem_ctx = talloc_init("torture_samba3_caseinsensitive"))) {		d_printf("talloc_init failed\n");		return false;	}	if (!torture_open_connection(&cli, torture, 0)) {		goto done;	}	smbcli_deltree(cli->tree, dirname);	status = smbcli_mkdir(cli->tree, dirname);	if (!NT_STATUS_IS_OK(status)) {		d_printf("smbcli_mkdir failed: %s\n", nt_errstr(status));		goto done;	}	if (!(fpath = talloc_asprintf(mem_ctx, "%s\\%s", dirname, fname))) {		goto done;	}	fnum = smbcli_open(cli->tree, fpath, O_RDWR | O_CREAT, DENY_NONE);	if (fnum == -1) {		d_printf("Could not create file %s: %s\n", fpath,			 smbcli_errstr(cli->tree));		goto done;	}	smbcli_close(cli->tree, fnum);	smbcli_list(cli->tree, talloc_asprintf(			    mem_ctx, "%s\\*", ucase_dirname),		    FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN		    |FILE_ATTRIBUTE_SYSTEM,		    count_fn, (void *)&counter);	if (counter == 3) {		ret = true;	}	else {		d_fprintf(stderr, "expected 3 entries, got %d\n", counter);		ret = false;	} done:	talloc_free(mem_ctx);	return ret;}/* * Check that Samba3 correctly deals with conflicting posix byte range locks * on an underlying file */bool torture_samba3_posixtimedlock(struct torture_context *tctx){	struct smbcli_state *cli;	NTSTATUS status;	bool ret = true;	const char *dirname = "posixlock";	const char *fname = "locked";	const char *fpath;	const char *localdir;	const char *localname;	int fnum = -1;	int fd = -1;	struct flock posix_lock;	union smb_lock io;	struct smb_lock_entry lock_entry;	struct smbcli_request *req;	if (!torture_open_connection(&cli, tctx, 0)) {		ret = false;		goto done;	}	smbcli_deltree(cli->tree, dirname);	status = smbcli_mkdir(cli->tree, dirname);	if (!NT_STATUS_IS_OK(status)) {		torture_warning(tctx, "smbcli_mkdir failed: %s\n",				nt_errstr(status));		ret = false;		goto done;	}	if (!(fpath = talloc_asprintf(tctx, "%s\\%s", dirname, fname))) {		torture_warning(tctx, "talloc failed\n");		ret = false;		goto done;	}	fnum = smbcli_open(cli->tree, fpath, O_RDWR | O_CREAT, DENY_NONE);	if (fnum == -1) {		torture_warning(tctx, "Could not create file %s: %s\n", fpath,				smbcli_errstr(cli->tree));		ret = false;		goto done;	}	if (!(localdir = torture_setting_string(tctx, "localdir", NULL))) {		torture_warning(tctx, "Need 'localdir' setting\n");		ret = false;		goto done;	}	if (!(localname = talloc_asprintf(tctx, "%s/%s/%s", localdir, dirname,					  fname))) {		torture_warning(tctx, "talloc failed\n");		ret = false;		goto done;	}	/*	 * Lock a byte range from posix	 */	fd = open(localname, O_RDWR);	if (fd == -1) {		torture_warning(tctx, "open(%s) failed: %s\n",				localname, strerror(errno));		goto done;	}	posix_lock.l_type = F_WRLCK;	posix_lock.l_whence = SEEK_SET;	posix_lock.l_start = 0;	posix_lock.l_len = 1;	if (fcntl(fd, F_SETLK, &posix_lock) == -1) {		torture_warning(tctx, "fcntl failed: %s\n", strerror(errno));		ret = false;		goto done;	}	/*	 * Try a cifs brlock without timeout to see if posix locking = yes	 */	io.lockx.in.ulock_cnt = 0;	io.lockx.in.lock_cnt = 1;	lock_entry.count = 1;	lock_entry.offset = 0;	lock_entry.pid = cli->tree->session->pid;	io.lockx.level = RAW_LOCK_LOCKX;	io.lockx.in.mode = LOCKING_ANDX_LARGE_FILES;	io.lockx.in.timeout = 0;	io.lockx.in.locks = &lock_entry;	io.lockx.in.file.fnum = fnum;	status = smb_raw_lock(cli->tree, &io);	ret = true;	CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);	if (!ret) {		goto done;	}	/*	 * Now fire off a timed brlock, unlock the posix lock and see if the	 * timed lock gets through.	 */	io.lockx.in.timeout = 5000;	req = smb_raw_lock_send(cli->tree, &io);	if (req == NULL) {		torture_warning(tctx, "smb_raw_lock_send failed\n");		ret = false;		goto done;	}	/*	 * Ship the async timed request to the server	 */	event_loop_once(req->transport->socket->event.ctx);	msleep(500);	close(fd);	status = smbcli_request_simple_recv(req);	CHECK_STATUS(status, NT_STATUS_OK); done:	if (fnum != -1) {		smbcli_close(cli->tree, fnum);	}	if (fd != -1) {		close(fd);	}	smbcli_deltree(cli->tree, dirname);	return ret;}bool torture_samba3_rootdirfid(struct torture_context *tctx){	struct smbcli_state *cli;	NTSTATUS status;	uint16_t dnum;	union smb_open io;	const char *fname = "testfile";	bool ret = false;	if (!torture_open_connection(&cli, tctx, 0)) {		ret = false;		goto done;	}	smbcli_unlink(cli->tree, fname);	ZERO_STRUCT(io);	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.access_mask =		SEC_STD_SYNCHRONIZE | SEC_FILE_EXECUTE;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;	io.ntcreatex.in.share_access =		NTCREATEX_SHARE_ACCESS_READ		| NTCREATEX_SHARE_ACCESS_READ;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.fname = "\\";	status = smb_raw_open(cli->tree, tctx, &io);	if (!NT_STATUS_IS_OK(status)) {		d_printf("smb_open on the directory failed: %s\n",			 nt_errstr(status));		ret = false;		goto done;	}	dnum = io.ntcreatex.out.file.fnum;	io.ntcreatex.in.flags =		NTCREATEX_FLAGS_REQUEST_OPLOCK		| NTCREATEX_FLAGS_REQUEST_BATCH_OPLOCK;	io.ntcreatex.in.root_fid = dnum;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF;	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_NONE;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	if (!NT_STATUS_IS_OK(status)) {		d_printf("smb_open on the file %s failed: %s\n",			 fname, nt_errstr(status));		ret = false;		goto done;	}	smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);	smbcli_close(cli->tree, dnum);	smbcli_unlink(cli->tree, fname);	ret = true; done:	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -