12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Decode and print Zephyr packets.
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	http://web.mit.edu/zephyr/doc/protocol
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 2001 Nickolai Zeldovich <kolya@MIT.EDU>
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved.
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution.
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The name of the author(s) may not be used to endorse or promote
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * products derived from this software without specific prior written
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * PURPOSE.
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-zephyr.c,v 1.10 2007-08-09 18:47:27 hannes Exp $";
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct z_packet {
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *version;
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int numfields;
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int kind;
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *uid;
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int port;
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int auth;
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int authlen;
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *authdata;
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *class;
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *inst;
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *opcode;
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *sender;
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *recipient;
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *format;
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int cksum;
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int multi;
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *multi_uid;
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* Other fields follow here.. */
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectenum z_packet_type {
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_UNSAFE = 0,
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_UNACKED,
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_ACKED,
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_HMACK,
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_HMCTL,
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_SERVACK,
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_SERVNAK,
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_CLIENTACK,
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    Z_PACKET_STAT
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok z_types[] = {
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_UNSAFE,		"unsafe" },
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_UNACKED,		"unacked" },
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_ACKED,		"acked" },
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_HMACK,		"hm-ack" },
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_HMCTL,		"hm-ctl" },
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_SERVACK,		"serv-ack" },
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_SERVNAK,		"serv-nak" },
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_CLIENTACK,	"client-ack" },
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { Z_PACKET_STAT,		"stat" }
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar z_buf[256];
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char *
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_field(char **pptr, int *len)
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *s;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (*len <= 0 || !pptr || !*pptr)
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (*pptr > (char *) snapend)
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    s = *pptr;
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    while (*pptr <= (char *) snapend && *len >= 0 && **pptr) {
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(*pptr)++;
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(*len)--;
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    (*pptr)++;
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    (*len)--;
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (*len < 0 || *pptr > (char *) snapend)
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return s;
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectz_triple(char *class, char *inst, const char *recipient)
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!*recipient)
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	recipient = "*";
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    snprintf(z_buf, sizeof(z_buf), "<%s,%s,%s>", class, inst, recipient);
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    z_buf[sizeof(z_buf)-1] = '\0';
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return z_buf;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstr_to_lower(char *string)
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    strncpy(z_buf, string, sizeof(z_buf));
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    z_buf[sizeof(z_buf)-1] = '\0';
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    string = z_buf;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    while (*string) {
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	*string = tolower((unsigned char)(*string));
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	string++;
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return z_buf;
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectzephyr_print(const u_char *cp, int length)
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct z_packet z;
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *parse = (char *) cp;
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int parselen = length;
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    char *s;
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int lose = 0;
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* squelch compiler warnings */
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    z.kind = 0;
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    z.class = 0;
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    z.inst = 0;
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    z.opcode = 0;
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    z.sender = 0;
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    z.recipient = 0;
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PARSE_STRING				\
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	s = parse_field(&parse, &parselen);	\
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!s) lose = 1;
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PARSE_FIELD_INT(field)			\
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	PARSE_STRING				\
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!lose) field = strtol(s, 0, 16);
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PARSE_FIELD_STR(field)			\
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	PARSE_STRING				\
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!lose) field = s;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.version);
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (lose) return;
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (strncmp(z.version, "ZEPH", 4))
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.numfields);
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.kind);
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.uid);
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.port);
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.auth);
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.authlen);
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.authdata);
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.class);
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.inst);
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.opcode);
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.sender);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.recipient);
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.format);
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.cksum);
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_INT(z.multi);
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    PARSE_FIELD_STR(z.multi_uid);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (lose) {
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|zephyr] (%d)", length);
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(" zephyr");
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (strncmp(z.version+4, "0.2", 3)) {
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" v%s", z.version+4);
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(" %s", tok2str(z_types, "type %d", z.kind));
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (z.kind == Z_PACKET_SERVACK) {
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Initialization to silence warnings */
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *ackdata = NULL;
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	PARSE_FIELD_STR(ackdata);
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!lose && strcmp(ackdata, "SENT"))
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("/%s", str_to_lower(ackdata));
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (*z.sender) printf(" %s", z.sender);
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "USER_LOCATE")) {
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.opcode, "USER_HIDE"))
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" hide");
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (!strcmp(z.opcode, "USER_UNHIDE"))
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" unhide");
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" locate %s", z.inst);
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "ZEPHYR_ADMIN")) {
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" zephyr-admin %s", str_to_lower(z.opcode));
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "ZEPHYR_CTL")) {
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.inst, "CLIENT")) {
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "SUBSCRIBE") ||
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		!strcmp(z.opcode, "SUBSCRIBE_NODEFS") ||
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		!strcmp(z.opcode, "UNSUBSCRIBE")) {
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %ssub%s", strcmp(z.opcode, "SUBSCRIBE") ? "un" : "",
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   strcmp(z.opcode, "SUBSCRIBE_NODEFS") ? "" :
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project								   "-nodefs");
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (z.kind != Z_PACKET_SERVACK) {
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    /* Initialization to silence warnings */
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    char *c = NULL, *i = NULL, *r = NULL;
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    PARSE_FIELD_STR(c);
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    PARSE_FIELD_STR(i);
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    PARSE_FIELD_STR(r);
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    if (!lose) printf(" %s", z_triple(c, i, r));
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "GIMME")) {
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ret");
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "GIMMEDEFS")) {
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" gimme-defs");
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "CLEARSUB")) {
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" clear-subs");
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" %s", str_to_lower(z.opcode));
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.inst, "HM")) {
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" %s", str_to_lower(z.opcode));
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.inst, "REALM")) {
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "ADD_SUBSCRIBE"))
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" realm add-subs");
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "REQ_SUBSCRIBE"))
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" realm req-subs");
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "RLM_SUBSCRIBE"))
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" realm rlm-sub");
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (!strcmp(z.opcode, "RLM_UNSUBSCRIBE"))
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" realm rlm-unsub");
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "HM_CTL")) {
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" hm_ctl %s", str_to_lower(z.inst));
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" %s", str_to_lower(z.opcode));
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "HM_STAT")) {
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.inst, "HMST_CLIENT") && !strcmp(z.opcode, "GIMMESTATS")) {
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" get-client-stats");
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "WG_CTL")) {
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" wg_ctl %s", str_to_lower(z.inst));
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" %s", str_to_lower(z.opcode));
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!strcmp(z.class, "LOGIN")) {
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.opcode, "USER_FLUSH")) {
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" flush_locs");
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!strcmp(z.opcode, "NONE") ||
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    !strcmp(z.opcode, "OPSTAFF") ||
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    !strcmp(z.opcode, "REALM-VISIBLE") ||
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    !strcmp(z.opcode, "REALM-ANNOUNCED") ||
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    !strcmp(z.opcode, "NET-VISIBLE") ||
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    !strcmp(z.opcode, "NET-ANNOUNCED")) {
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf(" set-exposure %s", str_to_lower(z.opcode));
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!*z.recipient)
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	z.recipient = "*";
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf(" to %s", z_triple(z.class, z.inst, z.recipient));
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (*z.opcode)
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" op %s", z.opcode);
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
323