networkctl.c revision 81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering This file is part of systemd.
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering Copyright 2014 Lennart Poettering
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering systemd is free software; you can redistribute it and/or modify it
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering under the terms of the GNU Lesser General Public License as published by
822cd601357f6f45d0176ae38fe9f86077462f06Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering (at your option) any later version.
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering systemd is distributed in the hope that it will be useful, but
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering Lesser General Public License for more details.
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering You should have received a copy of the GNU Lesser General Public License
770b5ce4fc31a336a41e81381c229da725ef0cfaLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
#include "sd-network.h"
#include "sd-rtnl.h"
#include "sd-hwdb.h"
#include "libudev.h"
#include "strv.h"
#include "build.h"
#include "util.h"
#include "pager.h"
#include "rtnl-util.h"
#include "udev-util.h"
#include "hwdb-util.h"
#include "arphrd-list.h"
#include "local-addresses.h"
#include "socket-util.h"
#include "ether-addr-util.h"
static bool arg_no_pager = false;
static bool arg_legend = true;
static bool arg_all = false;
static void pager_open_if_enabled(void) {
if (arg_no_pager)
pager_open(false);
if (id) {
return -ENOMEM;
*ret = p;
p = strdup(t);
return -ENOMEM;
ascii_strlower(p);
*ret = p;
typedef struct LinkInfo {
const char *name;
int ifindex;
unsigned iftype;
} LinkInfo;
static int link_info_compare(const void *a, const void *b) {
const LinkInfo *x = a, *y = b;
sd_rtnl_message *i;
for (i = m; i; i = sd_rtnl_message_next(i)) {
const char *name;
unsigned iftype;
int ifindex;
return -ENOMEM;
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)
const char *description;
if (!hwdb)
return -EINVAL;
if (!mac)
return -EINVAL;
return -EINVAL;
if (!desc)
return -ENOMEM;
static int get_gateway_description(
int ifindex,
int family,
char **gateway_description) {
sd_rtnl_message *m;
r = sd_rtnl_message_get_errno(m);
switch (fam) {
case AF_INET:
case AF_INET6:
return -ENODATA;
static int dump_gateways(
const char *prefix,
int ifindex) {
r = get_gateway_description(rtnl, hwdb, local[i].ifindex, local[i].family, &local[i].address, &description);
gateway);
if (description)
if (ifindex <= 0) {
static int dump_addresses(
const char *prefix,
int ifindex) {
pretty);
if (ifindex <= 0) {
STRV_FOREACH(i, l) {
static int link_status_one(
const char *name) {
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 (description)
if (mtu > 0)
char **name;
if (!udev)
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();