From 2cd59df4430d14618727b407136ec44a02af400a Mon Sep 17 00:00:00 2001 From: Fabian Dellwing Date: Mon, 1 May 2023 20:14:22 +0200 Subject: [PATCH] netstat: Add -e argument This adds information about the user owning the process to our netstat output. We do not fully match the behaviour of Linux as we don't show an inode information. --- Base/usr/share/man/man1/netstat.md | 3 ++- Userland/Utilities/netstat.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Base/usr/share/man/man1/netstat.md b/Base/usr/share/man/man1/netstat.md index 9cd1b503ab..b07fb367fa 100644 --- a/Base/usr/share/man/man1/netstat.md +++ b/Base/usr/share/man/man1/netstat.md @@ -5,7 +5,7 @@ netstat ## Synopsis ```sh -$ netstat [--all] [--list] [--tcp] [--udp] [--numeric] [--program] [--wide] +$ netstat [--all] [--list] [--tcp] [--udp] [--numeric] [--program] [--wide] [--extend] ``` ## Description @@ -21,5 +21,6 @@ Display network connections * `-n`, `--numeric`: Display numerical addresses * `-p`, `--program`: Show the PID and name of the program to which each socket belongs * `-W`, `--wide`: Do not truncate IP addresses by printing out the whole symbolic host +* `-e`, `--extend`: Display more information diff --git a/Userland/Utilities/netstat.cpp b/Userland/Utilities/netstat.cpp index a93677c407..71427757a5 100644 --- a/Userland/Utilities/netstat.cpp +++ b/Userland/Utilities/netstat.cpp @@ -32,6 +32,7 @@ ErrorOr serenity_main(Main::Arguments arguments) bool flag_numeric = false; bool flag_program = false; bool flag_wide = false; + bool flag_extend = false; Core::ArgsParser args_parser; args_parser.set_general_help("Display network connections"); @@ -42,6 +43,7 @@ ErrorOr serenity_main(Main::Arguments arguments) args_parser.add_option(flag_numeric, "Display numerical addresses", "numeric", 'n'); args_parser.add_option(flag_program, "Show the PID and name of the program to which each socket belongs", "program", 'p'); args_parser.add_option(flag_wide, "Do not truncate IP addresses by printing out the whole symbolic host", "wide", 'W'); + args_parser.add_option(flag_extend, "Display more information", "extend", 'e'); args_parser.parse(arguments); TRY(Core::System::unveil("/sys/kernel/net", "r")); @@ -87,6 +89,7 @@ ErrorOr serenity_main(Main::Arguments arguments) int local_address_column = -1; int peer_address_column = -1; int state_column = -1; + int user_column = -1; int program_column = -1; auto add_column = [&](auto title, auto alignment, auto width) { @@ -100,6 +103,7 @@ ErrorOr serenity_main(Main::Arguments arguments) local_address_column = add_column("Local Address", Alignment::Left, 22); peer_address_column = add_column("Peer Address", Alignment::Left, 22); state_column = add_column("State", Alignment::Left, 11); + user_column = flag_extend ? add_column("User", Alignment::Left, 4) : -1; program_column = flag_program ? add_column("PID/Program", Alignment::Left, 11) : -1; auto print_column = [](auto& column, auto& string) { @@ -132,6 +136,13 @@ ErrorOr serenity_main(Main::Arguments arguments) return DeprecatedString::formatted("{}/{}", pid, program.value()); }; + auto get_formatted_user = [&](i32 uid) -> ErrorOr { + if (uid == -1) + return String::from_utf8_short_string("-"sv); + + return String::number(uid); + }; + if (!has_protocol_flag || flag_tcp || flag_udp) { if (flag_program && current_uid != 0) { outln("(Some processes could not be identified, non-owned process info will not be shown)"); @@ -219,6 +230,7 @@ ErrorOr serenity_main(Main::Arguments arguments) } auto state = if_object.get_deprecated_string("state"sv).value_or({}); + auto origin_uid = if_object.get_i32("origin_uid"sv).value_or(-1); auto origin_pid = (if_object.has("origin_pid"sv)) ? if_object.get_u32("origin_pid"sv).value_or(0) : -1; if (!flag_all && ((state == "Listen" && !flag_list) || (state != "Listen" && flag_list))) @@ -236,6 +248,8 @@ ErrorOr serenity_main(Main::Arguments arguments) columns[peer_address_column].buffer = get_formatted_address(peer_address, peer_port); if (state_column != -1) columns[state_column].buffer = state; + if (flag_extend && user_column != -1) + columns[user_column].buffer = TRY(get_formatted_user(origin_uid)).to_deprecated_string(); if (flag_program && program_column != -1) columns[program_column].buffer = get_formatted_program(origin_pid); @@ -303,6 +317,7 @@ ErrorOr serenity_main(Main::Arguments arguments) } auto origin_pid = (if_object.has("origin_pid"sv)) ? if_object.get_u32("origin_pid"sv).value_or(0) : -1; + auto origin_uid = if_object.get_i32("origin_uid"sv).value_or(-1); if (protocol_column != -1) columns[protocol_column].buffer = "udp"; @@ -316,6 +331,8 @@ ErrorOr serenity_main(Main::Arguments arguments) columns[peer_address_column].buffer = get_formatted_address(peer_address, peer_port); if (state_column != -1) columns[state_column].buffer = "-"; + if (flag_extend && user_column != -1) + columns[user_column].buffer = TRY(get_formatted_user(origin_uid)).to_deprecated_string(); if (flag_program && program_column != -1) columns[program_column].buffer = get_formatted_program(origin_pid);