1999-02-19 03:21:36 +03:00
/*
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
2018-06-14 14:00:00 +03:00
* Copyright ( c ) 1996 - 2018 The strace developers .
1999-02-19 03:21:36 +03:00
* All rights reserved .
*
2018-12-10 03:00:00 +03:00
* SPDX - License - Identifier : LGPL - 2.1 - or - later
1999-02-19 03:21:36 +03:00
*/
# include "defs.h"
2017-07-09 19:04:24 +03:00
# include "print_fields.h"
2016-12-26 17:07:24 +03:00
1999-02-19 03:21:36 +03:00
# include <sys/socket.h>
2016-05-13 23:22:18 +03:00
# if defined ALPHA || defined SH || defined SH64
# include <linux / ioctl.h>
# endif
2004-07-12 11:13:06 +04:00
# include <linux/sockios.h>
# include <arpa/inet.h>
# include <net/if.h>
2016-12-26 17:07:24 +03:00
# include DEF_MPERS_TYPE(struct_ifconf)
# include DEF_MPERS_TYPE(struct_ifreq)
typedef struct ifconf struct_ifconf ;
typedef struct ifreq struct_ifreq ;
# include MPERS_DEFS
2014-04-26 03:30:54 +04:00
# include "xlat/iffflags.h"
2005-02-02 Roland McGrath <roland@redhat.com>
* sock.c (iffflags): New variable, table of IFF_* values.
(print_addr): New function.
(sock_ioctl): Handle SIOCGIFADDR, SIOCGIFDSTADDR, SIOCGIFBRDADDR,
SIOCGIFNETMASK, SIOCGIFFLAGS, SIOCGIFMETRIC, SIOCGIFMTU, SIOCGIFSLAVE,
SIOCGIFHWADDR. Use print_addr for SIOCGIFCONF, SIOCGIFNAME, and
SIOCGIFINDEX, and fix their output.
From Ulrich Drepper <drepper@redhat.com>.
Fixes RH#138223.
2005-02-02 23:25:17 +03:00
2018-05-07 09:34:44 +03:00
# define XLAT_MACROS_ONLY
2018-12-30 18:35:21 +03:00
# include "xlat/arp_hardware_types.h"
2018-05-07 09:34:44 +03:00
# undef XLAT_MACROS_ONLY
2015-01-24 23:58:23 +03:00
static void
print_ifname ( const char * ifname )
{
print_quoted_string ( ifname , IFNAMSIZ + 1 , QUOTE_0_TERMINATED ) ;
}
2018-09-16 14:44:01 +03:00
DIAG_PUSH_IGNORE_OVERRIDE_INIT
2015-07-04 14:01:08 +03:00
static void
Change type of ioctl 3rd argument from long to kernel_ureg_t
* defs.h (DECL_IOCTL): Change arg type from long to kernel_ureg_t.
* dm.c (dm_known_ioctl, dm_ioctl): Likewise.
* file_ioctl.c (file_ioctl): Likewise.
* fs_x_ioctl.c (fs_x_ioctl): Likewise.
* ioctl.c (ioctl_decode): Likewise.
* loop.c (decode_loop_info, decode_loop_info64): Change addr type
from long to kernel_ureg_t.
(loop_ioctl): Change arg type from long to kernel_ureg_t.
* ptp.c (ptp_ioctl): Likewise.
* scsi.c (print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res, scsi_ioctl): Likewise.
* sock.c (print_ifreq, sock_ioctl): Likewise.
(decode_ifconf): Change addr type from long to kernel_ureg_t.
* term.c (decode_termios, decode_termio, decode_winsize, decode_ttysize,
decode_modem_flags): Likewise.
(term_ioctl): Change arg type from long to kernel_ureg_t.
* ubi.c (ubi_ioctl): Likewise.
* userfaultfd.c (uffdio_ioctl): Likewise.
2016-12-21 06:03:09 +03:00
print_ifreq ( struct tcb * const tcp , const unsigned int code ,
2016-12-26 17:07:24 +03:00
const kernel_ulong_t arg , const struct_ifreq * const ifr )
2015-07-04 14:01:08 +03:00
{
switch ( code ) {
case SIOCSIFADDR :
case SIOCGIFADDR :
2017-07-09 19:04:24 +03:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_addr ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFDSTADDR :
case SIOCGIFDSTADDR :
2017-07-09 19:04:24 +03:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_dstaddr ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFBRDADDR :
case SIOCGIFBRDADDR :
2017-07-09 19:04:24 +03:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_broadaddr ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFNETMASK :
case SIOCGIFNETMASK :
2017-07-09 19:04:24 +03:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_netmask ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFHWADDR :
case SIOCGIFHWADDR : {
2018-05-07 09:34:44 +03:00
static uint8_t hwaddr_sizes [ ] = {
[ 0 . . . ARPHRD_IEEE802_TR ] = 255 ,
[ ARPHRD_NETROM ] = 7 /* AX25_ADDR_LEN */ ,
[ ARPHRD_ETHER ] = 6 /* ETH_ALEN */ ,
/* ARPHRD_EETHER - no actual devices in Linux */
[ ARPHRD_AX25 ] = 7 /* AX25_ADDR_LEN */ ,
/* ARPHRD_PRONET - no actual devices in Linux */
/* ARPHRD_CHAOS - no actual devices in Linux */
[ ARPHRD_IEEE802 ] = 6 /* FC_ALEN */ ,
[ ARPHRD_ARCNET ] = 1 /* ARCNET_ALEN */ ,
/* ARPHRD_APPLETLK - no actual devices in Linux */
[ ARPHRD_DLCI ] = sizeof ( short ) ,
/* ARPHRD_ATM - no explicit setting */
/* ARPHRD_METRICOM - no actual devices in Linux */
[ ARPHRD_IEEE1394 ] = 16 /* FWNET_ALEN */ ,
[ ARPHRD_EUI64 ] = 8 /* EUI64_ADDR_LEN */ ,
[ ARPHRD_INFINIBAND ] = 20 /* INFINIBAND_ALEN */ ,
[ ARPHRD_SLIP ] = 0 ,
/* ARPHRD_CSLIP - no actual devices in Linux */
/* ARPHRD_SLIP6 - no actual devices in Linux */
/* ARPHRD_CSLIP6 - no actual devices in Linux */
/* ARPHRD_RSRVD - no actual devices in Linux */
/* ARPHRD_ADAPT - no actual devices in Linux */
[ ARPHRD_ROSE ] = 5 /* ROSE_ADDR_LEN */ ,
[ ARPHRD_X25 ] = 0 ,
/* ARPHRD_HWX25 - no actual devices in Linux */
[ ARPHRD_CAN ] = 0 ,
[ ARPHRD_PPP ] = 0 ,
/* ARPHRD_CISCO - no actual devices in Linux */
/* ARPHRD_LAPB - no actual devices in Linux */
/* ARPHRD_DDCMP - no actual devices in Linux */
[ ARPHRD_RAWHDLC ] = 0 ,
[ ARPHRD_RAWIP ] = 0 ,
[ ARPHRD_TUNNEL ] = 4 /* IPIP */ ,
[ ARPHRD_TUNNEL6 ] = 16 /* sizeof(struct in6_addr) */ ,
/* ARPHRD_FRAD - no actual devices in Linux */
/* ARPHRD_SKIP - no actual devices in Linux */
[ ARPHRD_LOOPBACK ] = 6 /* ETH_ALEN */ ,
[ ARPHRD_LOCALTLK ] = 1 /* LTALK_ALEN */ ,
[ ARPHRD_FDDI ] = 6 /* FDDI_K_ALEN */ ,
/* ARPHRD_BIF - no actual devices in Linux */
[ ARPHRD_SIT ] = 4 ,
[ ARPHRD_IPDDP ] = 0 ,
[ ARPHRD_IPGRE ] = 4 ,
[ ARPHRD_PIMREG ] = 0 ,
[ ARPHRD_HIPPI ] = 6 /* HIPPI_ALEN */ ,
/* ARPHRD_ASH - no actual devices in Linux */
/* ARPHRD_ECONET - no actual devices in Linux */
[ ARPHRD_IRDA ] = 4 /* LAP_ALEN */ ,
/* ARPHRD_FCPP - no actual devices in Linux */
/* ARPHRD_FCAL - no actual devices in Linux */
/* ARPHRD_FCPL - no actual devices in Linux */
/* ARPHRD_FCFABRIC - no actual devices in Linux */
/* ARPHRD_IEEE802_TR - no actual devices in Linux */
[ ARPHRD_IEEE80211 ] = 6 /* ETH_ALEN */ ,
[ ARPHRD_IEEE80211_PRISM ] = 6 /* ETH_ALEN */ ,
[ ARPHRD_IEEE80211_RADIOTAP ] = 6 /* ETH_ALEN */ ,
[ ARPHRD_IEEE802154 ]
= 8 /* IEEE802154_EXTENDED_ADDR_LEN */ ,
[ ARPHRD_IEEE802154_MONITOR ]
= 8 /* IEEE802154_EXTENDED_ADDR_LEN */ ,
[ ARPHRD_PHONET ] = 1 ,
[ ARPHRD_PHONET_PIPE ] = 1 ,
[ ARPHRD_CAIF ] = 0 ,
[ ARPHRD_IP6GRE ] = 16 /* sizeof(struct in6_addr) */ ,
[ ARPHRD_NETLINK ] = 0 ,
[ ARPHRD_6LOWPAN ] = 8 /* EUI64_ADDR_LEN */
/* ^ or ETH_ALEN, depending on lltype */ ,
[ ARPHRD_VSOCKMON ] = 0 ,
} ;
uint16_t proto = ifr - > ifr_hwaddr . sa_family ;
uint8_t sz = ( proto < ARRAY_SIZE ( hwaddr_sizes ) )
? hwaddr_sizes [ proto ] : 255 ;
2018-05-30 16:26:09 +03:00
PRINT_FIELD_XVAL_SORTED_SIZED ( " ifr_hwaddr={ " , ifr - > ifr_hwaddr ,
sa_family , arp_hardware_types ,
arp_hardware_types_size ,
" ARPHRD_??? " ) ;
2018-05-07 09:34:44 +03:00
PRINT_FIELD_MAC_SZ ( " , " , ifr - > ifr_hwaddr , sa_data ,
MIN ( sizeof ( ifr - > ifr_hwaddr . sa_data ) , sz ) ) ;
tprints ( " } " ) ;
2015-07-04 14:01:08 +03:00
break ;
}
case SIOCSIFFLAGS :
case SIOCGIFFLAGS :
tprints ( " ifr_flags= " ) ;
2016-05-17 01:05:06 +03:00
printflags ( iffflags , ( unsigned short ) ifr - > ifr_flags , " IFF_??? " ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFMETRIC :
case SIOCGIFMETRIC :
tprintf ( " ifr_metric=%d " , ifr - > ifr_metric ) ;
break ;
case SIOCSIFMTU :
case SIOCGIFMTU :
tprintf ( " ifr_mtu=%d " , ifr - > ifr_mtu ) ;
break ;
case SIOCSIFSLAVE :
case SIOCGIFSLAVE :
tprints ( " ifr_slave= " ) ;
print_ifname ( ifr - > ifr_slave ) ;
break ;
case SIOCSIFTXQLEN :
case SIOCGIFTXQLEN :
tprintf ( " ifr_qlen=%d " , ifr - > ifr_qlen ) ;
break ;
case SIOCSIFMAP :
case SIOCGIFMAP :
2016-12-26 17:07:24 +03:00
tprintf ( " ifr_map={mem_start=%# " PRI_klx " , "
" mem_end=%# " PRI_klx " , base_addr=%#x, "
2015-07-04 14:01:08 +03:00
" irq=%u, dma=%u, port=%u} " ,
2016-12-26 17:07:24 +03:00
( kernel_ulong_t ) ifr - > ifr_map . mem_start ,
( kernel_ulong_t ) ifr - > ifr_map . mem_end ,
2015-07-04 14:01:08 +03:00
( unsigned ) ifr - > ifr_map . base_addr ,
( unsigned ) ifr - > ifr_map . irq ,
( unsigned ) ifr - > ifr_map . dma ,
( unsigned ) ifr - > ifr_map . port ) ;
break ;
}
}
2018-09-16 14:44:01 +03:00
DIAG_POP_IGNORE_OVERRIDE_INIT
2015-07-04 14:01:08 +03:00
static unsigned int
print_ifc_len ( int len )
{
2016-12-26 17:07:24 +03:00
const unsigned int n = ( unsigned int ) len / sizeof ( struct_ifreq ) ;
2015-07-04 14:01:08 +03:00
2016-12-26 17:07:24 +03:00
if ( len < 0 | | n * sizeof ( struct_ifreq ) ! = ( unsigned int ) len )
2015-07-04 14:01:08 +03:00
tprintf ( " %d " , len ) ;
else
tprintf ( " %u * sizeof(struct ifreq) " , n ) ;
return n ;
}
2016-12-23 22:53:22 +03:00
static bool
print_ifconf_ifreq ( struct tcb * tcp , void * elem_buf , size_t elem_size ,
void * dummy )
{
2016-12-26 17:07:24 +03:00
struct_ifreq * ifr = elem_buf ;
2016-12-23 22:53:22 +03:00
tprints ( " {ifr_name= " ) ;
print_ifname ( ifr - > ifr_name ) ;
2017-07-09 19:04:24 +03:00
PRINT_FIELD_SOCKADDR ( " , " , * ifr , ifr_addr ) ;
2016-12-23 22:53:22 +03:00
tprints ( " } " ) ;
return true ;
}
/*
* There are two different modes of operation :
*
* - Get buffer size . In this case , the callee sets ifc_buf to NULL ,
* and the kernel returns the buffer size in ifc_len .
* - Get actual data . In this case , the callee specifies the buffer address
* in ifc_buf and its size in ifc_len . The kernel fills the buffer with
* the data , and its amount is returned in ifc_len .
*
* Note that , technically , the whole struct ifconf is overwritten ,
* so ifc_buf could be different on exit , but current ioctl handler
* implementation does not touch it .
*/
2015-07-04 14:01:08 +03:00
static int
2016-12-26 13:26:03 +03:00
decode_ifconf ( struct tcb * const tcp , const kernel_ulong_t addr )
1999-02-19 03:21:36 +03:00
{
2016-12-26 17:07:24 +03:00
struct_ifconf * entering_ifc = NULL ;
struct_ifconf * ifc =
2016-12-23 22:53:22 +03:00
entering ( tcp ) ? malloc ( sizeof ( * ifc ) ) : alloca ( sizeof ( * ifc ) ) ;
2004-07-12 11:13:06 +04:00
2016-12-23 22:53:22 +03:00
if ( exiting ( tcp ) ) {
entering_ifc = get_tcb_priv_data ( tcp ) ;
if ( ! entering_ifc ) {
2018-05-02 21:58:49 +03:00
error_func_msg ( " where is my ifconf? " ) ;
2016-12-23 22:53:22 +03:00
return 0 ;
2004-07-12 11:13:06 +04:00
}
2015-07-04 14:01:08 +03:00
}
2016-12-23 22:53:22 +03:00
if ( ! ifc | | umove ( tcp , addr , ifc ) < 0 ) {
if ( entering ( tcp ) ) {
free ( ifc ) ;
tprints ( " , " ) ;
2015-07-04 14:01:08 +03:00
printaddr ( addr ) ;
2016-12-23 22:53:22 +03:00
} else {
/*
* We failed to fetch the structure on exiting syscall ,
* print whatever was fetched on entering syscall .
*/
if ( ! entering_ifc - > ifc_buf )
print_ifc_len ( entering_ifc - > ifc_len ) ;
1999-02-19 03:21:36 +03:00
2016-12-23 22:53:22 +03:00
tprints ( " , ifc_buf= " ) ;
printaddr ( ptr_to_kulong ( entering_ifc - > ifc_buf ) ) ;
tprints ( " } " ) ;
}
2015-07-04 14:01:08 +03:00
2017-08-28 03:39:15 +03:00
return RVAL_IOCTL_DECODED ;
2015-07-04 14:01:08 +03:00
}
2016-12-23 22:53:22 +03:00
if ( entering ( tcp ) ) {
tprints ( " , {ifc_len= " ) ;
if ( ifc - > ifc_buf )
print_ifc_len ( ifc - > ifc_len ) ;
set_tcb_priv_data ( tcp , ifc , free ) ;
2017-08-27 01:18:27 +03:00
return 0 ;
2015-07-04 14:01:08 +03:00
}
2016-12-23 22:53:22 +03:00
/* exiting */
if ( entering_ifc - > ifc_buf & & ( entering_ifc - > ifc_len ! = ifc - > ifc_len ) )
tprints ( " => " ) ;
if ( ! entering_ifc - > ifc_buf | | ( entering_ifc - > ifc_len ! = ifc - > ifc_len ) )
print_ifc_len ( ifc - > ifc_len ) ;
tprints ( " , ifc_buf= " ) ;
if ( ! entering_ifc - > ifc_buf | | syserror ( tcp ) ) {
printaddr ( ptr_to_kulong ( entering_ifc - > ifc_buf ) ) ;
if ( entering_ifc - > ifc_buf ! = ifc - > ifc_buf ) {
tprints ( " => " ) ;
printaddr ( ptr_to_kulong ( ifc - > ifc_buf ) ) ;
}
} else {
2016-12-26 17:07:24 +03:00
struct_ifreq ifr ;
2016-12-23 22:53:22 +03:00
print_array ( tcp , ptr_to_kulong ( ifc - > ifc_buf ) ,
2016-12-26 17:07:24 +03:00
ifc - > ifc_len / sizeof ( struct_ifreq ) ,
2016-12-23 22:53:22 +03:00
& ifr , sizeof ( ifr ) ,
print_array: enhance printing of unfetchable object addresses
When umoven_func invocation fails to fetch data, it prints the faulty
address. If this happens to a subsequent umoven_func invocation,
the printed address may be undistinguishable from a valid data printed
by print_func, e.g. when the data is printed in a numeric form like
[0x1, 0x2, 0x3, 0xdefaced].
Fix this source of confusion by moving the printing of the faulty
address from umoven_func to print_array itself. This change renames
umoven_func to tfetch_mem_func and changes its semantics, so that
- tfetch_mem_func never prints anything;
- tfetch_mem_func returns true if the fetch succeeded,
and false otherwise.
* defs.h (print_array): Replace umoven_func argument with
tfetch_mem_func.
* util.c (print_array): Replace umoven_func argument with
tfetch_mem_func, document expected tfetch_mem_func return value
semantics. When tfetch_mem_func returns false, print either addr
or "... /* addr */" depending on the context (inside the array or not).
* bpf.c (print_ebpf_prog, print_bpf_prog_info,
BEGIN_BPF_CMD_DECODER(BPF_PROG_QUERY)): Replace umoven_or_printaddr
argument of print_array with tfetch_mem.
* bpf_filter.c (print_bpf_fprog): Likewise.
* btrfs.c (btrfs_print_logical_ino_container,
btrfs_print_ino_path_container, btrfs_print_qgroup_inherit,
btrfs_ioctl): Likewise.
* dm.c (dm_decode_dm_target_deps): Likewise.
* epoll.c (epoll_wait_common): Likewise.
* file_ioctl.c (file_ioctl): Likewise.
* ipc_sem.c (tprint_sembuf_array): Likewise.
* kexec.c (print_kexec_segments): Likewise.
* mem.c (SYS_FUNC(subpage_prot)): Likewise.
* net.c (print_getsockopt): Likewise.
* netlink.c (decode_nlmsgerr_attr_cookie): Likewise.
* netlink_netlink_diag.c (decode_netlink_diag_groups): Likewise.
* netlink_packet_diag.c (decode_packet_diag_mclist): Likewise.
* netlink_unix_diag.c (decode_unix_diag_inode): Likewise.
* nlattr.c (decode_nla_meminfo): Likewise.
* numa.c (print_nodemask, SYS_FUNC(move_pages),
* perf_ioctl.c (perf_ioctl_query_bpf): Likewise.
* poll.c (decode_poll_entering): Likewise.
* printsiginfo.c (print_siginfo_array): Likewise.
* rtnl_tc.c (decode_tca_stab_data): Likewise.
* sock.c (decode_ifconf): Likewise.
* uid.c (print_groups): Likewise.
* io.c (SYS_FUNC(io_submit), SYS_FUNC(io_getevents)): Replace
umoven_or_printaddr argument of print_array with tfetch_mem.
(tprint_iov_upto): Replace umoven_or_printaddr_ignore_syserror
with tfetch_mem_ignore_syserror.
* v4l2.c (print_v4l2_format_fmt): Replace umoven_or_printaddr argument
of print_array with tfetch_mem.
(print_v4l2_ext_controls): Replace umoven_or_printaddr_ignore_syserror
with tfetch_mem_ignore_syserror.
* mmsghdr.c (fetch_struct_mmsghdr_or_printaddr): Rename
to fetch_struct_mmsghdr_for_print, do not print address, return bool.
(decode_mmsgvec): Replace fetch_struct_mmsghdr_or_printaddr
with fetch_struct_mmsghdr_for_print.
* tests/aio.c (main): Update expected output.
* tests/bpf.c (print_BPF_PROG_QUERY_attr5): Likewise.
* tests/ioctl_perf-success.c (main): Likewise.
* tests/ioctl_v4l2.c (main): Update expected output.
* tests/kexec_load.c (main): Likewise.
* tests/mmsg_name.c (test_mmsg_name): Update expected output.
* tests/move_pages.c (print_page_array, print_node_array): Likewise.
* tests/poll.c (print_pollfd_array_entering): Likewise.
* tests/preadv-pwritev.c (main): Likewise.
* tests/preadv2-pwritev2.c (dumpio): Likewise.
* tests/process_vm_readv_writev.c (print_iov): Likewise.
* tests/pwritev.c (print_iovec): Likewise.
* tests/readv.c (main): Likewise.
* tests/seccomp-filter-v.c
* tests/semop.c (main): Likewise.
* tests/set_mempolicy.c (print_nodes): Likewise.
* tests/setgroups.c (main): Likewise.
* tests/test_nlattr.h (print_nlattr) Likewise.
Co-Authored-by: Eugene Syromyatnikov <evgsyr@gmail.com>
2018-05-29 04:15:19 +03:00
tfetch_mem , print_ifconf_ifreq , NULL ) ;
2015-07-04 14:01:08 +03:00
}
2016-12-23 22:53:22 +03:00
tprints ( " } " ) ;
2015-07-04 14:01:08 +03:00
2017-08-28 03:39:15 +03:00
return RVAL_IOCTL_DECODED ;
2015-07-04 14:01:08 +03:00
}
2016-12-26 17:07:24 +03:00
MPERS_PRINTER_DECL ( int , sock_ioctl ,
struct tcb * tcp , const unsigned int code ,
const kernel_ulong_t arg )
2015-07-04 14:01:08 +03:00
{
2016-12-26 17:07:24 +03:00
struct_ifreq ifr ;
2015-07-04 14:01:08 +03:00
1999-02-19 03:21:36 +03:00
switch ( code ) {
2015-07-04 14:01:08 +03:00
case SIOCGIFCONF :
return decode_ifconf ( tcp , arg ) ;
# ifdef SIOCBRADDBR
case SIOCBRADDBR :
case SIOCBRDELBR :
tprints ( " , " ) ;
2016-12-20 19:43:26 +03:00
printstr ( tcp , arg ) ;
2015-07-04 14:01:08 +03:00
break ;
1999-02-19 03:21:36 +03:00
# endif
2015-07-04 14:01:08 +03:00
1999-02-19 03:21:36 +03:00
# ifdef FIOSETOWN
case FIOSETOWN :
# endif
# ifdef SIOCSPGRP
case SIOCSPGRP :
2015-07-04 14:01:08 +03:00
# endif
tprints ( " , " ) ;
printnum_int ( tcp , arg , " %d " ) ;
break ;
# ifdef FIOGETOWN
case FIOGETOWN :
1999-02-19 03:21:36 +03:00
# endif
# ifdef SIOCGPGRP
case SIOCGPGRP :
# endif
# ifdef SIOCATMARK
case SIOCATMARK :
# endif
2015-07-04 14:01:08 +03:00
if ( entering ( tcp ) )
return 0 ;
tprints ( " , " ) ;
printnum_int ( tcp , arg , " %d " ) ;
break ;
# ifdef SIOCBRADDIF
case SIOCBRADDIF :
# endif
# ifdef SIOCBRDELIF
case SIOCBRDELIF :
# endif
/* no arguments */
break ;
2014-10-31 22:36:01 +03:00
case SIOCSIFNAME :
2015-07-04 14:01:08 +03:00
case SIOCSIFADDR :
case SIOCSIFDSTADDR :
case SIOCSIFBRDADDR :
case SIOCSIFNETMASK :
case SIOCSIFFLAGS :
case SIOCSIFMETRIC :
case SIOCSIFMTU :
case SIOCSIFSLAVE :
case SIOCSIFHWADDR :
case SIOCSIFTXQLEN :
case SIOCSIFMAP :
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , arg , & ifr ) )
break ;
tprints ( " {ifr_name= " ) ;
print_ifname ( ifr . ifr_name ) ;
tprints ( " , " ) ;
if ( code = = SIOCSIFNAME ) {
tprints ( " ifr_newname= " ) ;
print_ifname ( ifr . ifr_newname ) ;
} else {
print_ifreq ( tcp , code , arg , & ifr ) ;
}
tprints ( " } " ) ;
break ;
2004-07-12 11:13:06 +04:00
case SIOCGIFNAME :
case SIOCGIFINDEX :
2005-02-02 Roland McGrath <roland@redhat.com>
* sock.c (iffflags): New variable, table of IFF_* values.
(print_addr): New function.
(sock_ioctl): Handle SIOCGIFADDR, SIOCGIFDSTADDR, SIOCGIFBRDADDR,
SIOCGIFNETMASK, SIOCGIFFLAGS, SIOCGIFMETRIC, SIOCGIFMTU, SIOCGIFSLAVE,
SIOCGIFHWADDR. Use print_addr for SIOCGIFCONF, SIOCGIFNAME, and
SIOCGIFINDEX, and fix their output.
From Ulrich Drepper <drepper@redhat.com>.
Fixes RH#138223.
2005-02-02 23:25:17 +03:00
case SIOCGIFADDR :
case SIOCGIFDSTADDR :
case SIOCGIFBRDADDR :
case SIOCGIFNETMASK :
case SIOCGIFFLAGS :
case SIOCGIFMETRIC :
case SIOCGIFMTU :
case SIOCGIFSLAVE :
case SIOCGIFHWADDR :
2007-03-21 16:52:14 +03:00
case SIOCGIFTXQLEN :
2007-03-21 16:57:50 +03:00
case SIOCGIFMAP :
2015-07-04 14:01:08 +03:00
if ( entering ( tcp ) ) {
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , arg , & ifr ) )
break ;
if ( SIOCGIFNAME = = code ) {
tprintf ( " {ifr_index=%d " , ifr . ifr_ifindex ) ;
2014-10-21 16:34:08 +04:00
} else {
2015-07-04 14:01:08 +03:00
tprints ( " {ifr_name= " ) ;
2015-01-24 23:58:23 +03:00
print_ifname ( ifr . ifr_name ) ;
2014-10-21 16:34:08 +04:00
}
2017-08-27 01:18:27 +03:00
return 0 ;
2014-10-21 16:34:08 +04:00
} else {
2015-07-04 14:01:08 +03:00
if ( syserror ( tcp ) ) {
2011-09-01 12:00:28 +04:00
tprints ( " } " ) ;
2005-02-02 Roland McGrath <roland@redhat.com>
* sock.c (iffflags): New variable, table of IFF_* values.
(print_addr): New function.
(sock_ioctl): Handle SIOCGIFADDR, SIOCGIFDSTADDR, SIOCGIFBRDADDR,
SIOCGIFNETMASK, SIOCGIFFLAGS, SIOCGIFMETRIC, SIOCGIFMTU, SIOCGIFSLAVE,
SIOCGIFHWADDR. Use print_addr for SIOCGIFCONF, SIOCGIFNAME, and
SIOCGIFINDEX, and fix their output.
From Ulrich Drepper <drepper@redhat.com>.
Fixes RH#138223.
2005-02-02 23:25:17 +03:00
break ;
}
2009-11-03 17:38:44 +03:00
2015-07-04 14:01:08 +03:00
tprints ( " , " ) ;
if ( umove ( tcp , arg , & ifr ) < 0 ) {
tprints ( " ???} " ) ;
break ;
2009-11-03 17:38:44 +03:00
}
2015-07-04 14:01:08 +03:00
if ( SIOCGIFNAME = = code ) {
tprints ( " ifr_name= " ) ;
print_ifname ( ifr . ifr_name ) ;
} else {
print_ifreq ( tcp , code , arg , & ifr ) ;
2004-07-12 11:13:06 +04:00
}
2011-09-01 12:00:28 +04:00
tprints ( " } " ) ;
2015-07-04 14:01:08 +03:00
break ;
2004-07-12 11:13:06 +04:00
}
2015-07-04 14:01:08 +03:00
1999-02-19 03:21:36 +03:00
default :
2015-07-04 14:01:08 +03:00
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-07-04 14:01:08 +03:00
2017-08-28 03:39:15 +03:00
return RVAL_IOCTL_DECODED ;
1999-02-19 03:21:36 +03:00
}