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

📄 clientgen.c

📁 MC Linux/Unix 终端下文件管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
	SSVAL(cli->outbuf,smb_vwv0,aSYSTEM | aHIDDEN);  	p = smb_buf(cli->outbuf);	*p++ = 4;      	pstrcpy(p,fname);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	return True;}/****************************************************************************create a directory****************************************************************************/BOOL cli_mkdir(struct cli_state *cli, char *dname){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,0, 2 + strlen(dname),True);	CVAL(cli->outbuf,smb_com) = SMBmkdir;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	p = smb_buf(cli->outbuf);	*p++ = 4;      	pstrcpy(p,dname);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	return True;}/****************************************************************************remove a directory****************************************************************************/BOOL cli_rmdir(struct cli_state *cli, char *dname){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,0, 2 + strlen(dname),True);	CVAL(cli->outbuf,smb_com) = SMBrmdir;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	p = smb_buf(cli->outbuf);	*p++ = 4;      	pstrcpy(p,dname);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	return True;}/****************************************************************************open a file****************************************************************************/int cli_nt_create(struct cli_state *cli, char *fname){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,24,1 + strlen(fname),True);	CVAL(cli->outbuf,smb_com) = SMBntcreateX;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,0xFF);	SIVAL(cli->outbuf,smb_ntcreate_Flags, 0x06);	SIVAL(cli->outbuf,smb_ntcreate_RootDirectoryFid, 0x0);	SIVAL(cli->outbuf,smb_ntcreate_DesiredAccess, 0x2019f);	SIVAL(cli->outbuf,smb_ntcreate_FileAttributes, 0x0);	SIVAL(cli->outbuf,smb_ntcreate_ShareAccess, 0x03);	SIVAL(cli->outbuf,smb_ntcreate_CreateDisposition, 0x01);	SIVAL(cli->outbuf,smb_ntcreate_CreateOptions, 0x0);	SIVAL(cli->outbuf,smb_ntcreate_ImpersonationLevel, 0x02);	SSVAL(cli->outbuf,smb_ntcreate_NameLength, strlen(fname));	p = smb_buf(cli->outbuf);	pstrcpy(p,fname);	p = skip_string(p,1);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return -1;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return -1;	}	return SVAL(cli->inbuf,smb_vwv2 + 1);}/****************************************************************************open a file****************************************************************************/int cli_open(struct cli_state *cli, char *fname, int flags, int share_mode){	char *p;	unsigned openfn=0;	unsigned accessmode=0;	/* you must open for RW not just write - otherwise getattrE doesn't	   work! */	if ((flags & O_ACCMODE) == O_WRONLY && strncmp(cli->dev, "LPT", 3)) {		flags = (flags & ~O_ACCMODE) | O_RDWR;	}	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 */	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,15,1 + strlen(fname),True);	CVAL(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);  	p = smb_buf(cli->outbuf);	pstrcpy(p,fname);	p = skip_string(p,1);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return -1;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		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);	CVAL(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;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	return True;}/****************************************************************************  lock a file****************************************************************************/BOOL cli_lock(struct cli_state *cli, int fnum, uint32 offset, uint32 len, int timeout){	char *p;        int saved_timeout = cli->timeout;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0', smb_size);	set_message(cli->outbuf,8,10,True);	CVAL(cli->outbuf,smb_com) = SMBlockingX;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	CVAL(cli->outbuf,smb_vwv0) = 0xFF;	SSVAL(cli->outbuf,smb_vwv2,fnum);	CVAL(cli->outbuf,smb_vwv3) = 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);	cli_send_smb(cli);        cli->timeout = (timeout == -1) ? 0x7FFFFFFF : timeout;	if (!cli_receive_smb(cli)) {                cli->timeout = saved_timeout;		return False;	}	cli->timeout = saved_timeout;	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	return True;}/****************************************************************************  unlock a file****************************************************************************/BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len, int timeout){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,8,10,True);	CVAL(cli->outbuf,smb_com) = SMBlockingX;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	CVAL(cli->outbuf,smb_vwv0) = 0xFF;	SSVAL(cli->outbuf,smb_vwv2,fnum);	CVAL(cli->outbuf,smb_vwv3) = 0;	SIVALS(cli->outbuf, smb_vwv4, timeout);	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);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	return True;}/****************************************************************************issue a single SMBread and don't wait for a reply****************************************************************************/static void cli_issue_read(struct cli_state *cli, int fnum, off_t offset, 			   size_t size, int i){	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,10,0,True);			CVAL(cli->outbuf,smb_com) = SMBreadX;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	CVAL(cli->outbuf,smb_vwv0) = 0xFF;	SSVAL(cli->outbuf,smb_vwv2,fnum);	SIVAL(cli->outbuf,smb_vwv3,offset);	SSVAL(cli->outbuf,smb_vwv5,size);	SSVAL(cli->outbuf,smb_vwv6,size);	SSVAL(cli->outbuf,smb_mid,cli->mid + i);	cli_send_smb(cli);}/****************************************************************************  read from a file****************************************************************************/size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t size){	char *p;	int total = -1;	int issued=0;	int received=0;	int mpx = MAX(cli->max_mux-1, 1);	int block = (cli->max_xmit - (smb_size+32)) & ~1023;	int mid;	int blocks = (size + (block-1)) / block;	if (size == 0) return 0;	while (received < blocks) {		int size2;		while (issued - received < mpx && issued < blocks) {			int size1 = MIN(block, size-issued*block);			cli_issue_read(cli, fnum, offset+issued*block, size1, issued);			issued++;		}		if (!cli_receive_smb(cli)) {			return total;		}		received++;		mid = SVAL(cli->inbuf, smb_mid) - cli->mid;		size2 = SVAL(cli->inbuf, smb_vwv5);		if (CVAL(cli->inbuf,smb_rcls) != 0) {			blocks = MIN(blocks, mid-1);			continue;		}		if (size2 <= 0) {			blocks = MIN(blocks, mid-1);			/* this distinguishes EOF from an error */			total = MAX(total, 0);			continue;		}		if (size2 > block) {			DEBUG(0,("server returned more than we wanted!\n"));			exit(1);		}		if (mid >= issued) {			DEBUG(0,("invalid mid from server!\n"));			exit(1);		}		p = smb_base(cli->inbuf) + SVAL(cli->inbuf,smb_vwv6);		memcpy(buf+mid*block, p, size2);		total = MAX(total, mid*block + size2);	}	while (received < issued) {		cli_receive_smb(cli);		received++;	}		return total;}/****************************************************************************issue a single SMBwrite and don't wait for a reply****************************************************************************/static void cli_issue_write(struct cli_state *cli, int fnum, off_t offset, uint16 mode, char *buf,			    size_t size, int i){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,12,size,True);		CVAL(cli->outbuf,smb_com) = SMBwriteX;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);		CVAL(cli->outbuf,smb_vwv0) = 0xFF;	SSVAL(cli->outbuf,smb_vwv2,fnum);	SIVAL(cli->outbuf,smb_vwv3,offset);	SIVAL(cli->outbuf,smb_vwv5,IS_BITS_SET_ALL(mode, 0x0008) ? 0xFFFFFFFF : 0);	SSVAL(cli->outbuf,smb_vwv7,mode);	SSVAL(cli->outbuf,smb_vwv8,IS_BITS_SET_ALL(mode, 0x0008) ? size : 0);	SSVAL(cli->outbuf,smb_vwv10,size);	SSVAL(cli->outbuf,smb_vwv11,	      smb_buf(cli->outbuf) - smb_base(cli->outbuf));		p = smb_base(cli->outbuf) + SVAL(cli->outbuf,smb_vwv11);	memcpy(p, buf, size);	SSVAL(cli->outbuf,smb_mid,cli->mid + i);		show_msg(cli->outbuf);	cli_send_smb(cli);}/****************************************************************************  write to a file  write_mode: 0x0001 disallow write cacheing              0x0002 return bytes remaining              0x0004 use raw named pipe protocol              0x0008 start of message mode named pipe protocol****************************************************************************/ssize_t cli_write(struct cli_state *cli,		  int fnum, uint16 write_mode,		  char *buf, off_t offset, size_t size){	int bwritten = 0;	int issued = 0;	int received = 0;	int mpx = MAX(cli->max_mux-1, 1);	int block = (cli->max_xmit - (smb_size+32)) & ~1023;	int blocks = (size + (block-1)) / block;	while (received < blocks) {		while ((issued - received < mpx) && (issued < blocks))		{			int bsent = issued * block;			int size1 = MIN(block, size - bsent);			cli_issue_write(cli, fnum, offset + bsent,			                write_mode,			                buf + bsent,					size1, issued);			issued++;		}		if (!cli_receive_smb(cli))		{			return bwritten;		}		received++;		if (CVAL(cli->inbuf,smb_rcls) != 0)		{			break;		}

⌨️ 快捷键说明

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