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

📄 clifile.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	}	if (cli_is_error(cli)) {		return False;	}	return True;}/**************************************************************************** Remove a directory.****************************************************************************/BOOL cli_rmdir(struct cli_state *cli, const char *dname){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,0, 0, True);	SCVAL(cli->outbuf,smb_com,SMBrmdir);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	p = smb_buf(cli->outbuf);	*p++ = 4;      	p += clistr_push(cli, p, dname, -1, STR_TERMINATE);	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (cli_is_error(cli)) {		return False;	}	return True;}/**************************************************************************** Set or clear the delete on close flag.****************************************************************************/int cli_nt_delete_on_close(struct cli_state *cli, int fnum, BOOL flag){	unsigned int data_len = 1;	unsigned int param_len = 6;	uint16 setup = TRANSACT2_SETFILEINFO;	pstring param;	unsigned char data;	char *rparam=NULL, *rdata=NULL;	memset(param, 0, param_len);	SSVAL(param,0,fnum);	SSVAL(param,2,SMB_SET_FILE_DISPOSITION_INFO);	data = flag ? 1 : 0;	if (!cli_send_trans(cli, SMBtrans2,						NULL,                        /* name */						-1, 0,                          /* fid, flags */						&setup, 1, 0,                   /* setup, length, max */						param, param_len, 2,            /* param, length, max */						(char *)&data,  data_len, cli->max_xmit /* data, length, max */						)) {		return False;	}	if (!cli_receive_trans(cli, SMBtrans2,						&rparam, &param_len,						&rdata, &data_len)) {		return False;	}	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return True;}/**************************************************************************** Open a file - exposing the full horror of the NT API :-). Used in smbtorture.****************************************************************************/int cli_nt_create_full(struct cli_state *cli, const char *fname, 		 uint32 CreatFlags, uint32 DesiredAccess,		 uint32 FileAttributes, uint32 ShareAccess,		 uint32 CreateDisposition, uint32 CreateOptions,		 uint8 SecuityFlags){	char *p;	int len;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,24,0,True);	SCVAL(cli->outbuf,smb_com,SMBntcreateX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,0xFF);	if (cli->use_oplocks)		CreatFlags |= (REQUEST_OPLOCK|REQUEST_BATCH_OPLOCK);		SIVAL(cli->outbuf,smb_ntcreate_Flags, CreatFlags);	SIVAL(cli->outbuf,smb_ntcreate_RootDirectoryFid, 0x0);	SIVAL(cli->outbuf,smb_ntcreate_DesiredAccess, DesiredAccess);	SIVAL(cli->outbuf,smb_ntcreate_FileAttributes, FileAttributes);	SIVAL(cli->outbuf,smb_ntcreate_ShareAccess, ShareAccess);	SIVAL(cli->outbuf,smb_ntcreate_CreateDisposition, CreateDisposition);	SIVAL(cli->outbuf,smb_ntcreate_CreateOptions, CreateOptions);	SIVAL(cli->outbuf,smb_ntcreate_ImpersonationLevel, 0x02);	SCVAL(cli->outbuf,smb_ntcreate_SecurityFlags, SecuityFlags);	p = smb_buf(cli->outbuf);	/* this alignment and termination is critical for netapp filers. Don't change */	p += clistr_align_out(cli, p, 0);	len = clistr_push(cli, p, fname, -1, 0);	p += len;	SSVAL(cli->outbuf,smb_ntcreate_NameLength, len);	/* sigh. this copes with broken netapp filer behaviour */	p += clistr_push(cli, p, "", -1, STR_TERMINATE);	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return -1;	}	if (cli_is_error(cli)) {		return -1;	}	return SVAL(cli->inbuf,smb_vwv2 + 1);}/**************************************************************************** Open a file.****************************************************************************/int cli_nt_create(struct cli_state *cli, const char *fname, uint32 DesiredAccess){	return cli_nt_create_full(cli, fname, 0, DesiredAccess, 0,				FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x0, 0x0);}/**************************************************************************** Open a file WARNING: if you open with O_WRONLY then getattrE won't work!****************************************************************************/int cli_open(struct cli_state *cli, const char *fname, int flags, int share_mode){	char *p;	unsigned openfn=0;	unsigned accessmode=0;	if (flags & O_CREAT)		openfn |= (1<<4);	if (!(flags & O_EXCL)) {		if (flags & O_TRUNC)			openfn |= (1<<1);		else			openfn |= (1<<0);	}	accessmode = (share_mode<<4);	if ((flags & O_ACCMODE) == O_RDWR) {		accessmode |= 2;	} else if ((flags & O_ACCMODE) == O_WRONLY) {		accessmode |= 1;	} #if defined(O_SYNC)	if ((flags & O_SYNC) == O_SYNC) {		accessmode |= (1<<14);	}#endif /* O_SYNC */	if (share_mode == DENY_FCB) {		accessmode = 0xFF;	}	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,15,0,True);	SCVAL(cli->outbuf,smb_com,SMBopenX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,0);  /* no additional info */	SSVAL(cli->outbuf,smb_vwv3,accessmode);	SSVAL(cli->outbuf,smb_vwv4,aSYSTEM | aHIDDEN);	SSVAL(cli->outbuf,smb_vwv5,0);	SSVAL(cli->outbuf,smb_vwv8,openfn);	if (cli->use_oplocks) {		/* if using oplocks then ask for a batch oplock via                   core and extended methods */		SCVAL(cli->outbuf,smb_flg, CVAL(cli->outbuf,smb_flg)|			FLAG_REQUEST_OPLOCK|FLAG_REQUEST_BATCH_OPLOCK);		SSVAL(cli->outbuf,smb_vwv2,SVAL(cli->outbuf,smb_vwv2) | 6);	}  	p = smb_buf(cli->outbuf);	p += clistr_push(cli, p, fname, -1, STR_TERMINATE);	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return -1;	}	if (cli_is_error(cli)) {		return -1;	}	return SVAL(cli->inbuf,smb_vwv2);}/**************************************************************************** Close a file.****************************************************************************/BOOL cli_close(struct cli_state *cli, int fnum){	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,3,0,True);	SCVAL(cli->outbuf,smb_com,SMBclose);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,fnum);	SIVALS(cli->outbuf,smb_vwv1,-1);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	return !cli_is_error(cli);}/**************************************************************************** send a lock with a specified locktype  this is used for testing LOCKING_ANDX_CANCEL_LOCK****************************************************************************/NTSTATUS cli_locktype(struct cli_state *cli, int fnum, 		      uint32 offset, uint32 len, int timeout, unsigned char locktype){	char *p;	int saved_timeout = cli->timeout;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0', smb_size);	set_message(cli->outbuf,8,0,True);	SCVAL(cli->outbuf,smb_com,SMBlockingX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SCVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,fnum);	SCVAL(cli->outbuf,smb_vwv3,locktype);	SIVALS(cli->outbuf, smb_vwv4, timeout);	SSVAL(cli->outbuf,smb_vwv6,0);	SSVAL(cli->outbuf,smb_vwv7,1);	p = smb_buf(cli->outbuf);	SSVAL(p, 0, cli->pid);	SIVAL(p, 2, offset);	SIVAL(p, 6, len);	p += 10;	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (timeout != 0) {		cli->timeout = (timeout == -1) ? 0x7FFFFFFF : (timeout + 2*1000);	}	if (!cli_receive_smb(cli)) {		cli->timeout = saved_timeout;		return NT_STATUS_UNSUCCESSFUL;	}	cli->timeout = saved_timeout;	return cli_nt_error(cli);}/**************************************************************************** Lock a file. note that timeout is in units of 2 milliseconds****************************************************************************/BOOL cli_lock(struct cli_state *cli, int fnum, 	      uint32 offset, uint32 len, int timeout, enum brl_type lock_type){	char *p;	int saved_timeout = cli->timeout;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0', smb_size);	set_message(cli->outbuf,8,0,True);	SCVAL(cli->outbuf,smb_com,SMBlockingX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SCVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,fnum);	SCVAL(cli->outbuf,smb_vwv3,(lock_type == READ_LOCK? 1 : 0));	SIVALS(cli->outbuf, smb_vwv4, timeout);	SSVAL(cli->outbuf,smb_vwv6,0);	SSVAL(cli->outbuf,smb_vwv7,1);	p = smb_buf(cli->outbuf);	SSVAL(p, 0, cli->pid);	SIVAL(p, 2, offset);	SIVAL(p, 6, len);	p += 10;	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (timeout != 0) {		cli->timeout = (timeout == -1) ? 0x7FFFFFFF : (timeout*2 + 5*1000);	}	if (!cli_receive_smb(cli)) {		cli->timeout = saved_timeout;		return False;	}	cli->timeout = saved_timeout;	if (cli_is_error(cli)) {		return False;	}	return True;}/**************************************************************************** Unlock a file.****************************************************************************/BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,8,0,True);	SCVAL(cli->outbuf,smb_com,SMBlockingX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SCVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,fnum);	SCVAL(cli->outbuf,smb_vwv3,0);	SIVALS(cli->outbuf, smb_vwv4, 0);	SSVAL(cli->outbuf,smb_vwv6,1);	SSVAL(cli->outbuf,smb_vwv7,0);	p = smb_buf(cli->outbuf);	SSVAL(p, 0, cli->pid);	SIVAL(p, 2, offset);	SIVAL(p, 6, len);	p += 10;	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (cli_is_error(cli)) {		return False;	}	return True;}/**************************************************************************** Lock a file with 64 bit offsets.****************************************************************************/BOOL cli_lock64(struct cli_state *cli, int fnum, 		SMB_BIG_UINT offset, SMB_BIG_UINT len, int timeout, enum brl_type lock_type){	char *p;        int saved_timeout = cli->timeout;	int ltype;	if (! (cli->capabilities & CAP_LARGE_FILES)) {		return cli_lock(cli, fnum, offset, len, timeout, lock_type);	}	ltype = (lock_type == READ_LOCK? 1 : 0);	ltype |= LOCKING_ANDX_LARGE_FILES;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0', smb_size);	set_message(cli->outbuf,8,0,True);	SCVAL(cli->outbuf,smb_com,SMBlockingX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SCVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,fnum);	SCVAL(cli->outbuf,smb_vwv3,ltype);	SIVALS(cli->outbuf, smb_vwv4, timeout);	SSVAL(cli->outbuf,smb_vwv6,0);	SSVAL(cli->outbuf,smb_vwv7,1);	p = smb_buf(cli->outbuf);	SIVAL(p, 0, cli->pid);	SOFF_T_R(p, 4, offset);	SOFF_T_R(p, 12, len);	p += 20;	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (timeout != 0) {		cli->timeout = (timeout == -1) ? 0x7FFFFFFF : (timeout + 5*1000);	}	if (!cli_receive_smb(cli)) {                cli->timeout = saved_timeout;		return False;	}	cli->timeout = saved_timeout;	if (cli_is_error(cli)) {		return False;	}	return True;}/**************************************************************************** Unlock a file with 64 bit offsets.****************************************************************************/BOOL cli_unlock64(struct cli_state *cli, int fnum, SMB_BIG_UINT offset, SMB_BIG_UINT len){	char *p;	if (! (cli->capabilities & CAP_LARGE_FILES)) {		return cli_unlock(cli, fnum, offset, len);	}	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,8,0,True);	SCVAL(cli->outbuf,smb_com,SMBlockingX);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SCVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,fnum);	SCVAL(cli->outbuf,smb_vwv3,LOCKING_ANDX_LARGE_FILES);	SIVALS(cli->outbuf, smb_vwv4, 0);	SSVAL(cli->outbuf,smb_vwv6,1);	SSVAL(cli->outbuf,smb_vwv7,0);	p = smb_buf(cli->outbuf);	SIVAL(p, 0, cli->pid);	SOFF_T_R(p, 4, offset);	SOFF_T_R(p, 12, len);	p += 20;	cli_setup_bcc(cli, p);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (cli_is_error(cli)) {		return False;	}	return True;}/**************************************************************************** Do a SMBgetattrE call.****************************************************************************/BOOL cli_getattrE(struct cli_state *cli, int fd, 		  uint16 *attr, SMB_OFF_T *size, 		  time_t *c_time, time_t *a_time, time_t *m_time){	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,1,0,True);	SCVAL(cli->outbuf,smb_com,SMBgetattrE);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,fd);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}		if (cli_is_error(cli)) {		return False;	}	if (size) {		*size = IVAL(cli->inbuf, smb_vwv6);	}	if (attr) {		*attr = SVAL(cli->inbuf,smb_vwv10);	}

⌨️ 快捷键说明

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