Add descr,description/-descr,-description commands to ifconfig(8) to handle a description.

From t-kusaba@IIJ
This commit is contained in:
ozaki-r 2019-07-04 02:45:45 +00:00
parent aa0ca9e9b1
commit 86e9de9cad
2 changed files with 76 additions and 4 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: ifconfig.8,v 1.116 2018/11/15 04:37:20 ozaki-r Exp $
.\" $NetBSD: ifconfig.8,v 1.117 2019/07/04 02:45:45 ozaki-r Exp $
.\"
.\" Copyright (c) 1983, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@ -29,7 +29,7 @@
.\"
.\" @(#)ifconfig.8 8.4 (Berkeley) 6/1/94
.\"
.Dd November 15, 2018
.Dd June 18, 2019
.Dt IFCONFIG 8
.Os
.Sh NAME
@ -186,6 +186,10 @@ pseudo-device, attach it to
.Ar iface .
If not specified, the kernel will attempt to select an interface with
a subnet matching that of the carp interface.
.It Cm description Ar description , Cm descr Ar description
Set a description of the interface. (0-63 characters)
.It Cm -description , Cm -descr
Clear the description of the interface.
.It Cm debug
Enable driver dependent debugging code; usually, this turns on
extra console error logging.

View File

@ -1,4 +1,4 @@
/* $NetBSD: ifconfig.c,v 1.238 2018/12/21 08:58:08 msaitoh Exp $ */
/* $NetBSD: ifconfig.c,v 1.239 2019/07/04 02:45:45 ozaki-r Exp $ */
/*-
* Copyright (c) 1997, 1998, 2000 The NetBSD Foundation, Inc.
@ -63,7 +63,7 @@
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1983, 1993\
The Regents of the University of California. All rights reserved.");
__RCSID("$NetBSD: ifconfig.c,v 1.238 2018/12/21 08:58:08 msaitoh Exp $");
__RCSID("$NetBSD: ifconfig.c,v 1.239 2019/07/04 02:45:45 ozaki-r Exp $");
#endif /* not lint */
#include <sys/param.h>
@ -133,6 +133,8 @@ static int setifnetmask(prop_dictionary_t, prop_dictionary_t);
static int setifprefixlen(prop_dictionary_t, prop_dictionary_t);
static int setlinkstr(prop_dictionary_t, prop_dictionary_t);
static int unsetlinkstr(prop_dictionary_t, prop_dictionary_t);
static int setifdescr(prop_dictionary_t, prop_dictionary_t);
static int unsetifdescr(prop_dictionary_t, prop_dictionary_t);
static void status(const struct sockaddr *, prop_dictionary_t,
prop_dictionary_t);
__dead static void usage(void);
@ -193,6 +195,9 @@ struct paddr parse_broadcast = PADDR_INITIALIZER(&parse_broadcast,
"broadcast address",
setifbroadaddr, "broadcast", NULL, NULL, NULL, &command_root.pb_parser);
struct pstr parse_descr = PSTR_INITIALIZER1(&parse_descr, "descr",
setifdescr, "descr", false, &command_root.pb_parser);
static const struct kwinst misckw[] = {
{.k_word = "alias", .k_key = "alias", .k_deact = "alias",
.k_type = KW_T_BOOL, .k_neg = true,
@ -213,6 +218,12 @@ static const struct kwinst misckw[] = {
, {.k_word = "linkstr", .k_nextparser = &parse_linkstr.ps_parser }
, {.k_word = "-linkstr", .k_exec = unsetlinkstr,
.k_nextparser = &command_root.pb_parser }
, {.k_word = "descr", .k_nextparser = &parse_descr.ps_parser}
, {.k_word = "description", .k_nextparser = &parse_descr.ps_parser}
, {.k_word = "-descr", .k_exec = unsetifdescr,
.k_nextparser = &command_root.pb_parser}
, {.k_word = "-description", .k_exec = unsetifdescr,
.k_nextparser = &command_root.pb_parser}
};
/* key: clonecmd */
@ -1270,6 +1281,7 @@ status(const struct sockaddr *sdl, prop_dictionary_t env,
struct ifcapreq ifcr;
unsigned short flags;
const struct afswtch *afp;
char ifdescr[IFDESCRSIZE];
if ((af = getaf(env)) == -1) {
afp = NULL;
@ -1321,6 +1333,12 @@ status(const struct sockaddr *sdl, prop_dictionary_t env,
SIMPLEQ_FOREACH(status_f, &status_funcs, f_next)
(*status_f->f_func)(env, oenv);
estrlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
ifr.ifr_buf = &ifdescr;
ifr.ifr_buflen = sizeof(ifdescr);
if (prog_ioctl(s, SIOCGIFDESCR, &ifr) == 0)
printf("\tdescription: \"%s\"\n", (char *)ifr.ifr_buf);
print_link_addresses(env, true);
estrlcpy(ifdrv.ifd_name, ifname, sizeof(ifdrv.ifd_name));
@ -1461,6 +1479,55 @@ unsetlinkstr(prop_dictionary_t env, prop_dictionary_t oenv)
return 0;
}
static int
setifdescr(prop_dictionary_t env, prop_dictionary_t oenv)
{
struct ifreq ifr;
size_t len;
prop_data_t data;
char *descr;
data = (prop_data_t)prop_dictionary_get(env, "descr");
if (data == NULL) {
errno = ENOENT;
return -1;
}
len = prop_data_size(data) + 1;
if (len > IFDESCRSIZE)
err(EXIT_FAILURE, "description too long");
descr = malloc(len);
if (descr == NULL)
err(EXIT_FAILURE, "malloc description space");
if (getargstr(env, "descr", descr, len) == -1)
errx(EXIT_FAILURE, "getargstr descr failed");
ifr.ifr_buf = descr;
ifr.ifr_buflen = len;
if (direct_ioctl(env, SIOCSIFDESCR, &ifr) != 0)
err(EXIT_FAILURE, "SIOCSIFDESCR");
free(descr);
return 0;
}
static int
unsetifdescr(prop_dictionary_t env, prop_dictionary_t oenv)
{
struct ifreq ifr;
ifr.ifr_buf = NULL;
ifr.ifr_buflen = 0;
if (direct_ioctl(env, SIOCSIFDESCR, &ifr) != 0)
err(EXIT_FAILURE, "SIOCSIFDESCR");
return 0;
}
static void
usage(void)
{
@ -1486,6 +1553,7 @@ usage(void)
"\t[ preference n ]\n"
"\t[ link0 | -link0 ] [ link1 | -link1 ] [ link2 | -link2 ]\n"
"\t[ linkstr str | -linkstr ]\n"
"\t[ description str | descr str | -description | -descr ]\n"
" %s -a [-b] [-d] [-h] %s[-u] [-v] [-z] [ af ]\n"
" %s -l [-b] [-d] [-s] [-u]\n"
" %s -C\n"