Allow newsyslog to execute compression commands which
have a semantic different than the traditional gzip(1) This is done to allow to use zstd(1) as a compression tool without having to patch it to change its default behavior.
This commit is contained in:
parent
78fdf7f396
commit
307845dff2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=326617
@ -151,14 +151,23 @@ struct compress_types {
|
||||
const char *flag; /* Flag in configuration file */
|
||||
const char *suffix; /* Compression suffix */
|
||||
const char *path; /* Path to compression program */
|
||||
char **args; /* Comrpession arguments */
|
||||
};
|
||||
|
||||
static char f_arg[] = "-f";
|
||||
static char q_arg[] = "-q";
|
||||
static char rm_arg[] = "--rm";
|
||||
static char *gz_args[] ={ NULL, f_arg, NULL, NULL };
|
||||
#define bzip2_args gz_args
|
||||
#define xz_args gz_args
|
||||
static char *zstd_args[] = { NULL, q_arg, rm_arg, NULL, NULL };
|
||||
|
||||
static const struct compress_types compress_type[COMPRESS_TYPES] = {
|
||||
{ "", "", "" }, /* no compression */
|
||||
{ "Z", COMPRESS_SUFFIX_GZ, _PATH_GZIP }, /* gzip compression */
|
||||
{ "J", COMPRESS_SUFFIX_BZ2, _PATH_BZIP2 }, /* bzip2 compression */
|
||||
{ "X", COMPRESS_SUFFIX_XZ, _PATH_XZ }, /* xz compression */
|
||||
{ "Y", COMPRESS_SUFFIX_ZST, _PATH_ZSTD } /* zst compression */
|
||||
{ "", "", "", NULL}, /* none */
|
||||
{ "Z", COMPRESS_SUFFIX_GZ, _PATH_GZIP, gz_args}, /* gzip */
|
||||
{ "J", COMPRESS_SUFFIX_BZ2, _PATH_BZIP2, bzip2_args}, /* bzip2 */
|
||||
{ "X", COMPRESS_SUFFIX_XZ, _PATH_XZ, xz_args }, /* xz */
|
||||
{ "Y", COMPRESS_SUFFIX_ZST, _PATH_ZSTD, zstd_args } /* zst */
|
||||
};
|
||||
|
||||
struct conf_entry {
|
||||
@ -2001,6 +2010,8 @@ do_zipwork(struct zipwork_entry *zwork)
|
||||
int errsav, fcount, zstatus;
|
||||
pid_t pidzip, wpid;
|
||||
char zresult[MAXPATHLEN];
|
||||
char command[BUFSIZ];
|
||||
char **args;
|
||||
int c;
|
||||
|
||||
assert(zwork != NULL);
|
||||
@ -2013,6 +2024,7 @@ do_zipwork(struct zipwork_entry *zwork)
|
||||
pgm_path = compress_type[c].path;
|
||||
(void) strlcat(zresult,
|
||||
compress_type[c].suffix, sizeof(zresult));
|
||||
args = compress_type[c].args;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2026,6 +2038,13 @@ do_zipwork(struct zipwork_entry *zwork)
|
||||
else
|
||||
pgm_name++;
|
||||
|
||||
args[0] = strdup(pgm_name);
|
||||
if (args[0] == NULL)
|
||||
err(1, "strdup()");
|
||||
for (c = 0; args[c] != NULL; c++)
|
||||
;
|
||||
args[c] = zwork->zw_fname;
|
||||
|
||||
if (zwork->zw_swork != NULL && zwork->zw_swork->sw_runcmd == 0 &&
|
||||
zwork->zw_swork->sw_pidok <= 0) {
|
||||
warnx(
|
||||
@ -2035,6 +2054,11 @@ do_zipwork(struct zipwork_entry *zwork)
|
||||
return;
|
||||
}
|
||||
|
||||
strlcpy(command, pgm_path, sizeof(command));
|
||||
for (c = 1; args[c] != NULL; c++) {
|
||||
strlcat(command, " ", sizeof(command));
|
||||
strlcat(command, args[c], sizeof(command));
|
||||
}
|
||||
if (noaction) {
|
||||
printf("\t%s %s\n", pgm_name, zwork->zw_fname);
|
||||
change_attrs(zresult, zwork->zw_conf);
|
||||
@ -2058,8 +2082,8 @@ do_zipwork(struct zipwork_entry *zwork)
|
||||
}
|
||||
if (!pidzip) {
|
||||
/* The child process executes the compression command */
|
||||
execl(pgm_path, pgm_path, "-f", zwork->zw_fname, (char *)0);
|
||||
err(1, "execl(`%s -f %s')", pgm_path, zwork->zw_fname);
|
||||
execv(pgm_path, (char *const*) args);
|
||||
err(1, "execv(`%s')", command);
|
||||
}
|
||||
|
||||
wpid = waitpid(pidzip, &zstatus, 0);
|
||||
@ -2069,13 +2093,12 @@ do_zipwork(struct zipwork_entry *zwork)
|
||||
return;
|
||||
}
|
||||
if (!WIFEXITED(zstatus)) {
|
||||
warnx("`%s -f %s' did not terminate normally", pgm_name,
|
||||
zwork->zw_fname);
|
||||
warnx("`%s' did not terminate normally", command);
|
||||
return;
|
||||
}
|
||||
if (WEXITSTATUS(zstatus)) {
|
||||
warnx("`%s -f %s' terminated with a non-zero status (%d)",
|
||||
pgm_name, zwork->zw_fname, WEXITSTATUS(zstatus));
|
||||
warnx("`%s' terminated with a non-zero status (%d)", command,
|
||||
WEXITSTATUS(zstatus));
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user