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:
Baptiste Daroussin 2017-12-06 09:44:35 +00:00
parent 78fdf7f396
commit 307845dff2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=326617

View File

@ -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;
}