1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2006 Sun Microsystems, Inc. 23 * All rights reserved. 24 * Use is subject to license terms. 25 */ 26 /* 27 * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 28 */ 29 30 #ifndef _NFS_NFS_ACL_H 31 #define _NFS_NFS_ACL_H 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 #define NFS_ACL_MAX_ENTRIES 1024 38 39 typedef ushort_t o_mode; 40 41 struct aclent { 42 int type; 43 uid32_t id; 44 o_mode perm; 45 }; 46 typedef struct aclent aclent; 47 48 #define NA_USER_OBJ 0x1 49 #define NA_USER 0x2 50 #define NA_GROUP_OBJ 0x4 51 #define NA_GROUP 0x8 52 #define NA_CLASS_OBJ 0x10 53 #define NA_OTHER_OBJ 0x20 54 #define NA_ACL_DEFAULT 0x1000 55 56 #define NA_READ 0x4 57 #define NA_WRITE 0x2 58 #define NA_EXEC 0x1 59 60 struct secattr { 61 uint32 mask; 62 int aclcnt; 63 struct { 64 uint_t aclent_len; 65 aclent *aclent_val; 66 } aclent; 67 int dfaclcnt; 68 struct { 69 uint_t dfaclent_len; 70 aclent *dfaclent_val; 71 } dfaclent; 72 }; 73 typedef struct secattr secattr; 74 75 #define NA_ACL 0x1 76 #define NA_ACLCNT 0x2 77 #define NA_DFACL 0x4 78 #define NA_DFACLCNT 0x8 79 80 struct GETACL2args { 81 fhandle_t fh; 82 uint32 mask; 83 }; 84 typedef struct GETACL2args GETACL2args; 85 86 struct GETACL2resok { 87 struct nfsfattr attr; 88 vsecattr_t acl; 89 }; 90 typedef struct GETACL2resok GETACL2resok; 91 92 struct GETACL2res { 93 enum nfsstat status; 94 union { 95 GETACL2resok ok; 96 } res_u; 97 }; 98 typedef struct GETACL2res GETACL2res; 99 100 struct SETACL2args { 101 fhandle_t fh; 102 vsecattr_t acl; 103 }; 104 typedef struct SETACL2args SETACL2args; 105 106 struct SETACL2resok { 107 struct nfsfattr attr; 108 }; 109 typedef struct SETACL2resok SETACL2resok; 110 111 struct SETACL2res { 112 enum nfsstat status; 113 union { 114 SETACL2resok ok; 115 } res_u; 116 }; 117 typedef struct SETACL2res SETACL2res; 118 119 struct GETATTR2args { 120 fhandle_t fh; 121 }; 122 typedef struct GETATTR2args GETATTR2args; 123 124 struct GETATTR2resok { 125 struct nfsfattr attr; 126 }; 127 typedef struct GETATTR2resok GETATTR2resok; 128 129 struct GETATTR2res { 130 enum nfsstat status; 131 union { 132 GETATTR2resok ok; 133 } res_u; 134 }; 135 typedef struct GETATTR2res GETATTR2res; 136 137 struct ACCESS2args { 138 fhandle_t fh; 139 uint32 access; 140 }; 141 typedef struct ACCESS2args ACCESS2args; 142 143 #define ACCESS2_READ 0x1 144 #define ACCESS2_LOOKUP 0x2 145 #define ACCESS2_MODIFY 0x4 146 #define ACCESS2_EXTEND 0x8 147 #define ACCESS2_DELETE 0x10 148 #define ACCESS2_EXECUTE 0x20 149 150 struct ACCESS2resok { 151 struct nfsfattr attr; 152 uint32 access; 153 }; 154 typedef struct ACCESS2resok ACCESS2resok; 155 156 struct ACCESS2res { 157 enum nfsstat status; 158 union { 159 ACCESS2resok ok; 160 } res_u; 161 }; 162 typedef struct ACCESS2res ACCESS2res; 163 164 struct GETXATTRDIR2args { 165 fhandle_t fh; 166 bool_t create; 167 }; 168 typedef struct GETXATTRDIR2args GETXATTRDIR2args; 169 170 struct GETXATTRDIR2resok { 171 fhandle_t fh; 172 struct nfsfattr attr; 173 }; 174 typedef struct GETXATTRDIR2resok GETXATTRDIR2resok; 175 176 struct GETXATTRDIR2res { 177 enum nfsstat status; 178 union { 179 GETXATTRDIR2resok ok; 180 } res_u; 181 }; 182 typedef struct GETXATTRDIR2res GETXATTRDIR2res; 183 184 struct GETACL3args { 185 nfs_fh3 fh; 186 uint32 mask; 187 }; 188 typedef struct GETACL3args GETACL3args; 189 190 struct GETACL3resok { 191 post_op_attr attr; 192 vsecattr_t acl; 193 }; 194 typedef struct GETACL3resok GETACL3resok; 195 196 struct GETACL3resfail { 197 post_op_attr attr; 198 }; 199 typedef struct GETACL3resfail GETACL3resfail; 200 201 struct GETACL3res { 202 nfsstat3 status; 203 union { 204 GETACL3resok ok; 205 GETACL3resfail fail; 206 } res_u; 207 }; 208 typedef struct GETACL3res GETACL3res; 209 210 struct SETACL3args { 211 nfs_fh3 fh; 212 vsecattr_t acl; 213 }; 214 typedef struct SETACL3args SETACL3args; 215 216 struct SETACL3resok { 217 post_op_attr attr; 218 }; 219 typedef struct SETACL3resok SETACL3resok; 220 221 struct SETACL3resfail { 222 post_op_attr attr; 223 }; 224 typedef struct SETACL3resfail SETACL3resfail; 225 226 struct SETACL3res { 227 nfsstat3 status; 228 union { 229 SETACL3resok ok; 230 SETACL3resfail fail; 231 } res_u; 232 }; 233 typedef struct SETACL3res SETACL3res; 234 235 struct GETXATTRDIR3args { 236 nfs_fh3 fh; 237 bool_t create; 238 }; 239 typedef struct GETXATTRDIR3args GETXATTRDIR3args; 240 241 struct GETXATTRDIR3resok { 242 nfs_fh3 fh; 243 post_op_attr attr; 244 }; 245 typedef struct GETXATTRDIR3resok GETXATTRDIR3resok; 246 247 struct GETXATTRDIR3res { 248 nfsstat3 status; 249 union { 250 GETXATTRDIR3resok ok; 251 } res_u; 252 }; 253 typedef struct GETXATTRDIR3res GETXATTRDIR3res; 254 255 #define NFS_ACL_PROGRAM ((rpcprog_t)(100227)) 256 #define NFS_ACL_VERSMIN ((rpcvers_t)(2)) 257 #define NFS_ACL_VERSMAX ((rpcvers_t)(3)) 258 259 #define NFS_ACL_V2 ((rpcvers_t)(2)) 260 #define ACLPROC2_NULL ((rpcproc_t)(0)) 261 #define ACLPROC2_GETACL ((rpcproc_t)(1)) 262 #define ACLPROC2_SETACL ((rpcproc_t)(2)) 263 #define ACLPROC2_GETATTR ((rpcproc_t)(3)) 264 #define ACLPROC2_ACCESS ((rpcproc_t)(4)) 265 #define ACLPROC2_GETXATTRDIR ((rpcproc_t)(5)) 266 267 #define NFS_ACL_V3 ((rpcvers_t)(3)) 268 #define ACLPROC3_NULL ((rpcproc_t)(0)) 269 #define ACLPROC3_GETACL ((rpcproc_t)(1)) 270 #define ACLPROC3_SETACL ((rpcproc_t)(2)) 271 #define ACLPROC3_GETXATTRDIR ((rpcproc_t)(3)) 272 273 #ifdef _KERNEL 274 /* the xdr functions */ 275 extern bool_t xdr_uid(XDR *, uid32_t *); 276 extern bool_t xdr_o_mode(XDR *, o_mode *); 277 extern bool_t xdr_aclent(XDR *, aclent_t *); 278 extern bool_t xdr_secattr(XDR *, vsecattr_t *); 279 280 extern bool_t xdr_GETACL2args(XDR *, GETACL2args *); 281 extern bool_t xdr_fastGETACL2args(XDR *, GETACL2args **); 282 extern bool_t xdr_GETACL2resok(XDR *, GETACL2resok *); 283 extern bool_t xdr_GETACL2res(XDR *, GETACL2res *); 284 extern bool_t xdr_SETACL2args(XDR *, SETACL2args *); 285 extern bool_t xdr_SETACL2resok(XDR *, SETACL2resok *); 286 #ifdef _LITTLE_ENDIAN 287 extern bool_t xdr_fastSETACL2resok(XDR *, SETACL2resok *); 288 #endif 289 extern bool_t xdr_SETACL2res(XDR *, SETACL2res *); 290 #ifdef _LITTLE_ENDIAN 291 extern bool_t xdr_fastSETACL2res(XDR *, SETACL2res *); 292 #endif 293 extern bool_t xdr_GETATTR2args(XDR *, GETATTR2args *); 294 extern bool_t xdr_fastGETATTR2args(XDR *, GETATTR2args **); 295 extern bool_t xdr_GETATTR2resok(XDR *, GETATTR2resok *); 296 #ifdef _LITTLE_ENDIAN 297 extern bool_t xdr_fastGETATTR2resok(XDR *, GETATTR2resok *); 298 #endif 299 extern bool_t xdr_GETATTR2res(XDR *, GETATTR2res *); 300 #ifdef _LITTLE_ENDIAN 301 extern bool_t xdr_fastGETATTR2res(XDR *, GETATTR2res *); 302 #endif 303 extern bool_t xdr_ACCESS2args(XDR *, ACCESS2args *); 304 extern bool_t xdr_fastACCESS2args(XDR *, ACCESS2args **); 305 extern bool_t xdr_ACCESS2resok(XDR *, ACCESS2resok *); 306 #ifdef _LITTLE_ENDIAN 307 extern bool_t xdr_fastACCESS2resok(XDR *, ACCESS2resok *); 308 #endif 309 extern bool_t xdr_ACCESS2res(XDR *, ACCESS2res *); 310 #ifdef _LITTLE_ENDIAN 311 extern bool_t xdr_fastACCESS2res(XDR *, ACCESS2res *); 312 #endif 313 extern bool_t xdr_GETXATTRDIR2args(XDR *, GETXATTRDIR2args *); 314 extern bool_t xdr_GETXATTRDIR2res(XDR *, GETXATTRDIR2res *); 315 316 extern bool_t xdr_GETACL3args(XDR *, GETACL3args *); 317 extern bool_t xdr_GETACL3resok(XDR *, GETACL3resok *); 318 extern bool_t xdr_GETACL3resfail(XDR *, GETACL3resfail *); 319 extern bool_t xdr_GETACL3res(XDR *, GETACL3res *); 320 extern bool_t xdr_SETACL3args(XDR *, SETACL3args *); 321 extern bool_t xdr_SETACL3resok(XDR *, SETACL3resok *); 322 extern bool_t xdr_SETACL3resfail(XDR *, SETACL3resfail *); 323 extern bool_t xdr_SETACL3res(XDR *, SETACL3res *); 324 extern bool_t xdr_GETXATTRDIR3args(XDR *, GETXATTRDIR3args *); 325 extern bool_t xdr_GETXATTRDIR3res(XDR *, GETXATTRDIR3res *); 326 327 #endif 328 329 #ifdef _KERNEL 330 /* the service procedures */ 331 extern void acl2_getacl(GETACL2args *, GETACL2res *, 332 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 333 extern void *acl2_getacl_getfh(GETACL2args *); 334 extern void acl2_getacl_free(GETACL2res *); 335 extern void acl2_setacl(SETACL2args *, SETACL2res *, 336 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 337 extern void *acl2_setacl_getfh(SETACL2args *); 338 extern void acl2_getattr(GETATTR2args *, GETATTR2res *, 339 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 340 extern void *acl2_getattr_getfh(GETATTR2args *); 341 extern void acl2_access(ACCESS2args *, ACCESS2res *, 342 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 343 extern void *acl2_access_getfh(ACCESS2args *); 344 extern void acl2_getxattrdir(GETXATTRDIR2args *, GETXATTRDIR2res *, 345 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 346 extern void *acl2_getxattrdir_getfh(GETXATTRDIR2args *); 347 348 extern void acl3_getacl(GETACL3args *, GETACL3res *, 349 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 350 extern void *acl3_getacl_getfh(GETACL3args *); 351 extern void acl3_getacl_free(GETACL3res *); 352 extern void acl3_setacl(SETACL3args *, SETACL3res *, 353 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 354 extern void *acl3_setacl_getfh(SETACL3args *); 355 extern void acl3_getxattrdir(GETXATTRDIR3args *, GETXATTRDIR3res *, 356 struct exportinfo *, struct svc_req *, cred_t *, bool_t); 357 extern void *acl3_getxattrdir_getfh(GETXATTRDIR3args *); 358 359 #endif 360 361 #ifdef _KERNEL 362 /* the client side procedures */ 363 extern int acl_getacl2(vnode_t *, vsecattr_t *, int, cred_t *); 364 extern int acl_setacl2(vnode_t *, vsecattr_t *, int, cred_t *); 365 extern int acl_getattr2_otw(vnode_t *, vattr_t *, cred_t *); 366 extern int acl_access2(vnode_t *, int, int, cred_t *); 367 extern int acl_getxattrdir2(vnode_t *, vnode_t **, bool_t, cred_t *, int); 368 extern int acl_getacl3(vnode_t *, vsecattr_t *, int, cred_t *); 369 extern int acl_setacl3(vnode_t *, vsecattr_t *, int, cred_t *); 370 extern int acl_getxattrdir3(vnode_t *, vnode_t **, bool_t, cred_t *, int); 371 extern int acl2call(mntinfo_t *, rpcproc_t, xdrproc_t, caddr_t, xdrproc_t, 372 caddr_t, cred_t *, int *, enum nfsstat *, int, 373 failinfo_t *); 374 extern int acl3call(mntinfo_t *, rpcproc_t, xdrproc_t, caddr_t, xdrproc_t, 375 caddr_t, cred_t *, int *, nfsstat3 *, int, 376 failinfo_t *); 377 extern void nfs_acl_free(vsecattr_t *); 378 #endif 379 380 #ifdef _KERNEL 381 /* server and client data structures */ 382 extern kstat_named_t *aclproccnt_v2_ptr; 383 extern kstat_named_t *aclproccnt_v3_ptr; 384 385 extern char *aclnames_v2[]; 386 extern uchar_t acl_call_type_v2[]; 387 extern uchar_t acl_ss_call_type_v2[]; 388 extern uchar_t acl_timer_type_v2[]; 389 390 extern char *aclnames_v3[]; 391 extern uchar_t acl_call_type_v3[]; 392 extern uchar_t acl_ss_call_type_v3[]; 393 extern uchar_t acl_timer_type_v3[]; 394 #endif 395 396 #ifdef __cplusplus 397 } 398 #endif 399 400 #endif /* _NFS_NFS_ACL_H */ 401