s4:provision: set the correct nTSecurityDescriptor on CN=Builtin,... (bug #9481)
[Samba/gebeck_regimport.git] / source4 / ntvfs / simple / svfs_util.c
blobc4e015668c76ba7bf41e566eddec05aa8bab2323
1 /*
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
25 #include "includes.h"
26 #include "system/filesys.h"
27 #include "svfs.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;
40 char *ret;
41 char *name_lower = strlower_talloc(p, name);
43 if (*name != '\\') {
44 ret = talloc_asprintf(req, "%s/%s", p->connectpath, name_lower);
45 } else {
46 ret = talloc_asprintf(req, "%s%s", p->connectpath, name_lower);
48 all_string_sub(ret, "\\", "/", 0);
49 talloc_free(name_lower);
50 return ret;
55 read a directory and find all matching file names and stat info
56 returned names are separate unix and DOS names. The returned names
57 are relative to the directory
59 struct svfs_dir *svfs_list_unix(TALLOC_CTX *mem_ctx, struct ntvfs_request *req, const char *unix_path)
61 char *p, *mask;
62 struct svfs_dir *dir;
63 DIR *odir;
64 struct dirent *dent;
65 unsigned int allocated = 0;
66 char *low_mask;
68 dir = talloc(mem_ctx, struct svfs_dir);
69 if (!dir) { return NULL; }
71 dir->count = 0;
72 dir->files = 0;
74 /* find the base directory */
75 p = strrchr(unix_path, '/');
76 if (!p) { return NULL; }
78 dir->unix_dir = talloc_strndup(mem_ctx, unix_path, PTR_DIFF(p, unix_path));
79 if (!dir->unix_dir) { return NULL; }
81 /* the wildcard pattern is the last part */
82 mask = p+1;
84 low_mask = strlower_talloc(mem_ctx, mask);
85 if (!low_mask) { return NULL; }
87 odir = opendir(dir->unix_dir);
88 if (!odir) { return NULL; }
90 while ((dent = readdir(odir))) {
91 unsigned int i = dir->count;
92 char *full_name;
93 char *low_name;
95 if (strchr(dent->d_name, ':') && !strchr(unix_path, ':')) {
96 /* don't show streams in dir listing */
97 continue;
100 low_name = strlower_talloc(mem_ctx, dent->d_name);
101 if (!low_name) { continue; }
103 /* check it matches the wildcard pattern */
104 if (ms_fnmatch_protocol(low_mask, low_name, PROTOCOL_NT1) != 0) {
105 continue;
108 if (dir->count >= allocated) {
109 allocated = (allocated + 100) * 1.2;
110 dir->files = talloc_realloc(dir, dir->files, struct svfs_dirfile, allocated);
111 if (!dir->files) {
112 closedir(odir);
113 return NULL;
117 dir->files[i].name = low_name;
118 if (!dir->files[i].name) { continue; }
120 full_name = talloc_asprintf(mem_ctx, "%s/%s", dir->unix_dir,
121 dir->files[i].name);
122 if (!full_name) { continue; }
124 if (stat(full_name, &dir->files[i].st) == 0) {
125 dir->count++;
128 talloc_free(full_name);
131 closedir(odir);
133 return dir;
137 read a directory and find all matching file names and stat info
138 returned names are separate unix and DOS names. The returned names
139 are relative to the directory
141 struct svfs_dir *svfs_list(struct ntvfs_module_context *ntvfs, struct ntvfs_request *req, const char *pattern)
143 struct svfs_private *p = ntvfs->private_data;
144 char *unix_path;
146 unix_path = svfs_unix_path(ntvfs, req, pattern);
147 if (!unix_path) { return NULL; }
149 return svfs_list_unix(p, req, unix_path);
153 /*******************************************************************
154 set the time on a file via file descriptor
155 *******************************************************************/
156 int svfs_file_utime(int fd, struct utimbuf *times)
158 char *fd_path = NULL;
159 int ret;
161 asprintf(&fd_path, "/proc/self/%d", fd);
162 if (!fd_path) {
163 errno = ENOMEM;
164 return -1;
167 ret = utime(fd_path, times);
168 free(fd_path);
169 return ret;
174 map a unix file attrib to a DOS attribute
176 uint16_t svfs_unix_to_dos_attrib(mode_t mode)
178 uint16_t ret = 0;
179 if (S_ISDIR(mode)) ret |= FILE_ATTRIBUTE_DIRECTORY;
180 if (!(mode & S_IWUSR)) ret |= FILE_ATTRIBUTE_READONLY;
181 return ret;