• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt/router/samba-3.0.25b/source/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 2 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, write to the Free Software
18   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "includes.h"
22
23extern SMB_ACL_T aixacl_to_smbacl( struct acl *file_acl);
24extern struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
25
26SMB_ACL_T aixacl_sys_acl_get_file(vfs_handle_struct *handle,
27				    const char *path_p,
28				    SMB_ACL_TYPE_T type)
29{
30	struct acl *file_acl = (struct acl *)NULL;
31	struct smb_acl_t *result = (struct smb_acl_t *)NULL;
32
33	int rc = 0;
34	uid_t user_id;
35
36	/* AIX has no DEFAULT */
37	if  ( type == SMB_ACL_TYPE_DEFAULT )
38		return NULL;
39
40	/* Get the acl using statacl */
41
42	DEBUG(10,("Entering AIX sys_acl_get_file\n"));
43	DEBUG(10,("path_p is %s\n",path_p));
44
45	file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
46
47	if(file_acl == NULL) {
48		errno=ENOMEM;
49		DEBUG(0,("Error in AIX sys_acl_get_file: %d\n",errno));
50		return(NULL);
51	}
52
53	memset(file_acl,0,BUFSIZ);
54
55	rc = statacl((char *)path_p,0,file_acl,BUFSIZ);
56	if( (rc == -1) && (errno == ENOSPC)) {
57		struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
58		if( new_acl == NULL) {
59			SAFE_FREE(file_acl);
60			errno = ENOMEM;
61			return NULL;
62		}
63		file_acl = new_acl;
64		rc = statacl((char *)path_p,0,file_acl,file_acl->acl_len+sizeof(struct acl));
65		if( rc == -1) {
66			DEBUG(0,("statacl returned %d with errno %d\n",rc,errno));
67			SAFE_FREE(file_acl);
68			return(NULL);
69		}
70	}
71
72	DEBUG(10,("Got facl and returned it\n"));
73
74
75	result = aixacl_to_smbacl(file_acl);
76	SAFE_FREE(file_acl);
77	return result;
78
79	/*errno = ENOTSUP;
80	return NULL;*/
81}
82
83SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
84				  files_struct *fsp,
85				  int fd)
86{
87
88	struct acl *file_acl = (struct acl *)NULL;
89	struct smb_acl_t *result = (struct smb_acl_t *)NULL;
90
91	int rc = 0;
92	uid_t user_id;
93
94	/* Get the acl using fstatacl */
95
96	DEBUG(10,("Entering AIX sys_acl_get_fd\n"));
97	DEBUG(10,("fd is %d\n",fd));
98	file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
99
100	if(file_acl == NULL) {
101		errno=ENOMEM;
102		DEBUG(0,("Error in AIX sys_acl_get_fd is %d\n",errno));
103		return(NULL);
104	}
105
106	memset(file_acl,0,BUFSIZ);
107
108	rc = fstatacl(fd,0,file_acl,BUFSIZ);
109	if( (rc == -1) && (errno == ENOSPC)) {
110		struct acl *new_acl = SMB_MALLOC(file_acl->acl_len + sizeof(struct acl));
111		if( new_acl == NULL) {
112			SAFE_FREE(file_acl);
113			errno = ENOMEM;
114			return NULL;
115		}
116		file_acl = new_acl;
117		rc = fstatacl(fd,0,file_acl,file_acl->acl_len + sizeof(struct acl));
118		if( rc == -1) {
119			DEBUG(0,("fstatacl returned %d with errno %d\n",rc,errno));
120			SAFE_FREE(file_acl);
121			return(NULL);
122		}
123	}
124
125	DEBUG(10,("Got facl and returned it\n"));
126
127	result = aixacl_to_smbacl(file_acl);
128	SAFE_FREE(file_acl);
129	return result;
130
131	/*errno = ENOTSUP;
132	return NULL;*/
133}
134
135int aixacl_sys_acl_set_file(vfs_handle_struct *handle,
136			      const char *name,
137			      SMB_ACL_TYPE_T type,
138			      SMB_ACL_T theacl)
139{
140	struct acl *file_acl = NULL;
141	uint rc;
142
143	file_acl = aixacl_smb_to_aixacl(type, theacl);
144	if (!file_acl)
145		return -1;
146
147	rc = chacl((char *)name,file_acl,file_acl->acl_len);
148	DEBUG(10,("errno is %d\n",errno));
149	DEBUG(10,("return code is %d\n",rc));
150	SAFE_FREE(file_acl);
151	DEBUG(10,("Exiting the aixacl_sys_acl_set_file\n"));
152
153	return rc;
154}
155
156int aixacl_sys_acl_set_fd(vfs_handle_struct *handle,
157			    files_struct *fsp,
158			    int fd, SMB_ACL_T theacl)
159{
160	struct acl *file_acl = NULL;
161	uint rc;
162
163	file_acl = aixacl_smb_to_aixacl(SMB_ACL_TYPE_ACCESS, theacl);
164	if (!file_acl)
165		return -1;
166
167	rc = fchacl(fd,file_acl,file_acl->acl_len);
168	DEBUG(10,("errno is %d\n",errno));
169	DEBUG(10,("return code is %d\n",rc));
170	SAFE_FREE(file_acl);
171	DEBUG(10,("Exiting aixacl_sys_acl_set_fd\n"));
172
173	return rc;
174}
175
176int aixacl_sys_acl_delete_def_file(vfs_handle_struct *handle,
177				     const char *path)
178{
179	return 0; /* otherwise you can't set acl at upper level */
180}
181
182/* VFS operations structure */
183
184static vfs_op_tuple aixacl_op_tuples[] = {
185	/* Disk operations */
186  {SMB_VFS_OP(aixacl_sys_acl_get_file),
187   SMB_VFS_OP_SYS_ACL_GET_FILE,
188   SMB_VFS_LAYER_TRANSPARENT},
189
190  {SMB_VFS_OP(aixacl_sys_acl_get_fd),
191   SMB_VFS_OP_SYS_ACL_GET_FD,
192   SMB_VFS_LAYER_TRANSPARENT},
193
194  {SMB_VFS_OP(aixacl_sys_acl_set_file),
195   SMB_VFS_OP_SYS_ACL_SET_FILE,
196   SMB_VFS_LAYER_TRANSPARENT},
197
198  {SMB_VFS_OP(aixacl_sys_acl_set_fd),
199   SMB_VFS_OP_SYS_ACL_SET_FD,
200   SMB_VFS_LAYER_TRANSPARENT},
201
202  {SMB_VFS_OP(aixacl_sys_acl_delete_def_file),
203   SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
204   SMB_VFS_LAYER_TRANSPARENT},
205
206  {SMB_VFS_OP(NULL),
207   SMB_VFS_OP_NOOP,
208   SMB_VFS_LAYER_NOOP}
209};
210
211NTSTATUS vfs_aixacl_init(void);
212NTSTATUS vfs_aixacl_init(void)
213{
214	return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "aixacl",
215				aixacl_op_tuples);
216}
217