mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 12:28:12 +00:00
netstat: Resolve ports to service names
This commit is contained in:
parent
64564a54d4
commit
fd6d87df82
2 changed files with 47 additions and 1 deletions
|
@ -5,7 +5,7 @@ netstat
|
||||||
## Synopsis
|
## Synopsis
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ netstat [--all] [--list] [--tcp] [--udp] [--program]
|
$ netstat [--all] [--list] [--tcp] [--udp] [--numeric] [--program]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
@ -21,6 +21,7 @@ Display network connections
|
||||||
* `-l`, `--list`: Display only listening sockets
|
* `-l`, `--list`: Display only listening sockets
|
||||||
* `-t`, `--tcp`: Display only TCP network connections
|
* `-t`, `--tcp`: Display only TCP network connections
|
||||||
* `-u`, `--udp`: Display only UDP network connections
|
* `-u`, `--udp`: Display only UDP network connections
|
||||||
|
* `-n`, `--numeric`: Display numerical addresses
|
||||||
* `-p`, `--program`: Show the PID and name of the program to which each socket belongs
|
* `-p`, `--program`: Show the PID and name of the program to which each socket belongs
|
||||||
|
|
||||||
<!-- Auto-generated through ArgsParser -->
|
<!-- Auto-generated through ArgsParser -->
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include <LibCore/ProcessStatisticsReader.h>
|
#include <LibCore/ProcessStatisticsReader.h>
|
||||||
#include <LibCore/System.h>
|
#include <LibCore/System.h>
|
||||||
#include <LibMain/Main.h>
|
#include <LibMain/Main.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netdb.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
|
@ -22,12 +24,14 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
TRY(Core::System::unveil("/proc/net", "r"));
|
TRY(Core::System::unveil("/proc/net", "r"));
|
||||||
TRY(Core::System::unveil("/proc/all", "r"));
|
TRY(Core::System::unveil("/proc/all", "r"));
|
||||||
TRY(Core::System::unveil("/etc/passwd", "r"));
|
TRY(Core::System::unveil("/etc/passwd", "r"));
|
||||||
|
TRY(Core::System::unveil("/etc/services", "r"));
|
||||||
TRY(Core::System::unveil(nullptr, nullptr));
|
TRY(Core::System::unveil(nullptr, nullptr));
|
||||||
|
|
||||||
bool flag_all = false;
|
bool flag_all = false;
|
||||||
bool flag_list = false;
|
bool flag_list = false;
|
||||||
bool flag_tcp = false;
|
bool flag_tcp = false;
|
||||||
bool flag_udp = false;
|
bool flag_udp = false;
|
||||||
|
bool flag_numeric = false;
|
||||||
bool flag_program = false;
|
bool flag_program = false;
|
||||||
|
|
||||||
Core::ArgsParser args_parser;
|
Core::ArgsParser args_parser;
|
||||||
|
@ -36,6 +40,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
args_parser.add_option(flag_list, "Display only listening sockets", "list", 'l');
|
args_parser.add_option(flag_list, "Display only listening sockets", "list", 'l');
|
||||||
args_parser.add_option(flag_tcp, "Display only TCP network connections", "tcp", 't');
|
args_parser.add_option(flag_tcp, "Display only TCP network connections", "tcp", 't');
|
||||||
args_parser.add_option(flag_udp, "Display only UDP network connections", "udp", 'u');
|
args_parser.add_option(flag_udp, "Display only UDP network connections", "udp", 'u');
|
||||||
|
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_program, "Show the PID and name of the program to which each socket belongs", "program", 'p');
|
||||||
args_parser.parse(arguments);
|
args_parser.parse(arguments);
|
||||||
|
|
||||||
|
@ -157,11 +162,31 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
auto bytes_in = if_object.get("bytes_in").to_string();
|
auto bytes_in = if_object.get("bytes_in").to_string();
|
||||||
auto bytes_out = if_object.get("bytes_out").to_string();
|
auto bytes_out = if_object.get("bytes_out").to_string();
|
||||||
auto peer_address = if_object.get("peer_address").to_string();
|
auto peer_address = if_object.get("peer_address").to_string();
|
||||||
|
|
||||||
auto peer_port = if_object.get("peer_port").to_string();
|
auto peer_port = if_object.get("peer_port").to_string();
|
||||||
|
if (!flag_numeric) {
|
||||||
|
auto service = getservbyport(htons(if_object.get("peer_port").to_u32()), "tcp");
|
||||||
|
if (service != nullptr) {
|
||||||
|
auto s_name = StringView(service->s_name);
|
||||||
|
if (!s_name.is_empty())
|
||||||
|
peer_port = s_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
auto formatted_peer_address = String::formatted("{}:{}", peer_address, peer_port);
|
auto formatted_peer_address = String::formatted("{}:{}", peer_address, peer_port);
|
||||||
|
|
||||||
auto local_address = if_object.get("local_address").to_string();
|
auto local_address = if_object.get("local_address").to_string();
|
||||||
|
|
||||||
auto local_port = if_object.get("local_port").to_string();
|
auto local_port = if_object.get("local_port").to_string();
|
||||||
|
if (!flag_numeric) {
|
||||||
|
auto service = getservbyport(htons(if_object.get("local_port").to_u32()), "tcp");
|
||||||
|
if (service != nullptr) {
|
||||||
|
auto s_name = StringView(service->s_name);
|
||||||
|
if (!s_name.is_empty())
|
||||||
|
local_port = s_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
auto formatted_local_address = String::formatted("{}:{}", local_address, local_port);
|
auto formatted_local_address = String::formatted("{}:{}", local_address, local_port);
|
||||||
|
|
||||||
auto state = if_object.get("state").to_string();
|
auto state = if_object.get("state").to_string();
|
||||||
auto origin_pid = (if_object.has("origin_pid")) ? if_object.get("origin_pid").to_u32() : -1;
|
auto origin_pid = (if_object.has("origin_pid")) ? if_object.get("origin_pid").to_u32() : -1;
|
||||||
|
|
||||||
|
@ -203,9 +228,29 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
auto& if_object = value.as_object();
|
auto& if_object = value.as_object();
|
||||||
|
|
||||||
auto local_address = if_object.get("local_address").to_string();
|
auto local_address = if_object.get("local_address").to_string();
|
||||||
|
|
||||||
auto local_port = if_object.get("local_port").to_string();
|
auto local_port = if_object.get("local_port").to_string();
|
||||||
|
if (!flag_numeric) {
|
||||||
|
auto service = getservbyport(htons(if_object.get("local_port").to_u32()), "udp");
|
||||||
|
if (service != nullptr) {
|
||||||
|
auto s_name = StringView(service->s_name);
|
||||||
|
if (!s_name.is_empty())
|
||||||
|
local_port = s_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto peer_address = if_object.get("peer_address").to_string();
|
auto peer_address = if_object.get("peer_address").to_string();
|
||||||
|
|
||||||
auto peer_port = if_object.get("peer_port").to_string();
|
auto peer_port = if_object.get("peer_port").to_string();
|
||||||
|
if (!flag_numeric) {
|
||||||
|
auto service = getservbyport(htons(if_object.get("peer_port").to_u32()), "udp");
|
||||||
|
if (service != nullptr) {
|
||||||
|
auto s_name = StringView(service->s_name);
|
||||||
|
if (!s_name.is_empty())
|
||||||
|
peer_port = s_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto origin_pid = (if_object.has("origin_pid")) ? if_object.get("origin_pid").to_u32() : -1;
|
auto origin_pid = (if_object.has("origin_pid")) ? if_object.get("origin_pid").to_u32() : -1;
|
||||||
|
|
||||||
if (protocol_column != -1)
|
if (protocol_column != -1)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue