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