134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project/*
234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * All rights reserved.
434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *
534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * Redistribution and use in source and binary forms, with or without
634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * modification, are permitted provided that the following conditions
734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * are met:
834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
1034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
1134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
1234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *    documentation and/or other materials provided with the distribution.
1334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * 3. The name of the author may not be used to endorse or promote products
1434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *    derived from this software without specific prior written permission.
1534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *
1634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project *
27f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown *	$Id$
2834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project */
2934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
3034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include "defs.h"
3134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
3234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef LINUX
3334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <sys/socket.h>
3434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <linux/sockios.h>
3534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#else
3634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <sys/socket.h>
3734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <sys/sockio.h>
3834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
3934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <arpa/inet.h>
4034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
4134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#if defined (ALPHA) || defined(SH) || defined(SH64)
4234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef HAVE_SYS_IOCTL_H
4334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <sys/ioctl.h>
4434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#elif defined(HAVE_IOCTLS_H)
4534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <ioctls.h>
4634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
4734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
4834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#include <net/if.h>
4934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
5034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectstatic const struct xlat iffflags[] = {
5134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_UP,		"IFF_UP"		},
5234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_BROADCAST,	"IFF_BROADCAST"		},
5334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_DEBUG,		"IFF_DEBUG"		},
5434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_LOOPBACK,		"IFF_LOOPBACK"		},
5534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_POINTOPOINT,	"IFF_POINTOPOINT"	},
5634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_NOTRAILERS,	"IFF_NOTRAILERS"	},
5734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_RUNNING,		"IFF_RUNNING"		},
5834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_NOARP,		"IFF_NOARP"		},
5934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_PROMISC,		"IFF_PROMISC"		},
6034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_ALLMULTI,		"IFF_ALLMULTI"		},
6134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_MASTER,		"IFF_MASTER"		},
6234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_SLAVE,		"IFF_SLAVE"		},
6334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_MULTICAST,	"IFF_MULTICAST"		},
6434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_PORTSEL,		"IFF_PORTSEL"		},
6534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ IFF_AUTOMEDIA,	"IFF_AUTOMEDIA"		},
6634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	{ 0,			NULL			}
6734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project};
6834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
6934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
7034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectstatic void
7134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectprint_addr(tcp, addr, ifr)
7234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectstruct tcb *tcp;
7334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectlong addr;
7434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectstruct ifreq *ifr;
7534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project{
7634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	if (ifr->ifr_addr.sa_family == AF_INET) {
7734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		struct sockaddr_in *sinp;
7834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		sinp = (struct sockaddr_in *) &ifr->ifr_addr;
7934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		tprintf("inet_addr(\"%s\")", inet_ntoa(sinp->sin_addr));
8034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	} else
8134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		printstr(tcp, addr, sizeof(ifr->ifr_addr.sa_data));
8234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project}
8334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
8434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Projectint
85f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brownsock_ioctl(struct tcb *tcp, long code, long arg)
8634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project{
8734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	struct ifreq ifr;
8834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	struct ifconf ifc;
8934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	const char *str = NULL;
9034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	unsigned char *bytes;
9134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
9234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	if (entering(tcp)) {
9334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		if (code == SIOCGIFCONF) {
94f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			if (umove(tcp, tcp->u_arg[2], &ifc) >= 0
95f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			    && ifc.ifc_buf == NULL)
9634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf(", {%d -> ", ifc.ifc_len);
9734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			else
9834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf(", {");
9934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		}
10034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		return 0;
10134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	}
10234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project
10334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	switch (code) {
10434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCSHIWAT
10534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCSHIWAT:
10634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
10734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCGHIWAT
10834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGHIWAT:
10934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
11034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCSLOWAT
11134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCSLOWAT:
11234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
11334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCGLOWAT
11434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGLOWAT:
11534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
11634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef FIOSETOWN
11734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case FIOSETOWN:
11834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
11934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef FIOGETOWN
12034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case FIOGETOWN:
12134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
12234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCSPGRP
12334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCSPGRP:
12434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
12534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCGPGRP
12634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGPGRP:
12734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
12834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef SIOCATMARK
12934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCATMARK:
13034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
13134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		printnum(tcp, arg, ", %#d");
13234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		return 1;
13334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#ifdef LINUX
13434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFNAME:
135f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFNAME:
13634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFINDEX:
13734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFADDR:
138f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFADDR:
13934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFDSTADDR:
140f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFDSTADDR:
14134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFBRDADDR:
142f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFBRDADDR:
14334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFNETMASK:
144f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFNETMASK:
14534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFFLAGS:
146f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFFLAGS:
14734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFMETRIC:
148f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFMETRIC:
14934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFMTU:
150f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFMTU:
15134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFSLAVE:
152f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFSLAVE:
15334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFHWADDR:
154f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFHWADDR:
155f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCGIFTXQLEN:
156f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFTXQLEN:
157f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCGIFMAP:
158f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown	case SIOCSIFMAP:
159f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown		if (umove(tcp, tcp->u_arg[2], &ifr) < 0)
160f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			tprintf(", %#lx", tcp->u_arg[2]);
161f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown		else if (syserror(tcp)) {
162f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			if (code == SIOCGIFNAME || code == SIOCSIFNAME)
16334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf(", {ifr_index=%d, ifr_name=???}", ifr.ifr_ifindex);
16434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			else
16534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf(", {ifr_name=\"%s\", ???}", ifr.ifr_name);
166f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown		} else if (code == SIOCGIFNAME || code == SIOCSIFNAME)
16734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf(", {ifr_index=%d, ifr_name=\"%s\"}",
16834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				ifr.ifr_ifindex, ifr.ifr_name);
16934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		else {
17034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf(", {ifr_name=\"%s\", ", ifr.ifr_name);
17134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			switch (code) {
17234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFINDEX:
17334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("ifr_index=%d", ifr.ifr_ifindex);
17434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
17534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFADDR:
176f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFADDR:
17734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				str = "ifr_addr";
17834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFDSTADDR:
179f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFDSTADDR:
180f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				if (!str)
18134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					str = "ifr_dstaddr";
18234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFBRDADDR:
183f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFBRDADDR:
184f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				if (!str)
18534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					str = "ifr_broadaddr";
18634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFNETMASK:
187f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFNETMASK:
188f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				if (!str)
18934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					str = "ifr_netmask";
19034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("%s={", str);
19134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				printxval(addrfams,
19234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					  ifr.ifr_addr.sa_family,
193f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					  "AF_???");
19434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf(", ");
19534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				print_addr(tcp, ((long) tcp->u_arg[2]
19634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project						 + offsetof (struct ifreq,
19734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project							     ifr_addr.sa_data)),
19834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					   &ifr);
19934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("}");
20034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
20134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFHWADDR:
202f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFHWADDR:
20334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				/* XXX Are there other hardware addresses
20434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				   than 6-byte MACs?  */
20534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				bytes = (unsigned char *) &ifr.ifr_hwaddr.sa_data;
20634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("ifr_hwaddr=%02x:%02x:%02x:%02x:%02x:%02x",
20734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					bytes[0], bytes[1], bytes[2],
20834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					bytes[3], bytes[4], bytes[5]);
20934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
21034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFFLAGS:
211f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFFLAGS:
21234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("ifr_flags=");
21334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				printflags(iffflags, ifr.ifr_flags, "IFF_???");
21434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
21534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFMETRIC:
216f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFMETRIC:
21734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("ifr_metric=%d", ifr.ifr_metric);
21834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
21934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFMTU:
220f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFMTU:
22134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("ifr_mtu=%d", ifr.ifr_mtu);
22234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
22334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			case SIOCGIFSLAVE:
224f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFSLAVE:
22534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("ifr_slave=\"%s\"", ifr.ifr_slave);
22634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				break;
227f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCGIFTXQLEN:
228f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFTXQLEN:
229f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				tprintf("ifr_qlen=%d", ifr.ifr_qlen);
230f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				break;
231f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCGIFMAP:
232f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			case SIOCSIFMAP:
233f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				tprintf("ifr_map={mem_start=%#lx, "
234f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					"mem_end=%#lx, base_addr=%#x, "
235f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					"irq=%u, dma=%u, port=%u}",
236f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					ifr.ifr_map.mem_start,
237f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					ifr.ifr_map.mem_end,
238f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					(unsigned) ifr.ifr_map.base_addr,
239f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					(unsigned) ifr.ifr_map.irq,
240f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					(unsigned) ifr.ifr_map.dma,
241f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown					(unsigned) ifr.ifr_map.port);
242f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				break;
24334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			}
24434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf("}");
24534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		}
24634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		return 1;
24734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	case SIOCGIFCONF:
248f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown		if (umove(tcp, tcp->u_arg[2], &ifc) < 0) {
249f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			tprintf("???}");
250f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			return 1;
251f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown		}
25234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		tprintf("%d, ", ifc.ifc_len);
253f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown		if (syserror(tcp)) {
25434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf("%lx", (unsigned long) ifc.ifc_buf);
25534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		} else if (ifc.ifc_buf == NULL) {
25634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf("NULL");
25734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		} else {
25834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			int i;
25934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			unsigned nifra = ifc.ifc_len / sizeof(struct ifreq);
26034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			struct ifreq ifra[nifra];
261f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown
262f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			if (umoven(tcp, (unsigned long) ifc.ifc_buf,
263f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				sizeof(ifra), (char *) ifra) < 0) {
264f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				tprintf("%lx}", (unsigned long) ifc.ifc_buf);
265f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown				return 1;
266f76f96e20f766e6bb91593885b1e800f8bc14a52Jeff Brown			}
26734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf("{");
26834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			for (i = 0; i < nifra; ++i ) {
26934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				if (i > 0)
27034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					tprintf(", ");
27134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("{\"%s\", {",
27234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					ifra[i].ifr_name);
27334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				if (verbose(tcp)) {
27434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					printxval(addrfams,
27534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project						  ifra[i].ifr_addr.sa_family,
27634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project						  "AF_???");
27734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					tprintf(", ");
27834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					print_addr(tcp, ((long) tcp->u_arg[2]
27934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project							 + offsetof (struct ifreq,
28034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project								     ifr_addr.sa_data)
28134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project							 + ((char *) &ifra[i]
28234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project							    - (char *) &ifra[0])),
28334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project						   &ifra[i]);
28434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				} else
28534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project					tprintf("...");
28634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project				tprintf("}}");
28734d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			}
28834d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project			tprintf("}");
28934d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		}
29034d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		tprintf("}");
29134d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		return 1;
29234d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project#endif
29334d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	default:
29434d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project		return 0;
29534d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project	}
29634d6eabc451f16d5f168fc1595ee604f21bccc51The Android Open Source Project}
297