Home | History | Annotate | Download | only in snoop
      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, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright (c) 1991, 1999 by Sun Microsystems, Inc.
     24  * All rights reserved.
     25  */
     26 
     27 #ident	"%Z%%M%	%I%	%E% SMI"	/* SunOS	*/
     28 
     29 #include <sys/types.h>
     30 #include <sys/errno.h>
     31 #include <setjmp.h>
     32 #include <string.h>
     33 
     34 #include <netinet/in.h>
     35 #include <rpc/types.h>
     36 #include <rpc/rpc.h>
     37 #include <rpc/xdr.h>
     38 #include <rpc/auth.h>
     39 #include <rpc/clnt.h>
     40 #include <rpc/rpc_msg.h>
     41 #include <rpcsvc/rquota.h>
     42 #include "snoop.h"
     43 
     44 extern char *dlc_header;
     45 extern jmp_buf xdr_err;
     46 
     47 static char *procnames_short[] = {
     48 	"Null",		/*  0 */
     49 	"GETQUOTA",	/*  1 */
     50 	"GETACTIVE",	/*  2 */
     51 };
     52 
     53 static char *procnames_long[] = {
     54 	"Null procedure",	/*  0 */
     55 	"Get quotas",		/*  1 */
     56 	"Get active quotas",	/*  2 */
     57 };
     58 
     59 #define	MAXPROC	2
     60 
     61 static void show_quota(void);
     62 
     63 void
     64 interpret_rquota(flags, type, xid, vers, proc, data, len)
     65 	int flags, type, xid, vers, proc;
     66 	char *data;
     67 	int len;
     68 {
     69 	char *line;
     70 	char buff[RQ_PATHLEN + 1];
     71 	int status;
     72 	int uid;
     73 
     74 	if (proc < 0 || proc > MAXPROC)
     75 		return;
     76 
     77 	if (flags & F_SUM) {
     78 		if (setjmp(xdr_err)) {
     79 			return;
     80 		}
     81 
     82 		line = get_sum_line();
     83 
     84 		if (type == CALL) {
     85 			(void) getxdr_string(buff, RQ_PATHLEN);
     86 			uid = getxdr_long();
     87 			(void) sprintf(line,
     88 				"RQUOTA C %s Uid=%d Path=%s",
     89 				procnames_short[proc],
     90 				uid, buff);
     91 
     92 			check_retransmit(line, xid);
     93 		} else {
     94 			(void) sprintf(line, "RQUOTA R %s ",
     95 				procnames_short[proc]);
     96 			line += strlen(line);
     97 			status = getxdr_u_long();
     98 			if (status == Q_OK)
     99 				(void) sprintf(line, "OK");
    100 			else if (status == Q_NOQUOTA)
    101 				(void) sprintf(line, "No quota");
    102 			else if (status == Q_EPERM)
    103 				(void) sprintf(line, "No permission");
    104 		}
    105 	}
    106 
    107 	if (flags & F_DTAIL) {
    108 		show_header("RQUOTA:  ", "Remote Quota Check", len);
    109 		show_space();
    110 		if (setjmp(xdr_err)) {
    111 			return;
    112 		}
    113 		(void) sprintf(get_line(0, 0),
    114 			"Proc = %d (%s)",
    115 			proc, procnames_long[proc]);
    116 
    117 		if (type == CALL) {
    118 			switch (proc) {
    119 			case  RQUOTAPROC_GETQUOTA:
    120 			case RQUOTAPROC_GETACTIVEQUOTA:
    121 				(void) showxdr_string(RQ_PATHLEN,
    122 					"Path = %s");
    123 				(void) showxdr_long("User id = %d");
    124 				break;
    125 			}
    126 		} else {
    127 			status = getxdr_u_long();
    128 			(void) sprintf(get_line(0, 0),
    129 				"Status = %lu (%s)",
    130 				status,
    131 				status == Q_OK ? "OK" :
    132 				status == Q_NOQUOTA ? "No quota" :
    133 				status == Q_EPERM ? "No permission":"");
    134 
    135 			if (status == Q_OK)
    136 				show_quota();
    137 		}
    138 
    139 		show_trailer();
    140 	}
    141 }
    142 
    143 static void
    144 show_quota()
    145 {
    146 	int active;
    147 
    148 	(void) showxdr_u_long("Block size = %lu");
    149 	active = getxdr_u_long();
    150 	(void) sprintf(get_line(0, 0),
    151 		"         Quota checking = %lu (%s)",
    152 		active,
    153 		active ? "on" : "off");
    154 	(void) showxdr_u_long("      Blocks hard limit = %lu");
    155 	(void) showxdr_u_long("      Blocks soft limit = %lu");
    156 	(void) showxdr_u_long("    Current block count = %lu");
    157 	(void) show_space();
    158 	(void) showxdr_u_long("        File hard limit = %lu");
    159 	(void) showxdr_u_long("        File soft limit = %lu");
    160 	(void) showxdr_u_long("     Current file count = %lu");
    161 	(void) show_space();
    162 	(void) showxdr_u_long("Excessive blocks limit  = %lu sec");
    163 	(void) showxdr_u_long("Excessive files  limit  = %lu sec");
    164 }
    165