4 * Implement a fixed mapping of forbidden NT characters in filenames that are
5 * used a lot by the CAD package Catia.
7 * Yes, this a BAD BAD UGLY INCOMPLETE hack, but it helps quite some people
8 * out there. Catia V4 on AIX uses characters like "<*$ a *lot*, all forbidden
11 * Copyright (C) Volker Lendecke, 2005
12 * Copyright (C) Aravind Srinivasan, 2009
13 * Copyright (C) Guenter Kukkukk, 2013
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 3 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, see <http://www.gnu.org/licenses/>.
31 #include "smbd/smbd.h"
33 static int vfs_catia_debug_level
= DBGC_VFS
;
36 #define DBGC_CLASS vfs_catia_debug_level
38 #define GLOBAL_SNUM 0xFFFFFFF
40 #define MAP_NUM 0x101 /* max unicode charval / MAP_SIZE */
41 #define T_OFFSET(_v_) ((_v_ % MAP_SIZE))
42 #define T_START(_v_) (((_v_ / MAP_SIZE) * MAP_SIZE))
43 #define T_PICK(_v_) ((_v_ / MAP_SIZE))
45 struct char_mappings
{
46 smb_ucs2_t entry
[MAP_SIZE
][2];
49 struct share_mapping_entry
{
51 struct share_mapping_entry
*next
;
52 struct char_mappings
**mappings
;
55 struct share_mapping_entry
*srt_head
= NULL
;
57 static bool build_table(struct char_mappings
**cmaps
, int value
)
60 int start
= T_START(value
);
62 (*cmaps
) = talloc_zero(NULL
, struct char_mappings
);
67 for (i
= 0; i
< MAP_SIZE
;i
++) {
68 (*cmaps
)->entry
[i
][vfs_translate_to_unix
] = start
+ i
;
69 (*cmaps
)->entry
[i
][vfs_translate_to_windows
] = start
+ i
;
75 static void set_tables(struct char_mappings
**cmaps
,
81 /* set unix -> windows */
82 i
= T_OFFSET(unix_map
);
83 cmaps
[T_PICK(unix_map
)]->entry
[i
][vfs_translate_to_windows
] = windows_map
;
85 /* set windows -> unix */
86 i
= T_OFFSET(windows_map
);
87 cmaps
[T_PICK(windows_map
)]->entry
[i
][vfs_translate_to_unix
] = unix_map
;
90 static bool build_ranges(struct char_mappings
**cmaps
,
95 if (!cmaps
[T_PICK(unix_map
)]) {
96 if (!build_table(&cmaps
[T_PICK(unix_map
)], unix_map
))
100 if (!cmaps
[T_PICK(windows_map
)]) {
101 if (!build_table(&cmaps
[T_PICK(windows_map
)], windows_map
))
105 set_tables(cmaps
, unix_map
, windows_map
);
110 static struct share_mapping_entry
*get_srt(connection_struct
*conn
,
111 struct share_mapping_entry
**global
)
113 struct share_mapping_entry
*share
;
115 for (share
= srt_head
; share
!= NULL
; share
= share
->next
) {
116 if (share
->snum
== GLOBAL_SNUM
)
119 if (share
->snum
== SNUM(conn
))
126 static struct share_mapping_entry
*add_srt(int snum
, const char **mappings
)
132 long unix_map
, windows_map
;
133 struct share_mapping_entry
*ret
= NULL
;
135 ret
= (struct share_mapping_entry
*)
136 TALLOC_ZERO(NULL
, sizeof(struct share_mapping_entry
) +
137 (mappings
? (MAP_NUM
* sizeof(struct char_mappings
*)) : 0));
144 ret
->next
= srt_head
;
148 ret
->mappings
= (struct char_mappings
**) ((unsigned char*) ret
+
149 sizeof(struct share_mapping_entry
));
150 memset(ret
->mappings
, 0,
151 MAP_NUM
* sizeof(struct char_mappings
*));
153 ret
->mappings
= NULL
;
158 * catia mappings are of the form :
159 * UNIX char (in 0xnn hex) : WINDOWS char (in 0xnn hex)
161 * multiple mappings are comma separated in smb.conf
163 for (i
=0;mappings
[i
];i
++) {
164 fstrcpy(mapping
, mappings
[i
]);
165 unix_map
= strtol(mapping
, &tmp
, 16);
166 if (unix_map
== 0 && errno
== EINVAL
) {
167 DEBUG(0, ("INVALID CATIA MAPPINGS - %s\n", mapping
));
170 windows_map
= strtol(++tmp
, NULL
, 16);
171 if (windows_map
== 0 && errno
== EINVAL
) {
172 DEBUG(0, ("INVALID CATIA MAPPINGS - %s\n", mapping
));
176 if (!build_ranges(ret
->mappings
, unix_map
, windows_map
)) {
177 DEBUG(0, ("TABLE ERROR - CATIA MAPPINGS - %s\n", mapping
));
185 static bool init_mappings(connection_struct
*conn
,
186 struct share_mapping_entry
**selected_out
)
188 const char **mappings
= NULL
;
189 struct share_mapping_entry
*share_level
= NULL
;
190 struct share_mapping_entry
*global
= NULL
;
192 /* check srt cache */
193 share_level
= get_srt(conn
, &global
);
195 *selected_out
= share_level
;
196 return (share_level
->mappings
!= NULL
);
199 /* see if we have a global setting */
202 mappings
= lp_parm_string_list(-1, "catia", "mappings", NULL
);
203 global
= add_srt(GLOBAL_SNUM
, mappings
);
206 /* no global setting - what about share level ? */
207 mappings
= lp_parm_string_list(SNUM(conn
), "catia", "mappings", NULL
);
208 share_level
= add_srt(SNUM(conn
), mappings
);
210 if (share_level
->mappings
) {
211 (*selected_out
) = share_level
;
214 if (global
->mappings
) {
215 share_level
->mappings
= global
->mappings
;
216 (*selected_out
) = share_level
;
223 static NTSTATUS
catia_string_replace_allocate(connection_struct
*conn
,
226 enum vfs_translate_direction direction
)
228 static smb_ucs2_t
*tmpbuf
= NULL
;
230 struct share_mapping_entry
*selected
;
231 struct char_mappings
*map
= NULL
;
232 size_t converted_size
;
233 TALLOC_CTX
*ctx
= talloc_tos();
235 if (!init_mappings(conn
, &selected
)) {
236 /* No mappings found. Just use the old name */
237 *mapped_name
= talloc_strdup(NULL
, name_in
);
240 return NT_STATUS_NO_MEMORY
;
245 if ((push_ucs2_talloc(ctx
, &tmpbuf
, name_in
,
246 &converted_size
)) == false) {
247 return map_nt_error_from_unix(errno
);
253 map
= selected
->mappings
[T_PICK((*ptr
))];
259 *ptr
= map
->entry
[T_OFFSET((*ptr
))][direction
];
262 if ((pull_ucs2_talloc(ctx
, mapped_name
, tmpbuf
,
263 &converted_size
)) == false) {
265 return map_nt_error_from_unix(errno
);
271 static DIR *catia_opendir(vfs_handle_struct
*handle
,
272 const struct smb_filename
*smb_fname
,
276 char *name_mapped
= NULL
;
279 struct smb_filename
*mapped_smb_fname
= NULL
;
281 status
= catia_string_replace_allocate(handle
->conn
,
282 smb_fname
->base_name
,
284 vfs_translate_to_unix
);
285 if (!NT_STATUS_IS_OK(status
)) {
286 errno
= map_errno_from_nt_status(status
);
290 mapped_smb_fname
= synthetic_smb_fname(talloc_tos(),
295 if (mapped_smb_fname
== NULL
) {
296 TALLOC_FREE(mapped_smb_fname
);
301 ret
= SMB_VFS_NEXT_OPENDIR(handle
, mapped_smb_fname
, mask
, attr
);
303 TALLOC_FREE(name_mapped
);
304 TALLOC_FREE(mapped_smb_fname
);
310 * TRANSLATE_NAME call which converts the given name to
311 * "WINDOWS displayable" name
313 static NTSTATUS
catia_translate_name(struct vfs_handle_struct
*handle
,
314 const char *orig_name
,
315 enum vfs_translate_direction direction
,
321 NTSTATUS status
, ret
;
324 * Copy the supplied name and free the memory for mapped_name,
325 * already allocated by the caller.
326 * We will be allocating new memory for mapped_name in
327 * catia_string_replace_allocate
329 name
= talloc_strdup(talloc_tos(), orig_name
);
332 return NT_STATUS_NO_MEMORY
;
334 status
= catia_string_replace_allocate(handle
->conn
, name
,
335 &mapped_name
, direction
);
338 if (!NT_STATUS_IS_OK(status
)) {
342 ret
= SMB_VFS_NEXT_TRANSLATE_NAME(handle
, mapped_name
, direction
,
343 mem_ctx
, pmapped_name
);
345 if (NT_STATUS_EQUAL(ret
, NT_STATUS_NONE_MAPPED
)) {
346 *pmapped_name
= talloc_move(mem_ctx
, &mapped_name
);
347 /* we need to return the former translation result here */
350 TALLOC_FREE(mapped_name
);
356 static int catia_open(vfs_handle_struct
*handle
,
357 struct smb_filename
*smb_fname
,
362 char *name_mapped
= NULL
;
367 tmp_base_name
= smb_fname
->base_name
;
368 status
= catia_string_replace_allocate(handle
->conn
,
369 smb_fname
->base_name
,
370 &name_mapped
, vfs_translate_to_unix
);
371 if (!NT_STATUS_IS_OK(status
)) {
372 errno
= map_errno_from_nt_status(status
);
376 smb_fname
->base_name
= name_mapped
;
377 ret
= SMB_VFS_NEXT_OPEN(handle
, smb_fname
, fsp
, flags
, mode
);
378 smb_fname
->base_name
= tmp_base_name
;
379 TALLOC_FREE(name_mapped
);
384 static int catia_rename(vfs_handle_struct
*handle
,
385 const struct smb_filename
*smb_fname_src
,
386 const struct smb_filename
*smb_fname_dst
)
388 TALLOC_CTX
*ctx
= talloc_tos();
389 struct smb_filename
*smb_fname_src_tmp
= NULL
;
390 struct smb_filename
*smb_fname_dst_tmp
= NULL
;
391 char *src_name_mapped
= NULL
;
392 char *dst_name_mapped
= NULL
;
396 status
= catia_string_replace_allocate(handle
->conn
,
397 smb_fname_src
->base_name
,
398 &src_name_mapped
, vfs_translate_to_unix
);
399 if (!NT_STATUS_IS_OK(status
)) {
400 errno
= map_errno_from_nt_status(status
);
404 status
= catia_string_replace_allocate(handle
->conn
,
405 smb_fname_dst
->base_name
,
406 &dst_name_mapped
, vfs_translate_to_unix
);
407 if (!NT_STATUS_IS_OK(status
)) {
408 errno
= map_errno_from_nt_status(status
);
412 /* Setup temporary smb_filename structs. */
413 smb_fname_src_tmp
= cp_smb_filename(ctx
, smb_fname_src
);
414 if (smb_fname_src_tmp
== NULL
) {
419 smb_fname_dst_tmp
= cp_smb_filename(ctx
, smb_fname_dst
);
420 if (smb_fname_dst_tmp
== NULL
) {
425 smb_fname_src_tmp
->base_name
= src_name_mapped
;
426 smb_fname_dst_tmp
->base_name
= dst_name_mapped
;
427 DEBUG(10, ("converted old name: %s\n",
428 smb_fname_str_dbg(smb_fname_src_tmp
)));
429 DEBUG(10, ("converted new name: %s\n",
430 smb_fname_str_dbg(smb_fname_dst_tmp
)));
432 ret
= SMB_VFS_NEXT_RENAME(handle
, smb_fname_src_tmp
,
435 TALLOC_FREE(src_name_mapped
);
436 TALLOC_FREE(dst_name_mapped
);
437 TALLOC_FREE(smb_fname_src_tmp
);
438 TALLOC_FREE(smb_fname_dst_tmp
);
442 static int catia_stat(vfs_handle_struct
*handle
,
443 struct smb_filename
*smb_fname
)
450 status
= catia_string_replace_allocate(handle
->conn
,
451 smb_fname
->base_name
,
452 &name
, vfs_translate_to_unix
);
453 if (!NT_STATUS_IS_OK(status
)) {
454 errno
= map_errno_from_nt_status(status
);
458 tmp_base_name
= smb_fname
->base_name
;
459 smb_fname
->base_name
= name
;
461 ret
= SMB_VFS_NEXT_STAT(handle
, smb_fname
);
462 smb_fname
->base_name
= tmp_base_name
;
468 static int catia_lstat(vfs_handle_struct
*handle
,
469 struct smb_filename
*smb_fname
)
476 status
= catia_string_replace_allocate(handle
->conn
,
477 smb_fname
->base_name
,
478 &name
, vfs_translate_to_unix
);
479 if (!NT_STATUS_IS_OK(status
)) {
480 errno
= map_errno_from_nt_status(status
);
484 tmp_base_name
= smb_fname
->base_name
;
485 smb_fname
->base_name
= name
;
487 ret
= SMB_VFS_NEXT_LSTAT(handle
, smb_fname
);
488 smb_fname
->base_name
= tmp_base_name
;
494 static int catia_unlink(vfs_handle_struct
*handle
,
495 const struct smb_filename
*smb_fname
)
497 struct smb_filename
*smb_fname_tmp
= NULL
;
502 status
= catia_string_replace_allocate(handle
->conn
,
503 smb_fname
->base_name
,
504 &name
, vfs_translate_to_unix
);
505 if (!NT_STATUS_IS_OK(status
)) {
506 errno
= map_errno_from_nt_status(status
);
510 /* Setup temporary smb_filename structs. */
511 smb_fname_tmp
= cp_smb_filename(talloc_tos(), smb_fname
);
512 if (smb_fname_tmp
== NULL
) {
517 smb_fname_tmp
->base_name
= name
;
518 ret
= SMB_VFS_NEXT_UNLINK(handle
, smb_fname_tmp
);
519 TALLOC_FREE(smb_fname_tmp
);
525 static int catia_chown(vfs_handle_struct
*handle
,
526 const struct smb_filename
*smb_fname
,
534 struct smb_filename
*catia_smb_fname
= NULL
;
536 status
= catia_string_replace_allocate(handle
->conn
,
537 smb_fname
->base_name
,
539 vfs_translate_to_unix
);
540 if (!NT_STATUS_IS_OK(status
)) {
541 errno
= map_errno_from_nt_status(status
);
544 catia_smb_fname
= synthetic_smb_fname(talloc_tos(),
549 if (catia_smb_fname
== NULL
) {
555 ret
= SMB_VFS_NEXT_CHOWN(handle
, catia_smb_fname
, uid
, gid
);
558 TALLOC_FREE(catia_smb_fname
);
563 static int catia_lchown(vfs_handle_struct
*handle
,
564 const struct smb_filename
*smb_fname
,
572 struct smb_filename
*catia_smb_fname
= NULL
;
574 status
= catia_string_replace_allocate(handle
->conn
,
575 smb_fname
->base_name
,
577 vfs_translate_to_unix
);
578 if (!NT_STATUS_IS_OK(status
)) {
579 errno
= map_errno_from_nt_status(status
);
582 catia_smb_fname
= synthetic_smb_fname(talloc_tos(),
587 if (catia_smb_fname
== NULL
) {
593 ret
= SMB_VFS_NEXT_LCHOWN(handle
, catia_smb_fname
, uid
, gid
);
596 TALLOC_FREE(catia_smb_fname
);
601 static int catia_chmod(vfs_handle_struct
*handle
,
602 const struct smb_filename
*smb_fname
,
609 struct smb_filename
*catia_smb_fname
= NULL
;
611 status
= catia_string_replace_allocate(handle
->conn
,
612 smb_fname
->base_name
,
614 vfs_translate_to_unix
);
615 if (!NT_STATUS_IS_OK(status
)) {
616 errno
= map_errno_from_nt_status(status
);
619 catia_smb_fname
= synthetic_smb_fname(talloc_tos(),
624 if (catia_smb_fname
== NULL
) {
630 ret
= SMB_VFS_NEXT_CHMOD(handle
, catia_smb_fname
, mode
);
633 TALLOC_FREE(catia_smb_fname
);
638 static int catia_rmdir(vfs_handle_struct
*handle
,
639 const struct smb_filename
*smb_fname
)
644 struct smb_filename
*catia_smb_fname
= NULL
;
646 status
= catia_string_replace_allocate(handle
->conn
,
647 smb_fname
->base_name
,
649 vfs_translate_to_unix
);
650 if (!NT_STATUS_IS_OK(status
)) {
651 errno
= map_errno_from_nt_status(status
);
654 catia_smb_fname
= synthetic_smb_fname(talloc_tos(),
659 if (catia_smb_fname
== NULL
) {
665 ret
= SMB_VFS_NEXT_RMDIR(handle
, catia_smb_fname
);
667 TALLOC_FREE(catia_smb_fname
);
672 static int catia_mkdir(vfs_handle_struct
*handle
,
673 const struct smb_filename
*smb_fname
,
679 struct smb_filename
*catia_smb_fname
= NULL
;
681 status
= catia_string_replace_allocate(handle
->conn
,
682 smb_fname
->base_name
,
684 vfs_translate_to_unix
);
685 if (!NT_STATUS_IS_OK(status
)) {
686 errno
= map_errno_from_nt_status(status
);
689 catia_smb_fname
= synthetic_smb_fname(talloc_tos(),
694 if (catia_smb_fname
== NULL
) {
700 ret
= SMB_VFS_NEXT_MKDIR(handle
, catia_smb_fname
, mode
);
702 TALLOC_FREE(catia_smb_fname
);
707 static int catia_chdir(vfs_handle_struct
*handle
,
714 status
= catia_string_replace_allocate(handle
->conn
, path
,
715 &name
, vfs_translate_to_unix
);
716 if (!NT_STATUS_IS_OK(status
)) {
717 errno
= map_errno_from_nt_status(status
);
721 ret
= SMB_VFS_NEXT_CHDIR(handle
, name
);
727 static int catia_ntimes(vfs_handle_struct
*handle
,
728 const struct smb_filename
*smb_fname
,
729 struct smb_file_time
*ft
)
731 struct smb_filename
*smb_fname_tmp
= NULL
;
736 status
= catia_string_replace_allocate(handle
->conn
,
737 smb_fname
->base_name
,
738 &name
, vfs_translate_to_unix
);
739 if (!NT_STATUS_IS_OK(status
)) {
740 errno
= map_errno_from_nt_status(status
);
744 smb_fname_tmp
= cp_smb_filename(talloc_tos(), smb_fname
);
745 if (smb_fname_tmp
== NULL
) {
750 smb_fname_tmp
->base_name
= name
;
751 ret
= SMB_VFS_NEXT_NTIMES(handle
, smb_fname_tmp
, ft
);
753 TALLOC_FREE(smb_fname_tmp
);
759 catia_realpath(vfs_handle_struct
*handle
, const char *path
)
761 char *mapped_name
= NULL
;
765 status
= catia_string_replace_allocate(handle
->conn
, path
,
766 &mapped_name
, vfs_translate_to_unix
);
767 if (!NT_STATUS_IS_OK(status
)) {
768 errno
= map_errno_from_nt_status(status
);
772 ret
= SMB_VFS_NEXT_REALPATH(handle
, mapped_name
);
773 TALLOC_FREE(mapped_name
);
778 static int catia_chflags(struct vfs_handle_struct
*handle
,
779 const char *path
, unsigned int flags
)
781 char *mapped_name
= NULL
;
785 status
= catia_string_replace_allocate(handle
->conn
, path
,
786 &mapped_name
, vfs_translate_to_unix
);
787 if (!NT_STATUS_IS_OK(status
)) {
788 errno
= map_errno_from_nt_status(status
);
792 ret
= SMB_VFS_NEXT_CHFLAGS(handle
, mapped_name
, flags
);
793 TALLOC_FREE(mapped_name
);
799 catia_streaminfo(struct vfs_handle_struct
*handle
,
800 struct files_struct
*fsp
,
801 const struct smb_filename
*smb_fname
,
803 unsigned int *_num_streams
,
804 struct stream_struct
**_streams
)
806 char *mapped_name
= NULL
;
809 struct smb_filename
*catia_smb_fname
= NULL
;
810 unsigned int num_streams
= 0;
811 struct stream_struct
*streams
= NULL
;
816 status
= catia_string_replace_allocate(handle
->conn
,
817 smb_fname
->base_name
,
819 vfs_translate_to_unix
);
820 if (!NT_STATUS_IS_OK(status
)) {
821 errno
= map_errno_from_nt_status(status
);
825 catia_smb_fname
= synthetic_smb_fname(talloc_tos(),
830 if (catia_smb_fname
== NULL
) {
831 TALLOC_FREE(mapped_name
);
832 return NT_STATUS_NO_MEMORY
;
835 status
= SMB_VFS_NEXT_STREAMINFO(handle
, fsp
, catia_smb_fname
,
836 mem_ctx
, &num_streams
, &streams
);
837 TALLOC_FREE(mapped_name
);
838 TALLOC_FREE(catia_smb_fname
);
839 if (!NT_STATUS_IS_OK(status
)) {
844 * Translate stream names just like the base names
846 for (i
= 0; i
< num_streams
; i
++) {
848 * Strip ":" prefix and ":$DATA" suffix to get a
849 * "pure" stream name and only translate that.
851 void *old_ptr
= streams
[i
].name
;
852 char *stream_name
= streams
[i
].name
+ 1;
853 char *stream_type
= strrchr_m(stream_name
, ':');
855 if (stream_type
!= NULL
) {
860 status
= catia_string_replace_allocate(handle
->conn
, stream_name
,
861 &mapped_name
, vfs_translate_to_windows
);
862 if (!NT_STATUS_IS_OK(status
)) {
863 TALLOC_FREE(streams
);
867 if (stream_type
!= NULL
) {
868 streams
[i
].name
= talloc_asprintf(streams
, ":%s:%s",
869 mapped_name
, stream_type
);
871 streams
[i
].name
= talloc_asprintf(streams
, ":%s",
874 TALLOC_FREE(mapped_name
);
875 TALLOC_FREE(old_ptr
);
876 if (streams
[i
].name
== NULL
) {
877 TALLOC_FREE(streams
);
878 return NT_STATUS_NO_MEMORY
;
882 *_num_streams
= num_streams
;
888 catia_get_nt_acl(struct vfs_handle_struct
*handle
,
889 const struct smb_filename
*smb_fname
,
890 uint32_t security_info
,
892 struct security_descriptor
**ppdesc
)
894 char *mapped_name
= NULL
;
895 const char *path
= smb_fname
->base_name
;
896 struct smb_filename
*mapped_smb_fname
= NULL
;
899 status
= catia_string_replace_allocate(handle
->conn
,
900 path
, &mapped_name
, vfs_translate_to_unix
);
901 if (!NT_STATUS_IS_OK(status
)) {
902 errno
= map_errno_from_nt_status(status
);
905 mapped_smb_fname
= synthetic_smb_fname(talloc_tos(),
910 if (mapped_smb_fname
== NULL
) {
911 TALLOC_FREE(mapped_name
);
912 return NT_STATUS_NO_MEMORY
;
915 status
= SMB_VFS_NEXT_GET_NT_ACL(handle
, mapped_smb_fname
,
916 security_info
, mem_ctx
, ppdesc
);
917 TALLOC_FREE(mapped_name
);
918 TALLOC_FREE(mapped_smb_fname
);
924 catia_chmod_acl(vfs_handle_struct
*handle
,
925 const struct smb_filename
*smb_fname
,
928 char *mapped_name
= NULL
;
929 struct smb_filename
*mapped_smb_fname
= NULL
;
934 status
= catia_string_replace_allocate(handle
->conn
,
935 smb_fname
->base_name
,
937 vfs_translate_to_unix
);
938 if (!NT_STATUS_IS_OK(status
)) {
939 errno
= map_errno_from_nt_status(status
);
943 mapped_smb_fname
= synthetic_smb_fname(talloc_tos(),
948 if (mapped_smb_fname
== NULL
) {
949 TALLOC_FREE(mapped_name
);
953 ret
= SMB_VFS_NEXT_CHMOD_ACL(handle
, mapped_smb_fname
, mode
);
955 TALLOC_FREE(mapped_name
);
956 TALLOC_FREE(mapped_smb_fname
);
962 catia_sys_acl_get_file(vfs_handle_struct
*handle
,
967 char *mapped_name
= NULL
;
971 status
= catia_string_replace_allocate(handle
->conn
,
972 path
, &mapped_name
, vfs_translate_to_unix
);
973 if (!NT_STATUS_IS_OK(status
)) {
974 errno
= map_errno_from_nt_status(status
);
978 ret
= SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle
, mapped_name
, type
, mem_ctx
);
979 TALLOC_FREE(mapped_name
);
985 catia_sys_acl_set_file(vfs_handle_struct
*handle
,
990 char *mapped_name
= NULL
;
994 status
= catia_string_replace_allocate(handle
->conn
,
995 path
, &mapped_name
, vfs_translate_to_unix
);
996 if (!NT_STATUS_IS_OK(status
)) {
997 errno
= map_errno_from_nt_status(status
);
1001 ret
= SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle
, mapped_name
, type
, theacl
);
1002 TALLOC_FREE(mapped_name
);
1008 catia_sys_acl_delete_def_file(vfs_handle_struct
*handle
,
1011 char *mapped_name
= NULL
;
1015 status
= catia_string_replace_allocate(handle
->conn
,
1016 path
, &mapped_name
, vfs_translate_to_unix
);
1017 if (!NT_STATUS_IS_OK(status
)) {
1018 errno
= map_errno_from_nt_status(status
);
1022 ret
= SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle
, mapped_name
);
1023 TALLOC_FREE(mapped_name
);
1029 catia_getxattr(vfs_handle_struct
*handle
, const char *path
,
1030 const char *name
, void *value
, size_t size
)
1032 char *mapped_name
= NULL
;
1036 status
= catia_string_replace_allocate(handle
->conn
,
1037 name
, &mapped_name
, vfs_translate_to_unix
);
1038 if (!NT_STATUS_IS_OK(status
)) {
1039 errno
= map_errno_from_nt_status(status
);
1044 ret
= SMB_VFS_NEXT_GETXATTR(handle
, path
, mapped_name
, value
, size
);
1045 TALLOC_FREE(mapped_name
);
1051 catia_listxattr(vfs_handle_struct
*handle
, const char *path
,
1052 char *list
, size_t size
)
1054 char *mapped_name
= NULL
;
1058 status
= catia_string_replace_allocate(handle
->conn
,
1059 path
, &mapped_name
, vfs_translate_to_unix
);
1060 if (!NT_STATUS_IS_OK(status
)) {
1061 errno
= map_errno_from_nt_status(status
);
1066 ret
= SMB_VFS_NEXT_LISTXATTR(handle
, mapped_name
, list
, size
);
1067 TALLOC_FREE(mapped_name
);
1073 catia_removexattr(vfs_handle_struct
*handle
, const char *path
,
1076 char *mapped_name
= NULL
;
1080 status
= catia_string_replace_allocate(handle
->conn
,
1081 name
, &mapped_name
, vfs_translate_to_unix
);
1082 if (!NT_STATUS_IS_OK(status
)) {
1083 errno
= map_errno_from_nt_status(status
);
1088 ret
= SMB_VFS_NEXT_REMOVEXATTR(handle
, path
, mapped_name
);
1089 TALLOC_FREE(mapped_name
);
1095 catia_setxattr(vfs_handle_struct
*handle
, const char *path
,
1096 const char *name
, const void *value
, size_t size
,
1099 char *mapped_name
= NULL
;
1103 status
= catia_string_replace_allocate(handle
->conn
,
1104 name
, &mapped_name
, vfs_translate_to_unix
);
1105 if (!NT_STATUS_IS_OK(status
)) {
1106 errno
= map_errno_from_nt_status(status
);
1111 ret
= SMB_VFS_NEXT_SETXATTR(handle
, path
, mapped_name
, value
, size
, flags
);
1112 TALLOC_FREE(mapped_name
);
1117 static struct vfs_fn_pointers vfs_catia_fns
= {
1118 .mkdir_fn
= catia_mkdir
,
1119 .rmdir_fn
= catia_rmdir
,
1120 .opendir_fn
= catia_opendir
,
1121 .open_fn
= catia_open
,
1122 .rename_fn
= catia_rename
,
1123 .stat_fn
= catia_stat
,
1124 .lstat_fn
= catia_lstat
,
1125 .unlink_fn
= catia_unlink
,
1126 .chown_fn
= catia_chown
,
1127 .lchown_fn
= catia_lchown
,
1128 .chmod_fn
= catia_chmod
,
1129 .chdir_fn
= catia_chdir
,
1130 .ntimes_fn
= catia_ntimes
,
1131 .realpath_fn
= catia_realpath
,
1132 .chflags_fn
= catia_chflags
,
1133 .streaminfo_fn
= catia_streaminfo
,
1134 .translate_name_fn
= catia_translate_name
,
1135 .get_nt_acl_fn
= catia_get_nt_acl
,
1136 .chmod_acl_fn
= catia_chmod_acl
,
1137 .sys_acl_get_file_fn
= catia_sys_acl_get_file
,
1138 .sys_acl_set_file_fn
= catia_sys_acl_set_file
,
1139 .sys_acl_delete_def_file_fn
= catia_sys_acl_delete_def_file
,
1140 .getxattr_fn
= catia_getxattr
,
1141 .listxattr_fn
= catia_listxattr
,
1142 .removexattr_fn
= catia_removexattr
,
1143 .setxattr_fn
= catia_setxattr
,
1147 NTSTATUS
vfs_catia_init(void)
1151 ret
= smb_register_vfs(SMB_VFS_INTERFACE_VERSION
, "catia",
1153 if (!NT_STATUS_IS_OK(ret
))
1156 vfs_catia_debug_level
= debug_add_class("catia");
1157 if (vfs_catia_debug_level
== -1) {
1158 vfs_catia_debug_level
= DBGC_VFS
;
1159 DEBUG(0, ("vfs_catia: Couldn't register custom debugging "
1162 DEBUG(10, ("vfs_catia: Debug class number of "
1163 "'catia': %d\n", vfs_catia_debug_level
));