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