summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2020-06-29 22:12:23 +0000
committerAlan Somers <asomers@FreeBSD.org>2020-06-29 22:12:23 +0000
commit81884a247ca3efea5fd285a373281f6fea090976 (patch)
tree302e7f8b4855c1988eb686dda0d606eacf78ebf3
parent46cac10b3b54f32739eec1a5093a5acf33f0ac22 (diff)
downloadsrc-test2-81884a247ca3efea5fd285a373281f6fea090976.tar.gz
src-test2-81884a247ca3efea5fd285a373281f6fea090976.zip
Notes
-rw-r--r--sbin/savecore/savecore.c47
-rw-r--r--share/man/man5/rc.conf.56
2 files changed, 48 insertions, 5 deletions
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c
index 1f0ea8aa4f68..47d05627f18a 100644
--- a/sbin/savecore/savecore.c
+++ b/sbin/savecore/savecore.c
@@ -973,6 +973,44 @@ closefd:
close(fddev);
}
+/* Prepend "/dev/" to any arguments that don't already have it */
+static char **
+devify(int argc, char **argv)
+{
+ char **devs;
+ int i, l;
+
+ devs = malloc(argc * sizeof(*argv));
+ if (devs == NULL) {
+ logmsg(LOG_ERR, "malloc(): %m");
+ exit(1);
+ }
+ for (i = 0; i < argc; i++) {
+ if (strncmp(argv[i], _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0)
+ devs[i] = strdup(argv[i]);
+ else {
+ char *fullpath;
+
+ fullpath = malloc(PATH_MAX);
+ if (fullpath == NULL) {
+ logmsg(LOG_ERR, "malloc(): %m");
+ exit(1);
+ }
+ l = snprintf(fullpath, PATH_MAX, "%s%s", _PATH_DEV,
+ argv[i]);
+ if (l < 0) {
+ logmsg(LOG_ERR, "snprintf(): %m");
+ exit(1);
+ } else if (l >= PATH_MAX) {
+ logmsg(LOG_ERR, "device name too long");
+ exit(1);
+ }
+ devs[i] = fullpath;
+ }
+ }
+ return (devs);
+}
+
static char **
enum_dumpdevs(int *argcp)
{
@@ -1069,6 +1107,7 @@ main(int argc, char **argv)
{
cap_rights_t rights;
const char *savedir;
+ char **devs;
int i, ch, error, savedirfd;
checkfor = compress = clear = force = keep = verbose = 0;
@@ -1132,7 +1171,9 @@ main(int argc, char **argv)
argv++;
}
if (argc == 0)
- argv = enum_dumpdevs(&argc);
+ devs = enum_dumpdevs(&argc);
+ else
+ devs = devify(argc, argv);
savedirfd = open(savedir, O_RDONLY | O_DIRECTORY);
if (savedirfd < 0) {
@@ -1148,10 +1189,10 @@ main(int argc, char **argv)
}
/* Enter capability mode. */
- init_caps(argc, argv);
+ init_caps(argc, devs);
for (i = 0; i < argc; i++)
- DoFile(savedir, savedirfd, argv[i]);
+ DoFile(savedir, savedirfd, devs[i]);
/* Emit minimal output. */
if (nfound == 0) {
diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5
index 9f350c6d4100..e59bed1383e9 100644
--- a/share/man/man5/rc.conf.5
+++ b/share/man/man5/rc.conf.5
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 23, 2020
+.Dd June 28, 2020
.Dt RC.CONF 5
.Os
.Sh NAME
@@ -3469,7 +3469,9 @@ the first suitable swap device listed in
.Pa /etc/fstab
will be used as dump device.
Otherwise, the value of this variable is passed as the argument to
-.Xr dumpon 8 .
+.Xr dumpon 8
+and
+.Xr savecore 8 .
To disable crash dumps, set this variable to
.Dq Li NO .
.It Va dumpon_flags