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

📄 clirap.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
BOOL cli_setpathinfo(struct cli_state *cli, const char *fname,                      time_t c_time, time_t a_time, time_t m_time, uint16 mode){	unsigned int data_len = 0;	unsigned int param_len = 0;	unsigned int rparam_len, rdata_len;	uint16 setup = TRANSACT2_SETPATHINFO;	pstring param;        pstring data;	char *rparam=NULL, *rdata=NULL;	int count=8;	BOOL ret;        void (*date_fn)(struct cli_state *, char *buf,int offset,time_t unixdate);	char *p;	memset(param, 0, sizeof(param));	memset(data, 0, sizeof(data));        p = param;        /* Add the information level */	SSVAL(p, 0, SMB_INFO_STANDARD);        /* Skip reserved */	p += 6;        /* Add the file name */	p += clistr_push(cli, p, fname, sizeof(pstring)-6, STR_TERMINATE);	param_len = PTR_DIFF(p, param);        p = data;	if (cli->win95) {		date_fn = cli_put_dos_date;	} else {		date_fn = cli_put_dos_date2;	}        /* Add the create, last access, and modification times */        (*date_fn)(cli, p, 0, c_time);        (*date_fn)(cli, p, 4, a_time);        (*date_fn)(cli, p, 8, m_time);        p += 12;        /* Skip DataSize and AllocationSize */        p += 8;        /* Add attributes */        SSVAL(p, 0, mode);        p += 2;        /* Add EA size (none) */        SIVAL(p, 0, 0);        p += 4;        data_len = PTR_DIFF(p, data);	do {		ret = (cli_send_trans(cli, SMBtrans2, 				      NULL,           /* Name */				      -1, 0,          /* fid, flags */				      &setup, 1, 0,   /* setup, length, max */				      param, param_len, 10, /* param, length, max */				      data, data_len, cli->max_xmit /* data, length, max */				      ) &&		       cli_receive_trans(cli, SMBtrans2, 					 &rparam, &rparam_len,					 &rdata, &rdata_len));		if (!cli_is_dos_error(cli)) break;		if (!ret) {			/* we need to work around a Win95 bug - sometimes			   it gives ERRSRV/ERRerror temprarily */			uint8 eclass;			uint32 ecode;			cli_dos_error(cli, &eclass, &ecode);			if (eclass != ERRSRV || ecode != ERRerror) break;			smb_msleep(100);		}	} while (count-- && ret==False);	if (!ret) {		return False;	}	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return True;}/****************************************************************************send a qpathinfo call with the SMB_QUERY_FILE_ALL_INFO info level****************************************************************************/BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, 		    time_t *c_time, time_t *a_time, time_t *m_time, 		    time_t *w_time, SMB_OFF_T *size, uint16 *mode,		    SMB_INO_T *ino){	unsigned int data_len = 0;	unsigned int param_len = 0;	uint16 setup = TRANSACT2_QPATHINFO;	pstring param;	char *rparam=NULL, *rdata=NULL;	char *p;	p = param;	memset(p, 0, 6);	SSVAL(p, 0, SMB_QUERY_FILE_ALL_INFO);	p += 6;	p += clistr_push(cli, p, fname, sizeof(pstring)-6, STR_TERMINATE);	param_len = PTR_DIFF(p, param);	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, &param_len,                               &rdata, &data_len)) {		return False;	}	if (!rdata || data_len < 22) {		return False;	}        	if (c_time) {                *c_time = interpret_long_date(rdata+0);	}	if (a_time) {		*a_time = interpret_long_date(rdata+8);	}	if (w_time) {		*w_time = interpret_long_date(rdata+16);	}	if (m_time) {		*m_time = interpret_long_date(rdata+24);	}	if (mode) {		*mode = SVAL(rdata, 32);	}	if (size) {                *size = IVAL2_TO_SMB_BIG_UINT(rdata,48);	}	if (ino) {		*ino = IVAL(rdata, 64);	}	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return True;}/****************************************************************************send a qfileinfo QUERY_FILE_NAME_INFO call****************************************************************************/BOOL cli_qfilename(struct cli_state *cli, int fnum, 		   pstring name){	unsigned int data_len = 0;	unsigned int param_len = 0;	uint16 setup = TRANSACT2_QFILEINFO;	pstring param;	char *rparam=NULL, *rdata=NULL;	param_len = 4;	memset(param, 0, param_len);	SSVAL(param, 0, fnum);	SSVAL(param, 2, SMB_QUERY_FILE_NAME_INFO);	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 */                            NULL, data_len, cli->max_xmit /* data, length, max */                           )) {		return False;	}	if (!cli_receive_trans(cli, SMBtrans2,                               &rparam, &param_len,                               &rdata, &data_len)) {		return False;	}	if (!rdata || data_len < 4) {		return False;	}	clistr_pull(cli, name, rdata+4, sizeof(pstring), IVAL(rdata, 0), STR_UNICODE);	return True;}/****************************************************************************send a qfileinfo call****************************************************************************/BOOL cli_qfileinfo(struct cli_state *cli, int fnum, 		   uint16 *mode, SMB_OFF_T *size,		   time_t *c_time, time_t *a_time, time_t *m_time, 		   time_t *w_time, SMB_INO_T *ino){	unsigned int data_len = 0;	unsigned int param_len = 0;	uint16 setup = TRANSACT2_QFILEINFO;	pstring param;	char *rparam=NULL, *rdata=NULL;	/* if its a win95 server then fail this - win95 totally screws it	   up */	if (cli->win95) return False;	param_len = 4;	memset(param, 0, param_len);	SSVAL(param, 0, fnum);	SSVAL(param, 2, SMB_QUERY_FILE_ALL_INFO);	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 */                            NULL, data_len, cli->max_xmit /* data, length, max */                           )) {		return False;	}	if (!cli_receive_trans(cli, SMBtrans2,                               &rparam, &param_len,                               &rdata, &data_len)) {		return False;	}	if (!rdata || data_len < 68) {		return False;	}	if (c_time) {		*c_time = interpret_long_date(rdata+0) - cli->serverzone;	}	if (a_time) {		*a_time = interpret_long_date(rdata+8) - cli->serverzone;	}	if (m_time) {		*m_time = interpret_long_date(rdata+16) - cli->serverzone;	}	if (w_time) {		*w_time = interpret_long_date(rdata+24) - cli->serverzone;	}	if (mode) {		*mode = SVAL(rdata, 32);	}	if (size) {                *size = IVAL2_TO_SMB_BIG_UINT(rdata,48);	}	if (ino) {		*ino = IVAL(rdata, 64);	}	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return True;}/****************************************************************************send a qpathinfo BASIC_INFO call****************************************************************************/BOOL cli_qpathinfo_basic( struct cli_state *cli, const char *name,                           SMB_STRUCT_STAT *sbuf, uint32 *attributes ){	unsigned int param_len = 0;	unsigned int data_len = 0;	uint16 setup = TRANSACT2_QPATHINFO;	char param[sizeof(pstring)+6];	char *rparam=NULL, *rdata=NULL;	char *p;	pstring path;	int len;		/* send full paths to dfs root shares */		if ( cli->dfsroot )		pstr_sprintf(path, "\\%s\\%s\\%s", cli->desthost, cli->share, name );	else		pstrcpy( path, name );		/* cleanup */		len = strlen( path );	if ( path[len] == '\\' )		path[len] = '\0';	p = param;	memset(p, 0, 6);	SSVAL(p, 0, SMB_QUERY_FILE_BASIC_INFO);	p += 6;	p += clistr_push(cli, p, path, sizeof(pstring)-6, STR_TERMINATE);	param_len = PTR_DIFF(p, param);	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 */		NULL,  0, cli->max_xmit      /* data, length, max */		)) {			return False;	}	if (!cli_receive_trans(cli, SMBtrans2,		&rparam, &param_len,		&rdata, &data_len)) {			return False;	}	if (data_len < 36) {		SAFE_FREE(rdata);		SAFE_FREE(rparam);		return False;	}	sbuf->st_atime = interpret_long_date( rdata+8 );	sbuf->st_mtime = interpret_long_date( rdata+16 );	sbuf->st_ctime = interpret_long_date( rdata+24 );		*attributes = IVAL( rdata, 32 );		SAFE_FREE(rparam);	SAFE_FREE(rdata);		return True;}/****************************************************************************send a qfileinfo call****************************************************************************/BOOL cli_qfileinfo_test(struct cli_state *cli, int fnum, int level, char **poutdata, uint32 *poutlen){	unsigned int data_len = 0;	unsigned int param_len = 0;	uint16 setup = TRANSACT2_QFILEINFO;	pstring param;	char *rparam=NULL, *rdata=NULL;	*poutdata = NULL;	*poutlen = 0;	/* if its a win95 server then fail this - win95 totally screws it	   up */	if (cli->win95)		return False;	param_len = 4;	memset(param, 0, param_len);	SSVAL(param, 0, fnum);	SSVAL(param, 2, level);	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 */                            NULL, data_len, cli->max_xmit   /* data, length, max */                           )) {		return False;	}	if (!cli_receive_trans(cli, SMBtrans2,                               &rparam, &param_len,                               &rdata, &data_len)) {		return False;	}	*poutdata = memdup(rdata, data_len);	*poutlen = data_len;	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return True;}/****************************************************************************send a qpathinfo SMB_QUERY_FILE_ALT_NAME_INFO call****************************************************************************/NTSTATUS cli_qpathinfo_alt_name(struct cli_state *cli, const char *fname, fstring alt_name){	unsigned int data_len = 0;	unsigned int param_len = 0;	uint16 setup = TRANSACT2_QPATHINFO;	pstring param;	char *rparam=NULL, *rdata=NULL;	int count=8;	char *p;	BOOL ret;	unsigned int len;	p = param;	memset(p, 0, 6);	SSVAL(p, 0, SMB_QUERY_FILE_ALT_NAME_INFO);	p += 6;	p += clistr_push(cli, p, fname, sizeof(pstring)-6, STR_TERMINATE);	param_len = PTR_DIFF(p, param);	do {		ret = (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 */				      ) &&		       cli_receive_trans(cli, SMBtrans2, 					 &rparam, &param_len,					 &rdata, &data_len));		if (!ret && cli_is_dos_error(cli)) {			/* we need to work around a Win95 bug - sometimes			   it gives ERRSRV/ERRerror temprarily */			uint8 eclass;			uint32 ecode;			cli_dos_error(cli, &eclass, &ecode);			if (eclass != ERRSRV || ecode != ERRerror) break;			smb_msleep(100);		}	} while (count-- && ret==False);	if (!ret || !rdata || data_len < 4) {		return NT_STATUS_UNSUCCESSFUL;	}	len = IVAL(rdata, 0);	if (len > data_len - 4) {		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	clistr_pull(cli, alt_name, rdata+4, sizeof(fstring), len, STR_UNICODE);	SAFE_FREE(rdata);	SAFE_FREE(rparam);	return NT_STATUS_OK;}

⌨️ 快捷键说明

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