Try to make sysctl options slightly more orthogonal:
- introduce a -o option that displays opaque variables. - introduce a -x option that displays opaque variables in full. - deprecate -A in favor of -ao and -X in favor of -ax. - remove -A and -X from usage() and SYNOPSIS (but not from DESCRIPTION). - ignore -a if one or more variables were listed on the command line. - deprecate -w, it is not needed to determine the user's intentions. - some language and style cleanup in the man page. This commit should not break any existing scripts. MFC after: 4 weeks
This commit is contained in:
parent
031c57af94
commit
9a2402bc41
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=77330
@ -40,64 +40,68 @@
|
||||
.Nd get or set kernel state
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl bNn
|
||||
.Ar name ...
|
||||
.Op Fl bNnox
|
||||
.Ar name Ns Op = Ns Ar value
|
||||
.Ar ...
|
||||
.Nm
|
||||
.Op Fl bNn
|
||||
.Fl w
|
||||
.Ar name Ns = Ns Ar value ...
|
||||
.Nm
|
||||
.Op Fl bNn
|
||||
.Fl aAX
|
||||
.Op Fl bNnox
|
||||
.Fl a
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility retrieves kernel state and allows processes with
|
||||
appropriate privilege to set kernel state.
|
||||
The state to be retrieved or set is described using a
|
||||
``Management Information Base'' (``MIB'') style name,
|
||||
described as a dotted set of components.
|
||||
utility retrieves kernel state and allows processes with appropriate
|
||||
privilege to set kernel state.
|
||||
The state to be retrieved or set is described using a ``Management
|
||||
Information Base'' (``MIB'') style name, described as a dotted set of
|
||||
components.
|
||||
.Pp
|
||||
The following options are available:
|
||||
.Bl -tag -width indent
|
||||
.It Fl a
|
||||
List all the currently available string or integer values.
|
||||
.It Fl A
|
||||
List all the known MIB names including opaques.
|
||||
Those with string or integer values will be printed as with the
|
||||
Equivalent to
|
||||
.Fl o
|
||||
.Fl a
|
||||
flag; for the opaque values,
|
||||
information about the format and the length is printed in addition the first
|
||||
few bytes is dumped in hex.
|
||||
.It Fl X
|
||||
Same as
|
||||
.Fl A
|
||||
except the entire value of opaque variables is hexdumped.
|
||||
(for compatibility).
|
||||
.It Fl a
|
||||
List all the currently available non-opaque values.
|
||||
This option is ignored if one or more variable names are specified on
|
||||
the command line.
|
||||
.It Fl N
|
||||
Show only variable names, not their values.
|
||||
This is particularly useful with shells that offer programmable
|
||||
completion.
|
||||
To enable completion of variable names in
|
||||
.Nm zsh ,
|
||||
use the following code:
|
||||
.Bd -literal -offset indent -compact
|
||||
listsysctls () { set -A reply $(sysctl -AN ${1%.*}) }
|
||||
compctl -K listsysctls sysctl
|
||||
.Ed
|
||||
.It Fl n
|
||||
Specify that the printing of the field name should be
|
||||
suppressed and that only its value should be output.
|
||||
This flag is useful for setting shell variables.
|
||||
For example, to save the pagesize in variable psize, use:
|
||||
Show only variable values, not their names.
|
||||
This option is useful for setting shell variables.
|
||||
For instance, to save the pagesize in variable psize, use:
|
||||
.Bd -literal -offset indent -compact
|
||||
set psize=`sysctl -n hw.pagesize`
|
||||
.Ed
|
||||
.It Fl b
|
||||
Force the value of the variable(s) to be output in raw, binary
|
||||
format. No names are printed and no terminating newlines are output.
|
||||
Force the value of the variable(s) to be output in raw, binary format.
|
||||
No names are printed and no terminating newlines are output.
|
||||
This is mostly useful with a single variable.
|
||||
.It Fl w Xo
|
||||
.Ar name Ns = Ns Ar value ...
|
||||
.Xc
|
||||
Set the MIB
|
||||
.Ar name
|
||||
to the new
|
||||
.Ar value .
|
||||
If just a MIB style
|
||||
.Ar name
|
||||
is given,
|
||||
the corresponding value is retrieved.
|
||||
.Fl o
|
||||
Show opaque variables (which are normally suppressed).
|
||||
The format and length are printed, as well as a hex dump of the first
|
||||
sixteen bytes of the value.
|
||||
.It Fl X
|
||||
Equivalent to
|
||||
.Fl x
|
||||
.Fl a
|
||||
(for compatibility).
|
||||
.It Fl x
|
||||
As
|
||||
.Fl o ,
|
||||
but prints a hex dump of the entire value instead of just the first
|
||||
few bytes.
|
||||
.El
|
||||
.Pp
|
||||
The information available from
|
||||
|
@ -58,7 +58,7 @@ static const char rcsid[] =
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static int Aflag, aflag, bflag, Nflag, nflag, wflag, Xflag;
|
||||
static int aflag, bflag, Nflag, nflag, oflag, xflag;
|
||||
|
||||
static int oidfmt(int *, int, char *, u_int *);
|
||||
static void parse(char *);
|
||||
@ -70,12 +70,9 @@ static void
|
||||
usage(void)
|
||||
{
|
||||
|
||||
(void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
|
||||
"usage: sysctl [-bNn] variable ...",
|
||||
" sysctl [-bNn] -w variable=value ...",
|
||||
" sysctl [-bNn] -a",
|
||||
" sysctl [-bNn] -A",
|
||||
" sysctl [-bNn] -X");
|
||||
(void)fprintf(stderr, "%s\n%s\n",
|
||||
"usage: sysctl [-bNnox] variable[=value] ...",
|
||||
" sysctl [-bNnox] -a");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -86,10 +83,11 @@ main(int argc, char **argv)
|
||||
setbuf(stdout,0);
|
||||
setbuf(stderr,0);
|
||||
|
||||
while ((ch = getopt(argc, argv, "AabNnwX")) != -1) {
|
||||
while ((ch = getopt(argc, argv, "AabNnowxX")) != -1) {
|
||||
switch (ch) {
|
||||
case 'A':
|
||||
Aflag = 1;
|
||||
/* compatibility */
|
||||
aflag = oflag = 1;
|
||||
break;
|
||||
case 'a':
|
||||
aflag = 1;
|
||||
@ -103,11 +101,19 @@ main(int argc, char **argv)
|
||||
case 'n':
|
||||
nflag = 1;
|
||||
break;
|
||||
case 'o':
|
||||
oflag = 1;
|
||||
break;
|
||||
case 'w':
|
||||
wflag = 1;
|
||||
/* compatibility */
|
||||
/* ignored */
|
||||
break;
|
||||
case 'X':
|
||||
Xflag = Aflag = 1;
|
||||
/* compatibility */
|
||||
aflag = xflag = 1;
|
||||
break;
|
||||
case 'x':
|
||||
xflag = 1;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
@ -116,9 +122,9 @@ main(int argc, char **argv)
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if ((wflag && (Aflag || aflag)) || (Nflag && nflag))
|
||||
if (Nflag && nflag)
|
||||
usage();
|
||||
if (Aflag || aflag)
|
||||
if (aflag && argc == 0)
|
||||
exit(sysctl_all(0, 0));
|
||||
if (argc == 0)
|
||||
usage();
|
||||
@ -146,17 +152,12 @@ parse(char *string)
|
||||
bufp = buf;
|
||||
snprintf(buf, BUFSIZ, "%s", string);
|
||||
if ((cp = strchr(string, '=')) != NULL) {
|
||||
if (!wflag)
|
||||
errx(2, "must specify -w to set variables");
|
||||
*strchr(buf, '=') = '\0';
|
||||
*cp++ = '\0';
|
||||
while (isspace(*cp))
|
||||
cp++;
|
||||
newval = cp;
|
||||
newsize = strlen(cp);
|
||||
} else {
|
||||
if (wflag)
|
||||
usage();
|
||||
}
|
||||
len = name2oid(bufp, mib);
|
||||
|
||||
@ -166,7 +167,7 @@ parse(char *string)
|
||||
if (oidfmt(mib, len, 0, &kind))
|
||||
err(1, "couldn't find format of oid '%s'", bufp);
|
||||
|
||||
if (!wflag) {
|
||||
if (newval == NULL) {
|
||||
if ((kind & CTLTYPE) == CTLTYPE_NODE) {
|
||||
sysctl_all(mib, len);
|
||||
} else {
|
||||
@ -468,15 +469,17 @@ show_var(int *oid, int nlen)
|
||||
}
|
||||
/* FALL THROUGH */
|
||||
default:
|
||||
if (!Aflag)
|
||||
if (!oflag && !xflag)
|
||||
return (1);
|
||||
if (!nflag)
|
||||
printf("%s: ", name);
|
||||
printf("Format:%s Length:%d Dump:0x", fmt, len);
|
||||
while (len--) {
|
||||
printf("%02x", *p++);
|
||||
if (Xflag || p < val+16)
|
||||
if (xflag || p < val+16)
|
||||
continue;
|
||||
if (len == 16)
|
||||
break;
|
||||
printf("...");
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user