• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source3/modules/
1/*
2   Unix SMB/Netbios implementation.
3   VFS module to get and set posix acls
4   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2006
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
22extern SMB_ACL_T aixacl_to_smbacl( struct acl *file_acl);
23extern struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
24
25SMB_ACL_T aixacl_sys_acl_get_file(vfs_handle_struct *handle,
26				    const char *path_p,
27				    SMB_ACL_TYPE_T type)
28{
29	struct acl *file_acl = (struct acl *)NULL;
30	struct smb_acl_t *result = (struct smb_acl_t *)NULL;
31
32	int rc = 0;
33	uid_t user_id;
34
35	/* AIX has no DEFAULT */
36	if  ( type == SMB_ACL_TYPE_DEFAULT )
37		return NULL;
38
39	/* Get the acl using statacl */
40
41	DEBUG(10,("Entering AIX sys_acl_get_file\n"));
42	DEBUG(10,("path_p is %s\n",path_p));
43
44	file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
45
46	if(file_acl == NULL) {
47		errno=ENOMEM;
48		DEBUG(0,("Error in AIX sys_acl_get_file: %d\n",errno));
49		return(NULL);
50	}
51
52	memset(file_acl,0,BUFSIZ);
53
54	rc = statacl((char *)path_p,0,file_acl,BUFSIZ);
55	if( (rc == -1) && (errno == ENOSPC)) {
56		struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
57		if( new_acl == NULL) {
58			SAFE_FREE(file_acl);
59			errno = ENOMEM;
60			return NULL;
61		}
62		file_acl = new_acl;
63		rc = statacl((char *)path_p,0,file_acl,file_acl->acl_len+sizeof(struct acl));
64		if( rc == -1) {
65			DEBUG(0,("statacl returned %d with errno %d\n",rc,errno));
66			SAFE_FREE(file_acl);
67			return(NULL);
68		}
69	}
70
71	DEBUG(10,("Got facl and returned it\n"));
72
73
74	result = aixacl_to_smbacl(file_acl);
75	SAFE_FREE(file_acl);
76	return result;
77
78	/*errno = ENOTSUP;
79	return NULL;*/
80}
81
82SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
83				files_struct *fsp)
84{
85
86	struct acl *file_acl = (struct acl *)NULL;
87	struct smb_acl_t *result = (struct smb_acl_t *)NULL;
88
89	int rc = 0;
90	uid_t user_id;
91
92	/* Get the acl using fstatacl */
93
94	DEBUG(10,("Entering AIX sys_acl_get_fd\n"));
95	DEBUG(10,("fd is %d\n",fsp->fh->fd));
96	file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
97
98	if(file_acl == NULL) {
99		errno=ENOMEM;
100		DEBUG(0,("Error in AIX sys_acl_get_fd is %d\n",errno));
101		return(NULL);
102	}
103
104	memset(file_acl,0,BUFSIZ);
105
106	rc = fstatacl(fsp->fh->fd,0,file_acl,BUFSIZ);
107	if( (rc == -1) && (errno == ENOSPC)) {
108		struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
109		if( new_acl == NULL) {
110			SAFE_FREE(file_acl);
111			errno = ENOMEM;
112			return NULL;
113		}
114		file_acl = new_acl;
115		rc = fstatacl(fsp->fh->fd,0,file_acl,file_acl->acl_len + sizeof(struct acl));
116		if( rc == -1) {
117			DEBUG(0,("fstatacl returned %d with errno %d\n",rc,errno));
118			SAFE_FREE(file_acl);
119			return(NULL);
120		}
121	}
122
123	DEBUG(10,("Got facl and returned it\n"));
124
125	result = aixacl_to_smbacl(file_acl);
126	SAFE_FREE(file_acl);
127	return result;
128
129	/*errno = ENOTSUP;
130	return NULL;*/
131}
132
133int aixacl_sys_acl_set_file(vfs_handle_struct *handle,
134			      const char *name,
135			      SMB_ACL_TYPE_T type,
136			      SMB_ACL_T theacl)
137{
138	struct acl *file_acl = NULL;
139	unsigned int rc;
140
141	file_acl = aixacl_smb_to_aixacl(type, theacl);
142	if (!file_acl)
143		return -1;
144
145	rc = chacl((char *)name,file_acl,file_acl->acl_len);
146	DEBUG(10,("errno is %d\n",errno));
147	DEBUG(10,("return code is %d\n",rc));
148	SAFE_FREE(file_acl);
149	DEBUG(10,("Exiting the aixacl_sys_acl_set_file\n"));
150
151	return rc;
152}
153
154int aixacl_sys_acl_set_fd(vfs_handle_struct *handle,
155			    files_struct *fsp,
156			    SMB_ACL_T theacl)
157{
158	struct acl *file_acl = NULL;
159	unsigned int rc;
160
161	file_acl = aixacl_smb_to_aixacl(SMB_ACL_TYPE_ACCESS, theacl);
162	if (!file_acl)
163		return -1;
164
165	rc = fchacl(fsp->fh->fd,file_acl,file_acl->acl_len);
166	DEBUG(10,("errno is %d\n",errno));
167	DEBUG(10,("return code is %d\n",rc));
168	SAFE_FREE(file_acl);
169	DEBUG(10,("Exiting aixacl_sys_acl_set_fd\n"));
170
171	return rc;
172}
173
174int aixacl_sys_acl_delete_def_file(vfs_handle_struct *handle,
175				     const char *path)
176{
177	return 0; /* otherwise you can't set acl at upper level */
178}
179
180static struct vfs_fn_pointers vfs_aixacl_fns = {
181	.sys_acl_get_file = aixacl_sys_acl_get_file,
182	.sys_acl_get_fd = aixacl_sys_acl_get_fd,
183	.sys_acl_set_file = aixacl_sys_acl_set_file,
184	.sys_acl_set_fd = aixacl_sys_acl_set_fd,
185	.sys_acl_delete_def_file = aixacl_sys_acl_delete_def_file,
186};
187
188NTSTATUS vfs_aixacl_init(void);
189NTSTATUS vfs_aixacl_init(void)
190{
191	return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "aixacl",
192				&vfs_aixacl_fns);
193}
194