svn commit: r326617 - head/usr.sbin/newsyslog
Baptiste Daroussin
bapt at FreeBSD.org
Wed Dec 6 09:44:37 UTC 2017
Author: bapt
Date: Wed Dec 6 09:44:35 2017
New Revision: 326617
URL: https://svnweb.freebsd.org/changeset/base/326617
Log:
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.
Modified:
head/usr.sbin/newsyslog/newsyslog.c
Modified: head/usr.sbin/newsyslog/newsyslog.c
==============================================================================
--- head/usr.sbin/newsyslog/newsyslog.c Wed Dec 6 06:49:53 2017 (r326616)
+++ head/usr.sbin/newsyslog/newsyslog.c Wed Dec 6 09:44:35 2017 (r326617)
@@ -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;
}
More information about the svn-src-all
mailing list