2
Unix SMB/CIFS implementation.
4
simple NTVFS filesystem backend
6
Copyright (C) Andrew Tridgell 2003
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3 of the License, or
11
(at your option) any later version.
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License
19
along with this program. If not, see <http://www.gnu.org/licenses/>.
22
utility functions for simple backend
26
#include "system/filesys.h"
28
#include "system/time.h"
29
#include "system/dir.h"
30
#include "ntvfs/ntvfs.h"
31
#include "ntvfs/simple/proto.h"
34
convert a windows path to a unix path - don't do any manging or case sensitive handling
36
char *svfs_unix_path(struct ntvfs_module_context *ntvfs,
37
struct ntvfs_request *req, const char *name)
39
struct svfs_private *p = ntvfs->private_data;
43
ret = talloc_asprintf(req, "%s/%s", p->connectpath, name);
45
ret = talloc_asprintf(req, "%s%s", p->connectpath, name);
47
all_string_sub(ret, "\\", "/", 0);
49
strlower(ret + strlen(p->connectpath));
56
read a directory and find all matching file names and stat info
57
returned names are separate unix and DOS names. The returned names
58
are relative to the directory
60
struct svfs_dir *svfs_list_unix(TALLOC_CTX *mem_ctx, struct ntvfs_request *req, const char *unix_path)
69
dir = talloc(mem_ctx, struct svfs_dir);
70
if (!dir) { return NULL; }
75
/* find the base directory */
76
p = strrchr(unix_path, '/');
77
if (!p) { return NULL; }
79
dir->unix_dir = talloc_strndup(mem_ctx, unix_path, PTR_DIFF(p, unix_path));
80
if (!dir->unix_dir) { return NULL; }
82
/* the wildcard pattern is the last part */
85
low_mask = talloc_strdup(mem_ctx, mask);
86
if (!low_mask) { return NULL; }
89
odir = opendir(dir->unix_dir);
90
if (!odir) { return NULL; }
92
while ((dent = readdir(odir))) {
93
uint_t i = dir->count;
97
if (strchr(dent->d_name, ':') && !strchr(unix_path, ':')) {
98
/* don't show streams in dir listing */
102
low_name = talloc_strdup(mem_ctx, dent->d_name);
103
if (!low_name) { continue; }
106
/* check it matches the wildcard pattern */
107
if (ms_fnmatch(low_mask, low_name, PROTOCOL_NT1) != 0) {
111
if (dir->count >= allocated) {
112
allocated = (allocated + 100) * 1.2;
113
dir->files = talloc_realloc(dir, dir->files, struct svfs_dirfile, allocated);
120
dir->files[i].name = low_name;
121
if (!dir->files[i].name) { continue; }
123
asprintf(&full_name, "%s/%s", dir->unix_dir, dir->files[i].name);
124
if (!full_name) { continue; }
126
if (stat(full_name, &dir->files[i].st) == 0) {
139
read a directory and find all matching file names and stat info
140
returned names are separate unix and DOS names. The returned names
141
are relative to the directory
143
struct svfs_dir *svfs_list(struct ntvfs_module_context *ntvfs, struct ntvfs_request *req, const char *pattern)
145
struct svfs_private *p = ntvfs->private_data;
148
unix_path = svfs_unix_path(ntvfs, req, pattern);
149
if (!unix_path) { return NULL; }
151
return svfs_list_unix(p, req, unix_path);
155
/*******************************************************************
156
set the time on a file via file descriptor
157
*******************************************************************/
158
int svfs_file_utime(int fd, struct utimbuf *times)
160
char *fd_path = NULL;
163
asprintf(&fd_path, "/proc/self/%d", fd);
169
ret = utime(fd_path, times);
176
map a unix file attrib to a DOS attribute
178
uint16_t svfs_unix_to_dos_attrib(mode_t mode)
181
if (S_ISDIR(mode)) ret |= FILE_ATTRIBUTE_DIRECTORY;
182
if (!(mode & S_IWUSR)) ret |= FILE_ATTRIBUTE_READONLY;