2
Unix SMB/CIFS implementation.
4
simpler Samba VFS filesystem backend for clients which support the
5
CIFS Unix Extensions or newer CIFS POSIX protocol extensions
8
Copyright (C) Andrew Tridgell 2003
9
Copyright (C) Steve French 2006
11
This program is free software; you can redistribute it and/or modify
12
it under the terms of the GNU General Public License as published by
13
the Free Software Foundation; either version 3 of the License, or
14
(at your option) any later version.
16
This program is distributed in the hope that it will be useful,
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
GNU General Public License for more details.
21
You should have received a copy of the GNU General Public License
22
along with this program. If not, see <http://www.gnu.org/licenses/>.
25
utility functions for cifs posix backend
29
#include "system/filesys.h"
30
#include "cifsposix.h"
31
#include "system/time.h"
32
#include "system/dir.h"
33
#include "ntvfs/ntvfs.h"
34
#include "ntvfs/cifs_posix_cli/proto.h"
37
convert a windows path to a unix path - don't do any manging or case sensitive handling
39
char *cifspsx_unix_path(struct ntvfs_module_context *ntvfs,
40
struct ntvfs_request *req, const char *name)
42
struct cifspsx_private *p = ntvfs->private_data;
46
ret = talloc_asprintf(req, "%s/%s", p->connectpath, name);
48
ret = talloc_asprintf(req, "%s%s", p->connectpath, name);
50
all_string_sub(ret, "\\", "/", 0);
52
strlower(ret + strlen(p->connectpath));
59
read a directory and find all matching file names and stat info
60
returned names are separate unix and DOS names. The returned names
61
are relative to the directory
63
struct cifspsx_dir *cifspsx_list_unix(TALLOC_CTX *mem_ctx, struct ntvfs_request *req, const char *unix_path)
66
struct cifspsx_dir *dir;
72
dir = talloc(mem_ctx, struct cifspsx_dir);
73
if (!dir) { return NULL; }
78
/* find the base directory */
79
p = strrchr(unix_path, '/');
80
if (!p) { return NULL; }
82
dir->unix_dir = talloc_strndup(mem_ctx, unix_path, PTR_DIFF(p, unix_path));
83
if (!dir->unix_dir) { return NULL; }
85
/* the wildcard pattern is the last part */
88
low_mask = talloc_strdup(mem_ctx, mask);
89
if (!low_mask) { return NULL; }
92
odir = opendir(dir->unix_dir);
93
if (!odir) { return NULL; }
95
while ((dent = readdir(odir))) {
96
uint_t i = dir->count;
100
if (strchr(dent->d_name, ':') && !strchr(unix_path, ':')) {
101
/* don't show streams in dir listing */
105
low_name = talloc_strdup(mem_ctx, dent->d_name);
106
if (!low_name) { continue; }
109
/* check it matches the wildcard pattern */
110
if (ms_fnmatch(low_mask, low_name, PROTOCOL_NT1) != 0) {
114
if (dir->count >= allocated) {
115
allocated = (allocated + 100) * 1.2;
116
dir->files = talloc_realloc(dir, dir->files, struct cifspsx_dirfile, allocated);
123
dir->files[i].name = low_name;
124
if (!dir->files[i].name) { continue; }
126
asprintf(&full_name, "%s/%s", dir->unix_dir, dir->files[i].name);
127
if (!full_name) { continue; }
129
if (stat(full_name, &dir->files[i].st) == 0) {
142
read a directory and find all matching file names and stat info
143
returned names are separate unix and DOS names. The returned names
144
are relative to the directory
146
struct cifspsx_dir *cifspsx_list(struct ntvfs_module_context *ntvfs, struct ntvfs_request *req, const char *pattern)
148
struct cifspsx_private *p = ntvfs->private_data;
151
unix_path = cifspsx_unix_path(ntvfs, req, pattern);
152
if (!unix_path) { return NULL; }
154
return cifspsx_list_unix(p, req, unix_path);
158
/*******************************************************************
159
set the time on a file via file descriptor
160
*******************************************************************/
161
int cifspsx_file_utime(int fd, struct utimbuf *times)
163
char *fd_path = NULL;
166
asprintf(&fd_path, "/proc/self/%d", fd);
172
ret = utime(fd_path, times);
179
map a unix file attrib to a DOS attribute
181
uint16_t cifspsx_unix_to_dos_attrib(mode_t mode)
184
if (S_ISDIR(mode)) ret |= FILE_ATTRIBUTE_DIRECTORY;
185
if (!(mode & S_IWUSR)) ret |= FILE_ATTRIBUTE_READONLY;