Changeset View
Changeset View
Standalone View
Standalone View
head/sbin/savecore/savecore.c
Show First 20 Lines • Show All 967 Lines • ▼ Show 20 Lines | closeall: | ||||
fclose(core); | fclose(core); | ||||
closefd: | closefd: | ||||
free(dumpkey); | free(dumpkey); | ||||
free(temp); | free(temp); | ||||
close(fddev); | close(fddev); | ||||
} | } | ||||
/* Prepend "/dev/" to any arguments that don't already have it */ | |||||
static char ** | 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) | enum_dumpdevs(int *argcp) | ||||
{ | { | ||||
struct fstab *fsp; | struct fstab *fsp; | ||||
char **argv; | char **argv; | ||||
int argc, n; | int argc, n; | ||||
/* | /* | ||||
* We cannot use getfsent(3) in capability mode, so we must | * We cannot use getfsent(3) in capability mode, so we must | ||||
▲ Show 20 Lines • Show All 79 Lines • ▼ Show 20 Lines | usage(void) | ||||
exit(1); | exit(1); | ||||
} | } | ||||
int | int | ||||
main(int argc, char **argv) | main(int argc, char **argv) | ||||
{ | { | ||||
cap_rights_t rights; | cap_rights_t rights; | ||||
const char *savedir; | const char *savedir; | ||||
char **devs; | |||||
int i, ch, error, savedirfd; | int i, ch, error, savedirfd; | ||||
checkfor = compress = clear = force = keep = verbose = 0; | checkfor = compress = clear = force = keep = verbose = 0; | ||||
nfound = nsaved = nerr = 0; | nfound = nsaved = nerr = 0; | ||||
savedir = "."; | savedir = "."; | ||||
openlog("savecore", LOG_PERROR, LOG_DAEMON); | openlog("savecore", LOG_PERROR, LOG_DAEMON); | ||||
signal(SIGINFO, infohandler); | signal(SIGINFO, infohandler); | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | if (error) { | ||||
logmsg(LOG_ERR, "chdir(%s): %m", argv[0]); | logmsg(LOG_ERR, "chdir(%s): %m", argv[0]); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
savedir = argv[0]; | savedir = argv[0]; | ||||
argc--; | argc--; | ||||
argv++; | argv++; | ||||
} | } | ||||
if (argc == 0) | if (argc == 0) | ||||
argv = enum_dumpdevs(&argc); | devs = enum_dumpdevs(&argc); | ||||
else | |||||
devs = devify(argc, argv); | |||||
savedirfd = open(savedir, O_RDONLY | O_DIRECTORY); | savedirfd = open(savedir, O_RDONLY | O_DIRECTORY); | ||||
if (savedirfd < 0) { | if (savedirfd < 0) { | ||||
logmsg(LOG_ERR, "open(%s): %m", savedir); | logmsg(LOG_ERR, "open(%s): %m", savedir); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
(void)cap_rights_init(&rights, CAP_CREATE, CAP_FCNTL, CAP_FSTATAT, | (void)cap_rights_init(&rights, CAP_CREATE, CAP_FCNTL, CAP_FSTATAT, | ||||
CAP_FSTATFS, CAP_PREAD, CAP_SYMLINKAT, CAP_FTRUNCATE, CAP_UNLINKAT, | CAP_FSTATFS, CAP_PREAD, CAP_SYMLINKAT, CAP_FTRUNCATE, CAP_UNLINKAT, | ||||
CAP_WRITE); | CAP_WRITE); | ||||
if (caph_rights_limit(savedirfd, &rights) < 0) { | if (caph_rights_limit(savedirfd, &rights) < 0) { | ||||
logmsg(LOG_ERR, "cap_rights_limit(): %m"); | logmsg(LOG_ERR, "cap_rights_limit(): %m"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
/* Enter capability mode. */ | /* Enter capability mode. */ | ||||
init_caps(argc, argv); | init_caps(argc, devs); | ||||
for (i = 0; i < argc; i++) | for (i = 0; i < argc; i++) | ||||
DoFile(savedir, savedirfd, argv[i]); | DoFile(savedir, savedirfd, devs[i]); | ||||
/* Emit minimal output. */ | /* Emit minimal output. */ | ||||
if (nfound == 0) { | if (nfound == 0) { | ||||
if (checkfor) { | if (checkfor) { | ||||
if (verbose) | if (verbose) | ||||
printf("No dump exists\n"); | printf("No dump exists\n"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
Show All 20 Lines |