--- /dev/null
+diff -up logrotate-3.7.6/logrotate.c.selinux logrotate-3.7.6/logrotate.c
+--- logrotate-3.7.6/logrotate.c.selinux 2007-08-07 09:14:35.000000000 +0200
++++ logrotate-3.7.6/logrotate.c 2008-01-21 09:32:56.000000000 +0100
+@@ -409,15 +409,17 @@ static int copyTruncate(char *currLog, c
+ }
+ #ifdef WITH_SELINUX
+ if (selinux_enabled) {
+- security_context_t oldContext;
++ security_context_t oldContext = NULL;
+ if (fgetfilecon_raw(fdcurr, &oldContext) >= 0) {
+ if (getfscreatecon_raw(&prev_context) < 0) {
+ message(MESS_ERROR,
+ "getting default context: %s\n",
+ strerror(errno));
+ if (selinux_enforce) {
+- freecon(oldContext);
+- return 1;
++ if (oldContext != NULL) {
++ freecon(oldContext);
++ }
++ return 1;
+ }
+ }
+ if (setfscreatecon_raw(oldContext) < 0) {
+@@ -425,11 +427,15 @@ static int copyTruncate(char *currLog, c
+ "setting file context %s to %s: %s\n",
+ saveLog, oldContext, strerror(errno));
+ if (selinux_enforce) {
+- freecon(oldContext);
+- return 1;
++ if (oldContext != NULL) {
++ freecon(oldContext);
++ }
++ return 1;
+ }
+ }
+- freecon(oldContext);
++ if (oldContext != NULL) {
++ freecon(oldContext);
++ }
+ } else {
+ if (errno != ENOTSUP) {
+ message(MESS_ERROR, "getting file context %s: %s\n",
+@@ -899,6 +905,9 @@ int rotateSingleLog(logInfo * log, int l
+ int hasErrors = 0;
+ struct stat sb;
+ int fd;
++#ifdef WITH_SELINUX
++ security_context_t savedContext = NULL;
++#endif
+
+ if (!state->doRotate)
+ return 0;
+@@ -906,7 +915,57 @@ int rotateSingleLog(logInfo * log, int l
+ if (!hasErrors) {
+
+ if (!(log->flags & (LOG_FLAG_COPYTRUNCATE | LOG_FLAG_COPY))) {
+- message(MESS_DEBUG, "renaming %s to %s\n", log->files[logNum],
++#ifdef WITH_SELINUX
++ if (selinux_enabled) {
++ security_context_t oldContext = NULL;
++ int fdcurr = -1;
++
++ if ((fdcurr = open(log->files[logNum], O_RDWR)) < 0) {
++ message(MESS_ERROR, "error opening %s: %s\n",
++ log->files[logNum],
++ strerror(errno));
++ return 1;
++ }
++ if (fgetfilecon_raw(fdcurr, &oldContext) >= 0) {
++ if (getfscreatecon_raw(&savedContext) < 0) {
++ message(MESS_ERROR,
++ "getting default context: %s\n",
++ strerror(errno));
++ if (selinux_enforce) {
++ if (oldContext != NULL) {
++ freecon(oldContext);
++ }
++ return 1;
++ }
++ }
++ if (setfscreatecon_raw(oldContext) < 0) {
++ message(MESS_ERROR,
++ "setting file context %s to %s: %s\n",
++ log->files[logNum], oldContext, strerror(errno));
++ if (selinux_enforce) {
++ if (oldContext != NULL) {
++ freecon(oldContext);
++ }
++ return 1;
++ }
++ }
++ message(MESS_DEBUG, "fscreate context set to %s\n",
++ oldContext);
++ if (oldContext != NULL) {
++ freecon(oldContext);
++ }
++ } else {
++ if (errno != ENOTSUP) {
++ message(MESS_ERROR, "getting file context %s: %s\n",
++ log->files[logNum], strerror(errno));
++ if (selinux_enforce) {
++ return 1;
++ }
++ }
++ }
++ }
++#endif
++ message(MESS_DEBUG, "renaming %s to %s\n", log->files[logNum],
+ rotNames->finalName);
+
+ if (!debug && !hasErrors &&
+@@ -961,6 +1020,15 @@ int rotateSingleLog(logInfo * log, int l
+ close(fd);
+ }
+ }
++#ifdef WITH_SELINUX
++ if (selinux_enabled) {
++ setfscreatecon_raw(savedContext);
++ if (savedContext != NULL) {
++ freecon(savedContext);
++ savedContext = NULL;
++ }
++ }
++#endif
+
+ if (!hasErrors
+ && log->flags & (LOG_FLAG_COPYTRUNCATE | LOG_FLAG_COPY))
+# TODO
+# - bug: when logrotate.status is written truncated (due disk getting full) and
+# the line is partial, it will complain erronously that the line is too long
+# while it just doesn't have the second DATE column. and that error should be
+# ignored as warning not fatal as error.
#
# Conditional build:
%bcond_without selinux # build without SELinux support
Summary(uk.UTF-8): Ротує, компресує, видаляє та відправляє поштою лог-файли
Name: logrotate
Version: 3.7.6
-Release: 2
+Release: 3
License: GPL v2
Group: Applications/System
-# extracted from FC src.rpm
+# Source0Download: ftp://download.fedora.redhat.com/pub/fedora/linux/updates/8/SRPMS/logrotate-3.7.6-2.2.fc8.src.rpm
Source0: %{name}-%{version}.tar.gz
# Source0-md5: cafaaf07c0688398c80ef234d40ec0e4
Source1: %{name}.conf
Source2: %{name}.sysconfig
Patch0: %{name}-man.patch
Patch1: %{name}-cron.patch
+Patch2: %{name}-selinux.patch
%{?with_selinux:BuildRequires: libselinux-devel}
BuildRequires: popt-devel >= 1.3
Requires(post): fileutils
%setup -q
%patch0 -p1
%patch1 -p1
+%patch2 -p1
%build
%{__make} \
%attr(750,root,root) %dir /etc/logrotate.d
%attr(750,root,root) /etc/cron.daily/logrotate
%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/*.conf
-%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/sysconfig/%{name}
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/sysconfig/%{name}
%attr(640,root,root) %ghost %{statdir}/logrotate.status
%attr(750,root,logs) %dir /var/log/archive
%ghost /var/log/archiv