12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright: (c) 2000 United States Government as represented by the
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	Secretary of the Navy. All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   1. Redistributions of source code must retain the above copyright
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      notice, this list of conditions and the following disclaimer.
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   2. Redistributions in binary form must reproduce the above copyright
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      notice, this list of conditions and the following disclaimer in
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      the documentation and/or other materials provided with the
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      distribution.
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *   3. The names of the authors may not be used to endorse or promote
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      products derived from this software without specific prior
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      written permission.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This code unmangles RX packets.  RX is the mutant form of RPC that AFS
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * uses to communicate between clients and servers.
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * In this code, I mainly concern myself with decoding the AFS calls, not
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * with the guts of RX, per se.
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Bah.  If I never look at rx_packet.h again, it will be too soon.
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Ken Hornstein <kenh@cmf.nrl.navy.mil>
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-rx.c,v 1.42 2008-07-01 07:44:50 guy Exp $";
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rx.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok rx_types[] = {
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_DATA,		"data" },
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_ACK,		"ack" },
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_BUSY,		"busy" },
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_ABORT,		"abort" },
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_ACKALL,	"ackall" },
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_CHALLENGE,	"challenge" },
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_RESPONSE,	"response" },
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_DEBUG,		"debug" },
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_PARAMS,	"params" },
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_PACKET_TYPE_VERSION,	"version" },
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,				NULL },
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct double_tok {
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int flag;		/* Rx flag */
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int packetType;		/* Packet type */
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *s;		/* Flag string */
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} rx_flags[] = {
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_CLIENT_INITIATED,	0,			"client-init" },
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_REQUEST_ACK,	0,			"req-ack" },
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_LAST_PACKET,	0,			"last-pckt" },
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_MORE_PACKETS,	0,			"more-pckts" },
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_FREE_PACKET,	0,			"free-pckt" },
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_SLOW_START_OK,	RX_PACKET_TYPE_ACK,	"slow-start" },
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ RX_JUMBO_PACKET,	RX_PACKET_TYPE_DATA,	"jumbogram" }
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok fs_req[] = {
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 130,		"fetch-data" },
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 131,		"fetch-acl" },
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 132,		"fetch-status" },
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 133,		"store-data" },
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 134,		"store-acl" },
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 135,		"store-status" },
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 136,		"remove-file" },
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 137,		"create-file" },
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 138,		"rename" },
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 139,		"symlink" },
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 140,		"link" },
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 141,		"makedir" },
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 142,		"rmdir" },
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 143,		"oldsetlock" },
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 144,		"oldextlock" },
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 145,		"oldrellock" },
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 146,		"get-stats" },
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 147,		"give-cbs" },
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 148,		"get-vlinfo" },
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 149,		"get-vlstats" },
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 150,		"set-vlstats" },
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 151,		"get-rootvl" },
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 152,		"check-token" },
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 153,		"get-time" },
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 154,		"nget-vlinfo" },
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 155,		"bulk-stat" },
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 156,		"setlock" },
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 157,		"extlock" },
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 158,		"rellock" },
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 159,		"xstat-ver" },
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 160,		"get-xstat" },
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 161,		"dfs-lookup" },
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 162,		"dfs-flushcps" },
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 163,		"dfs-symlink" },
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 220,		"residency" },
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65536,        "inline-bulk-status" },
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65537,        "fetch-data-64" },
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65538,        "store-data-64" },
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65539,        "give-up-all-cbs" },
12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65540,        "get-caps" },
12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65541,        "cb-rx-conn-addr" },
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok cb_req[] = {
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 204,		"callback" },
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 205,		"initcb" },
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 206,		"probe" },
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 207,		"getlock" },
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 208,		"getce" },
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 209,		"xstatver" },
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 210,		"getxstat" },
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 211,		"initcb2" },
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 212,		"whoareyou" },
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 213,		"initcb3" },
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 214,		"probeuuid" },
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 215,		"getsrvprefs" },
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 216,		"getcellservdb" },
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 217,		"getlocalcell" },
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 218,		"getcacheconf" },
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65536,        "getce64" },
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65537,        "getcellbynum" },
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65538,        "tellmeaboutyourself" },
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok pt_req[] = {
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 500,		"new-user" },
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 501,		"where-is-it" },
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 502,		"dump-entry" },
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 503,		"add-to-group" },
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 504,		"name-to-id" },
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 505,		"id-to-name" },
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 506,		"delete" },
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 507,		"remove-from-group" },
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 508,		"get-cps" },
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 509,		"new-entry" },
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 510,		"list-max" },
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 511,		"set-max" },
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 512,		"list-entry" },
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 513,		"change-entry" },
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 514,		"list-elements" },
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 515,		"same-mbr-of" },
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 516,		"set-fld-sentry" },
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 517,		"list-owned" },
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 518,		"get-cps2" },
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 519,		"get-host-cps" },
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 520,		"update-entry" },
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 521,		"list-entries" },
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 530,		"list-super-groups" },
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok vldb_req[] = {
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 501,		"create-entry" },
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 502,		"delete-entry" },
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 503,		"get-entry-by-id" },
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 504,		"get-entry-by-name" },
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 505,		"get-new-volume-id" },
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 506,		"replace-entry" },
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 507,		"update-entry" },
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 508,		"setlock" },
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 509,		"releaselock" },
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 510,		"list-entry" },
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 511,		"list-attrib" },
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 512,		"linked-list" },
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 513,		"get-stats" },
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 514,		"probe" },
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 515,		"get-addrs" },
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 516,		"change-addr" },
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 517,		"create-entry-n" },
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 518,		"get-entry-by-id-n" },
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 519,		"get-entry-by-name-n" },
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 520,		"replace-entry-n" },
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 521,		"list-entry-n" },
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 522,		"list-attrib-n" },
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 523,		"linked-list-n" },
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 524,		"update-entry-by-name" },
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 525,		"create-entry-u" },
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 526,		"get-entry-by-id-u" },
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 527,		"get-entry-by-name-u" },
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 528,		"replace-entry-u" },
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 529,		"list-entry-u" },
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 530,		"list-attrib-u" },
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 531,		"linked-list-u" },
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 532,		"regaddr" },
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 533,		"get-addrs-u" },
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 534,		"list-attrib-n2" },
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok kauth_req[] = {
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 1,		"auth-old" },
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 21,		"authenticate" },
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 22,		"authenticate-v2" },
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 2,		"change-pw" },
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 3,		"get-ticket-old" },
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 23,		"get-ticket" },
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 4,		"set-pw" },
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 5,		"set-fields" },
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 6,		"create-user" },
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 7,		"delete-user" },
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 8,		"get-entry" },
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 9,		"list-entry" },
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10,		"get-stats" },
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 11,		"debug" },
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 12,		"get-pw" },
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 13,		"get-random-key" },
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 14,		"unlock" },
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 15,		"lock-status" },
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok vol_req[] = {
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 100,		"create-volume" },
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 101,		"delete-volume" },
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 102,		"restore" },
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 103,		"forward" },
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 104,		"end-trans" },
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 105,		"clone" },
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 106,		"set-flags" },
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 107,		"get-flags" },
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 108,		"trans-create" },
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 109,		"dump" },
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 110,		"get-nth-volume" },
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 111,		"set-forwarding" },
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 112,		"get-name" },
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 113,		"get-status" },
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 114,		"sig-restore" },
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 115,		"list-partitions" },
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 116,		"list-volumes" },
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 117,		"set-id-types" },
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 118,		"monitor" },
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 119,		"partition-info" },
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 120,		"reclone" },
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 121,		"list-one-volume" },
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 122,		"nuke" },
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 123,		"set-date" },
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 124,		"x-list-volumes" },
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 125,		"x-list-one-volume" },
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 126,		"set-info" },
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 127,		"x-list-partitions" },
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 128,		"forward-multiple" },
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65536,	"convert-ro" },
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65537,	"get-size" },
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 65538,	"dump-v2" },
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok bos_req[] = {
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 80,		"create-bnode" },
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 81,		"delete-bnode" },
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 82,		"set-status" },
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 83,		"get-status" },
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 84,		"enumerate-instance" },
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 85,		"get-instance-info" },
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 86,		"get-instance-parm" },
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 87,		"add-superuser" },
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 88,		"delete-superuser" },
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 89,		"list-superusers" },
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 90,		"list-keys" },
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 91,		"add-key" },
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 92,		"delete-key" },
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 93,		"set-cell-name" },
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 94,		"get-cell-name" },
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 95,		"get-cell-host" },
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 96,		"add-cell-host" },
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 97,		"delete-cell-host" },
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 98,		"set-t-status" },
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 99,		"shutdown-all" },
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 100,		"restart-all" },
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 101,		"startup-all" },
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 102,		"set-noauth-flag" },
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 103,		"re-bozo" },
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 104,		"restart" },
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 105,		"start-bozo-install" },
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 106,		"uninstall" },
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 107,		"get-dates" },
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 108,		"exec" },
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 109,		"prune" },
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 110,		"set-restart-time" },
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 111,		"get-restart-time" },
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 112,		"start-bozo-log" },
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 113,		"wait-all" },
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 114,		"get-instance-strings" },
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 115,		"get-restricted" },
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 116,		"set-restricted" },
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ubik_req[] = {
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10000,	"vote-beacon" },
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10001,	"vote-debug-old" },
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10002,	"vote-sdebug-old" },
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10003,	"vote-getsyncsite" },
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10004,	"vote-debug" },
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10005,	"vote-sdebug" },
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 10006,	"vote-xdebug" },
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 10007,	"vote-xsdebug" },
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20000,	"disk-begin" },
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20001,	"disk-commit" },
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20002,	"disk-lock" },
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20003,	"disk-write" },
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20004,	"disk-getversion" },
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20005,	"disk-getfile" },
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20006,	"disk-sendfile" },
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20007,	"disk-abort" },
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20008,	"disk-releaselocks" },
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20009,	"disk-truncate" },
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20010,	"disk-probe" },
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20011,	"disk-writev" },
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20012,	"disk-interfaceaddr" },
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20013,	"disk-setversion" },
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VOTE_LOW	10000
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define VOTE_HIGH	10007
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DISK_LOW	20000
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DISK_HIGH	20013
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok cb_types[] = {
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 1,		"exclusive" },
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 2,		"shared" },
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 3,		"dropped" },
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ubik_lock_types[] = {
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 1,		"read" },
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 2,		"write" },
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 3,		"wait" },
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *voltype[] = { "read-write", "read-only", "backup" };
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok afs_fs_errors[] = {
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 101,		"salvage volume" },
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 102, 		"no such vnode" },
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 103, 		"no such volume" },
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 104, 		"volume exist" },
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 105, 		"no service" },
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 106, 		"volume offline" },
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 107, 		"voline online" },
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 108, 		"diskfull" },
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 109, 		"diskquota exceeded" },
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 110, 		"volume busy" },
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 111, 		"volume moved" },
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 112, 		"AFS IO error" },
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ -100,		"restarting fileserver" },
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL }
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Reasons for acknowledging a packet
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
38453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok rx_ack_reasons[] = {
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 1,		"ack requested" },
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 2,		"duplicate packet" },
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 3,		"out of sequence" },
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 4,		"exceeds window" },
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 5,		"no buffer space" },
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 6,		"ping" },
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 7,		"ping response" },
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 8,		"delay" },
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 9,		"idle" },
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL },
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Cache entries we keep around so we can figure out the RX opcode
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * numbers for replies.  This allows us to make sense of RX reply packets.
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct rx_cache_entry {
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	callnum;	/* Call number (net order) */
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	client;		/* client IP address (net order) */
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	server;		/* server IP address (net order) */
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int		dport;		/* server port (host order) */
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short		serviceId;	/* Service identifier (net order) */
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	opcode;		/* RX opcode (host order) */
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define RX_CACHE_SIZE	64
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct rx_cache_entry	rx_cache[RX_CACHE_SIZE];
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int	rx_cache_next = 0;
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int	rx_cache_hint = 0;
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void	rx_cache_insert(const u_char *, const struct ip *, int);
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int	rx_cache_find(const struct rx_header *, const struct ip *,
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			      int, int32_t *);
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void fs_print(const u_char *, int);
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void fs_reply_print(const u_char *, int, int32_t);
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void acl_print(u_char *, int, u_char *);
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void cb_print(const u_char *, int);
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void cb_reply_print(const u_char *, int, int32_t);
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void prot_print(const u_char *, int);
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void prot_reply_print(const u_char *, int, int32_t);
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void vldb_print(const u_char *, int);
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void vldb_reply_print(const u_char *, int, int32_t);
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void kauth_print(const u_char *, int);
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void kauth_reply_print(const u_char *, int, int32_t);
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void vol_print(const u_char *, int);
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void vol_reply_print(const u_char *, int, int32_t);
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void bos_print(const u_char *, int);
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void bos_reply_print(const u_char *, int, int32_t);
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ubik_print(const u_char *);
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ubik_reply_print(const u_char *, int, int32_t);
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void rx_ack_print(const u_char *, int);
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int is_ubik(u_int32_t);
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle the rx-level packet.  See if we know what port it's going to so
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * we can peek at the afs call inside
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrx_print(register const u_char *bp, int length, int sport, int dport,
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 u_char *bp2)
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register struct rx_header *rxh;
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int32_t opcode;
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp < (int)sizeof (struct rx_header)) {
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" [|rx] (%d)", length);
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rx %s", tok2str(rx_types, "type %d", rxh->type));
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int firstflag = 0;
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag > 1)
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" cid %08x call# %d",
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       (int) EXTRACT_32BITS(&rxh->cid),
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       (int) EXTRACT_32BITS(&rxh->callNumber));
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" seq %d ser %d",
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       (int) EXTRACT_32BITS(&rxh->seq),
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       (int) EXTRACT_32BITS(&rxh->serial));
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag > 2)
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" secindex %d serviceid %hu",
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(int) rxh->securityIndex,
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_16BITS(&rxh->serviceId));
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag > 1)
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < NUM_RX_FLAGS; i++) {
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (rxh->flags & rx_flags[i].flag &&
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    (!rx_flags[i].packetType ||
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     rxh->type == rx_flags[i].packetType)) {
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					if (!firstflag) {
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						firstflag = 1;
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						printf(" ");
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					} else {
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						printf(",");
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					}
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf("<%s>", rx_flags[i].s);
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Try to handle AFS calls that we know about.  Check the destination
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * port and make sure it's a data packet.  Also, make sure the
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * seq number is 1 (because otherwise it's a continuation packet,
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * and we can't interpret that).  Also, seems that reply packets
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * do not have the client-init flag set, so we check for that
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * as well.
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA &&
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    EXTRACT_32BITS(&rxh->seq) == 1 &&
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    rxh->flags & RX_CLIENT_INITIATED) {
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Insert this call into the call cache table, so we
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * have a chance to print out replies
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rx_cache_insert(bp, (const struct ip *) bp2, dport);
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (dport) {
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case FS_RX_PORT:	/* AFS file service */
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				fs_print(bp, length);
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case CB_RX_PORT:	/* AFS callback service */
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cb_print(bp, length);
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PROT_RX_PORT:	/* AFS protection service */
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				prot_print(bp, length);
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case VLDB_RX_PORT:	/* AFS VLDB service */
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				vldb_print(bp, length);
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case KAUTH_RX_PORT:	/* AFS Kerberos auth service */
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				kauth_print(bp, length);
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case VOL_RX_PORT:	/* AFS Volume service */
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				vol_print(bp, length);
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case BOS_RX_PORT:	/* AFS BOS service */
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bos_print(bp, length);
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				;
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it's a reply (client-init is _not_ set, but seq is one)
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * then look it up in the cache.  If we find it, call the reply
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * printing functions  Note that we handle abort packets here,
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * because printing out the return code can be useful at times.
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (((rxh->type == RX_PACKET_TYPE_DATA &&
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					EXTRACT_32BITS(&rxh->seq) == 1) ||
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    rxh->type == RX_PACKET_TYPE_ABORT) &&
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   (rxh->flags & RX_CLIENT_INITIATED) == 0 &&
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   rx_cache_find(rxh, (const struct ip *) bp2,
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 sport, &opcode)) {
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (sport) {
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case FS_RX_PORT:	/* AFS file service */
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				fs_reply_print(bp, length, opcode);
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case CB_RX_PORT:	/* AFS callback service */
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cb_reply_print(bp, length, opcode);
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case PROT_RX_PORT:	/* AFS PT service */
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				prot_reply_print(bp, length, opcode);
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case VLDB_RX_PORT:	/* AFS VLDB service */
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				vldb_reply_print(bp, length, opcode);
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case KAUTH_RX_PORT:	/* AFS Kerberos auth service */
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				kauth_reply_print(bp, length, opcode);
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case VOL_RX_PORT:	/* AFS Volume service */
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				vol_reply_print(bp, length, opcode);
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case BOS_RX_PORT:	/* AFS BOS service */
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bos_reply_print(bp, length, opcode);
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				;
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it's an RX ack packet, then use the appropriate ack decoding
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * function (there isn't any service-specific information in the
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * ack packet, so we can use one for all AFS services)
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (rxh->type == RX_PACKET_TYPE_ACK)
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rx_ack_print(bp, length);
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" (%d)", length);
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Insert an entry into the cache.  Taken from print-nfs.c
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrx_cache_insert(const u_char *bp, const struct ip *ip, int dport)
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_cache_entry *rxent;
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct rx_header *rxh = (const struct rx_header *) bp;
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t)))
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent = &rx_cache[rx_cache_next];
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (++rx_cache_next >= RX_CACHE_SIZE)
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rx_cache_next = 0;
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent->callnum = rxh->callNumber;
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent->client = ip->ip_src;
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent->server = ip->ip_dst;
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent->dport = dport;
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent->serviceId = rxh->serviceId;
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxent->opcode = EXTRACT_32BITS(bp + sizeof(struct rx_header));
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lookup an entry in the cache.  Also taken from print-nfs.c
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Note that because this is a reply, we're looking at the _source_
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * port.
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrx_cache_find(const struct rx_header *rxh, const struct ip *ip, int sport,
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      int32_t *opcode)
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_cache_entry *rxent;
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t clip = ip->ip_dst.s_addr;
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t sip = ip->ip_src.s_addr;
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Start the search where we last left off */
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = rx_cache_hint;
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	do {
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rxent = &rx_cache[i];
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (rxent->callnum == rxh->callNumber &&
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    rxent->client.s_addr == clip &&
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    rxent->server.s_addr == sip &&
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    rxent->serviceId == rxh->serviceId &&
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    rxent->dport == sport) {
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* We got a match! */
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rx_cache_hint = i;
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			*opcode = rxent->opcode;
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return(1);
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (++i >= RX_CACHE_SIZE)
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = 0;
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} while (i != rx_cache_hint);
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Our search failed */
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return(0);
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * These extrememly grody macros handle the printing of various AFS stuff.
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FIDOUT() { unsigned long n1, n2, n3; \
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t) * 3); \
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			n1 = EXTRACT_32BITS(bp); \
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			n2 = EXTRACT_32BITS(bp); \
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			n3 = EXTRACT_32BITS(bp); \
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" fid %d/%d/%d", (int) n1, (int) n2, (int) n3); \
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define STROUT(MAX) { unsigned int i; \
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t)); \
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp); \
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (i > (MAX)) \
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc; \
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" \""); \
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (fn_printn(bp, i, snapend)) \
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc; \
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\""); \
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += ((i + sizeof(int32_t) - 1) / sizeof(int32_t)) * sizeof(int32_t); \
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define INTOUT() { int i; \
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t)); \
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = (int) EXTRACT_32BITS(bp); \
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %d", i); \
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define UINTOUT() { unsigned long i; \
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t)); \
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp); \
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %lu", i); \
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
70653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define UINT64OUT() { u_int64_t i; \
70753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			TCHECK2(bp[0], sizeof(u_int64_t)); \
70853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			i = EXTRACT_64BITS(bp); \
70953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bp += sizeof(u_int64_t); \
71053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" %" PRIu64, i); \
71153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
71253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DATEOUT() { time_t t; struct tm *tm; char str[256]; \
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t)); \
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			t = (time_t) EXTRACT_32BITS(bp); \
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			tm = localtime(&t); \
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			strftime(str, 256, "%Y/%m/%d %T", tm); \
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", str); \
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define STOREATTROUT() { unsigned long mask, i; \
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], (sizeof(int32_t)*6)); \
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			mask = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (mask) printf (" StoreStatus"); \
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (mask & 1) { printf(" date"); DATEOUT(); } \
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else bp += sizeof(int32_t); \
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (mask & 2) printf(" owner %lu", i);  \
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (mask & 4) printf(" group %lu", i); \
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (mask & 8) printf(" mode %lo", i & 07777); \
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp); bp += sizeof(int32_t); \
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (mask & 16) printf(" segsize %lu", i); \
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* undocumented in 3.3 docu */ \
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (mask & 1024) printf(" fsync");  \
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define UBIK_VERSIONOUT() {int32_t epoch; int32_t counter; \
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t) * 2); \
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			epoch = EXTRACT_32BITS(bp); \
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			counter = EXTRACT_32BITS(bp); \
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t); \
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %d.%d", epoch, counter); \
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define AFSUUIDOUT() {u_int32_t temp; int i; \
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 11*sizeof(u_int32_t)); \
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			temp = EXTRACT_32BITS(bp); \
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(u_int32_t); \
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %08x", temp); \
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			temp = EXTRACT_32BITS(bp); \
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(u_int32_t); \
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%04x", temp); \
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			temp = EXTRACT_32BITS(bp); \
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(u_int32_t); \
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%04x", temp); \
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 8; i++) { \
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				temp = EXTRACT_32BITS(bp); \
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(u_int32_t); \
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("%02x", (unsigned char) temp); \
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} \
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the sickest one of all
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VECOUT(MAX) { u_char *sp; \
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			u_char s[AFSNAMEMAX]; \
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int k; \
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((MAX) + 1 > sizeof(s)) \
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc; \
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], (MAX) * sizeof(int32_t)); \
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sp = s; \
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (k = 0; k < (MAX); k++) { \
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				*sp++ = (u_char) EXTRACT_32BITS(bp); \
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t); \
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} \
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			s[(MAX)] = '\0'; \
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" \""); \
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fn_print(s, NULL); \
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\""); \
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
78853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define DESTSERVEROUT() { unsigned long n1, n2, n3; \
78953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			TCHECK2(bp[0], sizeof(int32_t) * 3); \
79053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			n1 = EXTRACT_32BITS(bp); \
79153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bp += sizeof(int32_t); \
79253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			n2 = EXTRACT_32BITS(bp); \
79353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bp += sizeof(int32_t); \
79453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			n3 = EXTRACT_32BITS(bp); \
79553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			bp += sizeof(int32_t); \
79653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" server %d:%d:%d", (int) n1, (int) n2, (int) n3); \
79753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
79853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS file service (fs)
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfs_print(register const u_char *bp, int length)
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int fs_op;
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from fsint/afsint.xg
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fs_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" fs call %s", tok2str(fs_req, "op#%d", fs_op));
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out arguments to some of the AFS calls.  This stuff is
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * all from afsint.xg
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Sigh.  This is gross.  Ritchie forgive me.
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (fs_op) {
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 130:	/* Fetch data */
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" offset");
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" length");
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 131:	/* Fetch ACL */
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 132:	/* Fetch Status */
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 143:	/* Old set lock */
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 144:	/* Old extend lock */
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 145:	/* Old release lock */
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 156:	/* Set lock */
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 157:	/* Extend lock */
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 158:	/* Release lock */
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 135:	/* Store status */
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STOREATTROUT();
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 133:	/* Store data */
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STOREATTROUT();
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" offset");
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" length");
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" flen");
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 134:	/* Store ACL */
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			char a[AFSOPAQUEMAX+1];
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp);
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], i);
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = min(AFSOPAQUEMAX, i);
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			strncpy(a, (char *) bp, i);
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			a[i] = '\0';
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			acl_print((u_char *) a, sizeof(a), (u_char *) a + i);
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 137:	/* Create file */
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 141:	/* MakeDir */
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STOREATTROUT();
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 136:	/* Remove file */
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 142:	/* Remove directory */
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 138:	/* Rename file */
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" old");
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" new");
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 139:	/* Symlink */
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" link to");
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 140:	/* Link */
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" link to");
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 148:	/* Get volume info */
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 149:	/* Get volume stats */
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 150:	/* Set volume stats */
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" volid");
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 154:	/* New get volume info */
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" volname");
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 155:	/* Bulk stat */
92653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 65536:     /* Inline bulk stat */
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j;
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = EXTRACT_32BITS(bp);
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < j; i++) {
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				FIDOUT();
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i != j - 1)
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(",");
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
94153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 65537:	/* Fetch data 64 */
94253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			FIDOUT();
94353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" offset");
94453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINT64OUT();
94553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" length");
94653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINT64OUT();
94753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
94853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 65538:	/* Store data 64 */
94953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			FIDOUT();
95053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			STOREATTROUT();
95153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" offset");
95253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINT64OUT();
95353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" length");
95453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINT64OUT();
95553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" flen");
95653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINT64OUT();
95753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
95853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 65541:    /* CallBack rx conn address */
95953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" addr");
96053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|fs]");
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS file service
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfs_reply_print(register const u_char *bp, int length, int32_t opcode)
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from fsint/afsint.xg
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" fs reply %s", tok2str(fs_req, "op#%d", opcode));
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA) {
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (opcode) {
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 131:	/* Fetch ACL */
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			char a[AFSOPAQUEMAX+1];
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp);
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], i);
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = min(AFSOPAQUEMAX, i);
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			strncpy(a, (char *) bp, i);
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			a[i] = '\0';
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			acl_print((u_char *) a, sizeof(a), (u_char *) a + i);
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 137:	/* Create file */
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 141:	/* MakeDir */
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" new");
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			FIDOUT();
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 151:	/* Get root volume */
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" root volume");
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(AFSNAMEMAX);
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 153:	/* Get time */
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			DATEOUT();
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (rxh->type == RX_PACKET_TYPE_ABORT) {
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int i;
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], sizeof(int32_t));
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = (int) EXTRACT_32BITS(bp);
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += sizeof(int32_t);
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" error %s", tok2str(afs_fs_errors, "#%d", i));
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" strange fs reply of type %d", rxh->type);
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|fs]");
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out an AFS ACL string.  An AFS ACL is a string that has the
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * following format:
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * <positive> <negative>
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * <uid1> <aclbits1>
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ....
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * "positive" and "negative" are integers which contain the number of
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * positive and negative ACL's in the string.  The uid/aclbits pair are
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ASCII strings containing the UID/PTS record and and a ascii number
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * representing a logical OR of all the ACL permission bits
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectacl_print(u_char *s, int maxsize, u_char *end)
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int pos, neg, acl;
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int n, i;
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *user;
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char fmt[1024];
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((user = (char *)malloc(maxsize)) == NULL)
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sscanf((char *) s, "%d %d\n%n", &pos, &neg, &n) != 2)
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto finish;
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	s += n;
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (s > end)
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto finish;
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * This wacky order preserves the order used by the "fs" command
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ACLOUT(acl) \
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_READ) \
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("r"); \
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_LOOKUP) \
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("l"); \
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_INSERT) \
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("i"); \
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_DELETE) \
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("d"); \
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_WRITE) \
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("w"); \
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_LOCK) \
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("k"); \
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (acl & PRSFS_ADMINISTER) \
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("a");
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < pos; i++) {
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1);
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sscanf((char *) s, fmt, user, &acl, &n) != 2)
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto finish;
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s += n;
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" +{");
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fn_print((u_char *)user, NULL);
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ACLOUT(acl);
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("}");
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (s > end)
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto finish;
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < neg; i++) {
11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(fmt, sizeof(fmt), "%%%ds %%d\n%%n", maxsize - 1);
11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sscanf((char *) s, fmt, user, &acl, &n) != 2)
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto finish;
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s += n;
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" -{");
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fn_print((u_char *)user, NULL);
11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ACLOUT(acl);
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("}");
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (s > end)
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto finish;
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfinish:
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	free(user);
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ACLOUT
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS callback service
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcb_print(register const u_char *bp, int length)
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int cb_op;
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from fsint/afscbint.xg
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cb_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" cb call %s", tok2str(cb_req, "op#%d", cb_op));
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from fsint/afscbint.xg
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (cb_op) {
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 204:		/* Callback */
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j, t;
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = EXTRACT_32BITS(bp);
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < j; i++) {
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				FIDOUT();
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i != j - 1)
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(",");
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = EXTRACT_32BITS(bp);
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j != 0)
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(";");
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < j; i++) {
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" ver");
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				INTOUT();
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" expires");
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				DATEOUT();
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK2(bp[0], 4);
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				t = EXTRACT_32BITS(bp);
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t);
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				tok2str(cb_types, "type %d", t);
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 214: {
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" afsuuid");
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			AFSUUIDOUT();
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|cb]");
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS Callback Service
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcb_reply_print(register const u_char *bp, int length, int32_t opcode)
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from fsint/afscbint.xg
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" cb reply %s", tok2str(cb_req, "op#%d", opcode));
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response.
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA)
12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (opcode) {
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 213:	/* InitCallBackState3 */
12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			AFSUUIDOUT();
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		;
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" errcode");
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|cb]");
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS protection database server
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprot_print(register const u_char *bp, int length)
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int pt_op;
12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from ptserver/ptint.xg
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pt_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" pt");
12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_ubik(pt_op)) {
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ubik_print(bp);
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" call %s", tok2str(pt_req, "op#%d", pt_op));
13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Decode some of the arguments to the PT calls
13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (pt_op) {
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 500:	/* I New User */
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(PRNAMEMAX);
13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" id");
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" oldid");
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 501:	/* Where is it */
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 506:	/* Delete */
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 508:	/* Get CPS */
13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 512:	/* List entry */
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 514:	/* List elements */
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 517:	/* List owned */
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 518:	/* Get CPS2 */
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 519:	/* Get host CPS */
132453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 530:	/* List super groups */
13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" id");
13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 502:	/* Dump entry */
13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" pos");
13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 503:	/* Add to group */
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 507:	/* Remove from group */
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 515:	/* Is a member of? */
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" uid");
13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" gid");
13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 504:	/* Name to ID */
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j;
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = EXTRACT_32BITS(bp);
13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Who designed this chicken-shit protocol?
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 *
13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Each character is stored as a 32-bit
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * integer!
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < j; i++) {
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				VECOUT(PRNAMEMAX);
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 505:	/* Id to name */
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j;
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ids:");
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp);
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < i; j++)
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				INTOUT();
13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 509:	/* New entry */
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(PRNAMEMAX);
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" flag");
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" oid");
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 511:	/* Set max */
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" id");
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" gflag");
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 513:	/* Change entry */
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" id");
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(PRNAMEMAX);
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" oldid");
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" newid");
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 520:	/* Update entry */
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" id");
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(PRNAMEMAX);
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|pt]");
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS protection service
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprot_reply_print(register const u_char *bp, int length, int32_t opcode)
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length < (int)sizeof(struct rx_header))
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from ptserver/ptint.xg.  Check to see if it's a
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Ubik call, however.
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" pt");
14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_ubik(opcode)) {
14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ubik_reply_print(bp, length, opcode);
14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" reply %s", tok2str(pt_req, "op#%d", opcode));
14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response
14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA)
14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (opcode) {
14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 504:		/* Name to ID */
14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j;
14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ids:");
14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp);
14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (j = 0; j < i; j++)
14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				INTOUT();
14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
14632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 505:		/* ID to name */
14642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j;
14662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
14672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = EXTRACT_32BITS(bp);
14682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Who designed this chicken-shit protocol?
14722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 *
14732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Each character is stored as a 32-bit
14742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * integer!
14752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
14762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < j; i++) {
14782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				VECOUT(PRNAMEMAX);
14792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
14802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
14812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
14822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
14832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
14842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 508:		/* Get CPS */
14852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 514:		/* List elements */
14862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 517:		/* List owned */
14872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 518:		/* Get CPS2 */
14882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 519:		/* Get host CPS */
14892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
14902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			unsigned long j;
14912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
14922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			j = EXTRACT_32BITS(bp);
14932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
14942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < j; i++) {
14952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				INTOUT();
14962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
14972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (j == 0)
14982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" <none!>");
14992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
15002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 510:		/* List max */
15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" maxuid");
15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" maxgid");
15052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
15062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
15082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
15122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
15132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
15142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" errcode");
15152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|pt]");
15222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
15232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
15252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS volume location database service
15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
15292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvldb_print(register const u_char *bp, int length)
15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int vldb_op;
15322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
15352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
15362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
15402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
15432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from vlserver/vldbint.xg
15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	vldb_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" vldb");
15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_ubik(vldb_op)) {
15512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ubik_print(bp);
15522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
15532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
15542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" call %s", tok2str(vldb_req, "op#%d", vldb_op));
15552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Decode some of the arguments to the VLDB calls
15582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
15592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
15612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (vldb_op) {
15632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 501:	/* Create new volume */
15642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 517:	/* Create entry N */
15652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			VECOUT(VLNAMEMAX);
15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 502:	/* Delete entry */
15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 503:	/* Get entry by ID */
15692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 507:	/* Update entry */
15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 508:	/* Set lock */
15712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 509:	/* Release lock */
15722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 518:	/* Get entry by ID N */
15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" volid");
15742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
15752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
15762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp);
15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
15782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (i <= 2)
15792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" type %s", voltype[i]);
15802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 504:	/* Get entry by name */
15822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 519:	/* Get entry by name N */
15832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 524:	/* Update entry by name */
15842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 527:	/* Get entry by name U */
15852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(VLNAMEMAX);
15862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 505:	/* Get new vol id */
15882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" bump");
15892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 506:	/* Replace entry */
15922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 520:	/* Replace entry N */
15932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" volid");
15942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
15952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = EXTRACT_32BITS(bp);
15972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
15982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (i <= 2)
15992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" type %s", voltype[i]);
16002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			VECOUT(VLNAMEMAX);
16012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 510:	/* List entry */
16032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 521:	/* List entry N */
16042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" index");
16052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
16062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
16082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
16092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
16102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|vldb]");
16152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
16162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
16182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS volume location database service
16192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
16202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
16222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvldb_reply_print(register const u_char *bp, int length, int32_t opcode)
16232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
16242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
16252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	unsigned long i;
16262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length < (int)sizeof(struct rx_header))
16282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
16292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
16312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
16332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
16342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from vlserver/vldbint.xg.  Check to see if it's a
16352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Ubik call, however.
16362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
16372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" vldb");
16392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_ubik(opcode)) {
16412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ubik_reply_print(bp, length, opcode);
16422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
16432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
16442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" reply %s", tok2str(vldb_req, "op#%d", opcode));
16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
16482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
16502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response
16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA)
16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (opcode) {
16552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 510:	/* List entry */
16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" count");
16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" nextindex");
16592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
16602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 503:	/* Get entry by id */
16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 504:	/* Get entry by name */
16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{	unsigned long nservers, j;
16632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			VECOUT(VLNAMEMAX);
16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" numservers");
16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
16682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			nservers = EXTRACT_32BITS(bp);
16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
16702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %lu", nservers);
16712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" servers");
16722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 8; i++) {
16732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK2(bp[0], sizeof(int32_t));
16742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i < nservers)
16752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %s",
16762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					   intoa(((struct in_addr *) bp)->s_addr));
16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t);
16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
16792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" partitions");
16802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 8; i++) {
16812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK2(bp[0], sizeof(int32_t));
16822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				j = EXTRACT_32BITS(bp);
16832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i < nservers && j <= 26)
16842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %c", 'a' + (int)j);
16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else if (i < nservers)
16862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %lu", j);
16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t);
16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
16892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 8 * sizeof(int32_t));
16902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 8 * sizeof(int32_t);
16912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" rwvol");
16922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
16932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" rovol");
16942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
16952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" backup");
16962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
16972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 505:	/* Get new volume ID */
17002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" newvol");
17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 521:	/* List entry */
17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 529:	/* List entry U */
17052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" count");
17062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
17072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" nextindex");
17082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
17092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 518:	/* Get entry by ID N */
17102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 519:	/* Get entry by name N */
17112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{	unsigned long nservers, j;
17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			VECOUT(VLNAMEMAX);
17132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" numservers");
17142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			nservers = EXTRACT_32BITS(bp);
17162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %lu", nservers);
17182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" servers");
17192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 13; i++) {
17202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK2(bp[0], sizeof(int32_t));
17212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i < nservers)
17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %s",
17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					   intoa(((struct in_addr *) bp)->s_addr));
17242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t);
17252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
17262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" partitions");
17272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 13; i++) {
17282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK2(bp[0], sizeof(int32_t));
17292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				j = EXTRACT_32BITS(bp);
17302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i < nservers && j <= 26)
17312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %c", 'a' + (int)j);
17322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else if (i < nservers)
17332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %lu", j);
17342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t);
17352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
17362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 13 * sizeof(int32_t));
17372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 13 * sizeof(int32_t);
17382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" rwvol");
17392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" rovol");
17412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" backup");
17432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
17462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 526:	/* Get entry by ID U */
17472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 527:	/* Get entry by name U */
17482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{	unsigned long nservers, j;
17492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			VECOUT(VLNAMEMAX);
17502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" numservers");
17512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
17522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			nservers = EXTRACT_32BITS(bp);
17532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
17542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %lu", nservers);
17552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" servers");
17562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 13; i++) {
17572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i < nservers) {
17582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" afsuuid");
17592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					AFSUUIDOUT();
17602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				} else {
17612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					TCHECK2(bp[0], 44);
17622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					bp += 44;
17632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
17642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
17652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4 * 13);
17662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 4 * 13;
17672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" partitions");
17682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < 13; i++) {
17692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK2(bp[0], sizeof(int32_t));
17702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				j = EXTRACT_32BITS(bp);
17712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (i < nservers && j <= 26)
17722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %c", 'a' + (int)j);
17732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else if (i < nservers)
17742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" %lu", j);
17752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				bp += sizeof(int32_t);
17762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
17772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 13 * sizeof(int32_t));
17782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += 13 * sizeof(int32_t);
17792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" rwvol");
17802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" rovol");
17822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" backup");
17842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
17852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
17882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
17932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
17942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" errcode");
17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
17972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
17992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
18012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|vldb]");
18022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
18032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
18052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS Kerberos Authentication service
18062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
18072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
18092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectkauth_print(register const u_char *bp, int length)
18102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
18112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int kauth_op;
18122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
18142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
18152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
18172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
18182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
18192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
18212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
18222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from kauth/kauth.rg
18232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
18242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	kauth_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
18262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" kauth");
18282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_ubik(kauth_op)) {
18302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ubik_print(bp);
18312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
18322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
18332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" call %s", tok2str(kauth_req, "op#%d", kauth_op));
18362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
18382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Decode some of the arguments to the KA calls
18392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
18402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
18422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (kauth_op) {
18442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 1:		/* Authenticate old */;
18452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 21:	/* Authenticate */
18462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 22:	/* Authenticate-V2 */
18472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 2:		/* Change PW */
18482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 5:		/* Set fields */
18492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 6:		/* Create user */
18502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 7:		/* Delete user */
18512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 8:		/* Get entry */
18522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 14:	/* Unlock */
18532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 15:	/* Lock status */
18542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" principal");
18552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
18582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 3:		/* GetTicket-old */
18592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 23:	/* GetTicket */
18602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
18612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int i;
18622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" kvno");
18632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
18642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" domain");
18652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], sizeof(int32_t));
18672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = (int) EXTRACT_32BITS(bp);
18682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
18692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], i);
18702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += i;
18712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" principal");
18722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
18752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
18762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 4:		/* Set Password */
18772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" principal");
18782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" kvno");
18812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
18822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
18832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 12:	/* Get password */
18842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" name");
18852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(KANAMEMAX);
18862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
18872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
18882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
18892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
18902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
18922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
18942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|kauth]");
18952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
18962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
18982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS Kerberos Authentication Service
18992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
19002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
19022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectkauth_reply_print(register const u_char *bp, int length, int32_t opcode)
19032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
19042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
19052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
19072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
19082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
19102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
19122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
19132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from kauth/kauth.rg
19142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
19152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" kauth");
19172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_ubik(opcode)) {
19192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ubik_reply_print(bp, length, opcode);
19202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
19212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" reply %s", tok2str(kauth_req, "op#%d", opcode));
19242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
19262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
19282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response.
19292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
19302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA)
19322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Well, no, not really.  Leave this for later */
19332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		;
19342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
19352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
19362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
19372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
19382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" errcode");
19392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
19402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
19432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
19452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|kauth]");
19462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
19472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
19492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS Volume location service
19502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
19512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
19532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvol_print(register const u_char *bp, int length)
19542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
19552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int vol_op;
19562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
19582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
19592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
19612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
19622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
19652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
19662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from volser/volint.xg
19672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
19682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	vol_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
19702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" vol call %s", tok2str(vol_req, "op#%d", vol_op));
19722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
197353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	bp += sizeof(struct rx_header) + 4;
19742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
197553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	switch (vol_op) {
197653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 100:	/* Create volume */
197753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" partition");
197853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
197953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" name");
198053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			STROUT(AFSNAMEMAX);
198153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" type");
198253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
198353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" parent");
198453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
198553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
198653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 101:	/* Delete volume */
198753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 107:	/* Get flags */
198853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" trans");
198953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
199053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
199153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 102:	/* Restore */
199253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" totrans");
199353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
199453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" flags");
199553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
199653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
199753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 103:	/* Forward */
199853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromtrans");
199953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
200053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromdate");
200153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			DATEOUT();
200253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			DESTSERVEROUT();
200353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" desttrans");
200453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			INTOUT();
200553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
200653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 104:	/* End trans */
200753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" trans");
200853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
200953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
201053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 105:	/* Clone */
201153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" trans");
201253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
201353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" purgevol");
201453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
201553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" newtype");
201653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
201753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" newname");
201853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			STROUT(AFSNAMEMAX);
201953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
202053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 106:	/* Set flags */
202153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" trans");
202253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
202353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" flags");
202453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
202553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
202653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 108:	/* Trans create */
202753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" vol");
202853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
202953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" partition");
203053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
203153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" flags");
203253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
203353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
203453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 109:	/* Dump */
203553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 655537:	/* Get size */
203653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromtrans");
203753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
203853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromdate");
203953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			DATEOUT();
204053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
204153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 110:	/* Get n-th volume */
204253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" index");
204353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
204453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
204553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 111:	/* Set forwarding */
204653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tid");
204753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
204853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" newsite");
204953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
205053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
205153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 112:	/* Get name */
205253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 113:	/* Get status */
205353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tid");
205453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
205553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 114:	/* Signal restore */
205653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" name");
205753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			STROUT(AFSNAMEMAX);
205853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" type");
205953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
206053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" pid");
206153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
206253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" cloneid");
206353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
206453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
206553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 116:	/* List volumes */
206653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" partition");
206753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
206853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" flags");
206953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
207053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
207153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 117:	/* Set id types */
207253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tid");
207353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
207453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" name");
207553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			STROUT(AFSNAMEMAX);
207653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" type");
207753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
207853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" pid");
207953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
208053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" clone");
208153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
208253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" backup");
208353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
208453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
208553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 119:	/* Partition info */
208653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" name");
208753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			STROUT(AFSNAMEMAX);
208853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
208953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 120:	/* Reclone */
209053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tid");
209153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
209253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
209353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 121:	/* List one volume */
209453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 122:	/* Nuke volume */
209553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 124:	/* Extended List volumes */
209653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 125:	/* Extended List one volume */
209753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 65536:	/* Convert RO to RW volume */
209853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" partid");
209953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
210053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" volid");
210153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
210253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
210353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 123:	/* Set date */
210453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tid");
210553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
210653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" date");
210753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			DATEOUT();
210853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
210953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 126:	/* Set info */
211053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" tid");
211153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
211253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
211353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 128:	/* Forward multiple */
211453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromtrans");
211553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
211653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromdate");
211753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			DATEOUT();
211853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			{
211953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				unsigned long i, j;
212053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				TCHECK2(bp[0], 4);
212153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				j = EXTRACT_32BITS(bp);
212253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				bp += sizeof(int32_t);
212353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				for (i = 0; i < j; i++) {
212453f17a9db278d33517d9888dd77848f554522a38JP Abgrall					DESTSERVEROUT();
212553f17a9db278d33517d9888dd77848f554522a38JP Abgrall					if (i != j - 1)
212653f17a9db278d33517d9888dd77848f554522a38JP Abgrall						printf(",");
212753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				}
212853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				if (j == 0)
212953f17a9db278d33517d9888dd77848f554522a38JP Abgrall					printf(" <none!>");
213053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
213153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
213253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 65538:	/* Dump version 2 */
213353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromtrans");
213453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
213553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" fromdate");
213653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			DATEOUT();
213753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf(" flags");
213853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			UINTOUT();
213953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
214053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		default:
214153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			;
214253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
21432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
21442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
21462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|vol]");
21472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
21482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
21502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS Volume Service
21512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
21522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
21542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvol_reply_print(register const u_char *bp, int length, int32_t opcode)
21552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
21562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
21572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
21592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
21602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
21622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
21642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
21652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from volser/volint.xg
21662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
21672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" vol reply %s", tok2str(vol_req, "op#%d", opcode));
21692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
21712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
21732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response.
21742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
21752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
217653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (rxh->type == RX_PACKET_TYPE_DATA) {
217753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		switch (opcode) {
217853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 100:	/* Create volume */
217953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" volid");
218053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
218153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" trans");
218253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
218353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
218453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 104:	/* End transaction */
218553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
218653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
218753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 105:	/* Clone */
218853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" newvol");
218953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
219053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
219153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 107:	/* Get flags */
219253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
219353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
219453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 108:	/* Transaction create */
219553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" trans");
219653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
219753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
219853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 110:	/* Get n-th volume */
219953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" volume");
220053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
220153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" partition");
220253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
220353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
220453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 112:	/* Get name */
220553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				STROUT(AFSNAMEMAX);
220653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
220753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 113:	/* Get status */
220853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" volid");
220953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
221053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" nextuniq");
221153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
221253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" type");
221353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
221453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" parentid");
221553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
221653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" clone");
221753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
221853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" backup");
221953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
222053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" restore");
222153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
222253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" maxquota");
222353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
222453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" minquota");
222553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
222653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" owner");
222753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				UINTOUT();
222853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" create");
222953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				DATEOUT();
223053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" access");
223153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				DATEOUT();
223253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" update");
223353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				DATEOUT();
223453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" expire");
223553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				DATEOUT();
223653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" backup");
223753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				DATEOUT();
223853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printf(" copy");
223953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				DATEOUT();
224053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
224153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 115:	/* Old list partitions */
224253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
224353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 116:	/* List volumes */
224453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			case 121:	/* List one volume */
224553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				{
224653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					unsigned long i, j;
224753f17a9db278d33517d9888dd77848f554522a38JP Abgrall					TCHECK2(bp[0], 4);
224853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					j = EXTRACT_32BITS(bp);
224953f17a9db278d33517d9888dd77848f554522a38JP Abgrall					bp += sizeof(int32_t);
225053f17a9db278d33517d9888dd77848f554522a38JP Abgrall					for (i = 0; i < j; i++) {
225153f17a9db278d33517d9888dd77848f554522a38JP Abgrall						printf(" name");
225253f17a9db278d33517d9888dd77848f554522a38JP Abgrall						VECOUT(32);
225353f17a9db278d33517d9888dd77848f554522a38JP Abgrall						printf(" volid");
225453f17a9db278d33517d9888dd77848f554522a38JP Abgrall						UINTOUT();
225553f17a9db278d33517d9888dd77848f554522a38JP Abgrall						printf(" type");
225653f17a9db278d33517d9888dd77848f554522a38JP Abgrall						bp += sizeof(int32_t) * 21;
225753f17a9db278d33517d9888dd77848f554522a38JP Abgrall						if (i != j - 1)
225853f17a9db278d33517d9888dd77848f554522a38JP Abgrall							printf(",");
225953f17a9db278d33517d9888dd77848f554522a38JP Abgrall					}
226053f17a9db278d33517d9888dd77848f554522a38JP Abgrall					if (j == 0)
226153f17a9db278d33517d9888dd77848f554522a38JP Abgrall						printf(" <none!>");
226253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				}
226353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				break;
226453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
226553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
226653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			default:
226753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				;
226853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
226953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else {
22702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
22712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
22722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
22732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" errcode");
22742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
22752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
22762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
22782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
22802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|vol]");
22812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
22822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle calls to the AFS BOS service
22852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
22862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
22882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbos_print(register const u_char *bp, int length)
22892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
22902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int bos_op;
22912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
22932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
22942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (snapend - bp + 1 <= (int)(sizeof(struct rx_header) + sizeof(int32_t))) {
22962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
22972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
22982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
23002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
23012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from bozo/bosint.xg
23022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
23032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bos_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
23052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" bos call %s", tok2str(bos_req, "op#%d", bos_op));
23072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
23092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Decode some of the arguments to the BOS calls
23102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
23112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
23132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (bos_op) {
23152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 80:	/* Create B node */
23162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" type");
23172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(BOSNAMEMAX);
23182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" instance");
23192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(BOSNAMEMAX);
23202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
23212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 81:	/* Delete B node */
23222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 83:	/* Get status */
23232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 85:	/* Get instance info */
23242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 87:	/* Add super user */
23252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 88:	/* Delete super user */
23262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 93:	/* Set cell name */
23272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 96:	/* Add cell host */
23282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 97:	/* Delete cell host */
23292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 104:	/* Restart */
23302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 106:	/* Uninstall */
23312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 108:	/* Exec */
23322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 112:	/* Getlog */
23332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 114:	/* Get instance strings */
23342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(BOSNAMEMAX);
23352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
23362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 82:	/* Set status */
23372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 98:	/* Set T status */
23382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(BOSNAMEMAX);
23392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" status");
23402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
23412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
23422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 86:	/* Get instance parm */
23432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(BOSNAMEMAX);
23442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" num");
23452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
23462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
23472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 84:	/* Enumerate instance */
23482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 89:	/* List super users */
23492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 90:	/* List keys */
23502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 91:	/* Add key */
23512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 92:	/* Delete key */
23522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 95:	/* Get cell host */
23532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
23542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
23552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 105:	/* Install */
23562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			STROUT(BOSNAMEMAX);
23572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" size");
23582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
23592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" flags");
23602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
23612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" date");
23622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
23632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
23642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
23652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
23662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
23672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
23692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
23712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|bos]");
23722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
23732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
23752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle replies to the AFS BOS Service
23762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
23772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
23792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbos_reply_print(register const u_char *bp, int length, int32_t opcode)
23802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
23812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
23822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length <= (int)sizeof(struct rx_header))
23842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
23852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
23872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
23892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
23902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from volser/volint.xg
23912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
23922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" bos reply %s", tok2str(bos_req, "op#%d", opcode));
23942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
23962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
23982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, interpret the response.
23992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
24002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA)
24022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Well, no, not really.  Leave this for later */
24032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		;
24042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
24052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
24062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Otherwise, just print out the return code
24072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
24082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" errcode");
24092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
24102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
24112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
24132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
24152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|bos]");
24162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
24172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
24192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Check to see if this is a Ubik opcode.
24202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
24212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
24232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectis_ubik(u_int32_t opcode)
24242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
24252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((opcode >= VOTE_LOW && opcode <= VOTE_HIGH) ||
24262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (opcode >= DISK_LOW && opcode <= DISK_HIGH))
24272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(1);
24282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
24292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(0);
24302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
24312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
24332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle Ubik opcodes to any one of the replicated database services
24342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
24352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
24372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectubik_print(register const u_char *bp)
24382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
24392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int ubik_op;
24402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int32_t temp;
24412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
24432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the afs call we're invoking.  The table used here was
24442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * gleaned from ubik/ubik_int.xg
24452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
24462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ubik_op = EXTRACT_32BITS(bp + sizeof(struct rx_header));
24482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" ubik call %s", tok2str(ubik_req, "op#%d", ubik_op));
24502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
24522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Decode some of the arguments to the Ubik calls
24532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
24542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header) + 4;
24562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (ubik_op) {
24582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 10000:		/* Beacon */
24592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(bp[0], 4);
24602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			temp = EXTRACT_32BITS(bp);
24612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
24622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" syncsite %s", temp ? "yes" : "no");
24632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" votestart");
24642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			DATEOUT();
24652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" dbversion");
24662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
24672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tid");
24682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
24692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
24702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 10003:		/* Get sync site */
24712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" site");
24722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UINTOUT();
24732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
24742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20000:		/* Begin */
24752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20001:		/* Commit */
24762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20007:		/* Abort */
24772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20008:		/* Release locks */
24782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20010:		/* Writev */
24792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tid");
24802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
24812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
24822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20002:		/* Lock */
24832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tid");
24842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
24852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" file");
24862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
24872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" pos");
24882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
24892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" length");
24902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
24912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			temp = EXTRACT_32BITS(bp);
24922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			bp += sizeof(int32_t);
24932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			tok2str(ubik_lock_types, "type %d", temp);
24942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
24952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20003:		/* Write */
24962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tid");
24972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
24982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" file");
24992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" pos");
25012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20005:		/* Get file */
25042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" file");
25052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20006:		/* Send file */
25082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" file");
25092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" length");
25112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" dbversion");
25132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
25142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20009:		/* Truncate */
25162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tid");
25172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
25182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" file");
25192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" length");
25212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20012:		/* Set version */
25242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tid");
25252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
25262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" oldversion");
25272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
25282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" newversion");
25292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
25302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
25322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
25332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
25342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
25362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
25382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|ubik]");
25392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
25402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
25422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle Ubik replies to any one of the replicated database services
25432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
25442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
25462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectubik_reply_print(register const u_char *bp, int length, int32_t opcode)
25472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
25482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_header *rxh;
25492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length < (int)sizeof(struct rx_header))
25512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
25522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxh = (struct rx_header *) bp;
25542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
25562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out the ubik call we're invoking.  This table was gleaned
25572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * from ubik/ubik_int.xg
25582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
25592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" ubik reply %s", tok2str(ubik_req, "op#%d", opcode));
25612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
25632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
25652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If it was a data packet, print out the arguments to the Ubik calls
25662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
25672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxh->type == RX_PACKET_TYPE_DATA)
25692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (opcode) {
25702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 10000:		/* Beacon */
25712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" vote no");
25722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 20004:		/* Get version */
25742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" dbversion");
25752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UBIK_VERSIONOUT();
25762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
25782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			;
25792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
25802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
25822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Otherwise, print out "yes" it it was a beacon packet (because
25832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * that's how yes votes are returned, go figure), otherwise
25842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * just print out the error code.
25852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
25862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
25882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (opcode) {
25892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 10000:		/* Beacon */
25902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" vote yes until");
25912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			DATEOUT();
25922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
25932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
25942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" errcode");
25952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			INTOUT();
25962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
25972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
25992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
26012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|ubik]");
26022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
26032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
26052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle RX ACK packets.
26062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
26072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
26092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrx_ack_print(register const u_char *bp, int length)
26102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
26112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct rx_ackPacket *rxa;
26122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i, start, last;
26132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t firstPacket;
26142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length < (int)sizeof(struct rx_header))
26162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
26172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += sizeof(struct rx_header);
26192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
26212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * This may seem a little odd .... the rx_ackPacket structure
26222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * contains an array of individual packet acknowledgements
26232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * (used for selective ack/nack), but since it's variable in size,
26242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * we don't want to truncate based on the size of the whole
26252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * rx_ackPacket structure.
26262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
26272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(bp[0], sizeof(struct rx_ackPacket) - RX_MAXACKS);
26292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rxa = (struct rx_ackPacket *) bp;
26312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bp += (sizeof(struct rx_ackPacket) - RX_MAXACKS);
26322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
26342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Print out a few useful things from the ack packet structure
26352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
26362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 2)
26382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" bufspace %d maxskew %d",
26392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       (int) EXTRACT_16BITS(&rxa->bufferSpace),
26402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       (int) EXTRACT_16BITS(&rxa->maxSkew));
26412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	firstPacket = EXTRACT_32BITS(&rxa->firstPacket);
26432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" first %d serial %d reason %s",
26442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       firstPacket, EXTRACT_32BITS(&rxa->serial),
26452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       tok2str(rx_ack_reasons, "#%d", (int) rxa->reason));
26462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
26482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Okay, now we print out the ack array.  The way _this_ works
26492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * is that we start at "first", and step through the ack array.
26502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If we have a contiguous range of acks/nacks, try to
26512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * collapse them into a range.
26522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *
26532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * If you're really clever, you might have noticed that this
26542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * doesn't seem quite correct.  Specifically, due to structure
26552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * padding, sizeof(struct rx_ackPacket) - RX_MAXACKS won't actually
26562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * yield the start of the ack array (because RX_MAXACKS is 255
26572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * and the structure will likely get padded to a 2 or 4 byte
26582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * boundary).  However, this is the way it's implemented inside
26592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * of AFS - the start of the extra fields are at
26602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * sizeof(struct rx_ackPacket) - RX_MAXACKS + nAcks, which _isn't_
26612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * the exact start of the ack array.  Sigh.  That's why we aren't
26622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * using bp, but instead use rxa->acks[].  But nAcks gets added
26632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * to bp after this, so bp ends up at the right spot.  Go figure.
26642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
26652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rxa->nAcks != 0) {
26672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(bp[0], rxa->nAcks);
26692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
26712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Sigh, this is gross, but it seems to work to collapse
26722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * ranges correctly.
26732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
26742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0, start = last = -2; i < rxa->nAcks; i++)
26762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (rxa->acks[i] == RX_ACK_TYPE_ACK) {
26772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*
26792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * I figured this deserved _some_ explanation.
26802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * First, print "acked" and the packet seq
26812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * number if this is the first time we've
26822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * seen an acked packet.
26832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 */
26842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (last == -2) {
26862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" acked %d",
26872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					       firstPacket + i);
26882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					start = i;
26892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
26902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
26912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*
26922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * Otherwise, if the there is a skip in
26932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * the range (such as an nacked packet in
26942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * the middle of some acked packets),
26952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * then print the current packet number
26962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * seperated from the last number by
26972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * a comma.
26982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 */
26992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else if (last != i - 1) {
27012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(",%d", firstPacket + i);
27022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					start = i;
27032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
27042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*
27062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * We always set last to the value of
27072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * the last ack we saw.  Conversely, start
27082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * is set to the value of the first ack
27092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * we saw in a range.
27102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 */
27112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				last = i;
27132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*
27152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * Okay, this bit a code gets executed when
27162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * we hit a nack ... in _this_ case we
27172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * want to print out the range of packets
27182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * that were acked, so we need to print
27192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * the _previous_ packet number seperated
27202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * from the first by a dash (-).  Since we
27212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * already printed the first packet above,
27222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * just print the final packet.  Don't
27232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * do this if there will be a single-length
27242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * range.
27252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 */
27262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else if (last == i - 1 && start != last)
27272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("-%d", firstPacket + i - 1);
27282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
27302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * So, what's going on here?  We ran off the end of the
27312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * ack list, and if we got a range we need to finish it up.
27322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * So we need to determine if the last packet in the list
27332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * was an ack (if so, then last will be set to it) and
27342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * we need to see if the last range didn't start with the
27352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * last packet (because if it _did_, then that would mean
27362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * that the packet number has already been printed and
27372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * we don't need to print it again).
27382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
27392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (last == i - 1 && start != last)
27412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("-%d", firstPacket + i - 1);
27422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
27442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Same as above, just without comments
27452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
27462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0, start = last = -2; i < rxa->nAcks; i++)
27482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (rxa->acks[i] == RX_ACK_TYPE_NACK) {
27492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (last == -2) {
27502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" nacked %d",
27512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					       firstPacket + i);
27522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					start = i;
27532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				} else if (last != i - 1) {
27542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(",%d", firstPacket + i);
27552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					start = i;
27562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
27572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				last = i;
27582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else if (last == i - 1 && start != last)
27592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("-%d", firstPacket + i - 1);
27602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (last == i - 1 && start != last)
27622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("-%d", firstPacket + i - 1);
27632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += rxa->nAcks;
27652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
27662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
27692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * These are optional fields; depending on your version of AFS,
27702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * you may or may not see them
27712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
27722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TRUNCRET(n)	if (snapend - bp + 1 <= n) return;
27742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 1) {
27762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TRUNCRET(4);
27772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ifmtu");
27782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
27792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TRUNCRET(4);
27812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" maxmtu");
27822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
27832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TRUNCRET(4);
27852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rwind");
27862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
27872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TRUNCRET(4);
27892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" maxpackets");
27902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		INTOUT();
27912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
27922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
27942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
27952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
27962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|ack]");
27972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
27982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef TRUNCRET
2799