1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 0 stevel * Common Development and Distribution License, Version 1.0 only 6 0 stevel * (the "License"). You may not use this file except in compliance 7 0 stevel * with the License. 8 0 stevel * 9 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 0 stevel * or http://www.opensolaris.org/os/licensing. 11 0 stevel * See the License for the specific language governing permissions 12 0 stevel * and limitations under the License. 13 0 stevel * 14 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 15 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 0 stevel * If applicable, add the following below this CDDL HEADER, with the 17 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 18 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 19 0 stevel * 20 0 stevel * CDDL HEADER END 21 0 stevel */ 22 0 stevel /* 23 0 stevel * Copyright 1994,2001-2003 Sun Microsystems, Inc. 24 0 stevel * All rights reserved. 25 0 stevel * Use is subject to license terms. 26 0 stevel */ 27 0 stevel 28 0 stevel /* 29 0 stevel * ident "%Z%%M% %I% %E% SMI" 30 0 stevel */ 31 0 stevel 32 0 stevel const NFS_ACL_MAX_ENTRIES = 1024; 33 0 stevel 34 0 stevel typedef int uid; 35 0 stevel typedef unsigned short o_mode; 36 0 stevel 37 0 stevel /* 38 0 stevel * This is the format of an ACL which is passed over the network. 39 0 stevel */ 40 0 stevel struct aclent { 41 0 stevel int type; 42 0 stevel uid id; 43 0 stevel o_mode perm; 44 0 stevel }; 45 0 stevel 46 0 stevel /* 47 0 stevel * The values for the type element of the aclent structure. 48 0 stevel */ 49 0 stevel const NA_USER_OBJ = 0x1; /* object owner */ 50 0 stevel const NA_USER = 0x2; /* additional users */ 51 0 stevel const NA_GROUP_OBJ = 0x4; /* owning group of the object */ 52 0 stevel const NA_GROUP = 0x8; /* additional groups */ 53 0 stevel const NA_CLASS_OBJ = 0x10; /* file group class and mask entry */ 54 0 stevel const NA_OTHER_OBJ = 0x20; /* other entry for the object */ 55 0 stevel const NA_ACL_DEFAULT = 0x1000; /* default flag */ 56 0 stevel 57 0 stevel /* 58 0 stevel * The bit field values for the perm element of the aclent 59 0 stevel * structure. The three values can be combined to form any 60 0 stevel * of the 8 combinations. 61 0 stevel */ 62 0 stevel const NA_READ = 0x4; /* read permission */ 63 0 stevel const NA_WRITE = 0x2; /* write permission */ 64 0 stevel const NA_EXEC = 0x1; /* exec permission */ 65 0 stevel 66 0 stevel /* 67 0 stevel * This is the structure which contains the ACL entries for a 68 0 stevel * particular entity. It contains the ACL entries which apply 69 0 stevel * to this object plus any default ACL entries which are 70 0 stevel * inherited by its children. 71 0 stevel * 72 0 stevel * The values for the mask field are defined below. 73 0 stevel */ 74 0 stevel struct secattr { 75 0 stevel u_int mask; 76 0 stevel int aclcnt; 77 0 stevel aclent aclent<NFS_ACL_MAX_ENTRIES>; 78 0 stevel int dfaclcnt; 79 0 stevel aclent dfaclent<NFS_ACL_MAX_ENTRIES>; 80 0 stevel }; 81 0 stevel 82 0 stevel /* 83 0 stevel * The values for the mask element of the secattr struct as well 84 0 stevel * as for the mask element in the arguments in the GETACL2 and 85 0 stevel * GETACL3 procedures. 86 0 stevel */ 87 0 stevel const NA_ACL = 0x1; /* aclent contains a valid list */ 88 0 stevel const NA_ACLCNT = 0x2; /* the number of entries in the aclent list */ 89 0 stevel const NA_DFACL = 0x4; /* dfaclent contains a valid list */ 90 0 stevel const NA_DFACLCNT = 0x8; /* the number of entries in the dfaclent list */ 91 0 stevel 92 0 stevel /* 93 0 stevel * This the definition for the GETACL procedure which applies to 94 0 stevel * NFS Version 2. 95 0 stevel */ 96 0 stevel struct GETACL2args { 97 0 stevel fhandle_t fh; 98 0 stevel u_int mask; 99 0 stevel }; 100 0 stevel 101 0 stevel struct GETACL2resok { 102 0 stevel struct nfsfattr attr; 103 0 stevel secattr acl; 104 0 stevel }; 105 0 stevel 106 0 stevel union GETACL2res switch (enum nfsstat status) { 107 0 stevel case ACL2_OK: 108 0 stevel GETACL2resok resok; 109 0 stevel default: 110 0 stevel void; 111 0 stevel }; 112 0 stevel 113 0 stevel /* 114 0 stevel * This is the definition for the SETACL procedure which applies 115 0 stevel * NFS Version 2. 116 0 stevel */ 117 0 stevel struct SETACL2args { 118 0 stevel fhandle_t fh; 119 0 stevel secattr acl; 120 0 stevel }; 121 0 stevel 122 0 stevel struct SETACL2resok { 123 0 stevel struct nfsfattr attr; 124 0 stevel }; 125 0 stevel 126 0 stevel union SETACL2res switch (enum nfsstat status) { 127 0 stevel case ACL2_OK: 128 0 stevel SETACL2resok resok; 129 0 stevel default: 130 0 stevel void; 131 0 stevel }; 132 0 stevel 133 0 stevel /* 134 0 stevel * This is the definition for the GETATTR procedure which can be 135 0 stevel * used as an alternative to the GETATTR in NFS Version 2. The 136 0 stevel * main difference between this GETATTR and the NFS GETATTR is 137 0 stevel * that this GETATTR returns the mode of the file without it being 138 0 stevel * changed to match the min/max permissions mapping that the NFS 139 0 stevel * Version 2 server does. 140 0 stevel */ 141 0 stevel struct GETATTR2args { 142 0 stevel fhandle_t fh; 143 0 stevel }; 144 0 stevel 145 0 stevel struct GETATTR2resok { 146 0 stevel struct nfsfattr attr; 147 0 stevel }; 148 0 stevel 149 0 stevel union GETATTR2res switch (enum nfsstat status) { 150 0 stevel case ACL2_OK: 151 0 stevel GETATTR2resok resok; 152 0 stevel default: 153 0 stevel void; 154 0 stevel }; 155 0 stevel 156 0 stevel /* 157 0 stevel * This is the definition for the ACCESS procedure which applies 158 0 stevel * to NFS Version 2. 159 0 stevel */ 160 0 stevel struct ACCESS2args { 161 0 stevel fhandle_t fh; 162 0 stevel uint32 access; 163 0 stevel }; 164 0 stevel 165 0 stevel /* 166 0 stevel * The following access permissions may be requested: 167 0 stevel */ 168 0 stevel const ACCESS2_READ = 0x1; /* read data or readdir a directory */ 169 0 stevel const ACCESS2_LOOKUP = 0x2; /* lookup a name in a directory */ 170 0 stevel const ACCESS2_MODIFY = 0x4; /* rewrite existing file data or */ 171 0 stevel /* modify existing directory entries */ 172 0 stevel const ACCESS2_EXTEND = 0x8; /* write new data or add directory entries */ 173 0 stevel const ACCESS2_DELETE = 0x10; /* delete existing directory entry */ 174 0 stevel const ACCESS2_EXECUTE = 0x20; /* execute file (no meaning for a directory) */ 175 0 stevel 176 0 stevel struct ACCESS2resok { 177 0 stevel struct nfsfattr attr; 178 0 stevel uint32 access; 179 0 stevel }; 180 0 stevel 181 0 stevel union ACCESS2res switch (enum nfsstat status) { 182 0 stevel case ACL2_OK: 183 0 stevel ACCESS2resok resok; 184 0 stevel default: 185 0 stevel void; 186 0 stevel }; 187 0 stevel 188 0 stevel /* 189 0 stevel * This is the definition for the GETXATTRDIR procedure which applies 190 0 stevel * to NFS Version 2 files. 191 0 stevel */ 192 0 stevel struct GETXATTRDIR2args { 193 0 stevel fhandle_t fh; 194 0 stevel bool create; 195 0 stevel }; 196 0 stevel 197 0 stevel struct GETXATTRDIR2resok { 198 0 stevel fhandle_t fh; 199 0 stevel struct nfsfattr attr; 200 0 stevel }; 201 0 stevel 202 0 stevel union GETXATTRDIR2res switch (enum nfsstat status) { 203 0 stevel case ACL2_OK: 204 0 stevel GETXATTRDIR2resok resok; 205 0 stevel default: 206 0 stevel void; 207 0 stevel }; 208 0 stevel 209 0 stevel /* 210 0 stevel * This is the definition for the GETACL procedure which applies 211 0 stevel * to NFS Version 3 files. 212 0 stevel */ 213 0 stevel struct GETACL3args { 214 0 stevel nfs_fh3 fh; 215 0 stevel u_int mask; 216 0 stevel }; 217 0 stevel 218 0 stevel struct GETACL3resok { 219 0 stevel post_op_attr attr; 220 0 stevel secattr acl; 221 0 stevel }; 222 0 stevel 223 0 stevel struct GETACL3resfail { 224 0 stevel post_op_attr attr; 225 0 stevel }; 226 0 stevel 227 0 stevel union GETACL3res switch (nfsstat3 status) { 228 0 stevel case ACL3_OK: 229 0 stevel GETACL3resok resok; 230 0 stevel default: 231 0 stevel GETACL3resfail resfail; 232 0 stevel }; 233 0 stevel 234 0 stevel /* 235 0 stevel * This is the definition for the SETACL procedure which applies 236 0 stevel * to NFS Version 3 files. 237 0 stevel */ 238 0 stevel struct SETACL3args { 239 0 stevel nfs_fh3 fh; 240 0 stevel secattr acl; 241 0 stevel }; 242 0 stevel 243 0 stevel struct SETACL3resok { 244 0 stevel post_op_attr attr; 245 0 stevel }; 246 0 stevel 247 0 stevel struct SETACL3resfail { 248 0 stevel post_op_attr attr; 249 0 stevel }; 250 0 stevel 251 0 stevel union SETACL3res switch (nfsstat3 status) { 252 0 stevel case ACL3_OK: 253 0 stevel SETACL3resok resok; 254 0 stevel default: 255 0 stevel SETACL3resfail resfail; 256 0 stevel }; 257 0 stevel 258 0 stevel /* 259 0 stevel * This is the definition for the GETXATTRDIR procedure which applies 260 0 stevel * to NFS Version 3 files. 261 0 stevel */ 262 0 stevel struct GETXATTRDIR3args { 263 0 stevel nfs_fh3 fh; 264 0 stevel bool create; 265 0 stevel }; 266 0 stevel 267 0 stevel struct GETXATTRDIR3resok { 268 0 stevel nfs_fh3 fh; 269 0 stevel post_op_attr attr; 270 0 stevel }; 271 0 stevel 272 0 stevel union GETXATTRDIR3res switch (nfsstat3 status) { 273 0 stevel case ACL3_OK: 274 0 stevel GETXATTRDIR3resok resok; 275 0 stevel default: 276 0 stevel void; 277 0 stevel }; 278 0 stevel 279 0 stevel /* 280 0 stevel * XXX { 281 0 stevel * This is a transitional interface to enable Solaris NFSv4 282 0 stevel * clients to manipulate ACLs on Solaris servers until the 283 0 stevel * spec is complete enough to implement this inside the 284 0 stevel * NFSv4 protocol itself. NFSv4 does handle extended 285 0 stevel * attributes in-band. 286 0 stevel */ 287 0 stevel 288 0 stevel /* 289 0 stevel * This is the definition for the GETACL procedure which applies 290 0 stevel * to NFS Version 4 files. 291 0 stevel */ 292 0 stevel struct GETACL4args { 293 0 stevel nfs_fh4 fh; 294 0 stevel u_int mask; 295 0 stevel }; 296 0 stevel 297 0 stevel struct GETACL4resok { 298 0 stevel post_op_attr attr; 299 0 stevel secattr acl; 300 0 stevel }; 301 0 stevel 302 0 stevel struct GETACL4resfail { 303 0 stevel post_op_attr attr; 304 0 stevel }; 305 0 stevel 306 0 stevel union GETACL4res switch (nfsstat3 status) { 307 0 stevel case ACL4_OK: 308 0 stevel GETACL4resok resok; 309 0 stevel default: 310 0 stevel GETACL4resfail resfail; 311 0 stevel }; 312 0 stevel 313 0 stevel /* 314 0 stevel * This is the definition for the SETACL procedure which applies 315 0 stevel * to NFS Version 4 files. 316 0 stevel */ 317 0 stevel struct SETACL4args { 318 0 stevel nfs_fh4 fh; 319 0 stevel secattr acl; 320 0 stevel }; 321 0 stevel 322 0 stevel struct SETACL4resok { 323 0 stevel post_op_attr attr; 324 0 stevel }; 325 0 stevel 326 0 stevel struct SETACL4resfail { 327 0 stevel post_op_attr attr; 328 0 stevel }; 329 0 stevel 330 0 stevel union SETACL4res switch (nfsstat3 status) { 331 0 stevel case ACL4_OK: 332 0 stevel SETACL4resok resok; 333 0 stevel default: 334 0 stevel SETACL4resfail resfail; 335 0 stevel }; 336 0 stevel 337 0 stevel /* XXX } */ 338 0 stevel 339 0 stevel /* 340 0 stevel * Share the port with the NFS service. NFS has to be running 341 0 stevel * in order for this service to be useful anyway. 342 0 stevel */ 343 0 stevel const NFS_ACL_PORT = 2049; 344 0 stevel 345 0 stevel /* 346 0 stevel * This is the definition for the ACL network protocol which is used 347 0 stevel * to provide support for Solaris ACLs for files which are accessed 348 0 stevel * via NFS Version 2 and NFS Version 3. 349 0 stevel */ 350 0 stevel program NFS_ACL_PROGRAM { 351 0 stevel version NFS_ACL_V2 { 352 0 stevel void 353 0 stevel ACLPROC2_NULL(void) = 0; 354 0 stevel GETACL2res 355 0 stevel ACLPROC2_GETACL(GETACL2args) = 1; 356 0 stevel SETACL2res 357 0 stevel ACLPROC2_SETACL(SETACL2args) = 2; 358 0 stevel GETATTR2res 359 0 stevel ACLPROC2_GETATTR(GETATTR2args) = 3; 360 0 stevel ACCESS2res 361 0 stevel ACLPROC2_ACCESS(ACCESS2args) = 4; 362 0 stevel GETXATTRDIR2res 363 0 stevel ACLPROC2_GETXATTRDIR(GETXATTRDIR2args) = 5; 364 0 stevel } = 2; 365 0 stevel version NFS_ACL_V3 { 366 0 stevel void 367 0 stevel ACLPROC3_NULL(void) = 0; 368 0 stevel GETACL3res 369 0 stevel ACLPROC3_GETACL(GETACL3args) = 1; 370 0 stevel SETACL3res 371 0 stevel ACLPROC3_SETACL(SETACL3args) = 2; 372 0 stevel GETXATTRDIR3res 373 0 stevel ACLPROC3_GETXATTRDIR(GETXATTRDIR3args) = 3; 374 0 stevel } = 3; 375 0 stevel version NFS_ACL_V4 { 376 0 stevel void 377 0 stevel ACLPROC4_NULL(void) = 0; 378 0 stevel GETACL4res 379 0 stevel ACLPROC4_GETACL(GETACL4args) = 1; 380 0 stevel SETACL4res 381 0 stevel ACLPROC4_SETACL(SETACL4args) = 2; 382 0 stevel } = 4; 383 0 stevel } = 100227; 384