s3-vfs: add glusterfs_fuse vfs module.
[samba.git] / source3 / modules / vfs_glusterfs_fuse.c
1 /*
2    Unix SMB/CIFS implementation.
3
4    Copyright (c) 2019 Guenther Deschner <gd@samba.org>
5
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.
10
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.
15
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/>.
18 */
19
20 #include "includes.h"
21 #include "smbd/smbd.h"
22 #include "system/filesys.h"
23
24 static int vfs_gluster_fuse_get_real_filename(struct vfs_handle_struct *handle,
25                                               const char *path,
26                                               const char *name,
27                                               TALLOC_CTX *mem_ctx,
28                                               char **_found_name)
29 {
30         int ret;
31         char key_buf[NAME_MAX + 64];
32         char val_buf[NAME_MAX + 1];
33         char *found_name = NULL;
34
35         if (strlen(name) >= NAME_MAX) {
36                 errno = ENAMETOOLONG;
37                 return -1;
38         }
39
40         snprintf(key_buf, NAME_MAX + 64,
41                  "glusterfs.get_real_filename:%s", name);
42
43         ret = getxattr(path, key_buf, val_buf, NAME_MAX + 1);
44         if (ret == -1) {
45                 if (errno == ENODATA) {
46                         errno = EOPNOTSUPP;
47                 }
48                 return -1;
49         }
50
51         found_name = talloc_strdup(mem_ctx, val_buf);
52         if (found_name == NULL) {
53                 errno = ENOMEM;
54                 return -1;
55         }
56         *_found_name = found_name;
57         return 0;
58 }
59
60 struct vfs_fn_pointers glusterfs_fuse_fns = {
61
62         /* File Operations */
63         .get_real_filename_fn = vfs_gluster_fuse_get_real_filename,
64 };
65
66 static_decl_vfs;
67 NTSTATUS vfs_glusterfs_fuse_init(TALLOC_CTX *ctx)
68 {
69         return smb_register_vfs(SMB_VFS_INTERFACE_VERSION,
70                                 "glusterfs_fuse", &glusterfs_fuse_fns);
71 }