aboutsummaryrefslogtreecommitdiff
path: root/sbin
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 /sbin
parent46cac10b3b54f32739eec1a5093a5acf33f0ac22 (diff)
downloadsrc-81884a247ca3efea5fd285a373281f6fea090976.tar.gz
src-81884a247ca3efea5fd285a373281f6fea090976.zip
savecore: accept device names without the /dev/ prefix
dumpon has accepted device names without the prefix ever since r291207. Since dumpon and savecore are always paired, they ought to accept the same arguments. Prior to this change, specifying 'dumpdev="da3"' in /etc/rc.conf, for example, would result in dumpon working just fine but savecore complaining that "Dump device does not exist". PR: 247618 Reviewed by: cem, bcr MFC after: 2 weeks Sponsored by: Axcient Differential Revision: https://reviews.freebsd.org/D25500
Notes
Notes: svn path=/head/; revision=362790
Diffstat (limited to 'sbin')
-rw-r--r--sbin/savecore/savecore.c47
1 files changed, 44 insertions, 3 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) {