2
Unix SMB/CIFS implementation.
4
Copyright (C) Andrew Tridgell 2004
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 3 of the License, or
9
(at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program. If not, see <http://www.gnu.org/licenses/>.
20
utility functions for posix backend
24
#include "vfs_posix.h"
27
return true if a string contains one of the CIFS wildcard characters
29
bool pvfs_has_wildcard(const char *str)
31
if (strpbrk(str, "*?<>\"")) {
38
map a unix errno to a NTSTATUS
40
NTSTATUS pvfs_map_errno(struct pvfs_state *pvfs, int unix_errno)
42
return map_nt_error_from_unix(unix_errno);
47
check if a filename has an attribute matching the given attribute search value
48
this is used by calls like unlink and search which take an attribute
49
and only include special files if they match the given attribute
51
NTSTATUS pvfs_match_attrib(struct pvfs_state *pvfs, struct pvfs_filename *name,
52
uint32_t attrib, uint32_t must_attrib)
54
if ((name->dos.attrib & ~attrib) & FILE_ATTRIBUTE_DIRECTORY) {
55
return NT_STATUS_FILE_IS_A_DIRECTORY;
57
if ((name->dos.attrib & ~attrib) & (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM)) {
58
return NT_STATUS_NO_SUCH_FILE;
60
if (must_attrib & ~name->dos.attrib) {
61
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
68
normalise a file attribute
70
uint32_t pvfs_attrib_normalise(uint32_t attrib, mode_t mode)
72
if (attrib != FILE_ATTRIBUTE_NORMAL) {
73
attrib &= ~FILE_ATTRIBUTE_NORMAL;
76
attrib |= FILE_ATTRIBUTE_DIRECTORY;
78
attrib &= ~FILE_ATTRIBUTE_DIRECTORY;
85
copy a file. Caller is supposed to have already ensured that the
86
operation is allowed. The destination file must not exist.
88
NTSTATUS pvfs_copy_file(struct pvfs_state *pvfs,
89
struct pvfs_filename *name1,
90
struct pvfs_filename *name2)
95
size_t buf_size = 0x10000;
96
uint8_t *buf = talloc_array(name2, uint8_t, buf_size);
99
return NT_STATUS_NO_MEMORY;
102
fd1 = open(name1->full_name, O_RDONLY);
105
return pvfs_map_errno(pvfs, errno);
108
fd2 = open(name2->full_name, O_CREAT|O_EXCL|O_WRONLY, 0);
112
return pvfs_map_errno(pvfs, errno);
116
ssize_t ret2, ret = read(fd1, buf, buf_size);
118
(errno == EINTR || errno == EAGAIN)) {
123
ret2 = write(fd2, buf, ret);
125
(errno == EINTR || errno == EAGAIN)) {
133
unlink(name2->full_name);
135
return pvfs_map_errno(pvfs, errno);
137
return NT_STATUS_DISK_FULL;
144
mode = pvfs_fileperms(pvfs, name1->dos.attrib);
145
if (fchmod(fd2, mode) == -1) {
146
status = pvfs_map_errno(pvfs, errno);
148
unlink(name2->full_name);
152
name2->st.st_mode = mode;
153
name2->dos = name1->dos;
155
status = pvfs_dosattrib_save(pvfs, name2, fd2);
156
if (!NT_STATUS_IS_OK(status)) {
158
unlink(name2->full_name);
169
hash a string of the specified length. The string does not need to be
172
hash alghorithm changed to FNV1 by idra@samba.org (Simo Sorce).
173
see http://www.isthe.com/chongo/tech/comp/fnv/index.html for a
174
discussion on Fowler / Noll / Vo (FNV) Hash by one of it's authors
176
uint32_t pvfs_name_hash(const char *key, size_t length)
178
const uint32_t fnv1_prime = 0x01000193;
179
const uint32_t fnv1_init = 0xa6b93095;
180
uint32_t value = fnv1_init;
182
while (*key && length--) {
184
codepoint_t c = next_codepoint(key, &c_size);
187
value ^= (uint32_t)c;
196
file allocation size rounding. This is required to pass ifstest
198
uint64_t pvfs_round_alloc_size(struct pvfs_state *pvfs, uint64_t size)
200
const uint32_t round_value = pvfs->alloc_size_rounding;
201
return round_value * ((size + round_value - 1)/round_value);