clifile.c

来自「samba最新软件」· C语言 代码 · 共 703 行 · 第 1/2 页

C
703
字号
		      uint32_t offset, uint32_t len, int timeout, 		      uint8_t locktype){	union smb_lock parms;	struct smb_lock_entry lock[1];	NTSTATUS status;	parms.lockx.level = RAW_LOCK_LOCKX;	parms.lockx.in.file.fnum = fnum;	parms.lockx.in.mode = locktype;	parms.lockx.in.timeout = timeout;	parms.lockx.in.ulock_cnt = 0;	parms.lockx.in.lock_cnt = 1;	lock[0].pid = tree->session->pid;	lock[0].offset = offset;	lock[0].count = len;	parms.lockx.in.locks = &lock[0];	status = smb_raw_lock(tree, &parms);		return status;}/**************************************************************************** Lock a file.****************************************************************************/NTSTATUS smbcli_lock(struct smbcli_tree *tree, int fnum, 		  uint32_t offset, uint32_t len, int timeout, 		  enum brl_type lock_type){	union smb_lock parms;	struct smb_lock_entry lock[1];	NTSTATUS status;	parms.lockx.level = RAW_LOCK_LOCKX;	parms.lockx.in.file.fnum = fnum;	parms.lockx.in.mode = (lock_type == READ_LOCK? 1 : 0);	parms.lockx.in.timeout = timeout;	parms.lockx.in.ulock_cnt = 0;	parms.lockx.in.lock_cnt = 1;	lock[0].pid = tree->session->pid;	lock[0].offset = offset;	lock[0].count = len;	parms.lockx.in.locks = &lock[0];	status = smb_raw_lock(tree, &parms);	return status;}/**************************************************************************** Unlock a file.****************************************************************************/NTSTATUS smbcli_unlock(struct smbcli_tree *tree, int fnum, uint32_t offset, uint32_t len){	union smb_lock parms;	struct smb_lock_entry lock[1];	NTSTATUS status;	parms.lockx.level = RAW_LOCK_LOCKX;	parms.lockx.in.file.fnum = fnum;	parms.lockx.in.mode = 0;	parms.lockx.in.timeout = 0;	parms.lockx.in.ulock_cnt = 1;	parms.lockx.in.lock_cnt = 0;	lock[0].pid = tree->session->pid;	lock[0].offset = offset;	lock[0].count = len;	parms.lockx.in.locks = &lock[0];		status = smb_raw_lock(tree, &parms);	return status;}	/**************************************************************************** Lock a file with 64 bit offsets.****************************************************************************/NTSTATUS smbcli_lock64(struct smbcli_tree *tree, int fnum, 		    off_t offset, off_t len, int timeout, 		    enum brl_type lock_type){	union smb_lock parms;	int ltype;	struct smb_lock_entry lock[1];	NTSTATUS status;	if (!(tree->session->transport->negotiate.capabilities & CAP_LARGE_FILES)) {		return smbcli_lock(tree, fnum, offset, len, timeout, lock_type);	}	parms.lockx.level = RAW_LOCK_LOCKX;	parms.lockx.in.file.fnum = fnum;		ltype = (lock_type == READ_LOCK? 1 : 0);	ltype |= LOCKING_ANDX_LARGE_FILES;	parms.lockx.in.mode = ltype;	parms.lockx.in.timeout = timeout;	parms.lockx.in.ulock_cnt = 0;	parms.lockx.in.lock_cnt = 1;	lock[0].pid = tree->session->pid;	lock[0].offset = offset;	lock[0].count = len;	parms.lockx.in.locks = &lock[0];	status = smb_raw_lock(tree, &parms);		return status;}/**************************************************************************** Unlock a file with 64 bit offsets.****************************************************************************/NTSTATUS smbcli_unlock64(struct smbcli_tree *tree, int fnum, off_t offset, 			 off_t len){	union smb_lock parms;	struct smb_lock_entry lock[1];	NTSTATUS status;	if (!(tree->session->transport->negotiate.capabilities & CAP_LARGE_FILES)) {		return smbcli_unlock(tree, fnum, offset, len);	}	parms.lockx.level = RAW_LOCK_LOCKX;	parms.lockx.in.file.fnum = fnum;	parms.lockx.in.mode = LOCKING_ANDX_LARGE_FILES;	parms.lockx.in.timeout = 0;	parms.lockx.in.ulock_cnt = 1;	parms.lockx.in.lock_cnt = 0;	lock[0].pid = tree->session->pid;	lock[0].offset = offset;	lock[0].count = len;	parms.lockx.in.locks = &lock[0];	status = smb_raw_lock(tree, &parms);	return status;}/**************************************************************************** Do a SMBgetattrE call.****************************************************************************/NTSTATUS smbcli_getattrE(struct smbcli_tree *tree, int fnum,		      uint16_t *attr, size_t *size,		      time_t *c_time, time_t *a_time, time_t *m_time){			union smb_fileinfo parms;	NTSTATUS status;	parms.getattre.level = RAW_FILEINFO_GETATTRE;	parms.getattre.in.file.fnum = fnum;	status = smb_raw_fileinfo(tree, NULL, &parms);	if (!NT_STATUS_IS_OK(status))		return status;	if (size) {		*size = parms.getattre.out.size;	}	if (attr) {		*attr = parms.getattre.out.attrib;	}	if (c_time) {		*c_time = parms.getattre.out.create_time;	}	if (a_time) {		*a_time = parms.getattre.out.access_time;	}	if (m_time) {		*m_time = parms.getattre.out.write_time;	}	return status;}/**************************************************************************** Do a SMBgetatr call****************************************************************************/NTSTATUS smbcli_getatr(struct smbcli_tree *tree, const char *fname, 		    uint16_t *attr, size_t *size, time_t *t){	union smb_fileinfo parms;	NTSTATUS status;	parms.getattr.level = RAW_FILEINFO_GETATTR;	parms.getattr.in.file.path = fname;	status = smb_raw_pathinfo(tree, NULL, &parms);		if (!NT_STATUS_IS_OK(status)) {		return status;	}	if (size) {		*size = parms.getattr.out.size;	}	if (t) {		*t = parms.getattr.out.write_time;	}	if (attr) {		*attr = parms.getattr.out.attrib;	}	return status;}/**************************************************************************** Do a SMBsetatr call.****************************************************************************/NTSTATUS smbcli_setatr(struct smbcli_tree *tree, const char *fname, uint16_t mode, 		    time_t t){	union smb_setfileinfo parms;	parms.setattr.level = RAW_SFILEINFO_SETATTR;	parms.setattr.in.file.path = fname;	parms.setattr.in.attrib = mode;	parms.setattr.in.write_time = t;		return smb_raw_setpathinfo(tree, &parms);}/**************************************************************************** Do a setfileinfo basic_info call.****************************************************************************/NTSTATUS smbcli_fsetatr(struct smbcli_tree *tree, int fnum, uint16_t mode, 			NTTIME create_time, NTTIME access_time, 			NTTIME write_time, NTTIME change_time){	union smb_setfileinfo parms;	parms.basic_info.level = RAW_SFILEINFO_BASIC_INFO;	parms.basic_info.in.file.fnum = fnum;	parms.basic_info.in.attrib = mode;	parms.basic_info.in.create_time = create_time;	parms.basic_info.in.access_time = access_time;	parms.basic_info.in.write_time = write_time;	parms.basic_info.in.change_time = change_time;		return smb_raw_setfileinfo(tree, &parms);}/**************************************************************************** truncate a file to a given size****************************************************************************/NTSTATUS smbcli_ftruncate(struct smbcli_tree *tree, int fnum, uint64_t size){	union smb_setfileinfo parms;	parms.end_of_file_info.level = RAW_SFILEINFO_END_OF_FILE_INFO;	parms.end_of_file_info.in.file.fnum = fnum;	parms.end_of_file_info.in.size = size;		return smb_raw_setfileinfo(tree, &parms);}/**************************************************************************** Check for existence of a dir.****************************************************************************/NTSTATUS smbcli_chkpath(struct smbcli_tree *tree, const char *path){	union smb_chkpath parms;	char *path2;	NTSTATUS status;	path2 = strdup(path);	trim_string(path2,NULL,"\\");	if (!*path2) {		free(path2);		path2 = strdup("\\");	}	parms.chkpath.in.path = path2;	status = smb_raw_chkpath(tree, &parms);	free(path2);	return status;}/**************************************************************************** Query disk space.****************************************************************************/NTSTATUS smbcli_dskattr(struct smbcli_tree *tree, uint32_t *bsize, 			uint64_t *total, uint64_t *avail){	union smb_fsinfo fsinfo_parms;	TALLOC_CTX *mem_ctx;	NTSTATUS status;	mem_ctx = talloc_init("smbcli_dskattr");	fsinfo_parms.dskattr.level = RAW_QFS_SIZE_INFO;	status = smb_raw_fsinfo(tree, mem_ctx, &fsinfo_parms);	if (NT_STATUS_IS_OK(status)) {		*bsize = fsinfo_parms.size_info.out.bytes_per_sector * fsinfo_parms.size_info.out.sectors_per_unit;		*total = fsinfo_parms.size_info.out.total_alloc_units;		*avail = fsinfo_parms.size_info.out.avail_alloc_units;	}	talloc_free(mem_ctx);		return status;}/**************************************************************************** Create and open a temporary file.****************************************************************************/int smbcli_ctemp(struct smbcli_tree *tree, const char *path, char **tmp_path){	union smb_open open_parms;	TALLOC_CTX *mem_ctx;	NTSTATUS status;	mem_ctx = talloc_init("raw_open");	if (!mem_ctx) return -1;	open_parms.openx.level = RAW_OPEN_CTEMP;	open_parms.ctemp.in.attrib = 0;	open_parms.ctemp.in.directory = path;	open_parms.ctemp.in.write_time = 0;	status = smb_raw_open(tree, mem_ctx, &open_parms);	if (tmp_path) {		*tmp_path = strdup(open_parms.ctemp.out.name);	}	talloc_free(mem_ctx);	if (NT_STATUS_IS_OK(status)) {		return open_parms.ctemp.out.file.fnum;	}	return -1;}

⌨️ 快捷键说明

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