diff options
author | Alan Somers <asomers@FreeBSD.org> | 2020-06-29 22:12:23 +0000 |
---|---|---|
committer | Alan Somers <asomers@FreeBSD.org> | 2020-06-29 22:12:23 +0000 |
commit | 81884a247ca3efea5fd285a373281f6fea090976 (patch) | |
tree | 302e7f8b4855c1988eb686dda0d606eacf78ebf3 | |
parent | 46cac10b3b54f32739eec1a5093a5acf33f0ac22 (diff) | |
download | src-test2-81884a247ca3efea5fd285a373281f6fea090976.tar.gz src-test2-81884a247ca3efea5fd285a373281f6fea090976.zip |
Notes
-rw-r--r-- | sbin/savecore/savecore.c | 47 | ||||
-rw-r--r-- | share/man/man5/rc.conf.5 | 6 |
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 |