1999-02-19 00:21:36 +00:00
/*
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
2018-06-14 11:00:00 +00:00
* Copyright ( c ) 1996 - 2018 The strace developers .
1999-02-19 00:21:36 +00:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include "defs.h"
2017-07-09 16:04:24 +00:00
# include "print_fields.h"
2016-12-26 17:07:24 +03:00
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
# include <arpa/inet.h>
# include <linux/socket.h>
# include <linux/if.h>
2016-05-13 20:22:18 +00:00
# if defined ALPHA || defined SH || defined SH64
# include <linux / ioctl.h>
# endif
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
# include <linux/ax25.h>
# include <linux/netrom.h>
# include <linux/rose.h>
# include <linux/route.h>
# include <linux/ipv6_route.h>
2004-07-12 07:13:06 +00:00
# include <linux/sockios.h>
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
# include <linux/x25.h>
2004-07-12 07:13:06 +00:00
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-25 23:30:54 +00: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 20:25:17 +00:00
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
# include "xlat/inet6_route_metrics.h"
# include "xlat/inet6_router_pref.h"
# include "xlat/netrom_route_types.h"
# include "xlat/route_flags.h"
# include "xlat/route_flags_inet6.h"
2018-05-07 08:34:44 +02:00
# define XLAT_MACROS_ONLY
# include "xlat / arp_hardware_types.h"
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
# include "xlat / route_nexthop_flags.h"
# include "xlat / routing_types.h"
2018-05-07 08:34:44 +02:00
# undef XLAT_MACROS_ONLY
2015-01-24 20:58:23 +00:00
static void
print_ifname ( const char * ifname )
{
print_quoted_string ( ifname , IFNAMSIZ + 1 , QUOTE_0_TERMINATED ) ;
}
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 03:03:09 +00: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 16:04:24 +00:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_addr ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFDSTADDR :
case SIOCGIFDSTADDR :
2017-07-09 16:04:24 +00:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_dstaddr ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFBRDADDR :
case SIOCGIFBRDADDR :
2017-07-09 16:04:24 +00:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_broadaddr ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFNETMASK :
case SIOCGIFNETMASK :
2017-07-09 16:04:24 +00:00
PRINT_FIELD_SOCKADDR ( " " , * ifr , ifr_netmask ) ;
2015-07-04 14:01:08 +03:00
break ;
case SIOCSIFHWADDR :
case SIOCGIFHWADDR : {
Add xlat description structure.
Rename struct xlat to struct xlat_data and make struct xlat an xlat descriptor
that contains various information about xlat. So far, it's type and number
of items.
As a result, xlookup/printxval now have enought information for handling
xlat depending on its type, so no *index/*_search APIs are needed.
* xlat.h (struct xlat_data): Rename from struct xlat.
(struct xlat): New type definition.
* xlat.c (xlat_search, printxval_sized, printxval_searchn_ex, xlat_idx,
printxval_indexn_ex, printxval_dispatch_ex, ): Remove.
(xlookup): Handle xlat_data based on xlat type.
(xlookup_le): New function, replaces xlat_search_eq_or_less and supports
all xlat types.
(sprintflags_ex, printflags_ex): Update.
* xlat/gen.sh (gen_header): Add handling for #sorted, generate new
struct xlat descriptor.
* defs.h (arp_hardware_types_size, ethernet_protocols_size,
inet_protocols_size, evdev_abs_size, xlat_search,
xlat_search_eq_or_less, xlat_idx, printxval_searchn_ex,
printxval_searchn, printxval_search, printxval_search_ex,
printxval_indexn_ex, printxval_indexn, printxval_index,
printxval_index_ex, printxval_dispatch_ex, printxval_dispatch): Remove.
(enum xlat_style_private_flag_bits): Remove PAF_INDEX_XLAT_SORTED_BIT
and PAF_INDEX_XLAT_VALUE_INDEXED_BIT.
(enum xlat_style_private_flag): Remove PAF_INDEX_XLAT_SORTED and
PAF_INDEX_XLAT_VALUE_INDEXED.
(print_array_ex): Remove index_xlat_size argument.
(xlookup_le): New declaration.
(printxval_ex): New macro.
* dyxlat.c (struct dyxlat): Remove used field (use xlat.size instead),
embed struct xlat, add pointer to struct xlat_data.
(MARK_END): Remove.
(dyxlat_alloc, dyxlat_free, dyxlat_get, dyxlat_add_pair): Update in
accordance with the structure changes.
* evdev.c (evdev_abs_size): Remove.
(keycode_ioctl): Use printxval instead of printxval_index.
(decode_bitset): Remove.
(decode_bitset_): Rename to decode_bitset, remove decode_nr_size and xt
arguments, call printxval instead of printxval_dispatch.
(bit_ioctl, evdev_read_ioctl): Do not pass xlat type to decode_bitset.
* print_fields.h (PRINT_FIELD_XVAL_SORTED_SIZED,
PRINT_FIELD_XVAL_INDEX): Remove.
* nlattr.h (struct decode_nla_xlat_opts): Remove xlat_size and xt
fields.
* nlattr.c (decode_nla_meminfo): do not pass
PAF_INDEX_XLAT_VALUE_INDEXED flag and netlink_sk_meminfo_indices size
in a print_array_ex call.
(decode_nla_xval): Call printxval_ex instead of printxval_dispatch_ex.
(decode_nla_ether_proto, decode_nla_ip_proto): Do not pass xlat_size and
xt fields in opts.
(decode_nla_flags): Remove XT_INDEXED unsupported warning.
* process.c (struct_user_offsets_data): Rename from
struct_user_offsets, change type to struct xlat_data[], remove XLAT_END.
(struct_user_offsets): New xlat description.
(print_user_offset_addr): Rewrite using xlookup_le.
* util.c (print_array_ex): Remove index_xlat_size argument, simply call
printxval_ex for index printing.
* aio.c (tprint_lio_opcode): Use printxval_ex instead of
printxval_indexn_ex.
* bpf.c: Use printxval instead of printxval_index; use PRINT_FIELD_XVAL
instead of PRINT_FIELD_XVAL_INDEX.
* bpf_filter.c (print_bpf_filter_code): Use printxval instead of
printxval_index.
* ioctl.c (evdev_decode_number): Use printxval instead of
printxval_indexn.
* kvm.c (kvm_ioctl_decode_check_extension): Use printxval instead of
printxval_index.
(kvm_ioctl_run_attach_auxstr): Use xlookup instead of xlat_idx.
* net.c: Use printxval instead of printxval_search/printxval_index, use
printxval_ex instead of printxval_searchn_ex.
* netlink_packet_diag.c (decode_packet_diag_msg): Use PRINT_FIELD_XVAL
instead of PRINT_FIELD_XVAL_SORTED_SIZED.
* netlink_smc_diag.c (decode_smc_diag_shutdown): Remove ARRSZ_PAIR
wrapper.
(decode_smc_diag_fallback): Use printxval_ex instead of
printxval_search_ex.
(decode_smc_diag_msg): Use PRINT_FIELD_XVAL instead of
PRINT_FIELD_XVAL_INDEX.
* print_statfs.c (print_statfs_type): Use printxval instead of
printxval_search.
* rtnl_cachereport.c (decode_nla_ipmra_msg_type,
decode_nla_ip6mra_msg_type): Remove ARRSZ_PAIR wrappers, xt fields.
* rtnl_link.c (decode_ifla_inet6_flags, decode_ifla_inet6_agm):
Likewise.
(decode_nla_tun_type, decode_ifla_xdp_attached): Remove xlat_size,
xt fields.
(decode_ifla_inet_conf, decode_ifla_inet6_conf, decode_ifla_inet6_stats,
decode_ifla_inet6_icmp6_stats): Remove PAF_INDEX_XLAT_VALUE_INDEXED flag
and ARRSZ_PAIR wrapper in print_array_ex calls.
(decode_ifinfomsg): Use PRINT_FIELD_XVAL instead of
PRINT_FIELD_XVAL_SORTED_SIZED.
* rtnl_route.c (decode_nla_rt_proto): Use printxval instead of
printxval_search.
* sock.c (print_ifreq): Use PRINT_FIELD_XVAL instead of
PRINT_FIELD_XVAL_SORTED_SIZED.
* sockaddr.c (print_sockaddr_data_ll, print_sockaddr_data_bt,
print_sockaddr): Use printxval instead of printxval_search and
printxval_index.
* time.c (getitimer, osf_getitimer, setitimer, printclockname): Use
printxval instead of printxval_index.
(do_adjtimex): Use xlookup instead of xlat_idx.
* v4l2.c (print_v4l2_cid): Use xlookup instead of xlat_search.
(print_v4l2_cid): Use xlookup_le instead of xlat_search_eq_or_less.
* tests/btrfs.c: Update xlat handling, use struct xlat_data instead of
struct xlat for XLAT() arrays.
* tests/ioctl_block.c: Likewise.
* tests/ioctl_rtc.c: Likewise.
* tests/printflags.c: Likewise.
* tests/printxval.c: Likewise.
* tests/prlimit64.c: Likewise.
* tests/setrlimit.c: Likewise.
* tests/socketcall.c: Likewise.
* tests/xgetrlimit.c: Likewise.
* tests/xstatfsx.c: Likewise.
* xlat/af_packet_versions.in: Add #value_indexed.
* xlat/arp_hardware_types.in: Add #sorted.
* xlat/ax25_protocols.in: Likewise.
* xlat/bluetooth_l2_cid.in: Likewise.
* xlat/bluetooth_l2_psm.in: Likewise.
* xlat/ethernet_protocols.in: Likewise.
* xlat/evdev_ff_types.in: Likewise.
* xlat/fsmagic.in: Likewise.
* xlat/hw_breakpoint_type.in: Likewise.
* xlat/iffflags.in: Likewise.
* xlat/inet6_if_flags.in: Likewise.
* xlat/inet_protocols.in: Likewise.
* xlat/msgctl_flags.in: Likewise.
* xlat/perf_hw_cache_id.in: Likewise.
* xlat/perf_hw_cache_op_id.in: Likewise.
* xlat/perf_hw_cache_op_result_id.in: Likewise.
* xlat/perf_hw_id.in: Likewise.
* xlat/perf_sw_ids.in: Likewise.
* xlat/perf_type_id.in: Likewise.
* xlat/routing_protocols.in: Likewise.
* xlat/semctl_flags.in: Likewise.
* xlat/shmctl_flags.in: Likewise.
* xlat/smc_decl_codes.in: Likewise.
* xlat/sock_ax25_options.in: Likewise.
* xlat/sock_bluetooth_options.in: Likewise.
* xlat/sock_dccp_options.in: Likewise.
* xlat/sock_tipc_options.in: Likewise.
* xlat/socketlayers.in: Likewise.
* xlat/v4l2_control_classes.in: Likewise.
* xlat/v4l2_pix_fmts.in: Likewise.
* xlat/v4l2_sdr_fmts.in: Likewise.
2018-08-31 13:32:15 +02:00
PRINT_FIELD_XVAL ( " ifr_hwaddr={ " , ifr - > ifr_hwaddr , sa_family ,
arp_hardware_types , " ARPHRD_??? " ) ;
2018-08-31 06:00:29 +02:00
PRINT_FIELD_HWADDR_SZ ( " , " , ifr - > ifr_hwaddr , sa_data ,
sizeof ( ifr - > ifr_hwaddr . sa_data ) ,
ifr - > ifr_hwaddr . sa_family ) ;
2018-05-07 08:34:44 +02:00
tprints ( " } " ) ;
2015-07-04 14:01:08 +03:00
break ;
}
case SIOCSIFFLAGS :
case SIOCGIFFLAGS :
tprints ( " ifr_flags= " ) ;
2016-05-16 22:05:06 +00: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 ;
}
}
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 16:04:24 +00: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 10:26:03 +00:00
decode_ifconf ( struct tcb * const tcp , const kernel_ulong_t addr )
1999-02-19 00:21:36 +00: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 07:13:06 +00: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 20:58:49 +02:00
error_func_msg ( " where is my ifconf? " ) ;
2016-12-23 22:53:22 +03:00
return 0 ;
2004-07-12 07:13:06 +00: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 00:21:36 +00: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 00:39:15 +00: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 00:18:27 +02: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 01:15:19 +00: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 00:39:15 +00:00
return RVAL_IOCTL_DECODED ;
2015-07-04 14:01:08 +03:00
}
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
static void
decode_rtentry ( struct tcb * tcp , kernel_ulong_t arg )
{
struct rtentry e ;
if ( umove_or_printaddr ( tcp , arg , & e ) )
return ;
tprints ( " { " ) ;
if ( e . rt_pad1 ) {
PRINT_FIELD_X ( " " , e , rt_pad1 ) ;
tprints ( " , " ) ;
}
PRINT_FIELD_SOCKADDR ( " " , e , rt_dst ) ;
PRINT_FIELD_SOCKADDR ( " , " , e , rt_gateway ) ;
PRINT_FIELD_SOCKADDR ( " , " , e , rt_genmask ) ;
PRINT_FIELD_FLAGS ( " , " , e , rt_flags , route_flags , " RTF_??? " ) ;
if ( e . rt_pad2 )
PRINT_FIELD_X ( " , " , e , rt_pad2 ) ;
if ( e . rt_pad3 )
PRINT_FIELD_X ( " , " , e , rt_pad3 ) ;
if ( e . rt_pad4 ) {
tprintf ( " , rt_pad4= " ) ;
printaddr ( ( uintptr_t ) e . rt_pad4 ) ;
}
PRINT_FIELD_U ( " , " , e , rt_metric ) ;
tprints ( " , rt_dev= " ) ;
printstr_ex ( tcp , ( uintptr_t ) e . rt_dev , IFNAMSIZ , QUOTE_0_TERMINATED ) ;
PRINT_FIELD_U ( " , " , e , rt_mtu ) ;
PRINT_FIELD_U ( " , " , e , rt_window ) ;
PRINT_FIELD_U ( " , " , e , rt_irtt ) ;
tprints ( " } " ) ;
}
static void
print_digipeaters ( uint32_t val , const char * dps_name , ax25_address * dps ,
size_t dps_sz )
{
if ( ! val )
return ;
size_t cnt = MIN ( val , dps_sz ) ;
tprintf ( " %s=[ " , dps_name ) ;
for ( size_t i = 0 ; i < cnt ; i + + ) {
if ( i )
tprints ( " , " ) ;
print_ax25_addr ( dps + i ) ;
}
tprints ( " ] " ) ;
}
static void
decode_ax25_routes_struct ( struct tcb * tcp , kernel_ulong_t arg )
{
struct ax25_routes_struct e ;
if ( umove_or_printaddr ( tcp , arg , & e ) )
return ;
PRINT_FIELD_AX25_ADDR ( " { " , e , port_addr ) ;
PRINT_FIELD_AX25_ADDR ( " , " , e , dest_addr ) ;
PRINT_FIELD_U ( " , " , e , digi_count ) ;
print_digipeaters ( e . digi_count , " digi_addr " , ARRSZ_PAIR ( e . digi_addr ) ) ;
tprints ( " } " ) ;
}
static void
decode_nr_route_struct ( struct tcb * tcp , kernel_ulong_t arg )
{
struct nr_route_struct e ;
if ( umove_or_printaddr ( tcp , arg , & e ) )
return ;
PRINT_FIELD_XVAL ( " { " , e , type , netrom_route_types , " NETROM_??? " ) ;
PRINT_FIELD_AX25_ADDR ( " , " , e , callsign ) ;
PRINT_FIELD_CSTRING ( " , " , e , device ) ;
PRINT_FIELD_U ( " , " , e , quality ) ;
PRINT_FIELD_CSTRING ( " , " , e , mnemonic ) ;
PRINT_FIELD_AX25_ADDR ( " , " , e , neighbour ) ;
PRINT_FIELD_U ( " , " , e , obs_count ) ;
PRINT_FIELD_U ( " , " , e , ndigis ) ;
print_digipeaters ( e . ndigis , " digipeaters " , ARRSZ_PAIR ( e . digipeaters ) ) ;
tprints ( " } " ) ;
}
static void
decode_x25_route_struct ( struct tcb * tcp , kernel_ulong_t arg )
{
struct x25_route_struct e ;
if ( umove_or_printaddr ( tcp , arg , & e ) )
return ;
PRINT_FIELD_X25_ADDR ( " { " , e , address ) ;
PRINT_FIELD_U ( " , " , e , sigdigits ) ;
PRINT_FIELD_CSTRING ( " , " , e , device ) ;
tprints ( " } " ) ;
}
static void
print_inet6_route_pref ( uint8_t pref )
{
if ( xlat_verbose ( xlat_verbosity ) ! = XLAT_STYLE_ABBREV )
tprintf ( " %#x " , pref < < 27 ) ;
if ( xlat_verbose ( xlat_verbosity ) = = XLAT_STYLE_RAW )
return ;
if ( xlat_verbose ( xlat_verbosity ) = = XLAT_STYLE_VERBOSE )
tprints ( " /* " ) ;
tprints ( " RTF_PREF( " ) ;
printxval ( inet6_router_pref , pref , " ICMPV6_ROUTER_PREF_??? " ) ;
tprints ( " ) " ) ;
if ( xlat_verbose ( xlat_verbosity ) = = XLAT_STYLE_VERBOSE )
tprints ( " */ " ) ;
}
static void
decode_in6_rtmsg ( struct tcb * tcp , kernel_ulong_t arg )
{
struct in6_rtmsg e ;
if ( umove_or_printaddr ( tcp , arg , & e ) )
return ;
PRINT_FIELD_INET6_ADDR ( " { " , e , rtmsg_dst ) ;
PRINT_FIELD_INET6_ADDR ( " , " , e , rtmsg_src ) ;
PRINT_FIELD_INET6_ADDR ( " , " , e , rtmsg_gateway ) ;
PRINT_FIELD_XVAL ( " , " , e , rtmsg_type , routing_types , " RTN_??? " ) ;
PRINT_FIELD_U ( " , " , e , rtmsg_dst_len ) ;
PRINT_FIELD_U ( " , " , e , rtmsg_src_len ) ;
PRINT_FIELD_XVAL ( " , " , e , rtmsg_metric , inet6_route_metrics ,
" IP6_RT_PRIO_??? " ) ;
PRINT_FIELD_U ( " , " , e , rtmsg_info ) ;
uint32_t pref = ( e . rtmsg_flags > > 27 ) & 0x3 ;
uint32_t flags = e . rtmsg_flags & ~ ( 0x3 < < 27 ) ;
tprints ( " , rtmsg_flags= " ) ;
print_inet6_route_pref ( pref ) ;
if ( flags ) {
tprints ( " | " ) ;
printflags_ex ( flags , " RTF_??? " , XLAT_STYLE_DEFAULT ,
route_nexthop_flags , route_flags_inet6 , NULL ) ;
}
PRINT_FIELD_IFINDEX ( " , " , e , rtmsg_ifindex ) ;
tprints ( " } " ) ;
}
static void
decode_rose_route_struct ( struct tcb * tcp , kernel_ulong_t arg )
{
struct rose_route_struct e ;
if ( umove_or_printaddr ( tcp , arg , & e ) )
return ;
PRINT_FIELD_ROSE_ADDR ( " { " , e , address ) ;
PRINT_FIELD_U ( " , " , e , mask ) ;
PRINT_FIELD_AX25_ADDR ( " { " , e , neighbour ) ;
PRINT_FIELD_CSTRING ( " , " , e , device ) ;
PRINT_FIELD_U ( " , " , e , ndigis ) ;
print_digipeaters ( e . ndigis , " digipeaters " , ARRSZ_PAIR ( e . digipeaters ) ) ;
tprints ( " } " ) ;
}
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 00:21:36 +00: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 16:43:26 +00:00
printstr ( tcp , arg ) ;
2015-07-04 14:01:08 +03:00
break ;
1999-02-19 00:21:36 +00:00
# endif
2015-07-04 14:01:08 +03:00
1999-02-19 00:21:36 +00: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 00:21:36 +00: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 19:36:01 +00: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 07:13:06 +00: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 20:25:17 +00:00
case SIOCGIFADDR :
case SIOCGIFDSTADDR :
case SIOCGIFBRDADDR :
case SIOCGIFNETMASK :
case SIOCGIFFLAGS :
case SIOCGIFMETRIC :
case SIOCGIFMTU :
case SIOCGIFSLAVE :
case SIOCGIFHWADDR :
2007-03-21 13:52:14 +00:00
case SIOCGIFTXQLEN :
2007-03-21 13:57:50 +00: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 08:34:08 -04:00
} else {
2015-07-04 14:01:08 +03:00
tprints ( " {ifr_name= " ) ;
2015-01-24 20:58:23 +00:00
print_ifname ( ifr . ifr_name ) ;
2014-10-21 08:34:08 -04:00
}
2017-08-27 00:18:27 +02:00
return 0 ;
2014-10-21 08:34:08 -04:00
} else {
2015-07-04 14:01:08 +03:00
if ( syserror ( tcp ) ) {
2011-09-01 10:00:28 +02: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 20:25:17 +00:00
break ;
}
2009-11-03 14:38:44 +00:00
2015-07-04 14:01:08 +03:00
tprints ( " , " ) ;
if ( umove ( tcp , arg , & ifr ) < 0 ) {
tprints ( " ???} " ) ;
break ;
2009-11-03 14:38:44 +00: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 07:13:06 +00:00
}
2011-09-01 10:00:28 +02:00
tprints ( " } " ) ;
2015-07-04 14:01:08 +03:00
break ;
2004-07-12 07:13:06 +00:00
}
2015-07-04 14:01:08 +03:00
sock: decode SIOCADDRT and SIOCDELRT commands
Those are a bit tricky, as their arguments depends on socket's address
family. So far, it's implemented for AF_INET, AF_AX25, AF_APPLETALK,
AF_NETROM, AF_X25, AF_INET6, AF_ROSE, and AF_PACKET.
* xlat/inet6_route_metrics.in: New file.
* xlat/inet6_router_pref.in: Likewise.
* xlat/netrom_route_types.in: Likewise.
* xlat/route_flags.in: Likewise.
* defs.h (route_nexthop_flags): New xlat declaration.
(sock_proto): Add SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM,
SOCK_PROTO_PACKET, SOCK_PROTO_ROSE, SOCK_PROTO_X25.
* print_fields.h (PRINT_FIELD_INET6_ADDR): New macro.
* sock.c: Include <linux/ax25.h>, <linux/in_route.h>,
<linux/ipv6_route.h>, <linux/netrom.h>, <linux/rose.h>, <linux/route.h>,
<linux/x25.h>, "xlat/inet6_route_metrics.h", "xlat/inet6_router_pref.h",
"xlat/netrom_route_types.h", "xlat/route_flags.h",
"xlat/route_flags_inet6.h", "xlat/route_nexthop_flags.h",
"xlat/routing_types.h".
(decode_rtentry, print_digipeaters, decode_ax25_routes_struct,
decode_nr_route_struct, decode_x25_route_struct, print_inet6_route_pref,
decode_in6_rtmsg, decode_rose_route_struct): New function.
(sock_ioctl): Handle SIOCADDRT and SIOCDELRT.
* socketutils.c (protocols): Add address family information for
SOCK_PROTO_AX25, SOCK_PROTO_DDP, SOCK_PROTO_NETROM, SOCK_PROTO_PACKET,
SOCK_PROTO_ROSE, and SOCK_PROTO_X25.
Co-Authored-by; Olga Feiermann <charmik@users.sourceforge.net>
Closes: https://github.com/strace/strace/issues/41
2018-08-27 12:52:53 +02:00
/*
* These two depend on the network protocol of the fd they ' re called .
* Unfortunately , we can ' t get it right away , so we should derive from
* the socket protocol .
*/
case SIOCADDRT :
case SIOCDELRT : {
typedef void ( * handler ) ( struct tcb * tcp , kernel_ulong_t addr ) ;
static const handler handlers [ ] = {
[ AF_INET ] = decode_rtentry ,
[ AF_AX25 ] = decode_ax25_routes_struct ,
/* packet_ioctl explicitly calls inet_dgram_ops.ioctl */
[ AF_APPLETALK ] = decode_rtentry ,
[ AF_NETROM ] = decode_nr_route_struct ,
[ AF_X25 ] = decode_x25_route_struct ,
[ AF_INET6 ] = decode_in6_rtmsg ,
[ AF_ROSE ] = decode_rose_route_struct ,
[ AF_PACKET ] = decode_rtentry ,
} ;
enum sock_proto proto = getfdproto ( tcp , tcp - > u_arg [ 0 ] ) ;
uint32_t family = MAX ( get_family_by_proto ( proto ) , 0 ) ;
if ( family < ARRAY_SIZE ( handlers ) & & handlers [ family ] ) {
handlers [ family ] ( tcp , arg ) ;
break ;
}
return RVAL_DECODED ;
}
1999-02-19 00:21:36 +00:00
default :
2015-07-04 14:01:08 +03:00
return RVAL_DECODED ;
1999-02-19 00:21:36 +00:00
}
2015-07-04 14:01:08 +03:00
2017-08-28 00:39:15 +00:00
return RVAL_IOCTL_DECODED ;
1999-02-19 00:21:36 +00:00
}