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

📄 clifile.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (c_time) {		*c_time = cli_make_unix_date2(cli, cli->inbuf+smb_vwv0);	}	if (a_time) {		*a_time = cli_make_unix_date2(cli, cli->inbuf+smb_vwv2);	}	if (m_time) {		*m_time = cli_make_unix_date2(cli, cli->inbuf+smb_vwv4);	}	return True;}/**************************************************************************** Do a SMBgetatr call****************************************************************************/BOOL cli_getatr(struct cli_state *cli, const char *fname, 		uint16 *attr, SMB_OFF_T *size, time_t *t){	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,SMBgetatr);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	p = smb_buf(cli->outbuf);	*p++ = 4;	p += clistr_push(cli, p, fname, -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;	}	if (size) {		*size = IVAL(cli->inbuf, smb_vwv3);	}	if (t) {		*t = cli_make_unix_date3(cli, cli->inbuf+smb_vwv1);	}	if (attr) {		*attr = SVAL(cli->inbuf,smb_vwv0);	}	return True;}/**************************************************************************** Do a SMBsetattrE call.****************************************************************************/BOOL cli_setattrE(struct cli_state *cli, int fd,		  time_t c_time, time_t a_time, time_t m_time){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,7,0,True);	SCVAL(cli->outbuf,smb_com,SMBsetattrE);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0, fd);	cli_put_dos_date2(cli, cli->outbuf,smb_vwv1, c_time);	cli_put_dos_date2(cli, cli->outbuf,smb_vwv3, a_time);	cli_put_dos_date2(cli, cli->outbuf,smb_vwv5, m_time);	p = smb_buf(cli->outbuf);	*p++ = 4;	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 SMBsetatr call.****************************************************************************/BOOL cli_setatr(struct cli_state *cli, const char *fname, uint16 attr, time_t t){	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,SMBsetatr);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0, attr);	cli_put_dos_date3(cli, cli->outbuf,smb_vwv1, t);	p = smb_buf(cli->outbuf);	*p++ = 4;	p += clistr_push(cli, p, fname, -1, STR_TERMINATE);	*p++ = 4;	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;}/**************************************************************************** Check for existance of a dir.****************************************************************************/BOOL cli_chkpath(struct cli_state *cli, const char *path){	pstring path2;	char *p;		pstrcpy(path2,path);	trim_char(path2,'\0','\\');	if (!*path2)		*path2 = '\\';		memset(cli->outbuf,'\0',smb_size);	set_message(cli->outbuf,0,0,True);	SCVAL(cli->outbuf,smb_com,SMBchkpth);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	p = smb_buf(cli->outbuf);	*p++ = 4;	p += clistr_push(cli, p, path2, -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;}/**************************************************************************** Query disk space.****************************************************************************/BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail){	memset(cli->outbuf,'\0',smb_size);	set_message(cli->outbuf,0,0,True);	SCVAL(cli->outbuf,smb_com,SMBdskattr);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return False;	}	*bsize = SVAL(cli->inbuf,smb_vwv1)*SVAL(cli->inbuf,smb_vwv2);	*total = SVAL(cli->inbuf,smb_vwv0);	*avail = SVAL(cli->inbuf,smb_vwv3);		return True;}/**************************************************************************** Create and open a temporary file.****************************************************************************/int cli_ctemp(struct cli_state *cli, const char *path, char **tmp_path){	int len;	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,3,0,True);	SCVAL(cli->outbuf,smb_com,SMBctemp);	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,0);	SIVALS(cli->outbuf,smb_vwv1,-1);	p = smb_buf(cli->outbuf);	*p++ = 4;	p += clistr_push(cli, p, path, -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;	}	/* despite the spec, the result has a -1, followed by	   length, followed by name */	p = smb_buf(cli->inbuf);	p += 4;	len = smb_buflen(cli->inbuf) - 4;	if (len <= 0) return -1;	if (tmp_path) {		pstring path2;		clistr_pull(cli, path2, p, 			    sizeof(path2), len, STR_ASCII);		*tmp_path = SMB_STRDUP(path2);	}	return SVAL(cli->inbuf,smb_vwv0);}/*    send a raw ioctl - used by the torture code*/NTSTATUS cli_raw_ioctl(struct cli_state *cli, int fnum, uint32 code, DATA_BLOB *blob){	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf, 3, 0, True);	SCVAL(cli->outbuf,smb_com,SMBioctl);	cli_setup_packet(cli);	SSVAL(cli->outbuf, smb_vwv0, fnum);	SSVAL(cli->outbuf, smb_vwv1, code>>16);	SSVAL(cli->outbuf, smb_vwv2, (code&0xFFFF));	cli_send_smb(cli);	if (!cli_receive_smb(cli)) {		return NT_STATUS_UNEXPECTED_NETWORK_ERROR;	}	if (cli_is_error(cli)) {		return cli_nt_error(cli);	}	*blob = data_blob(NULL, 0);	return NT_STATUS_OK;}/********************************************************* Set an extended attribute utility fn.*********************************************************/static BOOL cli_set_ea(struct cli_state *cli, uint16 setup, char *param, unsigned int param_len,			const char *ea_name, const char *ea_val, size_t ea_len){		unsigned int data_len = 0;	char *data = NULL;	char *rparam=NULL, *rdata=NULL;	char *p;	size_t ea_namelen = strlen(ea_name);	if (ea_namelen == 0 && ea_len == 0) {		data_len = 4;		data = SMB_MALLOC(data_len);		if (!data) {			return False;		}		p = data;		SIVAL(p,0,data_len);	} else {		data_len = 4 + 4 + ea_namelen + 1 + ea_len;		data = SMB_MALLOC(data_len);		if (!data) {			return False;		}		p = data;		SIVAL(p,0,data_len);		p += 4;		SCVAL(p, 0, 0); /* EA flags. */		SCVAL(p, 1, ea_namelen);		SSVAL(p, 2, ea_len);		memcpy(p+4, ea_name, ea_namelen+1); /* Copy in the name. */		memcpy(p+4+ea_namelen+1, ea_val, ea_len);	}	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 */		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(data);	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return True;}/********************************************************* Set an extended attribute on a pathname.*********************************************************/BOOL cli_set_ea_path(struct cli_state *cli, const char *path, const char *ea_name, const char *ea_val, size_t ea_len){	uint16 setup = TRANSACT2_SETPATHINFO;	unsigned int param_len = 0;	char param[sizeof(pstring)+6];	size_t srclen = 2*(strlen(path)+1);	char *p;	memset(param, 0, sizeof(param));	SSVAL(param,0,SMB_INFO_SET_EA);	p = &param[6];	p += clistr_push(cli, p, path, MIN(srclen, sizeof(param)-6), STR_TERMINATE);	param_len = PTR_DIFF(p, param);	return cli_set_ea(cli, setup, param, param_len, ea_name, ea_val, ea_len);}/********************************************************* Set an extended attribute on an fnum.*********************************************************/BOOL cli_set_ea_fnum(struct cli_state *cli, int fnum, const char *ea_name, const char *ea_val, size_t ea_len){	char param[6];	uint16 setup = TRANSACT2_SETFILEINFO;	memset(param, 0, 6);	SSVAL(param,0,fnum);	SSVAL(param,2,SMB_INFO_SET_EA);	return cli_set_ea(cli, setup, param, 6, ea_name, ea_val, ea_len);}/********************************************************* Get an extended attribute list tility fn.*********************************************************/static BOOL cli_get_ea_list(struct cli_state *cli,		uint16 setup, char *param, unsigned int param_len,		TALLOC_CTX *ctx,		size_t *pnum_eas,		struct ea_struct **pea_list){	unsigned int data_len = 0;	unsigned int rparam_len, rdata_len;	char *rparam=NULL, *rdata=NULL;	char *p;	size_t ea_size;	size_t num_eas;	BOOL ret = False;	struct ea_struct *ea_list;	*pnum_eas = 0;	*pea_list = NULL;	if (!cli_send_trans(cli, SMBtrans2,			NULL,           /* Name */			-1, 0,          /* fid, flags */			&setup, 1, 0,   /* setup, length, max */			param, param_len, 10, /* param, length, max */			NULL, data_len, cli->max_xmit /* data, length, max */				)) {		return False;	}	if (!cli_receive_trans(cli, SMBtrans2,			&rparam, &rparam_len,			&rdata, &rdata_len)) {		return False;	}	if (!rdata || rdata_len < 4) {		goto out;	}	ea_size = (size_t)IVAL(rdata,0);	if (ea_size > rdata_len) {		goto out;	}	if (ea_size == 0) {		/* No EA's present. */		ret = True;		goto out;	}	p = rdata + 4;	ea_size -= 4;	/* Validate the EA list and count it. */	for (num_eas = 0; ea_size >= 4; num_eas++) {		unsigned int ea_namelen = CVAL(p,1);		unsigned int ea_valuelen = SVAL(p,2);		if (ea_namelen == 0) {			goto out;		}		if (4 + ea_namelen + 1 + ea_valuelen > ea_size) {			goto out;		}		ea_size -= 4 + ea_namelen + 1 + ea_valuelen;		p += 4 + ea_namelen + 1 + ea_valuelen;	}	if (num_eas == 0) {		ret = True;		goto out;	}	*pnum_eas = num_eas;	if (!pea_list) {		/* Caller only wants number of EA's. */		ret = True;		goto out;	}	ea_list = TALLOC_ARRAY(ctx, struct ea_struct, num_eas);	if (!ea_list) {		goto out;	}	ea_size = (size_t)IVAL(rdata,0);	p = rdata + 4;	for (num_eas = 0; num_eas < *pnum_eas; num_eas++ ) {		struct ea_struct *ea = &ea_list[num_eas];		fstring unix_ea_name;		unsigned int ea_namelen = CVAL(p,1);		unsigned int ea_valuelen = SVAL(p,2);		ea->flags = CVAL(p,0);		unix_ea_name[0] = '\0';		pull_ascii_fstring(unix_ea_name, p + 4);		ea->name = talloc_strdup(ctx, unix_ea_name);		/* Ensure the value is null terminated (in case it's a string). */		ea->value = data_blob_talloc(ctx, NULL, ea_valuelen + 1);		if (!ea->value.data) {			goto out;		}		if (ea_valuelen) {			memcpy(ea->value.data, p+4+ea_namelen+1, ea_valuelen);		}		ea->value.data[ea_valuelen] = 0;		ea->value.length--;		p += 4 + ea_namelen + 1 + ea_valuelen;	}	*pea_list = ea_list;	ret = True; out :	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return ret;}/********************************************************* Get an extended attribute list from a pathname.*********************************************************/BOOL cli_get_ea_list_path(struct cli_state *cli, const char *path,		TALLOC_CTX *ctx,		size_t *pnum_eas,		struct ea_struct **pea_list){	uint16 setup = TRANSACT2_QPATHINFO;	unsigned int param_len = 0;	char param[sizeof(pstring)+6];	char *p;	p = param;	memset(p, 0, 6);	SSVAL(p, 0, SMB_INFO_QUERY_ALL_EAS);	p += 6;	p += clistr_push(cli, p, path, sizeof(pstring)-6, STR_TERMINATE);	param_len = PTR_DIFF(p, param);	return cli_get_ea_list(cli, setup, param, param_len, ctx, pnum_eas, pea_list);}/********************************************************* Get an extended attribute list from an fnum.*********************************************************/BOOL cli_get_ea_list_fnum(struct cli_state *cli, int fnum,		TALLOC_CTX *ctx,		size_t *pnum_eas,		struct ea_struct **pea_list){	uint16 setup = TRANSACT2_QFILEINFO;	char param[6];	memset(param, 0, 6);	SSVAL(param,0,fnum);	SSVAL(param,2,SMB_INFO_SET_EA);	return cli_get_ea_list(cli, setup, param, 6, ctx, pnum_eas, pea_list);}

⌨️ 快捷键说明

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