networkctl.c revision c09da72900b03fcddade06643f24c6357f3e0482
d29201dd5328b88140ce050100693c501852657dChristian Maeder/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
7165a916d2fa1bf87c4741ec63b253413eebbf69Karl Luc This file is part of systemd.
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Copyright 2014 Lennart Poettering
cacbb5e3100fb85d23d1614cace3a8662801f2e6Eugen Kuksa systemd is free software; you can redistribute it and/or modify it
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder under the terms of the GNU Lesser General Public License as published by
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder the Free Software Foundation; either version 2.1 of the License, or
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder (at your option) any later version.
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder systemd is distributed in the hope that it will be useful, but
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder WITHOUT ANY WARRANTY; without even the implied warranty of
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
51846950b4b1f31342008cf17f667859a5f21949Christian Maeder Lesser General Public License for more details.
e16b3696b2c173aac14200321868ed81b8f7dc69Christian Maeder You should have received a copy of the GNU Lesser General Public License
75067b1beba1380cde707c30e7fc050d86f6927fKarl Luc along with systemd; If not, see <http://www.gnu.org/licenses/>.
e16b3696b2c173aac14200321868ed81b8f7dc69Christian Maederstatic bool arg_no_pager = false;
51846950b4b1f31342008cf17f667859a5f21949Christian Maederstatic bool arg_legend = true;
51846950b4b1f31342008cf17f667859a5f21949Christian Maederstatic bool arg_all = false;
3831cf8a3b0ea144a80d13fe0314cc2752e32107Christian Maederstatic void pager_open_if_enabled(void) {
75067b1beba1380cde707c30e7fc050d86f6927fKarl Lucstatic int link_get_type_string(int iftype, struct udev_device *d, char **ret) {
75067b1beba1380cde707c30e7fc050d86f6927fKarl Luc const char *t;
7165a916d2fa1bf87c4741ec63b253413eebbf69Karl Luc /* WLANs have iftype ARPHRD_ETHER, but we want
de03ed90ff6efbbc4751301bcf6b50d9790c1afbKarl Luc * to show a more useful type string for
de03ed90ff6efbbc4751301bcf6b50d9790c1afbKarl Luctypedef struct LinkInfo {
cacbb5e3100fb85d23d1614cace3a8662801f2e6Eugen Kuksa const char *name;
0ac66bed6456d7900a657269e36107ca7bec4756Iulia Ignatovstatic int link_info_compare(const void *a, const void *b) {
0ac66bed6456d7900a657269e36107ca7bec4756Iulia Ignatov const LinkInfo *x = a, *y = b;
51846950b4b1f31342008cf17f667859a5f21949Christian Maederstatic int decode_and_sort_links(sd_rtnl_message *m, LinkInfo **ret) {
de03ed90ff6efbbc4751301bcf6b50d9790c1afbKarl Luc for (i = m; i; i = sd_rtnl_message_next(i)) {
7165a916d2fa1bf87c4741ec63b253413eebbf69Karl Luc const char *name;
c96c73387a0c41614ba325f737edad6abbf07e79Eugen Kuksa r = sd_rtnl_message_link_get_ifindex(i, &ifindex);
75067b1beba1380cde707c30e7fc050d86f6927fKarl Luc r = sd_rtnl_message_read_string(i, IFLA_IFNAME, &name);
99a1bfbb82c875580410b4745617fea2297fdc2bEugen Kuksa qsort_safe(links, c, sizeof(LinkInfo), link_info_compare);
99a1bfbb82c875580410b4745617fea2297fdc2bEugen Kuksa return (int) c;
99a1bfbb82c875580410b4745617fea2297fdc2bEugen Kuksastatic void operational_state_to_color(const char *state, const char **on, const char **off) {
037be4e5b0e867dd148db2ea89640d8edf009053Eugen Kuksastatic void setup_state_to_color(const char *state, const char **on, const char **off) {
99a1bfbb82c875580410b4745617fea2297fdc2bEugen Kuksa } else if (streq_ptr(state, "failed") || streq_ptr(state, "linger")) {
99a1bfbb82c875580410b4745617fea2297fdc2bEugen Kuksa _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
if (!udev)
return rtnl_log_create_error(r);
return rtnl_log_create_error(r);
if (arg_legend)
return rtnl_log_parse_error(c);
if (arg_legend)
char *description;
return -EINVAL;
snprintf(str, sizeof(str), "OUI:%02X%02X%02X%02X%02X%02X", mac->ether_addr_octet[0], mac->ether_addr_octet[1], mac->ether_addr_octet[2],
if (!description)
return -ENOMEM;
return -ENODATA;
sd_rtnl_message *m;
r = sd_rtnl_message_get_errno(m);
switch (fam) {
case AF_INET:
case AF_INET6:
return -ENODATA;
sd_rtnl_message *m;
bool first = true;
int family;
r = sd_rtnl_message_get_errno(m);
switch (family) {
case AF_INET:
case AF_INET6:
if (gateway_description)
gateway);
first = false;
pretty);
STRV_FOREACH(i, l) {
_cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *gateway = NULL, *gateway_description = NULL,
struct ether_addr e;
unsigned iftype;
int r, ifindex;
bool have_mac;
return rtnl_log_create_error(r);
return rtnl_log_create_error(r);
return rtnl_log_parse_error(r);
return rtnl_log_parse_error(r);
return rtnl_log_parse_error(r);
if (have_mac) {
const uint8_t *p;
bool all_zeroes = true;
all_zeroes = false;
if (all_zeroes)
have_mac = false;
char *wildcard;
if (!wildcard)
return log_oom();
return log_oom();
if (!vendor)
if (!model)
printf("%s%s%s %i: %s\n", on_color_operational, draw_special_char(DRAW_BLACK_CIRCLE), off_color_operational, ifindex, name);
strna(t),
if (path)
if (driver)
if (vendor)
if (model)
if (have_mac) {
if (mtu > 0)
char **name;
if (!udev)
return log_oom();
if (arg_all) {
return rtnl_log_create_error(r);
return rtnl_log_create_error(r);
return rtnl_log_parse_error(c);
static void help(void) {
help();
case ARG_VERSION:
case ARG_NO_PAGER:
arg_no_pager = true;
case ARG_NO_LEGEND:
arg_legend = false;
arg_all = true;
return -EINVAL;
const char* verb;
MORE,
LESS,
} argc_cmp;
const int argc;
} verbs[] = {
int left;
if (left <= 0)
help();
return -EINVAL;
case EQUAL:
return -EINVAL;
case MORE:
return -EINVAL;
case LESS:
return -EINVAL;
log_open();
goto finish;
pager_close();