/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2006 Sun Microsystems, Inc. * All rights reserved. * Use is subject to license terms. */ /* * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #ifndef _NFS_NFS_ACL_H #define _NFS_NFS_ACL_H #ifdef __cplusplus extern "C" { #endif #define NFS_ACL_MAX_ENTRIES 1024 typedef ushort_t o_mode; struct aclent { int type; uid32_t id; o_mode perm; }; typedef struct aclent aclent; #define NA_USER_OBJ 0x1 #define NA_USER 0x2 #define NA_GROUP_OBJ 0x4 #define NA_GROUP 0x8 #define NA_CLASS_OBJ 0x10 #define NA_OTHER_OBJ 0x20 #define NA_ACL_DEFAULT 0x1000 #define NA_READ 0x4 #define NA_WRITE 0x2 #define NA_EXEC 0x1 struct secattr { uint32 mask; int aclcnt; struct { uint_t aclent_len; aclent *aclent_val; } aclent; int dfaclcnt; struct { uint_t dfaclent_len; aclent *dfaclent_val; } dfaclent; }; typedef struct secattr secattr; #define NA_ACL 0x1 #define NA_ACLCNT 0x2 #define NA_DFACL 0x4 #define NA_DFACLCNT 0x8 struct GETACL2args { fhandle_t fh; uint32 mask; }; typedef struct GETACL2args GETACL2args; struct GETACL2resok { struct nfsfattr attr; vsecattr_t acl; }; typedef struct GETACL2resok GETACL2resok; struct GETACL2res { enum nfsstat status; union { GETACL2resok ok; } res_u; }; typedef struct GETACL2res GETACL2res; struct SETACL2args { fhandle_t fh; vsecattr_t acl; }; typedef struct SETACL2args SETACL2args; struct SETACL2resok { struct nfsfattr attr; }; typedef struct SETACL2resok SETACL2resok; struct SETACL2res { enum nfsstat status; union { SETACL2resok ok; } res_u; }; typedef struct SETACL2res SETACL2res; struct GETATTR2args { fhandle_t fh; }; typedef struct GETATTR2args GETATTR2args; struct GETATTR2resok { struct nfsfattr attr; }; typedef struct GETATTR2resok GETATTR2resok; struct GETATTR2res { enum nfsstat status; union { GETATTR2resok ok; } res_u; }; typedef struct GETATTR2res GETATTR2res; struct ACCESS2args { fhandle_t fh; uint32 access; }; typedef struct ACCESS2args ACCESS2args; #define ACCESS2_READ 0x1 #define ACCESS2_LOOKUP 0x2 #define ACCESS2_MODIFY 0x4 #define ACCESS2_EXTEND 0x8 #define ACCESS2_DELETE 0x10 #define ACCESS2_EXECUTE 0x20 struct ACCESS2resok { struct nfsfattr attr; uint32 access; }; typedef struct ACCESS2resok ACCESS2resok; struct ACCESS2res { enum nfsstat status; union { ACCESS2resok ok; } res_u; }; typedef struct ACCESS2res ACCESS2res; struct GETXATTRDIR2args { fhandle_t fh; bool_t create; }; typedef struct GETXATTRDIR2args GETXATTRDIR2args; struct GETXATTRDIR2resok { fhandle_t fh; struct nfsfattr attr; }; typedef struct GETXATTRDIR2resok GETXATTRDIR2resok; struct GETXATTRDIR2res { enum nfsstat status; union { GETXATTRDIR2resok ok; } res_u; }; typedef struct GETXATTRDIR2res GETXATTRDIR2res; struct GETACL3args { nfs_fh3 fh; uint32 mask; }; typedef struct GETACL3args GETACL3args; struct GETACL3resok { post_op_attr attr; vsecattr_t acl; }; typedef struct GETACL3resok GETACL3resok; struct GETACL3resfail { post_op_attr attr; }; typedef struct GETACL3resfail GETACL3resfail; struct GETACL3res { nfsstat3 status; union { GETACL3resok ok; GETACL3resfail fail; } res_u; }; typedef struct GETACL3res GETACL3res; struct SETACL3args { nfs_fh3 fh; vsecattr_t acl; }; typedef struct SETACL3args SETACL3args; struct SETACL3resok { post_op_attr attr; }; typedef struct SETACL3resok SETACL3resok; struct SETACL3resfail { post_op_attr attr; }; typedef struct SETACL3resfail SETACL3resfail; struct SETACL3res { nfsstat3 status; union { SETACL3resok ok; SETACL3resfail fail; } res_u; }; typedef struct SETACL3res SETACL3res; struct GETXATTRDIR3args { nfs_fh3 fh; bool_t create; }; typedef struct GETXATTRDIR3args GETXATTRDIR3args; struct GETXATTRDIR3resok { nfs_fh3 fh; post_op_attr attr; }; typedef struct GETXATTRDIR3resok GETXATTRDIR3resok; struct GETXATTRDIR3res { nfsstat3 status; union { GETXATTRDIR3resok ok; } res_u; }; typedef struct GETXATTRDIR3res GETXATTRDIR3res; #define NFS_ACL_PROGRAM ((rpcprog_t)(100227)) #define NFS_ACL_VERSMIN ((rpcvers_t)(2)) #define NFS_ACL_VERSMAX ((rpcvers_t)(3)) #define NFS_ACL_V2 ((rpcvers_t)(2)) #define ACLPROC2_NULL ((rpcproc_t)(0)) #define ACLPROC2_GETACL ((rpcproc_t)(1)) #define ACLPROC2_SETACL ((rpcproc_t)(2)) #define ACLPROC2_GETATTR ((rpcproc_t)(3)) #define ACLPROC2_ACCESS ((rpcproc_t)(4)) #define ACLPROC2_GETXATTRDIR ((rpcproc_t)(5)) #define NFS_ACL_V3 ((rpcvers_t)(3)) #define ACLPROC3_NULL ((rpcproc_t)(0)) #define ACLPROC3_GETACL ((rpcproc_t)(1)) #define ACLPROC3_SETACL ((rpcproc_t)(2)) #define ACLPROC3_GETXATTRDIR ((rpcproc_t)(3)) #ifdef _KERNEL /* the xdr functions */ extern bool_t xdr_uid(XDR *, uid32_t *); extern bool_t xdr_o_mode(XDR *, o_mode *); extern bool_t xdr_aclent(XDR *, aclent_t *); extern bool_t xdr_secattr(XDR *, vsecattr_t *); extern bool_t xdr_GETACL2args(XDR *, GETACL2args *); extern bool_t xdr_fastGETACL2args(XDR *, GETACL2args **); extern bool_t xdr_GETACL2resok(XDR *, GETACL2resok *); extern bool_t xdr_GETACL2res(XDR *, GETACL2res *); extern bool_t xdr_SETACL2args(XDR *, SETACL2args *); extern bool_t xdr_SETACL2resok(XDR *, SETACL2resok *); #ifdef _LITTLE_ENDIAN extern bool_t xdr_fastSETACL2resok(XDR *, SETACL2resok *); #endif extern bool_t xdr_SETACL2res(XDR *, SETACL2res *); #ifdef _LITTLE_ENDIAN extern bool_t xdr_fastSETACL2res(XDR *, SETACL2res *); #endif extern bool_t xdr_GETATTR2args(XDR *, GETATTR2args *); extern bool_t xdr_fastGETATTR2args(XDR *, GETATTR2args **); extern bool_t xdr_GETATTR2resok(XDR *, GETATTR2resok *); #ifdef _LITTLE_ENDIAN extern bool_t xdr_fastGETATTR2resok(XDR *, GETATTR2resok *); #endif extern bool_t xdr_GETATTR2res(XDR *, GETATTR2res *); #ifdef _LITTLE_ENDIAN extern bool_t xdr_fastGETATTR2res(XDR *, GETATTR2res *); #endif extern bool_t xdr_ACCESS2args(XDR *, ACCESS2args *); extern bool_t xdr_fastACCESS2args(XDR *, ACCESS2args **); extern bool_t xdr_ACCESS2resok(XDR *, ACCESS2resok *); #ifdef _LITTLE_ENDIAN extern bool_t xdr_fastACCESS2resok(XDR *, ACCESS2resok *); #endif extern bool_t xdr_ACCESS2res(XDR *, ACCESS2res *); #ifdef _LITTLE_ENDIAN extern bool_t xdr_fastACCESS2res(XDR *, ACCESS2res *); #endif extern bool_t xdr_GETXATTRDIR2args(XDR *, GETXATTRDIR2args *); extern bool_t xdr_GETXATTRDIR2res(XDR *, GETXATTRDIR2res *); extern bool_t xdr_GETACL3args(XDR *, GETACL3args *); extern bool_t xdr_GETACL3resok(XDR *, GETACL3resok *); extern bool_t xdr_GETACL3resfail(XDR *, GETACL3resfail *); extern bool_t xdr_GETACL3res(XDR *, GETACL3res *); extern bool_t xdr_SETACL3args(XDR *, SETACL3args *); extern bool_t xdr_SETACL3resok(XDR *, SETACL3resok *); extern bool_t xdr_SETACL3resfail(XDR *, SETACL3resfail *); extern bool_t xdr_SETACL3res(XDR *, SETACL3res *); extern bool_t xdr_GETXATTRDIR3args(XDR *, GETXATTRDIR3args *); extern bool_t xdr_GETXATTRDIR3res(XDR *, GETXATTRDIR3res *); #endif #ifdef _KERNEL /* the service procedures */ extern void acl2_getacl(GETACL2args *, GETACL2res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl2_getacl_getfh(GETACL2args *); extern void acl2_getacl_free(GETACL2res *); extern void acl2_setacl(SETACL2args *, SETACL2res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl2_setacl_getfh(SETACL2args *); extern void acl2_getattr(GETATTR2args *, GETATTR2res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl2_getattr_getfh(GETATTR2args *); extern void acl2_access(ACCESS2args *, ACCESS2res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl2_access_getfh(ACCESS2args *); extern void acl2_getxattrdir(GETXATTRDIR2args *, GETXATTRDIR2res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl2_getxattrdir_getfh(GETXATTRDIR2args *); extern void acl3_getacl(GETACL3args *, GETACL3res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl3_getacl_getfh(GETACL3args *); extern void acl3_getacl_free(GETACL3res *); extern void acl3_setacl(SETACL3args *, SETACL3res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl3_setacl_getfh(SETACL3args *); extern void acl3_getxattrdir(GETXATTRDIR3args *, GETXATTRDIR3res *, struct exportinfo *, struct svc_req *, cred_t *, bool_t); extern void *acl3_getxattrdir_getfh(GETXATTRDIR3args *); #endif #ifdef _KERNEL /* the client side procedures */ extern int acl_getacl2(vnode_t *, vsecattr_t *, int, cred_t *); extern int acl_setacl2(vnode_t *, vsecattr_t *, int, cred_t *); extern int acl_getattr2_otw(vnode_t *, vattr_t *, cred_t *); extern int acl_access2(vnode_t *, int, int, cred_t *); extern int acl_getxattrdir2(vnode_t *, vnode_t **, bool_t, cred_t *, int); extern int acl_getacl3(vnode_t *, vsecattr_t *, int, cred_t *); extern int acl_setacl3(vnode_t *, vsecattr_t *, int, cred_t *); extern int acl_getxattrdir3(vnode_t *, vnode_t **, bool_t, cred_t *, int); extern int acl2call(mntinfo_t *, rpcproc_t, xdrproc_t, caddr_t, xdrproc_t, caddr_t, cred_t *, int *, enum nfsstat *, int, failinfo_t *); extern int acl3call(mntinfo_t *, rpcproc_t, xdrproc_t, caddr_t, xdrproc_t, caddr_t, cred_t *, int *, nfsstat3 *, int, failinfo_t *); extern void nfs_acl_free(vsecattr_t *); #endif #ifdef _KERNEL /* server and client data structures */ extern char *aclnames_v2[]; extern uchar_t acl_call_type_v2[]; extern uchar_t acl_ss_call_type_v2[]; extern uchar_t acl_timer_type_v2[]; extern char *aclnames_v3[]; extern uchar_t acl_call_type_v3[]; extern uchar_t acl_ss_call_type_v3[]; extern uchar_t acl_timer_type_v3[]; #endif #ifdef __cplusplus } #endif #endif /* _NFS_NFS_ACL_H */