networkctl.c revision 920b52e4909d9dc812817fd8b82f83ca23a11c91
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye This file is part of systemd.
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye Copyright 2014 Lennart Poettering
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye systemd is free software; you can redistribute it and/or modify it
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye under the terms of the GNU Lesser General Public License as published by
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye the Free Software Foundation; either version 2.1 of the License, or
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye (at your option) any later version.
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye systemd is distributed in the hope that it will be useful, but
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye WITHOUT ANY WARRANTY; without even the implied warranty of
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye Lesser General Public License for more details.
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye You should have received a copy of the GNU Lesser General Public License
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye along with systemd; If not, see <http://www.gnu.org/licenses/>.
9b1dea974e126ecb07a1f6d6cf9d2b637c8a47a0Lubos Koscostatic bool arg_no_pager = false;
9b1dea974e126ecb07a1f6d6cf9d2b637c8a47a0Lubos Koscostatic bool arg_legend = true;
9b1dea974e126ecb07a1f6d6cf9d2b637c8a47a0Lubos Koscostatic bool arg_all = false;
d1b1bc11a3627ee70171f748984e056b19d6bf83Trond Norbyestatic void pager_open_if_enabled(void) {
9b1dea974e126ecb07a1f6d6cf9d2b637c8a47a0Lubos Koscostatic int link_get_type_string(int iftype, sd_device *d, char **ret) {
9b1dea974e126ecb07a1f6d6cf9d2b637c8a47a0Lubos Kosco const char *t;
9b1dea974e126ecb07a1f6d6cf9d2b637c8a47a0Lubos Kosco /* WLANs have iftype ARPHRD_ETHER, but we want
9ec7787531611654e8f50932473aa48963eaba55Trond Norbye * to show a more useful type string for
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;
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();
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 (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();