Netdev List
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: netdev@vger.kernel.org
Cc: dsahern@gmail.com, Stephen Hemminger <stephen@networkplumber.org>
Subject: [PATCH iproute2-next 0/7] cleanup help and exit codes
Date: Fri,  7 Aug 2026 08:42:23 -0700	[thread overview]
Message-ID: <20260807154306.111200-1-stephen@networkplumber.org> (raw)

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


             reply	other threads:[~2026-08-07 15:43 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-07 15:42 Stephen Hemminger [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260807154306.111200-1-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=dsahern@gmail.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox