Home | History | Annotate | Download | only in snoop
      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