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 + -
显示快捷键?