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 9759 Vasumathi * Common Development and Distribution License (the "License"). 6 9759 Vasumathi * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 9759 Vasumathi * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel #include <sys/types.h> 27 0 stevel #include <sys/errno.h> 28 0 stevel #include <sys/tiuser.h> 29 0 stevel #include <setjmp.h> 30 0 stevel #include <pwd.h> 31 0 stevel #include <grp.h> 32 0 stevel 33 0 stevel #include <rpc/types.h> 34 0 stevel #include <rpc/xdr.h> 35 0 stevel #include <rpc/auth.h> 36 0 stevel #include <rpc/clnt.h> 37 0 stevel #include <rpc/rpc_msg.h> 38 0 stevel #include <string.h> 39 0 stevel #include "snoop.h" 40 0 stevel 41 0 stevel #include <sys/stat.h> 42 0 stevel 43 0 stevel extern char *get_sum_line(); 44 0 stevel extern void check_retransmit(); 45 0 stevel extern char *sum_nfsfh(); 46 0 stevel extern int sum_nfsstat(); 47 0 stevel extern int detail_nfsstat(); 48 0 stevel extern void detail_nfsfh(); 49 0 stevel extern void detail_fattr(); 50 0 stevel extern void skip_fattr(); 51 0 stevel extern char *sum_nfsfh3(); 52 0 stevel extern int sum_nfsstat3(); 53 0 stevel extern int detail_nfsstat3(); 54 0 stevel extern void detail_post_op_attr(); 55 0 stevel extern void detail_nfsfh3(); 56 0 stevel extern int sum_nfsstat4(); 57 0 stevel extern int detail_nfsstat4(); 58 0 stevel 59 0 stevel extern jmp_buf xdr_err; 60 0 stevel 61 0 stevel static void aclcall2(); 62 0 stevel static void aclreply2(); 63 0 stevel static void aclcall3(); 64 0 stevel static void aclreply3(); 65 0 stevel static void aclcall4(); 66 0 stevel static void aclreply4(); 67 0 stevel static void detail_access2(); 68 0 stevel static char *sum_access2(); 69 0 stevel static void detail_mask(); 70 0 stevel static void detail_secattr(); 71 0 stevel static void detail_aclent(); 72 0 stevel static char *detail_uname(); 73 0 stevel static char *detail_gname(); 74 0 stevel static char *detail_perm(ushort_t); 75 410 kcpoon static void interpret_nfs_acl2(int, int, int, int, int, char *, int); 76 410 kcpoon static void interpret_nfs_acl3(int, int, int, int, int, char *, int); 77 410 kcpoon static void interpret_nfs_acl4(int, int, int, int, int, char *, int); 78 0 stevel 79 0 stevel #define ACLPROC2_NULL ((unsigned long)(0)) 80 0 stevel #define ACLPROC2_GETACL ((unsigned long)(1)) 81 0 stevel #define ACLPROC2_SETACL ((unsigned long)(2)) 82 0 stevel #define ACLPROC2_GETATTR ((unsigned long)(3)) 83 0 stevel #define ACLPROC2_ACCESS ((unsigned long)(4)) 84 0 stevel #define ACLPROC2_GETXATTRDIR ((unsigned long)(5)) 85 0 stevel 86 0 stevel #define ACLPROC3_NULL ((unsigned long)(0)) 87 0 stevel #define ACLPROC3_GETACL ((unsigned long)(1)) 88 0 stevel #define ACLPROC3_SETACL ((unsigned long)(2)) 89 0 stevel #define ACLPROC3_GETXATTRDIR ((unsigned long)(3)) 90 0 stevel 91 0 stevel #define ACLPROC4_NULL ((unsigned long)(0)) 92 0 stevel #define ACLPROC4_GETACL ((unsigned long)(1)) 93 0 stevel #define ACLPROC4_SETACL ((unsigned long)(2)) 94 0 stevel 95 0 stevel #define NA_USER_OBJ 0x1 96 0 stevel #define NA_USER 0x2 97 0 stevel #define NA_GROUP_OBJ 0x4 98 0 stevel #define NA_GROUP 0x8 99 0 stevel #define NA_CLASS_OBJ 0x10 100 0 stevel #define NA_OTHER_OBJ 0x20 101 0 stevel #define NA_ACL_DEFAULT 0x1000 102 0 stevel 103 0 stevel #define NA_DEF_USER_OBJ (NA_USER_OBJ | NA_ACL_DEFAULT) 104 0 stevel #define NA_DEF_USER (NA_USER | NA_ACL_DEFAULT) 105 0 stevel #define NA_DEF_GROUP_OBJ (NA_GROUP_OBJ | NA_ACL_DEFAULT) 106 0 stevel #define NA_DEF_GROUP (NA_GROUP | NA_ACL_DEFAULT) 107 0 stevel #define NA_DEF_CLASS_OBJ (NA_CLASS_OBJ | NA_ACL_DEFAULT) 108 0 stevel #define NA_DEF_OTHER_OBJ (NA_OTHER_OBJ | NA_ACL_DEFAULT) 109 0 stevel 110 0 stevel #define NA_ACL 0x1 111 0 stevel #define NA_ACLCNT 0x2 112 0 stevel #define NA_DFACL 0x4 113 0 stevel #define NA_DFACLCNT 0x8 114 0 stevel 115 0 stevel #define ACCESS2_READ 0x0001 116 0 stevel #define ACCESS2_LOOKUP 0x0002 117 0 stevel #define ACCESS2_MODIFY 0x0004 118 0 stevel #define ACCESS2_EXTEND 0x0008 119 0 stevel #define ACCESS2_DELETE 0x0010 120 0 stevel #define ACCESS2_EXECUTE 0x0020 121 0 stevel 122 0 stevel static char *procnames_short_v2[] = { 123 0 stevel "NULL2", /* 0 */ 124 0 stevel "GETACL2", /* 1 */ 125 0 stevel "SETACL2", /* 2 */ 126 0 stevel "GETATTR2", /* 3 */ 127 0 stevel "ACCESS2", /* 4 */ 128 0 stevel "GETXATTRDIR2", /* 5 */ 129 0 stevel }; 130 0 stevel static char *procnames_short_v3[] = { 131 0 stevel "NULL3", /* 0 */ 132 0 stevel "GETACL3", /* 1 */ 133 0 stevel "SETACL3", /* 2 */ 134 0 stevel "GETXATTRDIR3", /* 3 */ 135 0 stevel }; 136 0 stevel static char *procnames_short_v4[] = { 137 0 stevel "NULL4", /* 0 */ 138 0 stevel "GETACL4", /* 1 */ 139 0 stevel "SETACL4", /* 2 */ 140 0 stevel }; 141 0 stevel 142 0 stevel static char *procnames_long_v2[] = { 143 0 stevel "Null procedure", /* 0 */ 144 0 stevel "Get file access control list", /* 1 */ 145 0 stevel "Set file access control list", /* 2 */ 146 0 stevel "Get file attributes", /* 3 */ 147 0 stevel "Check access permission", /* 4 */ 148 0 stevel "Get extended attribute directory", /* 5 */ 149 0 stevel }; 150 0 stevel static char *procnames_long_v3[] = { 151 0 stevel "Null procedure", /* 0 */ 152 0 stevel "Get file access control list", /* 1 */ 153 0 stevel "Set file access control list", /* 2 */ 154 0 stevel "Get extended attribute directory", /* 3 */ 155 0 stevel }; 156 0 stevel static char *procnames_long_v4[] = { 157 0 stevel "Null procedure", /* 0 */ 158 0 stevel "Get file access control list", /* 1 */ 159 0 stevel "Set file access control list", /* 2 */ 160 0 stevel }; 161 0 stevel 162 0 stevel #define MAXPROC_V2 5 163 0 stevel #define MAXPROC_V3 3 164 0 stevel #define MAXPROC_V4 2 165 0 stevel 166 0 stevel /* ARGSUSED */ 167 0 stevel void 168 0 stevel interpret_nfs_acl(flags, type, xid, vers, proc, data, len) 169 0 stevel int flags, type, xid, vers, proc; 170 0 stevel char *data; 171 0 stevel int len; 172 0 stevel { 173 0 stevel 174 0 stevel if (vers == 2) { 175 0 stevel interpret_nfs_acl2(flags, type, xid, vers, proc, data, len); 176 0 stevel return; 177 0 stevel } 178 0 stevel 179 0 stevel if (vers == 3) { 180 0 stevel interpret_nfs_acl3(flags, type, xid, vers, proc, data, len); 181 0 stevel return; 182 0 stevel } 183 0 stevel 184 0 stevel if (vers == 4) { 185 0 stevel interpret_nfs_acl4(flags, type, xid, vers, proc, data, len); 186 0 stevel return; 187 0 stevel } 188 0 stevel } 189 0 stevel 190 410 kcpoon static void 191 410 kcpoon interpret_nfs_acl2(int flags, int type, int xid, int vers, int proc, 192 410 kcpoon char *data, int len) 193 0 stevel { 194 0 stevel char *line; 195 0 stevel char buff[2048]; 196 0 stevel int off, sz; 197 0 stevel char *fh; 198 0 stevel ulong_t mask; 199 0 stevel 200 0 stevel if (proc < 0 || proc > MAXPROC_V2) 201 0 stevel return; 202 0 stevel 203 0 stevel if (flags & F_SUM) { 204 0 stevel line = get_sum_line(); 205 0 stevel 206 0 stevel if (type == CALL) { 207 0 stevel (void) sprintf(line, "NFS_ACL C %s", 208 9759 Vasumathi procnames_short_v2[proc]); 209 0 stevel line += strlen(line); 210 0 stevel switch (proc) { 211 0 stevel case ACLPROC2_GETACL: 212 0 stevel fh = sum_nfsfh(); 213 0 stevel mask = getxdr_u_long(); 214 0 stevel (void) sprintf(line, "%s mask=%lu", fh, mask); 215 0 stevel break; 216 0 stevel case ACLPROC2_SETACL: 217 0 stevel (void) sprintf(line, sum_nfsfh()); 218 0 stevel break; 219 0 stevel case ACLPROC2_GETATTR: 220 0 stevel (void) sprintf(line, sum_nfsfh()); 221 0 stevel break; 222 0 stevel case ACLPROC2_ACCESS: 223 0 stevel fh = sum_nfsfh(); 224 0 stevel (void) sprintf(line, "%s (%s)", fh, 225 9759 Vasumathi sum_access2()); 226 0 stevel break; 227 0 stevel case ACLPROC2_GETXATTRDIR: 228 0 stevel fh = sum_nfsfh(); 229 0 stevel (void) sprintf(line, "%s create=%s", fh, 230 0 stevel getxdr_bool() ? "true" : "false"); 231 0 stevel break; 232 0 stevel default: 233 0 stevel break; 234 0 stevel } 235 0 stevel 236 0 stevel check_retransmit(line, (ulong_t)xid); 237 0 stevel } else { 238 0 stevel (void) sprintf(line, "NFS_ACL R %s ", 239 9759 Vasumathi procnames_short_v2[proc]); 240 0 stevel line += strlen(line); 241 0 stevel switch (proc) { 242 0 stevel case ACLPROC2_GETACL: 243 0 stevel (void) sum_nfsstat(line); 244 0 stevel break; 245 0 stevel case ACLPROC2_SETACL: 246 0 stevel (void) sum_nfsstat(line); 247 0 stevel break; 248 0 stevel case ACLPROC2_GETATTR: 249 0 stevel (void) sum_nfsstat(line); 250 0 stevel break; 251 0 stevel case ACLPROC2_ACCESS: 252 0 stevel if (sum_nfsstat(line) == 0) { 253 0 stevel skip_fattr(); 254 0 stevel line += strlen(line); 255 0 stevel (void) sprintf(line, " (%s)", 256 9759 Vasumathi sum_access2()); 257 0 stevel } 258 0 stevel break; 259 0 stevel case ACLPROC2_GETXATTRDIR: 260 0 stevel if (sum_nfsstat(line) == 0) { 261 0 stevel line += strlen(line); 262 0 stevel (void) sprintf(line, sum_nfsfh()); 263 0 stevel } 264 0 stevel break; 265 0 stevel default: 266 0 stevel break; 267 0 stevel } 268 0 stevel } 269 0 stevel } 270 0 stevel 271 0 stevel if (flags & F_DTAIL) { 272 0 stevel show_header("NFS_ACL: ", "Sun NFS_ACL", len); 273 0 stevel show_space(); 274 0 stevel (void) sprintf(get_line(0, 0), "Proc = %d (%s)", 275 9759 Vasumathi proc, procnames_long_v2[proc]); 276 0 stevel if (type == CALL) 277 0 stevel aclcall2(proc); 278 0 stevel else 279 0 stevel aclreply2(proc); 280 0 stevel show_trailer(); 281 0 stevel } 282 0 stevel } 283 0 stevel 284 410 kcpoon static void 285 410 kcpoon interpret_nfs_acl3(int flags, int type, int xid, int vers, int proc, 286 410 kcpoon char *data, int len) 287 0 stevel { 288 0 stevel char *line; 289 0 stevel char buff[2048]; 290 0 stevel int off, sz; 291 0 stevel char *fh; 292 0 stevel ulong_t mask; 293 0 stevel 294 0 stevel if (proc < 0 || proc > MAXPROC_V3) 295 0 stevel return; 296 0 stevel 297 0 stevel if (flags & F_SUM) { 298 0 stevel line = get_sum_line(); 299 0 stevel 300 0 stevel if (type == CALL) { 301 0 stevel (void) sprintf(line, "NFS_ACL C %s", 302 9759 Vasumathi procnames_short_v3[proc]); 303 0 stevel line += strlen(line); 304 0 stevel switch (proc) { 305 0 stevel case ACLPROC3_GETACL: 306 0 stevel fh = sum_nfsfh3(); 307 0 stevel mask = getxdr_u_long(); 308 0 stevel (void) sprintf(line, "%s mask=%lu", fh, mask); 309 0 stevel break; 310 0 stevel case ACLPROC3_SETACL: 311 0 stevel (void) sprintf(line, sum_nfsfh3()); 312 0 stevel break; 313 0 stevel case ACLPROC3_GETXATTRDIR: 314 0 stevel fh = sum_nfsfh3(); 315 0 stevel (void) sprintf(line, "%s create=%s", fh, 316 0 stevel getxdr_bool() ? "true" : "false"); 317 0 stevel break; 318 0 stevel default: 319 0 stevel break; 320 0 stevel } 321 0 stevel 322 0 stevel check_retransmit(line, (ulong_t)xid); 323 0 stevel } else { 324 0 stevel (void) sprintf(line, "NFS_ACL R %s ", 325 9759 Vasumathi procnames_short_v3[proc]); 326 0 stevel line += strlen(line); 327 0 stevel switch (proc) { 328 0 stevel case ACLPROC3_GETACL: 329 0 stevel (void) sum_nfsstat3(line); 330 0 stevel break; 331 0 stevel case ACLPROC3_SETACL: 332 0 stevel (void) sum_nfsstat3(line); 333 0 stevel break; 334 0 stevel case ACLPROC3_GETXATTRDIR: 335 0 stevel if (sum_nfsstat3(line) == 0) { 336 0 stevel line += strlen(line); 337 0 stevel (void) sprintf(line, sum_nfsfh3()); 338 0 stevel } 339 0 stevel break; 340 0 stevel default: 341 0 stevel break; 342 0 stevel } 343 0 stevel } 344 0 stevel } 345 0 stevel 346 0 stevel if (flags & F_DTAIL) { 347 0 stevel show_header("NFS_ACL: ", "Sun NFS_ACL", len); 348 0 stevel show_space(); 349 0 stevel (void) sprintf(get_line(0, 0), "Proc = %d (%s)", 350 9759 Vasumathi proc, procnames_long_v3[proc]); 351 0 stevel if (type == CALL) 352 0 stevel aclcall3(proc); 353 0 stevel else 354 0 stevel aclreply3(proc); 355 0 stevel show_trailer(); 356 0 stevel } 357 0 stevel } 358 0 stevel 359 410 kcpoon static void 360 410 kcpoon interpret_nfs_acl4(int flags, int type, int xid, int vers, int proc, 361 410 kcpoon char *data, int len) 362 0 stevel { 363 0 stevel char *line; 364 0 stevel char buff[2048]; 365 0 stevel int off, sz; 366 0 stevel char *fh; 367 0 stevel ulong_t mask; 368 0 stevel 369 0 stevel if (proc < 0 || proc > MAXPROC_V4) 370 0 stevel return; 371 0 stevel 372 0 stevel if (flags & F_SUM) { 373 0 stevel line = get_sum_line(); 374 0 stevel 375 0 stevel if (type == CALL) { 376 0 stevel (void) sprintf(line, "NFS_ACL C %s", 377 9759 Vasumathi procnames_short_v4[proc]); 378 0 stevel line += strlen(line); 379 0 stevel switch (proc) { 380 0 stevel case ACLPROC4_GETACL: 381 0 stevel fh = sum_nfsfh3(); 382 0 stevel mask = getxdr_u_long(); 383 0 stevel (void) sprintf(line, "%s mask=%lu", fh, mask); 384 0 stevel break; 385 0 stevel case ACLPROC4_SETACL: 386 0 stevel (void) sprintf(line, sum_nfsfh3()); 387 0 stevel break; 388 0 stevel default: 389 0 stevel break; 390 0 stevel } 391 0 stevel 392 0 stevel check_retransmit(line, (ulong_t)xid); 393 0 stevel } else { 394 0 stevel (void) sprintf(line, "NFS_ACL R %s ", 395 9759 Vasumathi procnames_short_v4[proc]); 396 0 stevel line += strlen(line); 397 0 stevel switch (proc) { 398 0 stevel case ACLPROC4_GETACL: 399 0 stevel (void) sum_nfsstat4(line); 400 0 stevel break; 401 0 stevel case ACLPROC4_SETACL: 402 0 stevel (void) sum_nfsstat4(line); 403 0 stevel break; 404 0 stevel default: 405 0 stevel break; 406 0 stevel } 407 0 stevel } 408 0 stevel } 409 0 stevel 410 0 stevel if (flags & F_DTAIL) { 411 0 stevel show_header("NFS_ACL: ", "Sun NFS_ACL", len); 412 0 stevel show_space(); 413 0 stevel (void) sprintf(get_line(0, 0), "Proc = %d (%s)", 414 9759 Vasumathi proc, procnames_long_v4[proc]); 415 0 stevel if (type == CALL) 416 0 stevel aclcall4(proc); 417 0 stevel else 418 0 stevel aclreply4(proc); 419 0 stevel show_trailer(); 420 0 stevel } 421 0 stevel } 422 0 stevel 423 0 stevel int 424 0 stevel sum_nfsstat4(char *line) 425 0 stevel { 426 0 stevel ulong_t status; 427 0 stevel char *p, *nfsstat4_to_name(int); 428 0 stevel 429 0 stevel status = getxdr_long(); 430 0 stevel p = nfsstat4_to_name(status); 431 0 stevel (void) strcpy(line, p); 432 0 stevel return (status); 433 0 stevel } 434 0 stevel 435 0 stevel int 436 0 stevel detail_nfsstat4() 437 0 stevel { 438 0 stevel ulong_t status; 439 0 stevel char buff[64]; 440 0 stevel int pos; 441 0 stevel 442 0 stevel pos = getxdr_pos(); 443 0 stevel status = sum_nfsstat4(buff); 444 0 stevel 445 0 stevel (void) sprintf(get_line(pos, getxdr_pos()), "Status = %d (%s)", 446 9759 Vasumathi status, buff); 447 0 stevel 448 0 stevel return ((int)status); 449 0 stevel } 450 0 stevel 451 0 stevel /* 452 0 stevel * Print out version 2 NFS_ACL call packets 453 0 stevel */ 454 0 stevel static void 455 0 stevel aclcall2(proc) 456 0 stevel int proc; 457 0 stevel { 458 0 stevel 459 0 stevel switch (proc) { 460 0 stevel case ACLPROC2_GETACL: 461 0 stevel detail_nfsfh(); 462 0 stevel detail_mask(); 463 0 stevel break; 464 0 stevel case ACLPROC2_SETACL: 465 0 stevel detail_nfsfh(); 466 0 stevel detail_secattr(); 467 0 stevel break; 468 0 stevel case ACLPROC2_GETATTR: 469 0 stevel detail_nfsfh(); 470 0 stevel break; 471 0 stevel case ACLPROC2_ACCESS: 472 0 stevel detail_nfsfh(); 473 0 stevel detail_access2(); 474 0 stevel break; 475 0 stevel default: 476 0 stevel break; 477 0 stevel } 478 0 stevel } 479 0 stevel 480 0 stevel /* 481 0 stevel * Print out version 2 NFS_ACL reply packets 482 0 stevel */ 483 0 stevel static void 484 0 stevel aclreply2(proc) 485 0 stevel int proc; 486 0 stevel { 487 0 stevel 488 0 stevel switch (proc) { 489 0 stevel case ACLPROC2_GETACL: 490 0 stevel if (detail_nfsstat() == 0) { 491 0 stevel detail_fattr(); 492 0 stevel detail_secattr(); 493 0 stevel } 494 0 stevel break; 495 0 stevel case ACLPROC2_SETACL: 496 0 stevel if (detail_nfsstat() == 0) 497 0 stevel detail_fattr(); 498 0 stevel break; 499 0 stevel case ACLPROC2_GETATTR: 500 0 stevel if (detail_nfsstat() == 0) 501 0 stevel detail_fattr(); 502 0 stevel break; 503 0 stevel case ACLPROC2_ACCESS: 504 0 stevel if (detail_nfsstat() == 0) { 505 0 stevel detail_fattr(); 506 0 stevel detail_access2(); 507 0 stevel } 508 0 stevel break; 509 0 stevel default: 510 0 stevel break; 511 0 stevel } 512 0 stevel } 513 0 stevel 514 0 stevel /* 515 0 stevel * Print out version 3 NFS_ACL call packets 516 0 stevel */ 517 0 stevel static void 518 0 stevel aclcall3(proc) 519 0 stevel int proc; 520 0 stevel { 521 0 stevel 522 0 stevel switch (proc) { 523 0 stevel case ACLPROC3_GETACL: 524 0 stevel detail_nfsfh3(); 525 0 stevel detail_mask(); 526 0 stevel break; 527 0 stevel case ACLPROC3_SETACL: 528 0 stevel detail_nfsfh3(); 529 0 stevel detail_secattr(); 530 0 stevel break; 531 0 stevel default: 532 0 stevel break; 533 0 stevel } 534 0 stevel } 535 0 stevel 536 0 stevel /* 537 0 stevel * Print out version 3 NFS_ACL reply packets 538 0 stevel */ 539 0 stevel static void 540 0 stevel aclreply3(proc) 541 0 stevel int proc; 542 0 stevel { 543 0 stevel 544 0 stevel switch (proc) { 545 0 stevel case ACLPROC3_GETACL: 546 0 stevel if (detail_nfsstat3() == 0) { 547 0 stevel detail_post_op_attr(""); 548 0 stevel detail_secattr(); 549 0 stevel } 550 0 stevel break; 551 0 stevel case ACLPROC3_SETACL: 552 0 stevel if (detail_nfsstat3() == 0) 553 0 stevel detail_post_op_attr(""); 554 0 stevel break; 555 0 stevel default: 556 0 stevel break; 557 0 stevel } 558 0 stevel } 559 0 stevel 560 0 stevel /* 561 0 stevel * Print out version 4 NFS_ACL call packets 562 0 stevel */ 563 0 stevel static void 564 0 stevel aclcall4(proc) 565 0 stevel int proc; 566 0 stevel { 567 0 stevel 568 0 stevel switch (proc) { 569 0 stevel case ACLPROC4_GETACL: 570 0 stevel detail_nfsfh3(); 571 0 stevel detail_mask(); 572 0 stevel break; 573 0 stevel case ACLPROC4_SETACL: 574 0 stevel detail_nfsfh3(); 575 0 stevel detail_secattr(); 576 0 stevel break; 577 0 stevel default: 578 0 stevel break; 579 0 stevel } 580 0 stevel } 581 0 stevel 582 0 stevel /* 583 0 stevel * Print out version 4 NFS_ACL reply packets 584 0 stevel */ 585 0 stevel static void 586 0 stevel aclreply4(proc) 587 0 stevel int proc; 588 0 stevel { 589 0 stevel 590 0 stevel switch (proc) { 591 0 stevel case ACLPROC4_GETACL: 592 0 stevel if (detail_nfsstat4() == 0) { 593 0 stevel detail_post_op_attr(""); 594 0 stevel detail_secattr(); 595 0 stevel } 596 0 stevel break; 597 0 stevel case ACLPROC4_SETACL: 598 0 stevel if (detail_nfsstat4() == 0) 599 0 stevel detail_post_op_attr(""); 600 0 stevel break; 601 0 stevel default: 602 0 stevel break; 603 0 stevel } 604 0 stevel } 605 0 stevel 606 0 stevel static void 607 0 stevel detail_access2() 608 0 stevel { 609 0 stevel uint_t bits; 610 0 stevel 611 0 stevel bits = showxdr_u_long("Access bits = 0x%08x"); 612 0 stevel (void) sprintf(get_line(0, 0), " %s", 613 9759 Vasumathi getflag(bits, ACCESS2_READ, "Read", "(no read)")); 614 0 stevel (void) sprintf(get_line(0, 0), " %s", 615 9759 Vasumathi getflag(bits, ACCESS2_LOOKUP, "Lookup", "(no lookup)")); 616 0 stevel (void) sprintf(get_line(0, 0), " %s", 617 9759 Vasumathi getflag(bits, ACCESS2_MODIFY, "Modify", "(no modify)")); 618 0 stevel (void) sprintf(get_line(0, 0), " %s", 619 9759 Vasumathi getflag(bits, ACCESS2_EXTEND, "Extend", "(no extend)")); 620 0 stevel (void) sprintf(get_line(0, 0), " %s", 621 9759 Vasumathi getflag(bits, ACCESS2_DELETE, "Delete", "(no delete)")); 622 0 stevel (void) sprintf(get_line(0, 0), " %s", 623 9759 Vasumathi getflag(bits, ACCESS2_EXECUTE, "Execute", "(no execute)")); 624 0 stevel } 625 0 stevel 626 0 stevel static char * 627 0 stevel sum_access2() 628 0 stevel { 629 0 stevel int bits; 630 0 stevel static char buff[22]; 631 0 stevel 632 0 stevel bits = getxdr_u_long(); 633 0 stevel buff[0] = '\0'; 634 0 stevel 635 0 stevel if (bits & ACCESS2_READ) 636 0 stevel (void) strcat(buff, "read,"); 637 0 stevel if (bits & ACCESS2_LOOKUP) 638 0 stevel (void) strcat(buff, "lookup,"); 639 0 stevel if (bits & ACCESS2_MODIFY) 640 0 stevel (void) strcat(buff, "modify,"); 641 0 stevel if (bits & ACCESS2_EXTEND) 642 0 stevel (void) strcat(buff, "extend,"); 643 0 stevel if (bits & ACCESS2_DELETE) 644 0 stevel (void) strcat(buff, "delete,"); 645 0 stevel if (bits & ACCESS2_EXECUTE) 646 0 stevel (void) strcat(buff, "execute,"); 647 0 stevel if (buff[0] != '\0') 648 0 stevel buff[strlen(buff) - 1] = '\0'; 649 0 stevel 650 0 stevel return (buff); 651 0 stevel } 652 0 stevel 653 0 stevel static void 654 0 stevel detail_mask() 655 0 stevel { 656 0 stevel ulong_t mask; 657 0 stevel 658 0 stevel mask = showxdr_u_long("Mask = 0x%lx"); 659 0 stevel (void) sprintf(get_line(0, 0), " %s", 660 9759 Vasumathi getflag(mask, NA_ACL, "aclent", "(no aclent)")); 661 0 stevel (void) sprintf(get_line(0, 0), " %s", 662 9759 Vasumathi getflag(mask, NA_ACLCNT, "aclcnt", "(no aclcnt)")); 663 0 stevel (void) sprintf(get_line(0, 0), " %s", 664 9759 Vasumathi getflag(mask, NA_DFACL, "dfaclent", "(no dfaclent)")); 665 0 stevel (void) sprintf(get_line(0, 0), " %s", 666 9759 Vasumathi getflag(mask, NA_DFACLCNT, "dfaclcnt", "(no dfaclcnt)")); 667 0 stevel } 668 0 stevel 669 0 stevel static void 670 0 stevel detail_secattr() 671 0 stevel { 672 0 stevel 673 0 stevel detail_mask(); 674 0 stevel showxdr_long("Aclcnt = %d"); 675 0 stevel detail_aclent(); 676 0 stevel showxdr_long("Dfaclcnt = %d"); 677 0 stevel detail_aclent(); 678 0 stevel } 679 0 stevel 680 0 stevel static void 681 0 stevel detail_aclent() 682 0 stevel { 683 0 stevel int count; 684 0 stevel int type; 685 0 stevel int id; 686 0 stevel ushort_t perm; 687 0 stevel 688 0 stevel count = getxdr_long(); 689 0 stevel while (count-- > 0) { 690 0 stevel type = getxdr_long(); 691 0 stevel id = getxdr_long(); 692 0 stevel perm = getxdr_u_short(); 693 0 stevel switch (type) { 694 0 stevel case NA_USER: 695 0 stevel (void) sprintf(get_line(0, 0), "\tuser:%s:%s", 696 9759 Vasumathi detail_uname(id), detail_perm(perm)); 697 0 stevel break; 698 0 stevel case NA_USER_OBJ: 699 0 stevel (void) sprintf(get_line(0, 0), "\tuser::%s", 700 9759 Vasumathi detail_perm(perm)); 701 0 stevel break; 702 0 stevel case NA_GROUP: 703 0 stevel (void) sprintf(get_line(0, 0), "\tgroup:%s:%s", 704 9759 Vasumathi detail_gname(id), detail_perm(perm)); 705 0 stevel break; 706 0 stevel case NA_GROUP_OBJ: 707 0 stevel (void) sprintf(get_line(0, 0), "\tgroup::%s", 708 9759 Vasumathi detail_perm(perm)); 709 0 stevel break; 710 0 stevel case NA_CLASS_OBJ: 711 0 stevel (void) sprintf(get_line(0, 0), "\tmask:%s", 712 9759 Vasumathi detail_perm(perm)); 713 0 stevel break; 714 0 stevel case NA_OTHER_OBJ: 715 0 stevel (void) sprintf(get_line(0, 0), "\tother:%s", 716 9759 Vasumathi detail_perm(perm)); 717 0 stevel break; 718 0 stevel case NA_DEF_USER: 719 0 stevel (void) sprintf(get_line(0, 0), "\tdefault:user:%s:%s", 720 9759 Vasumathi detail_uname(id), detail_perm(perm)); 721 0 stevel break; 722 0 stevel case NA_DEF_USER_OBJ: 723 0 stevel (void) sprintf(get_line(0, 0), "\tdefault:user::%s", 724 9759 Vasumathi detail_perm(perm)); 725 0 stevel break; 726 0 stevel case NA_DEF_GROUP: 727 0 stevel (void) sprintf(get_line(0, 0), "\tdefault:group:%s:%s", 728 9759 Vasumathi detail_gname(id), detail_perm(perm)); 729 0 stevel break; 730 0 stevel case NA_DEF_GROUP_OBJ: 731 0 stevel (void) sprintf(get_line(0, 0), "\tdefault:group::%s", 732 9759 Vasumathi detail_perm(perm)); 733 0 stevel break; 734 0 stevel case NA_DEF_CLASS_OBJ: 735 0 stevel (void) sprintf(get_line(0, 0), "\tdefault:mask:%s", 736 9759 Vasumathi detail_perm(perm)); 737 0 stevel break; 738 0 stevel case NA_DEF_OTHER_OBJ: 739 0 stevel (void) sprintf(get_line(0, 0), "\tdefault:other:%s", 740 9759 Vasumathi detail_perm(perm)); 741 0 stevel break; 742 0 stevel default: 743 0 stevel (void) sprintf(get_line(0, 0), "\tunrecognized entry"); 744 0 stevel break; 745 0 stevel } 746 0 stevel } 747 0 stevel } 748 0 stevel 749 0 stevel static char * 750 0 stevel detail_uname(uid_t uid) 751 0 stevel { 752 0 stevel struct passwd *pwd; 753 0 stevel static char uidp[10]; 754 0 stevel 755 0 stevel pwd = getpwuid(uid); 756 0 stevel if (pwd == NULL) { 757 0 stevel sprintf(uidp, "%d", uid); 758 0 stevel return (uidp); 759 0 stevel } 760 0 stevel return (pwd->pw_name); 761 0 stevel } 762 0 stevel 763 0 stevel static char * 764 0 stevel detail_gname(gid_t gid) 765 0 stevel { 766 0 stevel struct group *grp; 767 0 stevel static char gidp[10]; 768 0 stevel 769 0 stevel grp = getgrgid(gid); 770 0 stevel if (grp == NULL) { 771 0 stevel sprintf(gidp, "%d", gid); 772 0 stevel return (gidp); 773 0 stevel } 774 0 stevel return (grp->gr_name); 775 0 stevel } 776 0 stevel 777 0 stevel static char *perms[] = { 778 0 stevel "---", 779 0 stevel "--x", 780 0 stevel "-w-", 781 0 stevel "-wx", 782 0 stevel "r--", 783 0 stevel "r-x", 784 0 stevel "rw-", 785 0 stevel "rwx" 786 0 stevel }; 787 0 stevel static char * 788 0 stevel detail_perm(ushort_t perm) 789 0 stevel { 790 0 stevel 791 9759 Vasumathi if (perm >= sizeof (perms) / sizeof (perms[0])) 792 0 stevel return ("?"); 793 0 stevel return (perms[perm]); 794 0 stevel } 795