12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. 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: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Format and print AppleTalk packets. 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-atalk.c,v 1.81 2004/05/01 09:41:50 hannes Exp $ (LBL)"; 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h> 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h" 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" /* must come after interface.h */ 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "appletalk.h" 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok type2str[] = { 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ddpRTMP, "rtmp" }, 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ddpRTMPrequest, "rtmpReq" }, 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ddpECHO, "echo" }, 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ddpIP, "IP" }, 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ddpARP, "ARP" }, 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ddpKLAP, "KLAP" }, 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct aarp { 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t htype, ptype; 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t halen, palen; 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t op; 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t hsaddr[6]; 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t psaddr[4]; 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t hdaddr[6]; 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pdaddr[4]; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char tstr[] = "[|atalk]"; 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void atp_print(const struct atATP *, u_int); 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void atp_bitmap_print(u_char); 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void nbp_print(const struct atNBP *, u_int, u_short, u_char, u_char); 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *print_cstring(const char *, const u_char *); 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct atNBPtuple *nbp_tuple_print(const struct atNBPtuple *, 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *, 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short, u_char, u_char); 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct atNBPtuple *nbp_name_print(const struct atNBPtuple *, 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *); 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ataddr_string(u_short, u_char); 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ddp_print(const u_char *, u_int, int, u_short, u_char, u_char); 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ddpskt_string(int); 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print LLAP packets received on a physical LocalTalk interface. 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectltalk_if_print(const struct pcap_pkthdr *h, const u_char *p) 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (llap_print(p, h->caplen)); 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print AppleTalk LLAP packets. 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectllap_print(register const u_char *bp, u_int length) 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct LAP *lp; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct atDDP *dp; 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct atShortDDP *sdp; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short snet; 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int hdrlen; 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Our packet is on a 4-byte boundary, as we're either called 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * directly from a top-level link-layer printer (ltalk_if_print) 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or from the UDP printer. The LLAP+DDP header is a multiple 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * of 4 bytes in length, so the DDP payload is also on a 4-byte 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * boundary, and we don't need to align it before calling 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * "ddp_print()". 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lp = (const struct LAP *)bp; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(*lp); 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= sizeof(*lp); 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen = sizeof(*lp); 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (lp->type) { 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case lapShortDDP: 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < ddpSSize) { 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [|sddp %d]", length); 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (length); 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sdp = (const struct atShortDDP *)bp; 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s.%s", 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ataddr_string(0, lp->src), ddpskt_string(sdp->srcSkt)); 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" > %s.%s:", 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ataddr_string(0, lp->dst), ddpskt_string(sdp->dstSkt)); 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += ddpSSize; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= ddpSSize; 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen += ddpSSize; 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddp_print(bp, length, sdp->type, 0, lp->src, sdp->srcSkt); 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case lapDDP: 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < ddpSize) { 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [|ddp %d]", length); 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (length); 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp = (const struct atDDP *)bp; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snet = EXTRACT_16BITS(&dp->srcNet); 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s.%s", ataddr_string(snet, dp->srcNode), 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddpskt_string(dp->srcSkt)); 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" > %s.%s:", 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ataddr_string(EXTRACT_16BITS(&dp->dstNet), dp->dstNode), 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddpskt_string(dp->dstSkt)); 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += ddpSize; 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= ddpSize; 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen += ddpSize; 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddp_print(bp, length, dp->type, snet, dp->srcNode, dp->srcSkt); 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef notdef 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case lapKLAP: 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project klap_print(bp, length); 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d > %d at-lap#%d %d", 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lp->src, lp->dst, lp->type, length); 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (hdrlen); 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print EtherTalk/TokenTalk packets (or FDDITalk, or whatever it's called 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * when it runs over FDDI; yes, I've seen FDDI captures with AppleTalk 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * packets in them). 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectatalk_print(register const u_char *bp, u_int length) 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct atDDP *dp; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short snet; 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(!eflag) 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("AT "); 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < ddpSize) { 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [|ddp %d]", length); 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dp = (const struct atDDP *)bp; 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snet = EXTRACT_16BITS(&dp->srcNet); 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s.%s", ataddr_string(snet, dp->srcNode), 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddpskt_string(dp->srcSkt)); 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" > %s.%s: ", 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ataddr_string(EXTRACT_16BITS(&dp->dstNet), dp->dstNode), 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddpskt_string(dp->dstSkt)); 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += ddpSize; 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= ddpSize; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ddp_print(bp, length, dp->type, snet, dp->srcNode, dp->srcSkt); 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* XXX should probably pass in the snap header and do checks like arp_print() */ 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectaarp_print(register const u_char *bp, u_int length) 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct aarp *ap; 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define AT(member) ataddr_string((ap->member[1]<<8)|ap->member[2],ap->member[3]) 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("aarp "); 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ap = (const struct aarp *)bp; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_16BITS(&ap->htype) == 1 && 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ap->ptype) == ETHERTYPE_ATALK && 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ap->halen == 6 && ap->palen == 4 ) 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(&ap->op)) { 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: /* request */ 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("who-has %s tell %s", 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AT(pdaddr), AT(psaddr)); 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: /* response */ 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("reply %s is-at %s", 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AT(pdaddr), etheraddr_string(ap->hdaddr)); 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 3: /* probe (oy!) */ 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("probe %s tell %s", 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AT(pdaddr), AT(psaddr)); 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("len %u op %u htype %u ptype %#x halen %u palen %u", 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length, EXTRACT_16BITS(&ap->op), EXTRACT_16BITS(&ap->htype), 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ap->ptype), ap->halen, ap->palen); 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print AppleTalk Datagram Delivery Protocol packets. 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectddp_print(register const u_char *bp, register u_int length, register int t, 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_short snet, register u_char snode, u_char skt) 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (t) { 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ddpNBP: 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nbp_print((const struct atNBP *)bp, length, snet, snode, skt); 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ddpATP: 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project atp_print((const struct atATP *)bp, length); 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ddpEIGRP: 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_print(bp, length); 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" at-%s %d", tok2str(type2str, NULL, t), length); 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectatp_print(register const struct atATP *ap, u_int length) 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char c; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t data; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((const u_char *)(ap + 1) > snapend) { 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Just bail if we don't have the whole chunk. */ 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= sizeof(*ap); 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (ap->control & 0xc0) { 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpReqCode: 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" atp-req%s %d", 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ap->control & atpXO? " " : "*", 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ap->transID)); 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project atp_bitmap_print(ap->bitmap); 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length != 0) 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [len=%d]", length); 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (ap->control & (atpEOM|atpSTS)) { 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpEOM: 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [EOM]"); 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpSTS: 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [STS]"); 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpEOM|atpSTS: 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [EOM,STS]"); 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpRspCode: 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" atp-resp%s%d:%d (%d)", 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ap->control & atpEOM? "*" : " ", 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ap->transID), ap->bitmap, length); 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (ap->control & (atpXO|atpSTS)) { 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpXO: 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [XO]"); 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpSTS: 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [STS]"); 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpXO|atpSTS: 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [XO,STS]"); 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case atpRelCode: 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" atp-rel %d", EXTRACT_16BITS(&ap->transID)); 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project atp_bitmap_print(ap->bitmap); 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* length should be zero */ 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length) 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [len=%d]", length); 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* there shouldn't be any control flags */ 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ap->control & (atpXO|atpEOM|atpSTS)) { 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = '['; 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ap->control & atpXO) { 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%cXO", c); 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = ','; 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ap->control & atpEOM) { 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%cEOM", c); 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = ','; 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ap->control & atpSTS) { 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%cSTS", c); 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = ','; 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("]"); 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" atp-0x%x %d (%d)", ap->control, 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&ap->transID), length); 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project data = EXTRACT_32BITS(&ap->userData); 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (data != 0) 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" 0x%x", data); 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectatp_bitmap_print(register u_char bm) 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char c; 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The '& 0xff' below is needed for compilers that want to sign 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * extend a u_char, which is the case with the Ultrix compiler. 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (gcc is smart enough to eliminate it, at least on the Sparc). 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((bm + 1) & (bm & 0xff)) { 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = '<'; 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; bm; ++i) { 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bm & 1) { 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%c%d", c, i); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = ','; 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bm >>= 1; 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(">"); 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; bm; ++i) 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bm >>= 1; 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i > 1) 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("<0-%d>", i - 1); 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("<0>"); 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnbp_print(register const struct atNBP *np, u_int length, register u_short snet, 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char snode, register u_char skt) 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct atNBPtuple *tp = 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (const struct atNBPtuple *)((u_char *)np + nbpHeaderSize); 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ep; 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < nbpHeaderSize) { 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" truncated-nbp %d", length); 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= nbpHeaderSize; 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < 8) { 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* must be room for at least one tuple */ 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" truncated-nbp %d", length + nbpHeaderSize); 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ep points to end of available data */ 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ep = snapend; 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((const u_char *)tp > ep) { 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (i = np->control & 0xf0) { 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case nbpBrRq: 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case nbpLkUp: 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(i == nbpLkUp? " nbp-lkup %d:":" nbp-brRq %d:", 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project np->id); 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((const u_char *)(tp + 1) > ep) { 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)nbp_name_print(tp, ep); 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * look for anomalies: the spec says there can only 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * be one tuple, the address must match the source 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * address and the enumerator should be zero. 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((np->control & 0xf) != 1) 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [ntup=%d]", np->control & 0xf); 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->enumerator) 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [enum=%d]", tp->enumerator); 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_16BITS(&tp->net) != snet || 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->node != snode || tp->skt != skt) 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [addr=%s.%d]", 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ataddr_string(EXTRACT_16BITS(&tp->net), 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->node), tp->skt); 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case nbpLkUpReply: 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" nbp-reply %d:", np->id); 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print each of the tuples in the reply */ 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = np->control & 0xf; --i >= 0 && tp; ) 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = nbp_tuple_print(tp, ep, snet, snode, skt); 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" nbp-0x%x %d (%d)", np->control, np->id, 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print a counted string */ 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char * 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_cstring(register const char *cp, register const u_char *ep) 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int length; 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp >= (const char *)ep) { 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (0); 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length = *cp++; 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Spec says string can be at most 32 bytes long */ 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length > 32) { 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[len=%u]", length); 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (0); 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((int)--length >= 0) { 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp >= (const char *)ep) { 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (0); 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(*cp++); 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (cp); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct atNBPtuple * 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnbp_tuple_print(register const struct atNBPtuple *tp, 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *ep, 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_short snet, register u_char snode, 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char skt) 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct atNBPtuple *tpn; 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((const u_char *)(tp + 1) > ep) { 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(tstr, stdout); 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tpn = nbp_name_print(tp, ep); 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* if the enumerator isn't 1, print it */ 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->enumerator != 1) 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("(%d)", tp->enumerator); 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* if the socket doesn't match the src socket, print it */ 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->skt != skt) 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %d", tp->skt); 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* if the address doesn't match the src address, it's an anomaly */ 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_16BITS(&tp->net) != snet || tp->node != snode) 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [addr=%s]", 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ataddr_string(EXTRACT_16BITS(&tp->net), tp->node)); 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tpn); 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct atNBPtuple * 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnbp_name_print(const struct atNBPtuple *tp, register const u_char *ep) 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const char *cp = (const char *)tp + nbpTupleSize; 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Object */ 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('"'); 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = print_cstring(cp, ep)) != NULL) { 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Type */ 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(':'); 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = print_cstring(cp, ep)) != NULL) { 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Zone */ 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('@'); 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = print_cstring(cp, ep)) != NULL) 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('"'); 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ((const struct atNBPtuple *)cp); 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define HASHNAMESIZE 4096 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct hnamemem { 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int addr; 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *name; 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct hnamemem *nxt; 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct hnamemem hnametable[HASHNAMESIZE]; 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char * 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectataddr_string(u_short atnet, u_char athost) 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *tp, *tp2; 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i = (atnet << 8) | athost; 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char nambuf[MAXHOSTNAMELEN + 20]; 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static int first = 1; 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project FILE *fp; 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * if this is the first call, see if there's an AppleTalk 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * number to name map file. 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (first && (first = 0, !nflag) 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project && (fp = fopen("/etc/atalk.names", "r"))) { 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char line[256]; 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i1, i2, i3; 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (fgets(line, sizeof(line), fp)) { 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (line[0] == '\n' || line[0] == 0 || line[0] == '#') 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sscanf(line, "%d.%d.%d %256s", &i1, &i2, &i3, 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nambuf) == 4) 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* got a hostname. */ 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i3 |= ((i1 << 8) | i2) << 8; 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sscanf(line, "%d.%d %256s", &i1, &i2, 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nambuf) == 3) 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* got a net name */ 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i3 = (((i1 << 8) | i2) << 8) | 255; 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &hnametable[i3 & (HASHNAMESIZE-1)]; 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt; tp = tp->nxt) 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ; 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = i3; 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(nambuf); 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fclose(fp); 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &hnametable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->addr == i) 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* didn't have the node name -- see if we've got the net name */ 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i |= 255; 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp2 = &hnametable[i & (HASHNAMESIZE-1)]; tp2->nxt; tp2 = tp2->nxt) 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp2->addr == i) { 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = (atnet << 8) | athost; 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(nambuf, sizeof(nambuf), "%s.%d", 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp2->name, athost); 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(nambuf); 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = (atnet << 8) | athost; 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (athost != 255) 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(nambuf, sizeof(nambuf), "%d.%d.%d", 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project atnet >> 8, atnet & 0xff, athost); 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet >> 8, 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project atnet & 0xff); 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(nambuf); 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok skt2str[] = { 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { rtmpSkt, "rtmp" }, /* routing table maintenance */ 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { nbpSkt, "nis" }, /* name info socket */ 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { echoSkt, "echo" }, /* AppleTalk echo protocol */ 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { zipSkt, "zip" }, /* zone info protocol */ 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char * 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectddpskt_string(register int skt) 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[8]; 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nflag) { 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "%d", skt); 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (buf); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tok2str(skt2str, "%d", skt)); 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 628