Netdev List
 help / color / mirror / Atom feed
* [PATCH iproute2-next 0/7] cleanup help and exit codes
@ 2026-08-07 15:42 Stephen Hemminger
  2026-08-07 15:42 ` [PATCH iproute2-next 1/7] ip: follow Linux convention for help vs usage Stephen Hemminger
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Stephen Hemminger @ 2026-08-07 15:42 UTC (permalink / raw)
  To: netdev; +Cc: dsahern, Stephen Hemminger

This series cleans up how iproute2 commands handle help
and syntax errors. Before, ip help command and usage
errors both output to stderr and had non-zero exit code.
Now help outputs to stdout and exits with 0.

Since help and usage errors should not happen when
iproute2 commands are scripted this should have little impact
on users. There is no POSIX or other official standard for this;
the design choices here follow the precedent in coreutils, etc.

Initial conversion was done by hand, but after that the same pattern
was applied across all utilities with the aid of the "mechanical turk"
(ie. Claude Opus).

Before:
$ ip help 2>/dev/null; echo $? # text is on stderr
255

After:
$ ip help >/dev/null; echo $? # text is on stdout
0

Usage output is unchanged:
$ ip bogus 2>/dev/null; echo $?
1


Note: a help command inside a batch file still exits
immediately and following commands are not executed.

Example:
$ printf "help\nlink\n" | ./ip/ip -batch - ; echo $?
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
...
0

Stephen Hemminger (7):
  ip: follow Linux convention for help vs usage
  ip/routel: follow help vs usage convention
  misc: put help to stdout and usage to stderr
  netshaper: put help to stdout and usage to stderr
  bridge: put help to stdout and usage to stderr
  genl: put help to stdout and usage to stderr
  tc: put help to stdout and usage to stderr

 bridge/bridge.c       | 20 ++++++++++----------
 bridge/fdb.c          | 18 +++++++++---------
 bridge/link.c         | 16 +++++++++++-----
 bridge/mdb.c          | 14 +++++++-------
 bridge/monitor.c      | 11 ++++++-----
 bridge/mst.c          | 10 +++++-----
 bridge/vlan.c         | 10 +++++-----
 bridge/vni.c          | 10 +++++-----
 genl/genl.c           | 14 ++++++++------
 ip/ip.c               | 15 ++++++++-------
 ip/ip6tunnel.c        | 12 ++++++------
 ip/ip_common.h        |  4 ++--
 ip/ipaddress.c        | 18 +++++++++---------
 ip/ipaddrlabel.c      | 10 +++++-----
 ip/ipfou.c            | 12 ++++++------
 ip/ipila.c            | 12 ++++++------
 ip/ipioam6.c          | 13 ++++++++-----
 ip/ipl2tp.c           | 21 ++++++++++++---------
 ip/iplink.c           | 40 ++++++++++++++++++++-------------------
 ip/iplink_amt.c       | 15 +++++----------
 ip/iplink_can.c       | 11 +++--------
 ip/iplink_dsa.c       |  4 ++--
 ip/iplink_hsr.c       | 11 +++--------
 ip/iplink_vxcan.c     | 11 +++--------
 ip/ipmacsec.c         | 32 +++++++++++++++----------------
 ip/ipmaddr.c          | 14 +++++++-------
 ip/ipmonitor.c        | 10 +++++-----
 ip/ipmptcp.c          | 10 +++++-----
 ip/ipmroute.c         | 14 +++++++-------
 ip/ipneigh.c          | 18 +++++++++---------
 ip/ipnetconf.c        | 10 +++++-----
 ip/ipnetns.c          | 10 +++++-----
 ip/ipnexthop.c        | 26 ++++++++++++-------------
 ip/ipntable.c         | 10 +++++-----
 ip/iproute.c          | 20 ++++++++++----------
 ip/iproute_lwtunnel.c | 33 +++++++++++++++++---------------
 ip/iprule.c           | 12 ++++++------
 ip/ipseg6.c           | 13 ++++++++-----
 ip/iptoken.c          | 13 +++++++------
 ip/iptunnel.c         | 12 ++++++------
 ip/iptuntap.c         | 12 ++++++------
 ip/ipvrf.c            | 10 +++++-----
 ip/ipxfrm.c           | 14 +++++++-------
 ip/link_veth.c        | 14 +++++---------
 ip/routel             | 11 ++++++-----
 ip/rtmon.c            | 10 +++++-----
 ip/tcp_metrics.c      | 12 ++++++------
 ip/xfrm_monitor.c     | 10 +++++-----
 ip/xfrm_policy.c      | 16 +++++++++-------
 ip/xfrm_state.c       | 26 +++++++++++++------------
 misc/arpd.c           | 12 +++++++-----
 misc/ifstat.c         | 44 +++++++++++++++++++++----------------------
 misc/nstat.c          | 11 ++++++-----
 misc/rtacct.c         | 13 ++++++-------
 netshaper/netshaper.c | 31 +++++++++++++++---------------
 tc/e_bpf.c            | 15 ++++++++++-----
 tc/f_basic.c          | 12 +++++++-----
 tc/f_bpf.c            | 12 +++++++-----
 tc/f_cgroup.c         | 16 ++++++++++------
 tc/f_flow.c           | 12 +++++++-----
 tc/f_flower.c         | 13 +++++++++----
 tc/f_fw.c             | 12 +++++++-----
 tc/f_matchall.c       | 12 +++++++-----
 tc/f_route.c          | 12 +++++++-----
 tc/f_u32.c            | 12 +++++++-----
 tc/m_action.c         | 23 ++++++++++------------
 tc/m_bpf.c            | 10 ++++++----
 tc/m_connmark.c       | 16 +++++++++-------
 tc/m_csum.c           | 18 ++++++++++--------
 tc/m_ct.c             | 12 +++++++-----
 tc/m_ctinfo.c         | 16 +++++++++-------
 tc/m_estimator.c      | 12 +++++++-----
 tc/m_gact.c           | 27 +++++++++++++++-----------
 tc/m_gate.c           | 14 ++++++++------
 tc/m_ife.c            | 16 +++++++++-------
 tc/m_mirred.c         | 14 ++++++++------
 tc/m_mpls.c           | 16 +++++++++-------
 tc/m_nat.c            | 22 +++++++++++++---------
 tc/m_pedit.c          | 22 ++++++++++++----------
 tc/m_police.c         | 10 ++++++----
 tc/m_sample.c         | 24 ++++++++++++-----------
 tc/m_simple.c         | 16 +++++++++-------
 tc/m_skbedit.c        | 17 ++++++++++-------
 tc/m_skbmod.c         | 16 +++++++++-------
 tc/m_tunnel_key.c     | 20 +++++++++++---------
 tc/m_vlan.c           | 24 ++++++++++++-----------
 tc/q_cake.c           | 12 +++++++-----
 tc/q_cbs.c            | 12 +++++++-----
 tc/q_choke.c          | 12 +++++++-----
 tc/q_clsact.c         | 14 ++++++++++----
 tc/q_codel.c          | 12 +++++++-----
 tc/q_drr.c            | 24 +++++++++++++----------
 tc/q_dualpi2.c        | 38 ++++++++++++++++++++-----------------
 tc/q_etf.c            | 12 +++++++-----
 tc/q_ets.c            | 29 ++++++++++++++++------------
 tc/q_fifo.c           | 13 ++++++++-----
 tc/q_fq.c             | 12 +++++++-----
 tc/q_fq_codel.c       | 12 +++++++-----
 tc/q_fq_pie.c         | 12 +++++++-----
 tc/q_gred.c           | 19 ++++++++++---------
 tc/q_hfsc.c           | 28 +++++++++++++++------------
 tc/q_hhf.c            | 12 +++++++-----
 tc/q_htb.c            | 19 ++++++++++++-------
 tc/q_ingress.c        | 14 ++++++++++----
 tc/q_mqprio.c         | 10 ++++++----
 tc/q_multiq.c         | 12 +++++++-----
 tc/q_netem.c          | 21 +++++++++++++--------
 tc/q_pie.c            | 12 +++++++-----
 tc/q_plug.c           | 13 ++++++++-----
 tc/q_prio.c           | 15 +++++++++------
 tc/q_qfq.c            | 26 ++++++++++++++++---------
 tc/q_red.c            | 12 +++++++-----
 tc/q_sfb.c            | 14 ++++++++++----
 tc/q_sfq.c            | 12 +++++++-----
 tc/q_skbprio.c        | 13 ++++++++-----
 tc/q_taprio.c         | 10 ++++++----
 tc/q_tbf.c            | 14 ++++++++------
 tc/tc.c               | 12 ++++++------
 tc/tc_class.c         | 20 ++++++++++++--------
 tc/tc_exec.c          |  6 +++---
 tc/tc_filter.c        | 31 +++++++++++++++++-------------
 tc/tc_monitor.c       | 11 ++++++-----
 tc/tc_qdisc.c         | 14 +++++++-------
 tc/tc_stab.c          | 13 +++++++------
 124 files changed, 1057 insertions(+), 868 deletions(-)

-- 
2.53.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-08-07 15:43 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-07 15:42 [PATCH iproute2-next 0/7] cleanup help and exit codes Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 1/7] ip: follow Linux convention for help vs usage Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 2/7] ip/routel: follow help vs usage convention Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 3/7] misc: put help to stdout and usage to stderr Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 4/7] netshaper: " Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 5/7] bridge: " Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 6/7] genl: " Stephen Hemminger
2026-08-07 15:42 ` [PATCH iproute2-next 7/7] tc: " Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox