networkctl.c revision 64d6c22905e94b02e760747c6c143dc9893083d9
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk This file is part of systemd.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk Copyright 2014 Lennart Poettering
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk systemd is free software; you can redistribute it and/or modify it
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk under the terms of the GNU Lesser General Public License as published by
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk the Free Software Foundation; either version 2.1 of the License, or
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk (at your option) any later version.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk systemd is distributed in the hope that it will be useful, but
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk WITHOUT ANY WARRANTY; without even the implied warranty of
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk Lesser General Public License for more details.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk You should have received a copy of the GNU Lesser General Public License
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk along with systemd; If not, see <http://www.gnu.org/licenses/>.
#include "sd-netlink.h"
#include "sd-hwdb.h"
#include "sd-device.h"
#include "strv.h"
#include "build.h"
#include "util.h"
#include "pager.h"
#include "lldp.h"
#include "netlink-util.h"
#include "device-util.h"
#include "hwdb-util.h"
#include "arphrd-list.h"
#include "local-addresses.h"
#include "socket-util.h"
#include "ether-addr-util.h"
#include "verbs.h"
#include "terminal-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;
for (i = m; i; i = sd_netlink_message_next(i)) {
const char *name;
unsigned iftype;
int ifindex;
return -ENOMEM;
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) {
r = sd_netlink_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();
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)
if (tz)
char **name;
if (arg_all) {
return rtnl_log_create_error(r);
return rtnl_log_create_error(r);
return rtnl_log_parse_error(c);
char *capability;
return NULL;
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(t);
return NULL;
free(s);
capability = t;
s = NULL;
t = NULL;
return capability;
return rtnl_log_create_error(r);
return rtnl_log_create_error(r);
return rtnl_log_parse_error(c);
if (arg_legend)
return -ENOMEM;
STRV_FOREACH(s, l) {
return -ENOMEM;
r = safe_atollu(b, &x);
if (r < 0 || (usec_t) x != x)
if (x < time)
if (ttl >= 0) {
if (arg_legend) {
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;
log_open();
goto finish;
pager_close();