[Pkg-cron-devel] [pkg-cron] 01/01: Remove (again) files that crept in the merge and had been already removed (or renamed) in 2011.

Javier Fernandez-Sanguino Pen~a jfs at moszumanska.debian.org
Fri Oct 24 14:50:22 UTC 2014


This is an automated email from the git hooks/post-receive script.

jfs pushed a commit to branch master
in repository pkg-cron.

commit 9bc55b1ef8a3563ffa215983762b4f7d8bc52aea
Author: Javier Fernandez-Sanguino <jfs at debian.org>
Date:   Fri Oct 24 16:47:22 2014 +0200

    Remove (again) files that crept in the merge and had been
    already removed (or renamed) in 2011.
---
 debian/README.debian                               |  37 --
 debian/cron-se.dirs                                |   2 -
 debian/cron-se.install                             |   3 -
 debian/cron-se.overrides                           |   2 -
 debian/cron-se.postinst                            |  21 -
 debian/cron-se.postrm                              |  20 -
 debian/cron-se.preinst                             |  11 -
 debian/cron-se.prerm                               |  12 -
 debian/examples/stats-cron.pl                      | 357 ---------------
 .../proper_use_streerno_bug_470587.diff            | 153 -------
 .../patches-from-bts/sensible_editor_482284.diff   |  12 -
 debian/patches/features/add-helpmsg-to-new-crontab |  62 ---
 .../features/allow-running-cron-in-foreground      |  51 ---
 debian/patches/features/auditlog-support           |  82 ----
 debian/patches/features/backport-envparser         | 148 -------
 debian/patches/features/better-debugging-support   |  90 ----
 debian/patches/features/confirm-crontab-deletion   |  94 ----
 debian/patches/features/control-header-output      |  53 ---
 .../patches/features/crontab-refuse-eof-without-nl |  43 --
 .../patches/features/debian-logging-configuration  | 204 ---------
 debian/patches/features/debian-paths-and-commands  |  84 ----
 debian/patches/features/debian-specific-issues     |  38 --
 debian/patches/features/dont-die-on-missing-dirs   |  84 ----
 debian/patches/features/dont-fail-on-missing-MTA   |  58 ---
 debian/patches/features/iso-time-format            |  60 ---
 debian/patches/features/mailcmd-dont-timeout       | 447 -------------------
 debian/patches/features/no-argument-is-stdin       |  23 -
 debian/patches/features/option-log-completed-jobs  |  77 ----
 debian/patches/features/pam-env-support            |  69 ---
 debian/patches/features/pam-support                |  99 -----
 debian/patches/features/properly-handle-time-skips | 486 ---------------------
 .../patches/features/recover-from-broken-symlinks  |  65 ---
 debian/patches/features/run-on-reboot              |  56 ---
 .../features/security-make-crontab-setgid-crontab  | 377 ----------------
 debian/patches/features/selinux-support            | 304 -------------
 debian/patches/features/set-contenttype-in-mail    | 131 ------
 .../patches/features/support-for-drop.d-directory  | 334 --------------
 debian/patches/features/swap-both-uid-and-gid      |  36 --
 debian/patches/fixes/abort-crontabs-with-errors    |  39 --
 debian/patches/fixes/allow-crontab-by-users        |  36 --
 debian/patches/fixes/allow-editors-with-tmpfiles   | 311 -------------
 debian/patches/fixes/check-for-broken-command      |  26 --
 debian/patches/fixes/check-for-full-disk           |  53 ---
 debian/patches/fixes/compilation-issues            |  23 -
 .../fixes/correct-flag-setting-in-crontab-entry    |  48 --
 debian/patches/fixes/correct-use-of-error-messages | 152 -------
 debian/patches/fixes/crontab-entry-parsing         |  38 --
 debian/patches/fixes/crontab-file-parsing          |  59 ---
 debian/patches/fixes/crontab-time-parsing          |  22 -
 .../patches/fixes/dont-give-root-on-repeated-edits |  53 ---
 debian/patches/fixes/dont-log-temp-files           |  17 -
 debian/patches/fixes/drop-privileges               | 119 -----
 debian/patches/fixes/general-coding-errors         | 161 -------
 debian/patches/fixes/general-platform-issues       | 194 --------
 debian/patches/fixes/handle-escapes-in-commands    |  48 --
 debian/patches/fixes/limit-args-for-commands       |  35 --
 debian/patches/fixes/make-it-buildable             |  66 ---
 debian/patches/fixes/memory-management-issues      | 300 -------------
 .../patches/fixes/missing-or-broken-defs-and-decls |  27 --
 debian/patches/fixes/parse-envvars-correctly       | 156 -------
 debian/patches/fixes/prevent-tmpfiles-attack       | 113 -----
 debian/patches/fixes/proper-handling-of-stdstreams |  68 ---
 .../patches/fixes/properly-wait-for-spawned-editor |  93 ----
 .../patches/fixes/protect-against-buffer-overflows | 387 ----------------
 .../patches/fixes/root-does-not-override-allowdeny |  40 --
 .../patches/fixes/set-umask-while-editing-crontab  |  33 --
 debian/patches/fixes/signal-handling-issues        |  89 ----
 .../fixes/tolerate-empty-editor-and-visual-envs    |  28 --
 debian/patches/fixes/use-stdlib-for-time           |  61 ---
 debian/patches/fixes/various-mail-fixes            |  97 ----
 debian/patches/other/DEAD-CODE                     |  18 -
 debian/patches/other/changes-to-cron-8             | 158 -------
 debian/patches/other/changes-to-crontab-1          | 170 -------
 debian/patches/other/changes-to-crontab-5          | 268 ------------
 debian/patches/other/changes-to-upstream-README    |  17 -
 debian/patches/series                              |  62 ---
 76 files changed, 7970 deletions(-)

diff --git a/debian/README.debian b/debian/README.debian
deleted file mode 100644
index d74b9a2..0000000
--- a/debian/README.debian
+++ /dev/null
@@ -1,37 +0,0 @@
-cron for DEBIAN
-----------------------
-
-This is the Debian GNU/Linux prepackaged version of Paul Vixie's cron
-subsystem.
-
-Debian's cron development is being done on Alioth:
-http://svn.debian.org/wsvn/pkg-cron
-
-This package was put together by Ian Jackson <iwj10 at cus.cam.ac.uk>,
-from the standard sources to 3.0pl1, as posted to comp.sources.unix.
-Ian obtained them from
-src.doc.ic.ac.uk:/usenet/comp.sources.unix/volume27/vixie-cron.
-
-The changes are essentially the configuration for Debian Linux in the
-Makefile and pathnames.h, and the addition of support for the Debian
-package maintenance scheme in the form of various files (now in the
-debian directory).
-
-File locations that are different than that indicated in 
-the cron distributions README:
-
-user crontabs: /var/spool/cron/crontabs/*
-log file:      /var/log/cron.log
-allow file:    /etc/cron.allow
-deny file:     /etc/cron.deny
-
-Note that the location of the log file can be changed via syslog.conf.
-
-1998: Added reading of crontab fragments from /etc/cron.d to support
-other Debian package cron requirements. Files follow /etc/crontab
-format (i.e. with user field), must meet run-parts(8) naming
-convention (alphanumeric, underscore, hyphen only).
-
-This package is now maintained by Javier Fernández-Sanguino Peña
-<jfs at computer.org> and Christian Kastner <debian at kvr.at>.
-
diff --git a/debian/cron-se.dirs b/debian/cron-se.dirs
deleted file mode 100644
index ca882bb..0000000
--- a/debian/cron-se.dirs
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/bin
-usr/sbin
diff --git a/debian/cron-se.install b/debian/cron-se.install
deleted file mode 100644
index ba2fab1..0000000
--- a/debian/cron-se.install
+++ /dev/null
@@ -1,3 +0,0 @@
-b-cron-se/cron usr/sbin
-b-cron-se/crontab usr/bin
-b-cron-se/cron-se usr/share/lintian/overrides
\ No newline at end of file
diff --git a/debian/cron-se.overrides b/debian/cron-se.overrides
deleted file mode 100644
index 15360f4..0000000
--- a/debian/cron-se.overrides
+++ /dev/null
@@ -1,2 +0,0 @@
-cron-se: binary-without-manpage cron
-cron-se: binary-without-manpage crontab
diff --git a/debian/cron-se.postinst b/debian/cron-se.postinst
deleted file mode 100644
index 5f1661e..0000000
--- a/debian/cron-se.postinst
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-set -e
-
-# Fixup crontab binary, directory and files for new group 'crontab'.
-
-if ! dpkg-statoverride --list /usr/bin/crontab > /dev/null ; then
-    chgrp crontab /usr/bin/crontab
-    chmod g+s /usr/bin/crontab
-fi
-
-if [ -x /etc/init.d/cron ]; then
-	if [ -x /usr/sbin/invoke-rc.d ] ; then
-	       invoke-rc.d cron restart
-	else
-	       /etc/init.d/cron restart
-	fi
-fi
-
-
-
-#DEBHELPER#
diff --git a/debian/cron-se.postrm b/debian/cron-se.postrm
deleted file mode 100644
index de7c179..0000000
--- a/debian/cron-se.postrm
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-set -e
-
-if [ remove = "$1" ]; then
-    dpkg-divert --package cron-se --remove --rename \
-        --divert /usr/sbin/cron.cron /usr/sbin/cron
-    dpkg-divert --package cron-se --remove --rename \
-        --divert /usr/bin/crontab.cron /usr/bin/crontab
-fi
-
-# Restart non-se cron
-if [ -x /etc/init.d/cron ]; then
-	if [ -x /usr/sbin/invoke-rc.d ] ; then
-	       invoke-rc.d cron restart
-	else
-	       /etc/init.d/cron restart
-	fi
-fi
-
-#DEBHELPER#
diff --git a/debian/cron-se.preinst b/debian/cron-se.preinst
deleted file mode 100644
index e9bea18..0000000
--- a/debian/cron-se.preinst
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-set -e
-
-if [ install = "$1"  ]; then
-    dpkg-divert --package cron-se --add --rename \
-        --divert /usr/sbin/cron.cron /usr/sbin/cron
-    dpkg-divert --package cron-se --add --rename \
-        --divert /usr/bin/crontab.cron /usr/bin/crontab
-fi
-
-#DEBHELPER#
diff --git a/debian/cron-se.prerm b/debian/cron-se.prerm
deleted file mode 100644
index 8be5e3f..0000000
--- a/debian/cron-se.prerm
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-set -e
-
-if [ -x /etc/init.d/cron ]; then
-	if [ -x /usr/sbin/invoke-rc.d ] ; then
-	       invoke-rc.d cron stop
-	else
-	       /etc/init.d/cron stop
-	fi
-fi
-
-#DEBHELPER#
diff --git a/debian/examples/stats-cron.pl b/debian/examples/stats-cron.pl
deleted file mode 100644
index 0427eb8..0000000
--- a/debian/examples/stats-cron.pl
+++ /dev/null
@@ -1,357 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Generate stats of Cron messages sent to syslog
-#
-#
-# This script can be used to generate per-user and per-task 
-# statistics in order to determine how much time do cron tasks take
-# and audit cron use. It might be useful to debug issues related
-# to cron tasks that take too much time to run, or overlap, or get executed 
-# too fast..
-#
-# Hint: In some systems, cron tasks might not properly use lockfiles to
-# prevent themselves from being run twice in a row and some "strange"
-# things might happen if the system is overloaded and a cron task takes
-# more than expected. And, no, this is not something that Cron should
-# prevent (for more information see Debian bug #194805).
-#
-# In order for this script to work 
-#
-# together with the logging enhancements included
-# in Debian's vixie cron (3.0pl1-95) that make it possible to log 
-# when do cron tasks end.
-# 
-#
-# How to use:
-# - Modify /etc/init.d/cron so that the calls to cron pass the '-L 2'
-#   argument
-#   (Hint: change lines 27 and 47 so that they end with '-- -L 2 $LSBNAMES'
-#   instead of '-- $LSBNAMES')
-#   In Debian you need cron-3.0pl1-95 or later.
-#   Note: future versions of cron might use an /etc/default/cron file
-#   to provide arguments to cron. 
-#
-# - Review /etc/syslog.conf to determine where does the output of the cron
-#   facility goes to (might be /var/log/syslog together with other messages
-#   but you can also configure syslog to store them at /var/log/cron.log)
-#
-# - Run the script (by default it will read input /var/log/syslog but you
-#   can point to other file using the '-f' switch) and review the output
-#
-# - (Optionally) If you want to analyse log files for a long period
-#   concatenate different log files, extract all CRON related entries
-#   to a file and process that.
-#  
-#   You could do, for example, this:
-#
-#   zcat -f /var/log/syslog* | grep CRON >cron-log ;  \
-#              perl stats-cron.pl -f cron-log
-#   
-#
-# This program is copyright 2006 by Javier Fernandez-Sanguino <jfs at debian.org>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-#
-# For more information please see
-#  http://www.gnu.org/licenses/licenses.html#GPL
-
-# TODO:
-# - Print time internal of file analysis (from 'XXX' to 'XXX') based on the
-#   first and the last log entry read.
-# 
-# - Detect overlaped entries for the same task (start of an entry before the
-#   previous one finished)
-#
-# - Make it possible to filter by users
-#
-# - Consider adapting to other log formats (other cron programs? Solaris?) by
-#   separating analysis and extraction in the code and making it possible
-#   to switch to different analysis methods.
-
-
-# Required modules
-eval 'use Parse::Syslog';
-if ($@) {
-	print STDERR "ERROR: Parse::Syslog not installed, please install this Perl library\n";
-	print STDERR "ERROR: (in Debian it is provided by the 'libparse-syslog-perl' package)\n";
-	exit 1;
-}
-use Parse::Syslog;
-use Getopt::Std;
-# Parse command line
-getopts('d:hvf:');
-$opt_d = 0 if ! defined ($opt_d) ;
-
-if ( $opt_h ) {
-	print "Usage: $ARGV[0] [-dhv] [-f syslog file]";
-	exit 1;
-}
-
-# Note: in Debian's default syslog configuration log messages are 
-# sent to /var/log/syslog but you might have edited it to use
-# /var/log/cron.log instead. Which, BTW, is more efficient because
-# we do not need to parse the syslog to extract only cron messages.
-my $LOGFILE = $opt_f || "/var/log/syslog";
-
-# Sanity checks
-if ( ! -r $LOGFILE ) {
-	print STDERR "ERROR: Cannot read logfile $LOGFILE";
-}
-
-my $parser = Parse::Syslog->new( $LOGFILE);
-print STDERR "Starting parse of file $LOGFILE\n" if $opt_v;
-while(my $log = $parser->next) {
-	if ( $log->{program} =~ /CRON/ ) {
-		print STDERR "DEBUG: Found syslog entry: $log->{pid}\n" if $opt_d;
-# We extract the entries with the same text but with 'CMD' (start)
-# and 'END' (end) to check if it's the same we use the PID, the
-# PID of END (generated by the parent process) is PID-1 of CMD
-		if ($log->{text} =~ /CMD \(/) {
-			add_entry($log->{timestamp},$log->{text},$log->{pid});
-		}
-		if ($log->{text} =~ /END \(/) {
-			clear_entry($log->{timestamp},$log->{text},$log->{pid});
-		}
-	}
-}
-print STDERR "Finished parse of file $LOGFILE\n" if $opt_v;
-
-
-# Analysis, we find all entries with a start and stop timestamp 
-# and print them
-generate_analysis();
-
-# Stats:
-# - average time of execution of cron jobs
-# - cronjob which executed slowest
-# - cronjob which executed fastes
-# - cronjobs which start before they finish
-print_stats();
-
-exit 0;
-
-sub find_user {
-# Extract a user from a cron entry
-	my ($text) = @_;
-	my $user = "";
-	if ( $text =~ /^\((.*?)\)/ ) {
-		$user = $1;
-	} 
-	return $user;
-}
-
-sub find_prg {
-# Extract a program from a cron entry
-	my ($text) = @_;
-	my $prg = "";
-	if ( $text =~ /(CM|EN)D\s*\((.*)\s*\)\s*$/ ) {
-		$prg = $2;
-	}
-	return $prg;
-}
-
-sub add_entry {
-# Get a syslog entry and add it to the table of entries for analysis
-	my ($time, $text, $pid) = @_;
-	my ($user, $prg);
-	print STDERR "DEBUG: Entering add_entry with @_\n" if $opt_d; 
-	$user = find_user($text);
-	if ( ! defined ($user) ) {
-		print STDERR "WARN: Cannot find user for cron job (pid $pid)\n";
-		return;
-	}
-	$prg  = find_prg($text);
-	if ( ! defined ($prg) ) {
-		print STDERR "WARN: Cannot find program for cron job (pid $pid)\n";
-		return;
-	}
-	my $value = $pid."-".$time;
-	print STDERR "DEBUG: Adding cronjob of user $user to list: $prg\n" if $opt_d;
-	add_cron_entry($user, $prg, $value);
-	$cron_entries{$user}{$prg}{'count'}++;
-	return;
-}
-
-sub clear_entry {
-# Get a syslog entry, find the start entry and add the timestamp difference
-# to the list of timestamps for that user
-#
-	my ($timestamp, $text, $pid) = @_;
-	my ($user, $prg, $entry, $count);
-	my @array; my @stack;
-	print STDERR "DEBUG: Entering clear_entry with @_\n" if $opt_d; 
-	$user = find_user($text);
-	if ( $user eq "" ) {
-		print STDERR "WARN: Cannot find user for cron job (pid $pid)\n";
-		return;
-	}
-	$prg  = find_prg($text);
-	if ( $prg eq "" ) {
-		print STDERR "WARN: Cannot find program for cron job (pid $pid)\n";
-		return;
-	}
-	if ( ! defined ( $cron_entries{$user}{$prg}{'item'} ) ) {
-		print STDERR "WARN: End entry without start entry (pid $pid)\n";
-		return;
-	}
-	@array = split(':', $cron_entries{$user}{$prg}{'item'});
-	$count = $#array + 1 ;
-	print STDERR "DEBUG: $count cron entries for $user, task '$prg'\n" if $opt_d;
-	my $finish = 0;
-	while ( $finish == 0 ) {
-		$entry = pop @array;
-		last if ! defined ($entry) ;
-	# Pop all entries and look for one whose pid is ours -1
-		my ($spid, $stimestamp) =  split ("-", $entry);
-		print  STDERR "DEBUG: Comparing entry $spid to $pid\n" if $opt_d;
-		if  ( $pid-$spid <= 1 ) {
-			my $timediff =  $timestamp-$stimestamp;
-			print STDERR "DEBUG: Entries match, time difference of $timediff\n" if $opt_d ;
-			$cron_entries{$user}{$prg}{'finished'}++;
-			if (defined ( $cron_times{$user}{$prg} ) ) { 
-				$cron_times{$user}{$prg} = join(":", $cron_times{$user}{$prg}, $timediff);
-			} else {
-				$cron_times{$user}{$prg} = $timediff;
-			}
-			$finish = 1;
-		} else {
-			print STDERR "DEBUG: Pushing entry $spid into stack\n" if $opt_d;
-			push @stack, $entry;
-		}
-	}
-	# Push all remaining entries to the stack
-	$cron_entries{$user}{$prg}{'item'}="";
-	$count = $#array + 1 ;
-	if ($opt_d) {
-		print STDERR "DEBUG: Restoring all entries (size: array $count";
-		$count = $#stack + 1 ;
-		print STDERR ", stack $count)\n";
-	}
-	print STDERR "DEBUG: Total finished tasks: $cron_entries{$user}{$prg}{'finished'} out of $cron_entries{$user}{$prg}{'count'}\n" if defined $cron_entries{$user}{$prg}{'finished'} && $opt_d;
-	print STDERR "DEBUG: Unmatched now: $cron_entries{$user}{$prg}{'item'}\n" if $opt_d;
-	while ( $entry = pop @array ) {
-		add_cron_entry($user, $prg, $entry);
-	}
-	while ( $entry = pop @stack ) {
-		add_cron_entry($user, $prg, $entry);
-	}
-	print STDERR "DEBUG: Finish execution of clear_entry\n" if $opt_d;
-	return;
-}
-
-sub add_cron_entry {
-	my ($user, $prg, $entry) = @_;
-	if ( defined ($cron_entries{$user}{$prg}) &&  $cron_entries{$user}{$prg} ne "" ) { 
-		$cron_entries{$user}{$prg}{'item'} = join(":", $cron_entries{$user}{$prg}{'item'}, $entry);
-	} else {
-		$cron_entries{$user}{$prg}{'item'} = $entry;
-	}
-}
-
-sub count_unmatched {
-	my ($user, $prg) = @_;
-	my ($count, @array);
-	return 0 if ! defined ( $cron_entries{$user}{$prg}{'item'} ); 
-	@array = split(':', $cron_entries{$user}{$prg}{'item'});
-	$count = $#array + 1 ;
-	return $count;
-}
-
-sub find_average {
-	my ($user, $prg) = @_;
-	my ($average, $count, $total, @array, $entry);
-	$total = 0 ;
-	return -1 if ! defined ( $cron_times{$user}{$prg} ); 
-	@array = split(':', $cron_times{$user}{$prg});
-	$count = $#array + 1 ;
-	while ( defined ( $entry = pop @array ) ) {
-		$total += $entry;
-	}
-	$average = $total / $count;
-	return $average;
-}
-
-sub find_minimum {
-	my ($user, $prg) = @_;
-	my ($minimum, @array, $entry);
-	$minimum = -1;
-	return -1 if ! defined ( $cron_times{$user}{$prg} ); 
-	@array = split(':', $cron_times{$user}{$prg});
-	while ( defined ( $entry = pop @array ) ) {
-		if ( $minimum == -1 ) {
-			$minimum = $entry;
-		} else {
-			$minimum = $entry if $entry < $minimum;
-		}
-	}
-	return $minimum;
-}
-
-sub find_maximum {
-	my ($user, $prg) = @_;
-	my ($maximum, @array);
-	$maximum = -1;
-	return -1 if ! defined ( $cron_times{$user}{$prg} ); 
-	@array = split(':', $cron_times{$user}{$prg});
-	while ( defined ( $entry = pop @array ) ) {
-		if ( $maximum == -1 ) {
-			$maximum = $entry ;
-		} else { 
-			$maximum = $entry if $entry > $maximum;
-		}
-	}
-	return $maximum;
-}
-
-
-
-sub generate_analysis {
-# For each user and program calculate the average time for the task
-	my ($user, $prg);
-	foreach $user (keys %cron_entries) {
-		print STDERR "DEBUG: Calculating data for user '$user'\n" if $opt_d;
-		foreach my $prg ( keys %{$cron_entries{$user}} ) {
-			print STDERR "DEBUG: Calculating data for task '$prg'\n" if $opt_d;
-			my $unmatched = count_unmatched($user, $prg);
-			my $average = find_average($user, $prg);
-			my $minimum = find_minimum($user, $prg);
-			my $maximum = find_maximum($user, $prg);
-			$cron_entries{$user}{$prg}{'unmatched'} = $unmatched;
-			$cron_entries{$user}{$prg}{'average'} = $average;
-			$cron_entries{$user}{$prg}{'minimum'} = $minimum;
-			$cron_entries{$user}{$prg}{'maximum'} = $maximum;
-		}
-	}
-}
-
-sub print_stats {
-# Print information of cron statistics
-	my ($user, $prg);
-	foreach  $user (keys %cron_entries) {
-		print "Cron statistics for user '$user'\n";
-		foreach $prg ( keys %{$cron_entries{$user}} ) {
-			print "\tTask: '$prg'\n";
-			print "\t\tDEBUG: $cron_times{$user}{$prg}\n" if $opt_d;
-			print <<EOF
-\t\tTotal: $cron_entries{$user}{$prg}{'count'}
-\t\tFinished: $cron_entries{$user}{$prg}{'finished'}
-\t\tUnmatched: $cron_entries{$user}{$prg}{'unmatched'}
-\t\tAvg time: $cron_entries{$user}{$prg}{'average'}
-\t\tMin time: $cron_entries{$user}{$prg}{'minimum'}
-\t\tMax time: $cron_entries{$user}{$prg}{'maximum'}
-EOF
-		}
-	}
-}
diff --git a/debian/patches-from-bts/proper_use_streerno_bug_470587.diff b/debian/patches-from-bts/proper_use_streerno_bug_470587.diff
deleted file mode 100644
index 0acc0a3..0000000
--- a/debian/patches-from-bts/proper_use_streerno_bug_470587.diff
+++ /dev/null
@@ -1,153 +0,0 @@
-diff -u cron-3.0pl1/misc.c cron-3.0pl1/misc.c
---- cron-3.0pl1/misc.c
-+++ cron-3.0pl1/misc.c
-@@ -203,8 +203,7 @@
- 			fprintf(stderr, "%s: created\n", CRONDIR);
- 			stat(CRONDIR, &sb);
- 		} else {
--			fprintf(stderr, "%s: ", CRONDIR);
--			perror("mkdir");
-+			fprintf(stderr, "%s: mkdir: %s\n", CRONDIR, strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 	}
-@@ -214,8 +213,7 @@
- 		exit(ERROR_EXIT);
- 	}
- 	if (chdir(CRONDIR) < OK) {
--		fprintf(stderr, "cannot chdir(%s), bailing out.\n", CRONDIR);
--		perror(CRONDIR);
-+		fprintf(stderr, "%s: chdir: %s\n", CRONDIR, strerror(errno));
- 		exit(ERROR_EXIT);
- 	}
- 
-@@ -227,8 +225,7 @@
- 			fprintf(stderr, "%s: created\n", SPOOL_DIR);
- 			stat(SPOOL_DIR, &sb);
- 		} else {
--			fprintf(stderr, "%s: ", SPOOL_DIR);
--			perror("mkdir");
-+			fprintf(stderr, "%s: mkdir: %s\n", SPOOL_DIR, strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 	}
-@@ -507,9 +504,8 @@
- 	if (LogFD < OK) {
- 		LogFD = open(LOG_FILE, O_WRONLY|O_APPEND|O_CREAT, 0600);
- 		if (LogFD < OK) {
--			fprintf(stderr, "%s: can't open log file\n",
--				ProgramName);
--			perror(LOG_FILE);
-+			fprintf(stderr, "%s: %s: open: %s\n",
-+				ProgramName, LOG_FILE, strerror(errno));
- 		} else {
- 			(void) fcntl(LogFD, F_SETFD, 1);
- 		}
-diff -u cron-3.0pl1/crontab.c cron-3.0pl1/crontab.c
---- cron-3.0pl1/crontab.c
-+++ cron-3.0pl1/crontab.c
-@@ -326,8 +326,7 @@
- 		if (errno == ENOENT) 
- 			fprintf(stderr, "no crontab for %s\n", User);
- 		else {
--                        fprintf(stderr, "%s/", CRONDIR);
--			perror(n);
-+                        fprintf(stderr, "%s/: fopen: %s\n", n, strerror(errno));
-                 }
- 		exit(ERROR_EXIT);
- 	} else if ((fd=fileno(f))==-1) {
-@@ -413,8 +412,7 @@
- 		if (errno == ENOENT)
- 			fprintf(stderr, "no crontab for %s\n", User);
- 		else {
--                        fprintf(stderr, "%s/", CRONDIR);
--			perror(n);
-+                        fprintf(stderr, "%s/: unlink: %s\n", CRONDIR, strerror(errno));
-                 }
- 		exit(ERROR_EXIT);
- 	}
-@@ -583,8 +581,7 @@
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
- 	if (!(f = fopen(n, "r"))) {
- 		if (errno != ENOENT) {
--                        fprintf(stderr, "%s/", CRONDIR);
--			perror(n);
-+                        fprintf(stderr, "%s/: fdopen: %s", n, strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 		fprintf(stderr, "no crontab for %s - using an empty one\n",
-@@ -875,14 +872,12 @@
- 	um = umask(077);
- 	fd = mkstemp(tn);
- 	if (fd < 0) {
--                fprintf(stderr, "%s/", CRONDIR);
--		perror(tn);
-+                fprintf(stderr, "%s/: mkstemp: %s\n", CRONDIR, strerror(errno));
- 		return(-2);
- 	}
- 	tmp = fdopen(fd, "w+");
- 	if (!tmp) {
--                fprintf(stderr, "%s/", CRONDIR);
--		perror(tn);
-+                fprintf(stderr, "%s/: fdopen: %s\n", CRONDIR, strerror(errno));
- 		return (-2);
- 	}
- 	(void) umask(um);
-@@ -903,9 +898,8 @@
- 		putc(ch, tmp);
- 
- 	if (ferror(tmp) || fflush(tmp) || fsync(fd)) {
--		fprintf(stderr, "%s: error while writing new crontab to %s\n",
--			ProgramName, tn);
--		perror("Error");
-+		fprintf(stderr, "%s: %s: %s\n",
-+			ProgramName, tn, strerror(errno));
- 		fclose(tmp);  unlink(tn);
- 		return (-2);
- 	}
-@@ -969,9 +963,8 @@
-         }
- 
- 	if (rename(tn, n)) {
--		fprintf(stderr, "%s: error renaming %s to %s\n",
--			ProgramName, tn, n);
--		perror("rename");
-+		fprintf(stderr, "%s: %s: rename: %s\n",
-+			ProgramName, n, strerror(errno));
- 		unlink(tn);
- 		return (-2);
- 	}
-@@ -994,16 +987,14 @@
- 	(void) gettimeofday(&tvs[0], &tz);
- 	tvs[1] = tvs[0];
- 	if (utimes(SPOOL_DIR, tvs) < OK) {
--		fprintf(stderr, "crontab: can't update mtime on spooldir\n");
--                fprintf(stderr, "%s/", CRONDIR);
--		perror(SPOOL_DIR);
-+                fprintf(stderr, "%s/: utimes: %s", CRONDIR, strerror(errno));
-+		fputs("crontab: can't update mtime on spooldir\n", stderr);
- 		return;
- 	}
- #else
- 	if (utime(SPOOL_DIR, NULL) < OK) {
--		fprintf(stderr, "crontab: can't update mtime on spooldir\n");
--                fprintf(stderr, "%s/", CRONDIR);
--		perror(SPOOL_DIR);
-+                fprintf(stderr, "%s: utime: %s\n", CRONDIR, strerror(errno));
-+		fputs("crontab: can't update mtime on spooldir\n", stderr);
- 		return;
- 	}
- #endif /*USE_UTIMES*/
-diff -u cron-3.0pl1/do_command.c cron-3.0pl1/do_command.c
---- cron-3.0pl1/do_command.c
-+++ cron-3.0pl1/do_command.c
-@@ -342,8 +342,7 @@
- 			}
- #endif
-                         execle(shell, shell, "-c", e->cmd, (char *)0, jobenv);
--			fprintf(stderr, "execl: couldn't exec `%s'\n", shell);
--			perror("execl");
-+			fprintf(stderr, "%s: execle: %s\n", shell, strerror(errno));
- 			_exit(ERROR_EXIT);
- 		}
- 		break;
diff --git a/debian/patches-from-bts/sensible_editor_482284.diff b/debian/patches-from-bts/sensible_editor_482284.diff
deleted file mode 100644
index 6480a83..0000000
--- a/debian/patches-from-bts/sensible_editor_482284.diff
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -upr cron-3.0pl1.orig/pathnames.h cron-3.0pl1/pathnames.h
---- cron-3.0pl1.orig/pathnames.h	2008-05-21 10:42:06.064487361 -0500
-+++ cron-3.0pl1/pathnames.h	2008-05-21 10:41:34.412450000 -0500
-@@ -75,7 +75,7 @@
- 			 * environment variable specified.
- 			 */
- #if defined(DEBIAN)
--# define EDITOR "/usr/bin/editor"
-+# define EDITOR "/usr/bin/sensible-editor"
- #elif defined(_PATH_VI)
- # define EDITOR _PATH_VI
- #else
diff --git a/debian/patches/features/add-helpmsg-to-new-crontab b/debian/patches/features/add-helpmsg-to-new-crontab
deleted file mode 100644
index 4e6d02d..0000000
--- a/debian/patches/features/add-helpmsg-to-new-crontab
+++ /dev/null
@@ -1,62 +0,0 @@
-Subject: Add a helpful header to a new crontab
-Author: Javier Fernández-Sanguino Peña <jfs at debian.org>
-Last-Update: 2010-04-11
-
-When creating a new crontab, seed it with helpful instructions (as comments) on
-how to create an entry.
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:57.090560587 +0200
-+++ patched/crontab.c	2010-05-06 18:18:57.762561131 +0200
-@@ -549,6 +549,7 @@
- 	WAIT_T		waiter;
- 	PID_T		pid, xpid;
- 	mode_t		um;
-+	int             add_help_text = 0;
- 
- 	log_it(RealUser, Pid, "BEGIN EDIT", User);
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
-@@ -563,6 +564,7 @@
- 			perror("/dev/null");
- 			exit(ERROR_EXIT);
- 		}
-+		add_help_text = 1;
- 	}
- 
- 	um = umask(077);
-@@ -581,6 +583,33 @@
- 
- 	Set_LineNum(1)
- 
-+	if (add_help_text) {
-+		fprintf(NewCrontab, 
-+"# Edit this file to introduce tasks to be run by cron.\n"
-+"# \n"
-+"# Each task to run has to be defined through a single line\n"
-+"# indicating with different fields when the task will be run\n"
-+"# and what command to run for the task\n"
-+"# \n"
-+"# To define the time you can provide concrete values for\n"
-+"# minute (m), hour (h), day of month (dom), month (mon),\n"
-+"# and day of week (dow) or use '*' in these fields (for 'any')."
-+"# \n"
-+"# Notice that tasks will be started based on the cron's system\n"
-+"# daemon's notion of time and timezones.\n"
-+"# \n"
-+"# Output of the crontab jobs (including errors) is sent through\n"
-+"# email to the user the crontab file belongs to (unless redirected).\n"
-+"# \n"
-+"# For example, you can run a backup of all your user accounts\n"
-+"# at 5 a.m every week with:\n"
-+"# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/\n"
-+"# \n"
-+"# For more information see the manual pages of crontab(5) and cron(8)\n" 
-+"# \n"
-+"# m h  dom mon dow   command\n" );
-+	}
-+
- 	/* ignore the top few comments since we probably put them there.
- 	 */
- 	for (x = 0;  x < NHEADER_LINES;  x++) {
diff --git a/debian/patches/features/allow-running-cron-in-foreground b/debian/patches/features/allow-running-cron-in-foreground
deleted file mode 100644
index abde843..0000000
--- a/debian/patches/features/allow-running-cron-in-foreground
+++ /dev/null
@@ -1,51 +0,0 @@
-Subject: Allow running cron in foreground
-Last-Update: 2010-04-11
-
-Allow running cron in foreground if one wishes to do so.
-
-Bug-Debian: http://bugs.debian.org/108492
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:54.665561020 +0200
-+++ patched/cron.c	2010-05-06 18:18:55.651562056 +0200
-@@ -117,7 +117,7 @@
- 	if (0) {
- # endif
- 		(void) fprintf(stderr, "[%d] cron started\n", getpid());
--	} else {
-+	} else if (!stay_foreground) {
- 		switch (fork()) {
- 		case -1:
- 			log_it("CRON",getpid(),"DEATH","can't fork");
-@@ -464,12 +464,16 @@
- {
- 	int	argch;
- 
-+	stay_foreground = 0;
-         lsbsysinit_mode = 0;
- 
--	while (EOF != (argch = getopt(argc, argv, "lx:"))) {
-+	while (EOF != (argch = getopt(argc, argv, "lfx:"))) {
- 		switch (argch) {
- 		default:
- 			usage();
-+		case 'f':
-+			stay_foreground = 1;
-+			break;
- 		case 'x':
- 			if (!set_debug_flags(optarg))
- 				usage();
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:54.665561020 +0200
-+++ patched/cron.h	2010-05-06 18:18:55.651562056 +0200
-@@ -290,6 +290,7 @@
- time_min clockTime;
- static long GMToff;
- 
-+int	stay_foreground;
- int     lsbsysinit_mode;
- 
- char    cron_default_mail_charset[MAX_ENVSTR] = "";
diff --git a/debian/patches/features/auditlog-support b/debian/patches/features/auditlog-support
deleted file mode 100644
index d89bb9f..0000000
--- a/debian/patches/features/auditlog-support
+++ /dev/null
@@ -1,82 +0,0 @@
-Subject: Auditlog support
-Last-Update: 2010-04-11
-
-Auditlog support.
-Index: patched/Makefile
-===================================================================
---- patched.orig/Makefile	2010-05-06 18:18:48.837561139 +0200
-+++ patched/Makefile	2010-05-06 18:18:53.301142936 +0200
-@@ -55,7 +55,7 @@
- INCLUDE		=	-I.
- #INCLUDE	=
- #<<need getopt()>>
--LIBS		= $(PAM_LIBS) $(SELINUX_LIBS)
-+LIBS		= $(PAM_LIBS) $(SELINUX_LIBS) $(AUDIT_LIBS)
- #<<optimize or debug?>>
- OPTIM		=	-O2
- #OPTIM		=	-g
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:52.595435667 +0200
-+++ patched/misc.c	2010-05-06 18:18:53.301435633 +0200
-@@ -36,6 +36,9 @@
- #include <string.h>
- #include <fcntl.h>
- #include <grp.h>
-+#ifdef WITH_AUDIT
-+#include <libaudit.h>
-+#endif
- #if defined(SYSLOG)
- # include <syslog.h>
- #endif
-@@ -461,7 +464,17 @@
- {
- 	static int	init = FALSE;
- 	static FILE	*allow, *deny;
-+	int     isallowed;
-+
-+        /* Root cannot be denied execution of cron jobs even if in the
-+	 * 'DENY_FILE' so we return inmediately */
-+        if (strcmp(username, ROOT_USER) == 0)
-+                return (TRUE);
- 
-+	isallowed = FALSE;
-+#if defined(ALLOW_ONLY_ROOT)
-+	Debug(DMISC, "only root access is allowed")
-+#else
- 	if (!init) {
- 		init = TRUE;
- #if defined(ALLOW_FILE) && defined(DENY_FILE)
-@@ -474,16 +487,24 @@
- #endif
- 	}
- 
--	if (allow)
--		return (in_file(username, allow));
--	if (deny)
--		return (!in_file(username, deny));
-+	if (allow) 
-+		isallowed = in_file(username, allow);
-+	else
-+		isallowed = TRUE; /* Allow access if ALLOW_FILE does not exist */
-+	if (deny && !allow)
-+		isallowed = !in_file(username, deny);
-+#endif
- 
--#if defined(ALLOW_ONLY_ROOT)
--	return (strcmp(username, ROOT_USER) == 0);
--#else
--	return TRUE;
-+#ifdef WITH_AUDIT
-+       /* Log an audit message if the user is rejected */ 
-+       if (isallowed == FALSE) {
-+               int audit_fd = audit_open();
-+               audit_log_user_message(audit_fd, AUDIT_USER_START, "cron deny",
-+                       NULL, NULL, NULL, 0);
-+               close(audit_fd);
-+       }
- #endif
-+	return isallowed;
- }
- 
- 
diff --git a/debian/patches/features/backport-envparser b/debian/patches/features/backport-envparser
deleted file mode 100644
index c225bc0..0000000
--- a/debian/patches/features/backport-envparser
+++ /dev/null
@@ -1,148 +0,0 @@
-Subject: Backport the crontab environment parser from 4.1
-Origin: backport, http://ftp.isc.org/isc/cron/cron_4.1.shar
-Last-Update: 2010-04-29
-
-The 3.0 parser is crude and may misparse crontab entries containing equal signs
-(=). This patch backports the parser from the 4.1 release.
-
-Bug-Debian: http://bugs.debian.org/437180
-Index: patched/env.c
-===================================================================
---- patched.orig/env.c	2010-05-06 18:18:28.216436280 +0200
-+++ patched/env.c	2010-05-06 18:19:03.459436043 +0200
-@@ -128,6 +128,17 @@
- 	return (p);
- }
- 
-+/* The following states are used by load_env(), traversed in order: */
-+enum env_state {
-+	NAMEI,		/* First char of NAME, may be quote */
-+	NAME,		/* Subsequent chars of NAME */
-+	EQ1,		/* After end of name, looking for '=' sign */
-+	EQ2,		/* After '=', skipping whitespace */
-+	VALUEI,		/* First char of VALUE, may be quote */
-+	VALUE,		/* Subsequent chars of VALUE */
-+	FINI,		/* All done, skipping trailing whitespace */
-+	ERROR,		/* Error */
-+};
- 
- /* return	ERR = end of file
-  *		FALSE = not an env setting (file was repositioned)
-@@ -140,8 +151,9 @@
- {
- 	long	filepos;
- 	int	fileline;
--	char	name[MAX_ENVSTR], val[MAX_ENVSTR];
--	int	fields;
-+	enum env_state state;
-+	char name[MAX_ENVSTR], val[MAX_ENVSTR];
-+	char quotechar, *c, *str;
- 
- 	filepos = ftell(f);
- 	fileline = LineNumber;
-@@ -153,20 +165,90 @@
- 
- 	Debug(DPARS, ("load_env, read <%s>\n", envstr))
- 
--	name[0] = val[0] = '\0';
--	fields = sscanf(envstr, "%[^ =] = %[^\n#]", name, val);
--	if (fields != 2) {
--		Debug(DPARS, ("load_env, not 2 fields (%d)\n", fields))
-+	bzero(name, sizeof name);
-+	bzero(val, sizeof val);
-+	str = name;
-+	state = NAMEI;
-+	quotechar = '\0';
-+	c = envstr;
-+	while (state != ERROR && *c) {
-+		switch (state) {
-+		case NAMEI:
-+		case VALUEI:
-+			if (*c == '\'' || *c == '"')
-+				quotechar = *c++;
-+			state++;
-+			/* FALLTHROUGH */
-+		case NAME:
-+		case VALUE:
-+			if (quotechar) {
-+				if (*c == quotechar) {
-+					state++;
-+					c++;
-+					break;
-+				}
-+				if (state == NAME && *c == '=') {
-+					state = ERROR;
-+					break;
-+				}
-+			} else {
-+				if (state == NAME) {
-+					if (isspace((unsigned char)*c)) {
-+						c++;
-+						state++;
-+						break;
-+					}
-+					if (*c == '=') {
-+						state++;
-+						break;
-+					}
-+				}
-+			}
-+			*str++ = *c++;
-+			break;
-+
-+		case EQ1:
-+			if (*c == '=') {
-+				state++;
-+				str = val;
-+				quotechar = '\0';
-+			} else {
-+				if (!isspace((unsigned char)*c))
-+					state = ERROR;
-+			}
-+			c++;
-+			break;
-+
-+		case EQ2:
-+		case FINI:
-+			if (isspace((unsigned char)*c))
-+				c++;
-+			else
-+				state++;
-+			break;
-+
-+		default:
-+			abort();
-+		}
-+	}
-+	if (state != FINI && !(state == VALUE && !quotechar)) {
-+		Debug(DPARS, ("load_env, not an env var, state = %d\n", state))
- 		fseek(f, filepos, 0);
- 		Set_LineNum(fileline);
- 		return (FALSE);
- 	}
-+	if (state == VALUE) {
-+		/* End of unquoted value: trim trailing whitespace */
-+		c = val + strlen(val);
-+		while (c > val && isspace((unsigned char)c[-1]))
-+			*(--c) = '\0';
-+	}
- 
--	/* 2 fields from scanf; looks like an env setting
--	 */
-+	/* 2 fields from parser; looks like an env setting */
- 
- 	/*
--	 * process value string
-+	 * This can't overflow because get_string() limited the size of the
-+	 * name and val fields.  Still, it doesn't hurt to be careful...
- 	 */
- 	/*local*/{
- 		int	len = strdtb(val);
-@@ -188,7 +270,6 @@
- 	return (TRUE);
- }
- 
--
- char *
- env_get(name, envp)
- 	register char	*name;
diff --git a/debian/patches/features/better-debugging-support b/debian/patches/features/better-debugging-support
deleted file mode 100644
index b2e8540..0000000
--- a/debian/patches/features/better-debugging-support
+++ /dev/null
@@ -1,90 +0,0 @@
-Subject: Better debugging support
-Last-Update: 2010-04-11
-
-Extend debugging options, etc...
-Index: patched/Makefile
-===================================================================
---- patched.orig/Makefile	2010-05-06 18:18:21.821436206 +0200
-+++ patched/Makefile	2010-05-06 18:18:44.879435811 +0200
-@@ -71,9 +71,10 @@
- #<<want to use a nonstandard CC?>>
- #CC		=	vcc
- #<<manifest defines>>
--DEFS		=
-+# Allow override from command line
-+DEBUG_DEFS = -DDEBUGGING=0   
- # The -DUSE_SIGCHLD is needed for the Alpha port
--DEFS = -DDEBIAN -DUSE_SIGCHLD
-+DEFS = -DDEBIAN -DUSE_SIGCHLD $(DEBUG_DEFS)
- #(SGI IRIX systems need this)
- #DEFS		=	-D_BSD_SIGNALS -Dconst=
- #<<the name of the BSD-like install program>>
-Index: patched/config.h
-===================================================================
---- patched.orig/config.h	2010-05-06 18:18:31.635435778 +0200
-+++ patched/config.h	2010-05-06 18:18:44.880437493 +0200
-@@ -29,6 +29,7 @@
-  */
- 
- #ifndef DEBUGGING
-+#error DEBUGGING not defined
- #define DEBUGGING 1	/* 1 or 0 -- do you want debugging code built in? */
- #endif
- 
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:38.503560917 +0200
-+++ patched/cron.c	2010-05-06 18:18:44.880437493 +0200
-@@ -48,7 +48,16 @@
- 
- static void
- usage() {
--	fprintf(stderr, "usage:  %s [-x debugflag[,...]]\n", ProgramName);
-+#if DEBUGGING
-+	char **dflags;
-+
-+	fprintf(stderr, "usage:  %s [-x [", ProgramName);
-+	for(dflags = DebugFlagNames; *dflags; dflags++)
-+		fprintf(stderr, "%s%s", *dflags, dflags[1] ? "," : "]");
-+	fprintf(stderr, "]\n");
-+#else
-+	fprintf(stderr, "usage: %s\n", ProgramName);
-+#endif
- 	exit(ERROR_EXIT);
- }
- 
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:43.421561039 +0200
-+++ patched/crontab.c	2010-05-06 18:18:44.880437493 +0200
-@@ -148,6 +148,12 @@
- 	/*NOTREACHED*/
- }
- 	
-+#if DEBUGGING
-+char *getoptarg = "u:lerix:";
-+#else
-+char *getoptarg = "u:leri";
-+#endif
-+
- 
- static void
- parse_args(argc, argv)
-@@ -170,12 +176,16 @@
- 	}
- 	Filename[0] = '\0';
- 	Option = opt_unknown;
--	while (EOF != (argch = getopt(argc, argv, "u:lerx:"))) {
-+
-+	while (EOF != (argch = getopt(argc, argv, getoptarg))) {
- 		switch (argch) {
-+#if DEBUGGING
- 		case 'x':
- 			if (!set_debug_flags(optarg))
- 				usage("bad debug option");
-+			usage("unrecognized option");
- 			break;
-+#endif
- 		case 'u':
- 			if (!(pw = getpwnam(optarg)))
- 			{
diff --git a/debian/patches/features/confirm-crontab-deletion b/debian/patches/features/confirm-crontab-deletion
deleted file mode 100644
index 180ae11..0000000
--- a/debian/patches/features/confirm-crontab-deletion
+++ /dev/null
@@ -1,94 +0,0 @@
-Subject: Ask for confirmation when deleting crontab
-Author: Javier Fernández-Sanguino Peña <jfs at debian.org>
-Last-Update: 2010-04-11
-
-Add the ability to request confirmation before deleting a crontab.
-
-Bug-Debian: http://bugs.debian.org/513379
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:56.391036364 +0200
-+++ patched/crontab.c	2010-05-06 18:18:57.090560587 +0200
-@@ -60,6 +60,7 @@
- static	char		Directory[MAX_FNAME];
- static	FILE		*NewCrontab = NULL;
- static	int		CheckErrorCount;
-+static  int             PromptOnDelete;
- static	enum opt_t	Option;
- static	struct passwd	*pw;
- static	void		list_cmd __P((void)),
-@@ -81,11 +82,12 @@
- {
- 	fprintf(stderr, "%s: usage error: %s\n", ProgramName, msg);
- 	fprintf(stderr, "usage:\t%s [-u user] file\n", ProgramName);
--	fprintf(stderr, "\t%s [-u user] { -e | -l | -r }\n", ProgramName);
-+	fprintf(stderr, "\t%s [ -u user ] [ -i ] { -e | -l | -r }\n", ProgramName);
- 	fprintf(stderr, "\t\t(default operation is replace, per 1003.2)\n");
- 	fprintf(stderr, "\t-e\t(edit user's crontab)\n");
- 	fprintf(stderr, "\t-l\t(list user's crontab)\n");
- 	fprintf(stderr, "\t-r\t(delete user's crontab)\n");
-+        fprintf(stderr, "\t-i\t(prompt before deleting user's crontab)\n");
- 	exit(ERROR_EXIT);
- }
- 
-@@ -175,6 +177,7 @@
- 	}
- 	Filename[0] = '\0';
- 	Option = opt_unknown;
-+        PromptOnDelete = 0;
- 
- 	while (EOF != (argch = getopt(argc, argv, getoptarg))) {
- 		switch (argch) {
-@@ -220,6 +223,9 @@
- 				usage("only one operation permitted");
- 			Option = opt_edit;
- 			break;
-+		case 'i':
-+                        PromptOnDelete = 1;
-+			break;
- 		default:
- 			usage("unrecognized option");
- 		}
-@@ -344,9 +350,39 @@
- static void
- delete_cmd() {
- 	char	n[MAX_FNAME];
-+        char    q[MAX_TEMPSTR];
-+        int     ans;
-+	struct stat fsbuf;
- 
--	log_it(RealUser, Pid, "DELETE", User);
-+        /* Check if the user has a crontab file first */
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
-+	if (stat(n, &fsbuf) < 0) {
-+            fprintf(stderr, "no crontab for %s\n", User);
-+            exit(ERROR_EXIT);
-+	}
-+
-+        if( PromptOnDelete == 1 )
-+        {
-+            printf("crontab: really delete %s's crontab? (y/n) ", User);
-+            fflush(stdout);
-+            ans = 0;
-+            q[0] = '\0';
-+            while ( ans == 0 ) {
-+                (void) fgets(q, sizeof q, stdin);
-+                switch (islower(q[0]) ? q[0] : tolower(q[0])) {
-+                    case 'y':
-+                    case 'n':
-+                        ans = 1;
-+                        break;
-+                    default:
-+                        fprintf(stderr, "Please enter Y or N: ");
-+                }
-+            }
-+            if ( (q[0] == 'N') || (q[0] == 'n') )
-+                exit(OK_EXIT);
-+        }
-+
-+	log_it(RealUser, Pid, "DELETE", User);
- 	if (unlink(n)) {
- 		if (errno == ENOENT)
- 			fprintf(stderr, "no crontab for %s\n", User);
diff --git a/debian/patches/features/control-header-output b/debian/patches/features/control-header-output
deleted file mode 100644
index 4cbddcd..0000000
--- a/debian/patches/features/control-header-output
+++ /dev/null
@@ -1,53 +0,0 @@
-Subject: Control output of header in crontab -e
-Last-Update: 2010-04-11
-
-Change the default behaviour of outputting a warning header to only outputting
-it when specifically requested so by setting CRONTAB_NOHEADER=N.
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:52.595435667 +0200
-+++ patched/crontab.c	2010-05-06 18:18:56.391036364 +0200
-@@ -292,6 +292,10 @@
- 	char	n[MAX_FNAME];
- 	FILE	*f;
- 	int	ch;
-+#ifdef DEBIAN
-+	int     x;
-+	char    *ctnh;
-+#endif
- 
- 	log_it(RealUser, Pid, "LIST", User);
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
-@@ -307,6 +311,30 @@
- 	/* file is open. copy to stdout, close.
- 	 */
- 	Set_LineNum(1)
-+#ifdef DEBIAN
-+	  /* DEBIAN: Don't list header lines unless CRONTAB_NOHEADER is
-+	     'N'. */
-+	  /* ignore the top few comments since we probably put them there.
-+	   */
-+	  if (!(ctnh = getenv("CRONTAB_NOHEADER")) ||
-+	      toupper(*ctnh) != 'N') 
-+	    {
-+	    for (x = 0;  x < NHEADER_LINES;  x++) {
-+	      ch = get_char(f);
-+	      if (EOF == ch)
-+		break;
-+	      if ('#' != ch) {
-+		putchar(ch);
-+		break;
-+	      }
-+	      while (EOF != (ch = get_char(f)))
-+		if (ch == '\n')
-+		  break;
-+	      if (EOF == ch)
-+		break;
-+	    }
-+	  }
-+#endif
- 	while (EOF != (ch = get_char(f)))
- 		putchar(ch);
- 	fclose(f);
diff --git a/debian/patches/features/crontab-refuse-eof-without-nl b/debian/patches/features/crontab-refuse-eof-without-nl
deleted file mode 100644
index f77a3c5..0000000
--- a/debian/patches/features/crontab-refuse-eof-without-nl
+++ /dev/null
@@ -1,43 +0,0 @@
-Subject: Refuse crontabs missing a newline before EOF
-Author: Christian Kastner <debian at kvr.at
-Last-Update: 2010-04-19
-
-Make crontab(1) refuse to add/replace a crontab with a missing newline before
-EOF.
-
-Bug-Debian: http://bugs.debian.org/79037
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:19:00.402560845 +0200
-+++ patched/crontab.c	2010-05-06 18:19:02.287668125 +0200
-@@ -819,6 +819,7 @@
- 	char	n[MAX_FNAME], envstr[MAX_ENVSTR];
- 	FILE	*tmp;
- 	int	ch, eof, fd;
-+	int	nl = FALSE;
- 	entry	*e;
- 	time_t	now = time(NULL);
- 	char	**envp = env_init();
-@@ -888,6 +889,8 @@
- 		switch (load_env(envstr, tmp)) {
- 		case ERR:
- 			eof = TRUE;
-+			if (envstr[0] == '\0')
-+				nl = TRUE;
- 			break;
- 		case FALSE:
- 			e = load_entry(tmp, check_error, pw, envp);
-@@ -905,6 +908,13 @@
- 		return (-1);
- 	}
- 
-+	if (nl == FALSE) {
-+		fprintf(stderr, "new crontab file is missing newline before "
-+				"EOF, can't install.\n");
-+		fclose(tmp);  unlink(tn);
-+		return (-1);
-+	}
-+
- 
- #ifdef HAS_FCHMOD
- 	if (fchmod(fileno(tmp), 0600) < OK)
diff --git a/debian/patches/features/debian-logging-configuration b/debian/patches/features/debian-logging-configuration
deleted file mode 100644
index 7d337df..0000000
--- a/debian/patches/features/debian-logging-configuration
+++ /dev/null
@@ -1,204 +0,0 @@
-Subject: Debian logging configuration
-Last-Update: 2010-04-11
-
-Tweak logging to Debian. Among other (smaller) things:
-  * Log to syslog only
-  * Log broken system crontabs (user crontabs are checked by crontab(1))
-  * Log messages added where Debian considered them nice-to-have
-
-Bug-Debian: http://bugs.debian.org/76625
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:46.637435837 +0200
-+++ patched/misc.c	2010-05-06 18:18:50.298436009 +0200
-@@ -281,7 +281,8 @@
- 			log_it("CRON", getpid(), "DEATH", buf);
- 			exit(ERROR_EXIT);
- 		}
--
-+		snprintf(buf, MAX_TEMPSTR, "pidfile fd = %d", fd);
-+		log_it("CRON", getpid(), "INFO", buf);
- 		(void) fcntl(fd, F_SETFD, 1);
- 	}
- 
-@@ -293,6 +294,7 @@
- 	/* abandon fd and fp even though the file is open. we need to
- 	 * keep it open and locked, but we don't need the handles elsewhere.
- 	 */
-+	
- }
- 
- /* get_char(file) : like getc() but increment LineNumber on newlines
-@@ -458,17 +460,14 @@
- 	char	*event;
- 	char	*detail;
- {
--	PID_T			pid = xpid;
- #if defined(LOG_FILE)
-+	PID_T			pid = xpid;
- 	char			*msg;
- 	TIME_T			now = time((TIME_T) 0);
- 	register struct tm	*t = localtime(&now);
- 	int 			msg_size;
- #endif /*LOG_FILE*/
- 
--#if defined(SYSLOG)
--	static int		syslog_open = 0;
--#endif
- 
- #if defined(LOG_FILE)
- 	/* we assume that MAX_TEMPSTR will hold the date, time, &punctuation.
-@@ -513,21 +512,24 @@
- #endif /*LOG_FILE*/
- 
- #if defined(SYSLOG)
--	if (!syslog_open) {
--		/* we don't use LOG_PID since the pid passed to us by
--		 * our client may not be our own.  therefore we want to
--		 * print the pid ourselves.
--		 */
--# ifdef LOG_DAEMON
--		openlog(ProgramName, LOG_PID, LOG_CRON);
-+
-+
-+	    /* we don't use LOG_PID since the pid passed to us by
-+	     * our client may not be our own.  therefore we want to
-+	     * print the pid ourselves.
-+	     */
-+	    /* SteveG says: That comment is not consistent with the
-+	       code, and makes no sense -- I suspect it's a remnant
-+	       of a cut-n-paster... */
-+# ifdef LOG_CRON
-+	openlog(ProgramName, LOG_PID, LOG_CRON);
- # else
--		openlog(ProgramName, LOG_PID);
-+	openlog(ProgramName, LOG_PID);
- # endif
--		syslog_open = TRUE;		/* assume openlog success */
--	}
--
--	syslog(LOG_INFO, "(%s) %s (%s)\n", username, event, detail);
-+	  
-+	syslog(LOG_INFO, "(%s) %s (%s)", username, event, detail);
- 
-+	closelog();
- #endif /*SYSLOG*/
- 
- #if DEBUGGING
-@@ -541,10 +543,15 @@
- 
- void
- log_close() {
-+#if defined(LOG_FILE)
- 	if (LogFD != ERR) {
- 		close(LogFD);
- 		LogFD = ERR;
- 	}
-+#endif
-+#if defined(SYSLOG)
-+	closelog();
-+#endif
- }
- 
- 
-Index: patched/pathnames.h
-===================================================================
---- patched.orig/pathnames.h	2010-05-06 18:18:49.631436001 +0200
-+++ patched/pathnames.h	2010-05-06 18:18:50.298436009 +0200
-@@ -54,7 +54,7 @@
- #define	ALLOW_FILE	"allow"		/*-*/
- #define DENY_FILE	"deny"		/*-*/
- #endif
--#define LOG_FILE	"log"		/*-*/
-+/* #define LOG_FILE	"log"		  -*/
- 
- 			/* where should the daemon stick its PID?
- 			 */
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:48.877435845 +0200
-+++ patched/do_command.c	2010-05-06 18:18:50.325296679 +0200
-@@ -257,9 +257,7 @@
- 
- 		/* that's the last thing we'll log.  close the log files.
- 		 */
--#ifdef SYSLOG
--		closelog();
--#endif
-+		log_close();
- 
- 		/* get new pgrp, void tty, etc.
- 		 */
-Index: patched/user.c
-===================================================================
---- patched.orig/user.c	2010-05-06 18:18:48.877435845 +0200
-+++ patched/user.c	2010-05-06 18:18:50.325435826 +0200
-@@ -23,8 +23,11 @@
-  */
- 
- 
-+#include <syslog.h>
-+#include <string.h>
- #include "cron.h"
- 
-+
- #ifdef WITH_SELINUX
- #include <selinux/context.h>
- #include <selinux/selinux.h>
-@@ -127,6 +130,32 @@
- #endif
- 
- 
-+#ifdef DEBIAN
-+/* Function used to log errors in crontabs from cron daemon. (User
-+   crontabs are checked before they're accepted, but system crontabs
-+   are not. */
-+static char *err_user=NULL;
-+
-+void
-+crontab_error(msg)
-+     char *msg;
-+{
-+  const char *fn;
-+  /* Figure out the file name from the username */
-+  if (0 == strcmp(err_user,"*system*")) {
-+    syslog(LOG_ERR|LOG_CRON,"Error: %s; while reading %s", msg, SYSCRONTAB);
-+  } else if (0 == strncmp(err_user,"*system*",8)) {
-+    fn = err_user+8;
-+    syslog(LOG_ERR|LOG_CRON,"Error: %s; while reading %s/%s", msg, 
-+	   SYSCRONDIR,fn);
-+  } else {
-+    syslog(LOG_ERR|LOG_CRON, "Error: %s; while reading crontab for user %s",
-+	   msg, err_user);
-+  }
-+}
-+
-+#endif
-+
- void
- free_user(u)
- 	user	*u;
-@@ -230,12 +259,21 @@
- 			}
- 			goto done;
- 		case FALSE:
-+#ifdef DEBIAN
-+			err_user = fname;
-+			e = load_entry(file, crontab_error, pw, envp);
-+			err_user = NULL;
-+#else
- 			e = load_entry(file, NULL, pw, envp);
-+#endif
- 			if (e) {
- 				e->next = u->crontab;
- 				u->crontab = e;
- 			} else {
- 				/* stop processing on syntax error */
-+				log_it(u->name, getpid(), "ERROR", "Syntax "
-+					"error, this crontab file will be "
-+					"ignored"); 
- 				free_user(u);
- 				u = NULL;
- 				goto done;
diff --git a/debian/patches/features/debian-paths-and-commands b/debian/patches/features/debian-paths-and-commands
deleted file mode 100644
index 3fe6c60..0000000
--- a/debian/patches/features/debian-paths-and-commands
+++ /dev/null
@@ -1,84 +0,0 @@
-Subject: Debian paths and commands
-Last-Update: 2010-04-11
-
-User pathnames and commands specific to the Debian platform.
-TODO: _PATH_DEFPATH_ROOT does not appear to be used (see cron.c)
-
-Bug-Debian: http://bugs.debian.org/482284
-Index: patched/pathnames.h
-===================================================================
---- patched.orig/pathnames.h	2010-05-06 18:18:22.673435429 +0200
-+++ patched/pathnames.h	2010-05-06 18:18:46.636435718 +0200
-@@ -28,7 +28,7 @@
- 			 * to; SPOOL_DIR, ALLOW_FILE, DENY_FILE, and LOG_FILE
- 			 * are all relative to this directory.
- 			 */
--#define CRONDIR		"/var/cron"
-+#define CRONDIR		"/var/spool/cron"
- #endif
- 
- 			/* SPOOLDIR is where the crontabs live.
-@@ -39,7 +39,7 @@
- 			 * newer than they were last time around (or which
- 			 * didn't exist last time around...)
- 			 */
--#define SPOOL_DIR	"tabs"
-+#define SPOOL_DIR	"crontabs"
- 
- 			/* undefining these turns off their features.  note
- 			 * that ALLOW_FILE and DENY_FILE must both be defined
-@@ -47,8 +47,13 @@
- 			 * LOG_FILE or SYSLOG is defined, we don't log.  If
- 			 * both are defined, we log both ways.
- 			 */
-+#ifdef DEBIAN
-+#define	ALLOW_FILE	"/etc/cron.allow"		/*-*/
-+#define DENY_FILE	"/etc/cron.deny"		/*-*/
-+#else
- #define	ALLOW_FILE	"allow"		/*-*/
- #define DENY_FILE	"deny"		/*-*/
-+#endif
- #define LOG_FILE	"log"		/*-*/
- 
- 			/* where should the daemon stick its PID?
-@@ -58,7 +63,7 @@
- #else
- # define PIDDIR "/etc/"
- #endif
--#define PIDFILE		"%scron.pid"
-+#define PIDFILE		"%scrond.pid"
- 
- 			/* 4.3BSD-style crontab */
- #define SYSCRONTAB	"/etc/crontab"
-@@ -66,7 +71,9 @@
- 			/* what editor to use if no EDITOR or VISUAL
- 			 * environment variable specified.
- 			 */
--#if defined(_PATH_VI)
-+#if defined(DEBIAN)
-+# define EDITOR "/usr/bin/sensible-editor"
-+#elif defined(_PATH_VI)
- # define EDITOR _PATH_VI
- #else
- # define EDITOR "/usr/ucb/vi"
-@@ -79,3 +86,7 @@
- #ifndef _PATH_DEFPATH
- # define _PATH_DEFPATH "/usr/bin:/bin"
- #endif
-+
-+#ifndef _PATH_DEFPATH_ROOT
-+# define _PATH_DEFPATH_ROOT "/usr/sbin:/usr/bin:/sbin:/bin"
-+#endif
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:44.201560954 +0200
-+++ patched/misc.c	2010-05-06 18:18:46.637435837 +0200
-@@ -234,7 +234,7 @@
- }
- 
- 
--/* acquire_daemonlock() - write our PID into /etc/cron.pid, unless
-+/* acquire_daemonlock() - write our PID into /etc/crond.pid, unless
-  *	another daemon is already running, which we detect here.
-  *
-  * note: main() calls us twice; once before forking, once after.
diff --git a/debian/patches/features/debian-specific-issues b/debian/patches/features/debian-specific-issues
deleted file mode 100644
index cab1094..0000000
--- a/debian/patches/features/debian-specific-issues
+++ /dev/null
@@ -1,38 +0,0 @@
-Subject: Debian-specific issues
-Last-Update: 2010-04-11
-
-Fix certain issues apparently specific to building on Debian.
-
-IMPORTANT NOTE: These appear to be *very* bogus and should be inspected
-further, so:
-
-NOT Acked
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:37.114561029 +0200
-+++ patched/misc.c	2010-05-06 18:18:44.201560954 +0200
-@@ -667,7 +667,7 @@
- #endif /*MAIL_DATE*/
- 
- 
--#ifdef HAVE_SAVED_SUIDS
-+#ifdef HAVE_SAVED_UIDS
- static int save_euid;
- int swap_uids() { save_euid = geteuid(); return seteuid(getuid()); }
- int swap_uids_back() { return seteuid(save_euid); }
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:33.012435990 +0200
-+++ patched/do_command.c	2010-05-06 18:18:44.201560954 +0200
-@@ -117,7 +117,11 @@
- 	 * use wait() explictly.  so we have to disable the signal (which
- 	 * was inherited from the parent).
- 	 */
-+#ifdef DEBIAN
-+	(void) signal(SIGCHLD, SIG_DFL);
-+#else
- 	(void) signal(SIGCHLD, SIG_IGN);
-+#endif
- #else
- 	/* on system-V systems, we are ignoring SIGCLD.  we have to stop
- 	 * ignoring it now or the wait() in cron_pclose() won't work.
diff --git a/debian/patches/features/dont-die-on-missing-dirs b/debian/patches/features/dont-die-on-missing-dirs
deleted file mode 100644
index 25e64f7..0000000
--- a/debian/patches/features/dont-die-on-missing-dirs
+++ /dev/null
@@ -1,84 +0,0 @@
-Subject: Don't die on missing directories
-Author: Justin Pryzby <justinpryzby at users.sourceforge.net>
-Last-Update: 2010-04-19
-
-cron shouldn't just die when it encounters missing dirs.
-
-Bug-Debian: http://bugs.debian.org/470564
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:52.595435667 +0200
-+++ patched/database.c	2010-05-06 18:19:01.607560756 +0200
-@@ -78,13 +78,15 @@
- 	 */
- 	if (stat(SPOOL_DIR, &statbuf) < OK) {
- 		log_it("CRON", getpid(), "STAT FAILED", SPOOL_DIR);
--		(void) exit(ERROR_EXIT);
-+		statbuf.st_mtime = 0;
- 	}
- 
- 	/* track system crontab file
- 	 */
--	if (stat(SYSCRONTAB, &syscron_stat) < OK)
-+	if (stat(SYSCRONTAB, &syscron_stat) < OK) {
-+		log_it("CRON", getpid(), "STAT FAILED", SYSCRONTAB);
- 		syscron_stat.st_mtime = 0;
-+	}
- 
- #ifdef DEBIAN
- 	/* Check mod time of SYSCRONDIR. This won't tell us if a file
-@@ -93,7 +95,7 @@
- 	 */
- 	if (stat(SYSCRONDIR, &syscrond_stat) < OK) {
- 		log_it("CRON", getpid(), "STAT FAILED", SYSCRONDIR);
--		(void) exit(ERROR_EXIT);
-+		syscrond_stat.st_mtime = 0;
- 	}
- 
- 	/* If SYSCRONDIR was modified, we know that something is changed and
-@@ -175,10 +177,9 @@
- 	/* Read all the package crontabs. */
- 	if (!(dir = opendir(SYSCRONDIR))) {
- 		log_it("CRON", getpid(), "OPENDIR FAILED", SYSCRONDIR);
--		(void) exit(ERROR_EXIT);
- 	}
- 
--	while (NULL != (dp = readdir(dir))) {
-+	while (dir != NULL && NULL != (dp = readdir(dir))) {
- 		char	fname[MAXNAMLEN+1],
- 		        tabname[PATH_MAX+1];
- 
-@@ -208,7 +209,8 @@
- 				&statbuf, &new_db, old_db);
- 
- 	}
--	closedir(dir);
-+	if (dir)
-+		closedir(dir);
- #endif
- 
- 	/* we used to keep this dir open all the time, for the sake of
-@@ -217,10 +219,9 @@
- 	 */
- 	if (!(dir = opendir(SPOOL_DIR))) {
- 		log_it("CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR);
--		(void) exit(ERROR_EXIT);
- 	}
- 
--	while (NULL != (dp = readdir(dir))) {
-+	while (dir != NULL && NULL != (dp = readdir(dir))) {
- 		char	fname[MAXNAMLEN+1],
- 			tabname[PATH_MAX+1];
- 
-@@ -238,7 +239,8 @@
- 		process_crontab(fname, fname, tabname,
- 				&statbuf, &new_db, old_db);
- 	}
--	closedir(dir);
-+	if (dir)
-+		closedir(dir);
- 
- 	/* if we don't do this, then when our children eventually call
- 	 * getpwnam() in do_command.c's child_process to verify MAILTO=,
diff --git a/debian/patches/features/dont-fail-on-missing-MTA b/debian/patches/features/dont-fail-on-missing-MTA
deleted file mode 100644
index 1cae427..0000000
--- a/debian/patches/features/dont-fail-on-missing-MTA
+++ /dev/null
@@ -1,58 +0,0 @@
-Subject: Don't fail silently when MTA is not installed 
-Author: Christian Kastner <debian at kvr.at>
-Last-Update: 2010-04-22
-
-When an MTA is not installed (MAILCMD is not available), the attempted piping
-out job output to the MTA fails fatally when the pipe's buffer is exceeded.
-This patch checks if MAILCMD is available before proceeding to pipe output to
-it.
-
-Bug-Debian: http://bugs.debian.org/577133
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:59.066435924 +0200
-+++ patched/do_command.c	2010-05-06 18:18:59.713435868 +0200
-@@ -23,6 +23,8 @@
- #include "cron.h"
- #include <signal.h>
- #include <grp.h>
-+#include <sys/stat.h>
-+#include <unistd.h>
- #if defined(sequent)
- # include <sys/universe.h>
- #endif
-@@ -492,6 +494,8 @@
- // status.
- 	
- 	long pos;
-+	struct stat	mcsb;
-+	int		statret;	
- 
- 	fseek(tmpout, 0, SEEK_END);
- 	pos = ftell(tmpout);
-@@ -508,6 +512,17 @@
- 	else if (!*mailto)
- 		mailto = NULL;
- 
-+	/* Don't send mail if MAILCMD is not available */
-+	if ((statret = stat(MAILCMD, &mcsb)) != 0) {
-+		Debug(DPROC|DEXT, ("%s not found, not sending mail\n", MAILCMD))
-+		if (pos > 0) {
-+			log_it("CRON", getpid(), "info", "No MTA installed, discarding output");
-+		}
-+		goto mail_finished;
-+	} else {
-+		Debug(DPROC|DEXT, ("%s found, will send mail\n", MAILCMD))
-+	}
-+
- 	register FILE	*mail = NULL;
- 	register int	bytes = 1;
- 
-@@ -617,6 +632,7 @@
- 		log_it(usernm, getpid(), "MAIL", "stream error reading output");
- 	}
- 
-+mail_finished:
- 	fclose(tmpout);
- 
- 	if (log_level >= 2) {
diff --git a/debian/patches/features/iso-time-format b/debian/patches/features/iso-time-format
deleted file mode 100644
index ec247ff..0000000
--- a/debian/patches/features/iso-time-format
+++ /dev/null
@@ -1,60 +0,0 @@
-Subject: Use ISO time format
-
-Use ISO time format
-
-
-Index: cron-3.0pl1.orig/misc.c
-===================================================================
---- cron-3.0pl1.orig.orig/misc.c	2010-04-10 00:29:48.620013489 +0200
-+++ cron-3.0pl1.orig/misc.c	2010-04-10 00:29:53.010888665 +0200
-@@ -660,26 +660,36 @@
- 
- 
- #ifdef MAIL_DATE
--/* Sat, 27 Feb 93 11:44:51 CST
-- * 123456789012345678901234567
-+/* Sat, 27 Feb 1993 11:44:51 -0800 (CST)
-+ * 1234567890123456789012345678901234567
-  */
- char *
- arpadate(clock)
- 	time_t *clock;
- {
--	time_t t = clock ?*clock :time(0L);
-+	static char ret[64];	/* zone name might be >3 chars */
-+	time_t t = clock ? *clock : time(NULL);
- 	struct tm *tm = localtime(&t);
--	static char ret[30];	/* zone name might be >3 chars */
--	
--	(void) snprintf(ret, 30, "%s, %2d %s %2d %02d:%02d:%02d %s",
--		       DowNames[tm->tm_wday],
--		       tm->tm_mday,
--		       MonthNames[tm->tm_mon],
--		       tm->tm_year,
--		       tm->tm_hour,
--		       tm->tm_min,
--		       tm->tm_sec,
--		       TZONE(*tm));
-+	char *qmark;
-+	size_t len;
-+	int hours = tm->tm_gmtoff / 3600;
-+	int minutes = (tm->tm_gmtoff - (hours * 3600)) / 60;
-+
-+	if (minutes < 0)
-+		minutes = -minutes;
-+
-+	/* Defensive coding (almost) never hurts... */
-+	len = strftime(ret, sizeof(ret), "%a, %e %b %Y %T ????? (%Z)", tm);
-+	if (len == 0) {
-+		ret[0] = '?';
-+		ret[1] = '\0';
-+		return ret;
-+	}
-+	qmark = strchr(ret, '?');
-+	if (qmark && len - (qmark - ret) >= 6) {
-+		snprintf(qmark, 6, "% .2d%.2d", hours, minutes);
-+		qmark[5] = ' ';
-+	}
- 	return ret;
- }
- #endif /*MAIL_DATE*/
diff --git a/debian/patches/features/mailcmd-dont-timeout b/debian/patches/features/mailcmd-dont-timeout
deleted file mode 100644
index 4e66553..0000000
--- a/debian/patches/features/mailcmd-dont-timeout
+++ /dev/null
@@ -1,447 +0,0 @@
-Subject: Don't let mailcmd time out with long running jobs
-Author: Justin Pryzby <justinpryzby at users.sourceforge.net>
-Last-Update: 2010-04-22
-
-Long running cron jobs can cause sendmail (or whatever compatible mailer is
-installed) to time out. By writing children's output to a temporary file 
-and waiting for them to terminate instead, this situation can be avoided.
-
-Bug-Debian: http://bugs.debian.org/155109
-Bug-Debian: http://bugs.debian.org/433615
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:58.396435930 +0200
-+++ patched/do_command.c	2010-05-06 18:18:59.066435924 +0200
-@@ -111,12 +111,21 @@
- }
- 
- 
-+/*
-+ * CROND
-+ *  - cron (runs child_process);
-+ *    - cron (runs exec sh -c 'tab entry');
-+ *    - cron (writes any %-style stdin to the command);
-+ *    - mail (popen writes any stdout to mailcmd);
-+ */
-+
- static void
- child_process(e, u)
- 	entry	*e;
- 	user	*u;
- {
--	int		stdin_pipe[2], stdout_pipe[2];
-+	int		stdin_pipe[2];
-+	FILE		*tmpout;
- 	register char	*input_data;
- 	char		*usernm, *mailto;
- 	int		children = 0;
-@@ -176,10 +185,14 @@
- 	(void) signal(SIGCLD, SIG_DFL);
- #endif /*BSD*/
- 
--	/* create some pipes to talk to our future child
-+	/* create a pipe to talk to our future child
- 	 */
- 	pipe(stdin_pipe);	/* child's stdin */
--	pipe(stdout_pipe);	/* child's stdout */
-+	/* child's stdout */
-+	if ((tmpout = tmpfile()) == NULL) {
-+		log_it("CRON", getpid(), "error", "create tmpfile");
-+		exit(ERROR_EXIT);
-+	}
- 	
- 	/* since we are a forked process, we can diddle the command string
- 	 * we were passed -- nobody else is going to use it again, right?
-@@ -270,7 +283,6 @@
- 		 * appropriate circumstances.
- 		 */
- 		close(stdin_pipe[WRITE_PIPE]);
--		close(stdout_pipe[READ_PIPE]);
- 
- 		/* grandchild process.  make std{in,out} be the ends of
- 		 * pipes opened by our daddy; make stderr go to stdout.
-@@ -278,14 +290,14 @@
- 		/* Closes are unnecessary -- let dup2() do it */
- 
- 		  /* close(STDIN) */; dup2(stdin_pipe[READ_PIPE], STDIN);
--		  /* close(STDOUT) */;  dup2(stdout_pipe[WRITE_PIPE], STDOUT);
-+		  dup2(fileno(tmpout), STDOUT);
- 		  /* close(STDERR)*/; dup2(STDOUT, STDERR);
- 
- 
--		/* close the pipes we just dup'ed.  The resources will remain.
-+		/* close the pipe we just dup'ed.  The resources will remain.
- 		 */
- 		close(stdin_pipe[READ_PIPE]);
--		close(stdout_pipe[WRITE_PIPE]);
-+		// Don't do this: fclose(tmpout);
- 
- 		/* set our login universe.  Do this in the grandchild
- 		 * so that the child can invoke /usr/lib/sendmail
-@@ -370,11 +382,10 @@
- 
- 	Debug(DPROC, ("[%d] child continues, closing pipes\n", getpid()))
- 
--	/* close the ends of the pipe that will only be referenced in the
-+	/* close the end of the pipe that will only be referenced in the
- 	 * grandchild process...
- 	 */
- 	close(stdin_pipe[READ_PIPE]);
--	close(stdout_pipe[WRITE_PIPE]);
- 
- 	/*
- 	 * write, to the pipe connected to child's stdin, any input specified
-@@ -395,11 +406,6 @@
- 
- 		Debug(DPROC, ("[%d] child2 sending data to grandchild\n", getpid()))
- 
--		/* close the pipe we don't use, since we inherited it and
--		 * are part of its reference count now.
--		 */
--		close(stdout_pipe[READ_PIPE]);
--
- 		/* translation:
- 		 *	\% -> %
- 		 *	%  -> \n
-@@ -447,167 +453,12 @@
- 	 * when the grandchild exits, we'll get EOF.
- 	 */
- 
--	Debug(DPROC, ("[%d] child reading output from grandchild\n", getpid()))
--
--	/*local*/{
--		register FILE	*in = fdopen(stdout_pipe[READ_PIPE], "r");
--		register int	ch = getc(in);
--
--		if (ch != EOF) {
--			register FILE	*mail = NULL;
--			register int	bytes = 1;
--			int		status = 0;
--
--			Debug(DPROC|DEXT,
--				("[%d] got data (%x:%c) from grandchild\n",
--					getpid(), ch, ch))
--
--			/* get name of recipient.  this is MAILTO if set to a
--			 * valid local username; USER otherwise.
--			 */
--			if (mailto) {
--				/* MAILTO was present in the environment
--				 */
--				if (!*mailto) {
--					/* ... but it's empty. set to NULL
--					 */
--					mailto = NULL;
--				}
--			} else {
--				/* MAILTO not present, set to USER.
--				 */
--				mailto = usernm;
--			}
--		
--			/* if we are supposed to be mailing, MAILTO will
--			 * be non-NULL.  only in this case should we set
--			 * up the mail command and subjects and stuff...
--			 */
--
--			if (mailto) {
--				register char	**env;
--                        	char    **jobenv = build_env(e->envp); 
--				auto char	mailcmd[MAX_COMMAND];
--				auto char	hostname[MAXHOSTNAMELEN];
--				char    *content_type = env_get("CONTENT_TYPE",jobenv),
--					*content_transfer_encoding = env_get("CONTENT_TRANSFER_ENCODING",jobenv);
--
--
--				(void) gethostname(hostname, MAXHOSTNAMELEN);
--				(void) snprintf(mailcmd, sizeof(mailcmd),
--				    MAILARGS, MAILCMD, mailto);
--				if (!(mail = cron_popen(mailcmd, "w", e))) {
--					perror(MAILCMD);
--					(void) _exit(ERROR_EXIT);
--				}
--				fprintf(mail, "From: root (Cron Daemon)\n");
--				fprintf(mail, "To: %s\n", mailto);
--				fprintf(mail, "Subject: Cron <%s@%s> %s\n",
--					usernm, first_word(hostname, "."),
--					e->cmd);
--# if defined(MAIL_DATE)
--				fprintf(mail, "Date: %s\n",
--					arpadate(&StartTime));
--# endif /* MAIL_DATE */
--                               if ( content_type == 0L ) {
--                                       fprintf(mail, "Content-Type: text/plain; charset=%s\n",
--                                               cron_default_mail_charset
--                                              );
--                               } else {   
--				    /* user specified Content-Type header.
--				     * disallow new-lines for security reasons
--				     * (else users could specify arbitrary mail headers!)
--				     */
--				       char *nl=content_type;
--                                       size_t ctlen = strlen(content_type);
--
--                                       while(  (*nl != '\0')
--                                            && ((nl=strchr(nl,'\n')) != 0L)
--                                            && (nl < (content_type+ctlen))
--                                            ) *nl = ' ';
--                                       fprintf(mail,"Content-Type: %s\n", content_type);
--                               }
--                               if ( content_transfer_encoding != 0L ) {
--                                       char *nl=content_transfer_encoding;
--                                       size_t ctlen = strlen(content_transfer_encoding);
--                                       while(  (*nl != '\0')
--                                            && ((nl=strchr(nl,'\n')) != 0L)
--                                            && (nl < (content_transfer_encoding+ctlen))
--                                            ) *nl = ' ';
--
--                                       fprintf(mail,"Content-Transfer-Encoding: %s\n", content_transfer_encoding);
--                               }
--
--
--				for (env = e->envp;  *env;  env++)
--					fprintf(mail, "X-Cron-Env: <%s>\n",
--						*env);
--				fprintf(mail, "\n");
--
--				/* this was the first char from the pipe
--				 */
--				putc(ch, mail);
--			}
--
--			/* we have to read the input pipe no matter whether
--			 * we mail or not, but obviously we only write to
--			 * mail pipe if we ARE mailing.
--			 */
--
--			while (EOF != (ch = getc(in))) {
--				bytes++;
--				if (mailto)
--					putc(ch, mail);
--			}
--
--			/* only close pipe if we opened it -- i.e., we're
--			 * mailing...
--			 */
--
--			if (mailto) {
--				Debug(DPROC, ("[%d] closing pipe to mail\n",
--					getpid()))
--				/* Note: the pclose will probably see
--				 * the termination of the grandchild
--				 * in addition to the mail process, since
--				 * it (the grandchild) is likely to exit
--				 * after closing its stdout.
--				 */
--				status = cron_pclose(mail);
--			}
--
--			/* if there was output and we could not mail it,
--			 * log the facts so the poor user can figure out
--			 * what's going on.
--			 */
--			if (mailto && status) {
--				char buf[MAX_TEMPSTR];
--
--				snprintf(buf, MAX_TEMPSTR,
--			"mailed %d byte%s of output but got status 0x%04x\n",
--					bytes, (bytes==1)?"":"s",
--					status);
--				log_it(usernm, getpid(), "MAIL", buf);
--			}
--
--		} /*if data from grandchild*/
--
--		if (log_level >= 2) {
--			char *x = mkprints((u_char *)e->cmd, strlen(e->cmd));
--
--			log_it(usernm, getpid(), "END", x);
--			free(x);
--		}
--
--		Debug(DPROC, ("[%d] got EOF from grandchild\n", getpid()))
--
--		fclose(in);	/* also closes stdout_pipe[READ_PIPE] */
--	}
--
- 	/* wait for children to die.
- 	 */
-+	int status = 0;
- 	for (;  children > 0;  children--)
- 	{
-+		char		msg[256];
- 		WAIT_T		waiter;
- 		PID_T		pid;
- 
-@@ -615,16 +466,165 @@
- 			getpid(), children))
- 		pid = wait(&waiter);
- 		if (pid < OK) {
--			Debug(DPROC, ("[%d] no more grandchildren--mail written?\n",
--				getpid()))
-+			Debug(DPROC, ("[%d] no more grandchildren\n", getpid()))
- 			break;
- 		}
--		Debug(DPROC, ("[%d] grandchild #%d finished, status=%04x",
-+		Debug(DPROC, ("[%d] grandchild #%d finished, status=%04x\n",
- 			getpid(), pid, WEXITSTATUS(waiter)))
--		if (WIFSIGNALED(waiter) && WCOREDUMP(waiter))
--			Debug(DPROC, (", dumped core"))
--		Debug(DPROC, ("\n"))
-+
-+		if (WIFEXITED(waiter) && WEXITSTATUS(waiter)) {
-+			status = waiter;
-+			snprintf(msg, 256, "grandchild #%d failed with exit "
-+				"status %d", pid, WEXITSTATUS(waiter));
-+			log_it("CRON", getpid(), "error", msg);
-+		} else if (WIFSIGNALED(waiter)) {
-+			status = waiter;
-+			snprintf(msg, 256, "grandchild #%d terminated by signal"
-+				" %d%s", pid, WTERMSIG(waiter),
-+				WCOREDUMP(waiter) ? ", dumped core" : "");
-+			log_it("CRON", getpid(), "error", msg);
-+		} 
- 	}
-+
-+// Finally, send any output of the command to the mailer; also, alert
-+// the user if their job failed.  Avoid popening the mailcmd until now
-+// since sendmail may time out, and to write info about the exit
-+// status.
-+	
-+	long pos;
-+
-+	fseek(tmpout, 0, SEEK_END);
-+	pos = ftell(tmpout);
-+	fseek(tmpout, 0, SEEK_SET);
-+
-+	Debug(DPROC|DEXT, ("[%d] got %ld bytes data from grandchild tmpfile\n",
-+				getpid(), (long) pos))
-+	if (pos == 0 && status == 0)
-+		return;
-+
-+	// get name of recipient.
-+	if (mailto == NULL)
-+		mailto = usernm;
-+	else if (!*mailto)
-+		mailto = NULL;
-+
-+	register FILE	*mail = NULL;
-+	register int	bytes = 1;
-+
-+	register char	**env;
-+	char    	**jobenv = build_env(e->envp); 
-+	auto char	mailcmd[MAX_COMMAND];
-+	auto char	hostname[MAXHOSTNAMELEN];
-+	char    	*content_type = env_get("CONTENT_TYPE",jobenv),
-+			*content_transfer_encoding = env_get("CONTENT_TRANSFER_ENCODING",jobenv);
-+
-+	(void) gethostname(hostname, MAXHOSTNAMELEN);
-+	(void) snprintf(mailcmd, sizeof(mailcmd),
-+			MAILARGS, MAILCMD, mailto);
-+	if (!(mail = cron_popen(mailcmd, "w", e))) {
-+		perror(MAILCMD);
-+		(void) _exit(ERROR_EXIT);
-+	}
-+	fprintf(mail, "From: root (Cron Daemon)\n");
-+	fprintf(mail, "To: %s\n", mailto);
-+	fprintf(mail, "Subject: Cron <%s@%s> %s%s\n",
-+			usernm, first_word(hostname, "."),
-+			e->cmd, status?" (failed)":"");
-+# if defined(MAIL_DATE)
-+	fprintf(mail, "Date: %s\n",
-+			arpadate(&StartTime));
-+# endif /* MAIL_DATE */
-+	if ( content_type == 0L ) {
-+		fprintf(mail, "Content-Type: text/plain; charset=%s\n",
-+				cron_default_mail_charset
-+		       );
-+	} else {   
-+		/* user specified Content-Type header.
-+		 * disallow new-lines for security reasons
-+		 * (else users could specify arbitrary mail headers!)
-+		 */
-+		char *nl=content_type;
-+		size_t ctlen = strlen(content_type);
-+
-+		while(  (*nl != '\0')
-+				&& ((nl=strchr(nl,'\n')) != 0L)
-+				&& (nl < (content_type+ctlen))
-+		     ) *nl = ' ';
-+		fprintf(mail,"Content-Type: %s\n", content_type);
-+	}
-+	if ( content_transfer_encoding != 0L ) {
-+		char *nl=content_transfer_encoding;
-+		size_t ctlen = strlen(content_transfer_encoding);
-+		while(  (*nl != '\0')
-+				&& ((nl=strchr(nl,'\n')) != 0L)
-+				&& (nl < (content_transfer_encoding+ctlen))
-+		     ) *nl = ' ';
-+
-+		fprintf(mail,"Content-Transfer-Encoding: %s\n", content_transfer_encoding);
-+	}
-+
-+	for (env = e->envp;  *env;  env++)
-+		fprintf(mail, "X-Cron-Env: <%s>\n",
-+				*env);
-+	fputc('\n', mail);
-+
-+	if (WIFEXITED(status) && WEXITSTATUS(status)) {
-+		status = WEXITSTATUS(status);
-+		fprintf(mail, "command failed with exit status %d\n\n", status);
-+	} else if (WIFSIGNALED(status)) {
-+		fprintf(mail, "command terminated by signal %d%s\n\n",
-+				WTERMSIG(status),
-+				WCOREDUMP(status)?", dumped core":"");
-+	}
-+
-+// Append the actual output of the child to the mail
-+	
-+	char buf[4096];
-+	int ret, remain;
-+
-+	while(1) {
-+		if ((ret = fread(buf, 1, sizeof(buf), tmpout)) == 0)
-+			break;
-+		for (remain = ret; remain != 0; ) {
-+			ret = fwrite(buf, 1, remain, mail);
-+			if (ret > 0) {
-+				remain -= ret;
-+				continue;
-+			}
-+			// XXX error
-+			break;
-+		}
-+	}
-+
-+	Debug(DPROC, ("[%d] closing pipe to mail\n", getpid()))
-+	status = cron_pclose(mail);
-+
-+	/* if there was output and we could not mail it,
-+	 * log the facts so the poor user can figure out
-+	 * what's going on.
-+	 */
-+	if (status) {
-+		char buf[MAX_TEMPSTR];
-+		snprintf(buf, MAX_TEMPSTR,
-+				"mailed %d byte%s of output; "
-+				"but got status 0x%04x, "
-+				"\n",
-+				bytes, (bytes==1)?"":"s", status);
-+		log_it(usernm, getpid(), "MAIL", buf);
-+	}
-+
-+	if (ferror(tmpout)) {
-+		log_it(usernm, getpid(), "MAIL", "stream error reading output");
-+	}
-+
-+	fclose(tmpout);
-+
-+	if (log_level >= 2) {
-+		char *x = mkprints((u_char *)e->cmd, strlen(e->cmd));
-+		log_it(usernm, getpid(), "END", x);
-+		free(x);
-+	}
-+
- #if defined(USE_PAM)
- 	pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT);
- 	retcode = pam_close_session(pamh, PAM_SILENT);
diff --git a/debian/patches/features/no-argument-is-stdin b/debian/patches/features/no-argument-is-stdin
deleted file mode 100644
index 7ee6cfa..0000000
--- a/debian/patches/features/no-argument-is-stdin
+++ /dev/null
@@ -1,23 +0,0 @@
-Subject: crontab without argument is stdin
-Last-Update: 2010-04-11
-
-If crontab is run without argument then it will read stdin to replace the
-users crontab. This way it is POSIXLY_CORRECT.
-
-Bug-Debian: http://bugs.debian.org/514062
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:57.762561131 +0200
-+++ patched/crontab.c	2010-05-06 18:19:00.402560845 +0200
-@@ -109,6 +109,9 @@
- #if defined(BSD)
- 	setlinebuf(stderr);
- #endif
-+	if (argv[1] == NULL) {
-+		argv[1] = "-";
-+	}	
- 	parse_args(argc, argv);		/* sets many globals, opens a file */
- 	set_cron_cwd();
- 	if (!allowed(User)) {
diff --git a/debian/patches/features/option-log-completed-jobs b/debian/patches/features/option-log-completed-jobs
deleted file mode 100644
index ad53c1d..0000000
--- a/debian/patches/features/option-log-completed-jobs
+++ /dev/null
@@ -1,77 +0,0 @@
-Subject: Option to log completed jobs
-Last-Update: 2010-04-11
-
-Provide an option to log completed jobs if requested so.
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:55.651562056 +0200
-+++ patched/cron.h	2010-05-06 18:18:58.395435796 +0200
-@@ -292,7 +292,7 @@
- 
- int	stay_foreground;
- int     lsbsysinit_mode;
--
-+int     log_level = 1;
- char    cron_default_mail_charset[MAX_ENVSTR] = "";
- 
- # if DEBUGGING
-@@ -308,6 +308,7 @@
- 		*DowNames[],
- 		*ProgramName;
- extern  int     lsbsysinit_mode;
-+extern  int     log_level;
- extern	int	LineNumber;
- extern	time_t	StartTime;
- extern  time_min timeRunning;
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:55.651562056 +0200
-+++ patched/cron.c	2010-05-06 18:18:58.396435930 +0200
-@@ -467,7 +467,7 @@
- 	stay_foreground = 0;
-         lsbsysinit_mode = 0;
- 
--	while (EOF != (argch = getopt(argc, argv, "lfx:"))) {
-+	while (EOF != (argch = getopt(argc, argv, "lfx:L:"))) {
- 		switch (argch) {
- 		default:
- 			usage();
-@@ -481,6 +481,9 @@
-                 case 'l':
-                     lsbsysinit_mode = 1;
-                     break;
-+		case 'L':
-+		    log_level = atoi(optarg);
-+		    break;
- 		}
- 	}
- }
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:54.665561020 +0200
-+++ patched/do_command.c	2010-05-06 18:18:58.396435930 +0200
-@@ -248,7 +248,7 @@
- 		 * the actual user command shell was going to get and the
- 		 * PID is part of the log message.
- 		 */
--		/*local*/{
-+		if (log_level >= 1) {
- 			char *x = mkprints((u_char *)e->cmd, strlen(e->cmd));
- 
- 			log_it(usernm, getpid(), "CMD", x);
-@@ -592,6 +592,13 @@
- 
- 		} /*if data from grandchild*/
- 
-+		if (log_level >= 2) {
-+			char *x = mkprints((u_char *)e->cmd, strlen(e->cmd));
-+
-+			log_it(usernm, getpid(), "END", x);
-+			free(x);
-+		}
-+
- 		Debug(DPROC, ("[%d] got EOF from grandchild\n", getpid()))
- 
- 		fclose(in);	/* also closes stdout_pipe[READ_PIPE] */
diff --git a/debian/patches/features/pam-env-support b/debian/patches/features/pam-env-support
deleted file mode 100644
index 9fc88c3..0000000
--- a/debian/patches/features/pam-env-support
+++ /dev/null
@@ -1,69 +0,0 @@
-Subject: Support pam_env
-Last-Update: 2010-04-11
-
-Enable use of pam_env for cron's environment.
-
-IMPORTANT NOTE: This currently only (or mostly) affects commands launched by
-crontab entries. Other commands run (such as mail notification via MAILTO) do
-not use this code. This is not really that big of an issue (eg. why would
-anyone force MAILTO via /etc/environment), but it should be documented
-somewhere.
-
-Bug-Debian: http://bugs.debian.org/203737
-Bug-Debian: http://bugs.debian.org/511684
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:47.437435738 +0200
-+++ patched/do_command.c	2010-05-06 18:18:48.182560885 +0200
-@@ -46,6 +46,31 @@
- static void		child_process __P((entry *, user *)),
- 			do_univ __P((user *));
- 
-+/* Build up the job environment from the PAM environment plus the
-+   crontab environment */
-+static char ** build_env(char **cronenv)
-+{
-+        char **jobenv = cronenv;
-+#if defined(USE_PAM)
-+        char **pamenv = pam_getenvlist(pamh);
-+        char *cronvar;
-+        int count = 0;
-+
-+        jobenv = env_copy(pamenv);
-+
-+        /* Now add the cron environment variables. Since env_set()
-+           overwrites existing variables, this will let cron's
-+           environment settings override pam's */
-+
-+        while ((cronvar = cronenv[count++])) {
-+                if (!(jobenv = env_set(jobenv, cronvar))) {
-+                        syslog(LOG_ERR, "Setting Cron environment variable %s failed", cronvar);
-+                        return NULL;
-+                }
-+        }
-+#endif
-+    return jobenv;
-+}
- 
- void
- do_command(e, u)
-@@ -296,8 +321,8 @@
- 		/* exec the command.
- 		 */
- 		{
--			char	*shell = env_get("SHELL", e->envp);
--
-+                        char    **jobenv = build_env(e->envp); 
-+                        char	*shell = env_get("SHELL", jobenv);
- # if DEBUGGING
- 			if (DebugFlags & DTEST) {
- 				fprintf(stderr,
-@@ -307,7 +332,7 @@
- 				_exit(OK_EXIT);
- 			}
- # endif /*DEBUGGING*/
--			execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);
-+                        execle(shell, shell, "-c", e->cmd, (char *)0, jobenv);
- 			fprintf(stderr, "%s: execle: %s\n", shell, strerror(errno));
- 			_exit(ERROR_EXIT);
- 		}
diff --git a/debian/patches/features/pam-support b/debian/patches/features/pam-support
deleted file mode 100644
index 83ff337..0000000
--- a/debian/patches/features/pam-support
+++ /dev/null
@@ -1,99 +0,0 @@
-Subject: PAM support
-Last-Update: 2010-04-11
-Author: Topi Miettinen <Topi.Miettinen at nic.fi>
-
-General support for PAM. Not available on the Hurd.
-
-Bug-Debian: https://bugs.debian.org/68366
-Bug-Debian: https://bugs.debian.org/67586
-Bug-Debian: https://bugs.debian.org/70028
-Bug-Debian: https://bugs.debian.org/75408
-Index: patched/Makefile
-===================================================================
---- patched.orig/Makefile	2010-05-06 18:18:44.879435811 +0200
-+++ patched/Makefile	2010-05-06 18:18:47.436487807 +0200
-@@ -55,7 +55,7 @@
- INCLUDE		=	-I.
- #INCLUDE	=
- #<<need getopt()>>
--LIBS		=
-+LIBS		= $(PAM_LIBS)
- #<<optimize or debug?>>
- OPTIM		=	-O2
- #OPTIM		=	-g
-@@ -74,7 +74,7 @@
- # Allow override from command line
- DEBUG_DEFS = -DDEBUGGING=0   
- # The -DUSE_SIGCHLD is needed for the Alpha port
--DEFS = -DDEBIAN -DUSE_SIGCHLD $(DEBUG_DEFS)
-+DEFS = -DDEBIAN -DUSE_SIGCHLD $(DEBUG_DEFS) $(PAM_DEFS)
- #(SGI IRIX systems need this)
- #DEFS		=	-D_BSD_SIGNALS -Dconst=
- #<<the name of the BSD-like install program>>
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:44.201560954 +0200
-+++ patched/do_command.c	2010-05-06 18:18:47.437435738 +0200
-@@ -29,6 +29,18 @@
- #if defined(SYSLOG)
- # include <syslog.h>
- #endif
-+#if defined(USE_PAM)
-+#include <security/pam_appl.h>
-+static pam_handle_t *pamh = NULL;
-+static const struct pam_conv conv = {
-+	NULL
-+};
-+#define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
-+	fprintf(stderr,"\n%s\n",pam_strerror(pamh, retcode)); \
-+	syslog(LOG_ERR,"%s",pam_strerror(pamh, retcode)); \
-+	pam_end(pamh, retcode); exit(1); \
-+   }
-+#endif
- 
- 
- static void		child_process __P((entry *, user *)),
-@@ -79,6 +91,10 @@
- 	char		*usernm, *mailto;
- 	int		children = 0;
- 
-+#if defined(USE_PAM)
-+	int		retcode = 0;
-+#endif
-+
- 	Debug(DPROC, ("[%d] child_process('%s')\n", getpid(), e->cmd))
- 
- 	/* mark ourselves as different to PS command watchers by upshifting
-@@ -172,6 +188,20 @@
- 		*p = '\0';
- 	}
- 
-+#if defined(USE_PAM)
-+	retcode = pam_start("cron", usernm, &conv, &pamh);
-+	PAM_FAIL_CHECK;
-+	retcode = pam_set_item(pamh, PAM_TTY, "cron");
-+	PAM_FAIL_CHECK;
-+	retcode = pam_acct_mgmt(pamh, PAM_SILENT);
-+	PAM_FAIL_CHECK;
-+	retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
-+	PAM_FAIL_CHECK;
-+	retcode = pam_open_session(pamh, PAM_SILENT);
-+	PAM_FAIL_CHECK;
-+
-+#endif
-+
- 	/* fork again, this time so we can exec the user's command.
- 	 */
- 	switch (vfork()) {
-@@ -509,6 +539,11 @@
- 			Debug(DPROC, (", dumped core"))
- 		Debug(DPROC, ("\n"))
- 	}
-+#if defined(USE_PAM)
-+	pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT);
-+	retcode = pam_close_session(pamh, PAM_SILENT);
-+	pam_end(pamh, retcode);
-+#endif
- }
- 
- 
diff --git a/debian/patches/features/properly-handle-time-skips b/debian/patches/features/properly-handle-time-skips
deleted file mode 100644
index 94fe8f0..0000000
--- a/debian/patches/features/properly-handle-time-skips
+++ /dev/null
@@ -1,486 +0,0 @@
-Subject: Properly handle time skips
-Last-Update: 2010-04-11
-
-Properly handle time skips, especially those related to Daylight Savings Time.
-It should be noted that this fix is not yet considered complete.
-
-http://bugs.debian.org/8499
-http://bugs.debian.org/217836
-http://bugs.debian.org/458123
-http://bugs.debian.org/474157
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:49.631436001 +0200
-+++ patched/cron.h	2010-05-06 18:18:51.094436073 +0200
-@@ -40,6 +40,13 @@
- #include "config.h"
- #include "externs.h"
- 
-+#if SYS_TIME_H
-+# include <sys/time.h>
-+#else
-+# include <time.h>
-+#endif
-+
-+
- #ifdef WITH_SELINUX
- #include <selinux/selinux.h>
- #endif
-@@ -125,6 +132,10 @@
- 			 LineNumber = ln; \
- 			}
- 
-+typedef int time_min;
-+
-+#define SECONDS_PER_MINUTE 60
-+
- #define	FIRST_MINUTE	0
- #define	LAST_MINUTE	59
- #define	MINUTE_COUNT	(LAST_MINUTE - FIRST_MINUTE + 1)
-@@ -167,6 +178,8 @@
- #define	DOM_STAR	0x01
- #define	DOW_STAR	0x02
- #define	WHEN_REBOOT	0x04
-+#define MIN_STAR	0x08
-+#define HR_STAR		0x10
- } entry;
- 
- 			/* the crontab database will be a list of the
-@@ -226,6 +239,8 @@
- 		allowed __P((char *)),
- 		strdtb __P((char *));
- 
-+long            get_gmtoff(time_t *, struct tm *);
-+
- char		*env_get __P((char *, char **)),
- 		*arpadate __P((time_t *)),
- 		*mkprints __P((unsigned char *, unsigned int)),
-@@ -269,7 +284,11 @@
- 
- char	*ProgramName;
- int	LineNumber;
--time_t	TargetTime;
-+time_t	StartTime;
-+time_min timeRunning;
-+time_min virtualTime;
-+time_min clockTime;
-+static long GMToff;
- 
- int     lsbsysinit_mode;
- 
-@@ -287,7 +306,10 @@
- 		*ProgramName;
- extern  int     lsbsysinit_mode;
- extern	int	LineNumber;
--extern	time_t	TargetTime;
-+extern	time_t	StartTime;
-+extern  time_min timeRunning;
-+extern  time_min virtualTime;
-+extern  time_min clockTime;
- # if DEBUGGING
- extern	int	DebugFlags;
- extern	char	*DebugFlagNames[];
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:35.745561147 +0200
-+++ patched/entry.c	2010-05-06 18:18:51.094436073 +0200
-@@ -157,6 +157,7 @@
- 			bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1));
- 			bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
- 			bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
-+			e->flags |= HR_STAR;
- 		} else {
- 			ecode = e_timespec;
- 			goto eof;
-@@ -164,6 +165,8 @@
- 	} else {
- 		Debug(DPARS, ("load_entry()...about to parse numerics\n"))
- 
-+		if (ch == '*')
-+			e->flags |= MIN_STAR;
- 		ch = get_list(e->minute, FIRST_MINUTE, LAST_MINUTE,
- 			      PPC_NULL, ch, file);
- 		if (ch == EOF) {
-@@ -174,6 +177,8 @@
- 		/* hours
- 		 */
- 
-+		if (ch == '*')
-+			e->flags |= HR_STAR;
- 		ch = get_list(e->hour, FIRST_HOUR, LAST_HOUR,
- 			      PPC_NULL, ch, file);
- 		if (ch == EOF) {
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:50.325296679 +0200
-+++ patched/do_command.c	2010-05-06 18:18:51.094436073 +0200
-@@ -503,7 +503,7 @@
- 					e->cmd);
- # if defined(MAIL_DATE)
- 				fprintf(mail, "Date: %s\n",
--					arpadate(&TargetTime));
-+					arpadate(&StartTime));
- # endif /* MAIL_DATE */
- 				for (env = e->envp;  *env;  env++)
- 					fprintf(mail, "X-Cron-Env: <%s>\n",
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:49.632435697 +0200
-+++ patched/cron.c	2010-05-06 18:18:51.095435790 +0200
-@@ -25,20 +25,15 @@
- 
- #include "cron.h"
- #include <signal.h>
--#if SYS_TIME_H
--# include <sys/time.h>
--#else
--# include <time.h>
--#endif
- 
- #include <sys/types.h>
- #include <fcntl.h>
- 
- static	void	usage __P((void)),
- 		run_reboot_jobs __P((cron_db *)),
--		cron_tick __P((cron_db *)),
--		cron_sync __P((void)),
--		cron_sleep __P((void)),
-+		find_jobs __P((time_min, cron_db *, int, int)),
-+		set_time __P((int)),
-+		cron_sleep __P((time_min)),
- #ifdef USE_SIGCHLD
- 		sigchld_handler __P((int)),
- #endif
-@@ -137,23 +132,126 @@
- 	database.sysd_mtime = (time_t) 0;
- #endif
- 	load_database(&database);
-+
-+	set_time(TRUE);
- 	run_reboot_jobs(&database);
--	cron_sync();
-+	timeRunning = virtualTime = clockTime;
-+
-+	/*
-+	 * too many clocks, not enough time (Al. Einstein)
-+	 * These clocks are in minutes since the epoch (time()/60).
-+	 * virtualTime: is the time it *would* be if we woke up
-+	 * promptly and nobody ever changed the clock. It is
-+	 * monotonically increasing... unless a timejump happens.
-+	 * At the top of the loop, all jobs for 'virtualTime' have run.
-+	 * timeRunning: is the time we last awakened.
-+	 * clockTime: is the time when set_time was last called.
-+	 */
- 	while (TRUE) {
--# if DEBUGGING
--		if (!(DebugFlags & DTEST))
--# endif /*DEBUGGING*/
--			cron_sleep();
-+		time_min timeDiff;
-+		int wakeupKind;
-+
-+		/* ... wait for the time (in minutes) to change ... */
-+		do {
-+			cron_sleep(timeRunning + 1);
-+			set_time(FALSE);
-+		} while (clockTime == timeRunning);
-+		timeRunning = clockTime;
- 
- 		load_database(&database);
- 
--		/* do this iteration
-+		/*
-+		 * ... calculate how the current time differs from
-+		 * our virtual clock. Classify the change into one
-+		 * of 4 cases
- 		 */
--		cron_tick(&database);
-+		timeDiff = timeRunning - virtualTime;
- 
--		/* sleep 1 minute
--		 */
--		TargetTime += 60;
-+		Debug(DSCH, ("[%d] pulse: %d = %d - %d\n",
-+            	    getpid(), timeDiff, timeRunning, virtualTime));
-+
-+		/* shortcut for the most common case */
-+		if (timeDiff == 1) {
-+			virtualTime = timeRunning;
-+			find_jobs(virtualTime, &database, TRUE, TRUE);
-+		} else {
-+			wakeupKind = -1;
-+			if (timeDiff > -(3*MINUTE_COUNT))
-+				wakeupKind = 0;
-+			if (timeDiff > 0)
-+				wakeupKind = 1;
-+			if (timeDiff > 5)
-+				wakeupKind = 2;
-+			if (timeDiff > (3*MINUTE_COUNT))
-+				wakeupKind = 3;
-+
-+			switch (wakeupKind) {
-+			case 1:
-+				/*
-+				 * case 1: timeDiff is a small positive number
-+				 * (wokeup late) run jobs for each virtual minute
-+				 * until caught up.
-+				 */
-+				Debug(DSCH, ("[%d], normal case %d minutes to go\n",
-+				    getpid(), timeRunning - virtualTime))
-+				do {
-+					if (job_runqueue())
-+						sleep(10);
-+					virtualTime++;
-+					find_jobs(virtualTime, &database, TRUE, TRUE);
-+				} while (virtualTime< timeRunning);
-+				break;
-+
-+			case 2:
-+				/*
-+				 * case 2: timeDiff is a medium-sized positive number,
-+				 * for example because we went to DST run wildcard
-+				 * jobs once, then run any fixed-time jobs that would
-+				 * otherwise be skipped if we use up our minute
-+				 * (possible, if there are a lot of jobs to run) go
-+				 * around the loop again so that wildcard jobs have
-+				 * a chance to run, and we do our housekeeping
-+				 */
-+				Debug(DSCH, ("[%d], DST begins %d minutes to go\n",
-+				    getpid(), timeRunning - virtualTime))
-+				/* run wildcard jobs for current minute */
-+				find_jobs(timeRunning, &database, TRUE, FALSE);
-+	
-+				/* run fixed-time jobs for each minute missed */ 
-+				do {
-+					if (job_runqueue())
-+						sleep(10);
-+					virtualTime++;
-+					find_jobs(virtualTime, &database, FALSE, TRUE);
-+					set_time(FALSE);
-+				} while (virtualTime< timeRunning &&
-+				    clockTime == timeRunning);
-+				break;
-+	
-+			case 0:
-+				/*
-+				 * case 3: timeDiff is a small or medium-sized
-+				 * negative num, eg. because of DST ending just run
-+				 * the wildcard jobs. The fixed-time jobs probably
-+				 * have already run, and should not be repeated
-+				 * virtual time does not change until we are caught up
-+				 */
-+				Debug(DSCH, ("[%d], DST ends %d minutes to go\n",
-+				    getpid(), virtualTime - timeRunning))
-+				find_jobs(timeRunning, &database, TRUE, FALSE);
-+				break;
-+			default:
-+				/*
-+				 * other: time has changed a *lot*,
-+				 * jump virtual time, and run everything
-+				 */
-+				Debug(DSCH, ("[%d], clock jumped\n", getpid()))
-+				virtualTime = timeRunning;
-+				find_jobs(timeRunning, &database, TRUE, TRUE);
-+			}
-+		}
-+		/* jobs to be run (if any) are loaded. clear the queue */
-+		job_runqueue();
- 	}
- }
- 
-@@ -177,10 +275,14 @@
- 
- 
- static void
--cron_tick(db)
-+find_jobs(vtime, db, doWild, doNonWild)
-+	time_min vtime;
- 	cron_db	*db;
-+	int doWild;
-+	int doNonWild;
- {
-- 	register struct tm	*tm = localtime(&TargetTime);
-+	time_t   virtualSecond  = vtime * SECONDS_PER_MINUTE;
-+	register struct tm 	*tm = gmtime(&virtualSecond);
- 	register int		minute, hour, dom, month, dow;
- 	register user		*u;
- 	register entry		*e;
-@@ -193,8 +295,9 @@
- 	month = tm->tm_mon +1 /* 0..11 -> 1..12 */ -FIRST_MONTH;
- 	dow = tm->tm_wday -FIRST_DOW;
- 
--	Debug(DSCH, ("[%d] tick(%d,%d,%d,%d,%d)\n",
--		getpid(), minute, hour, dom, month, dow))
-+	Debug(DSCH, ("[%d] tick(%d,%d,%d,%d,%d) %s %s\n",
-+		getpid(), minute, hour, dom, month, dow,
-+		doWild?" ":"No wildcard",doNonWild?" ":"Wildcard only"))
- 
- 	/* the dom/dow situation is odd.  '* * 1,15 * Sun' will run on the
- 	 * first and fifteenth AND every Sunday;  '* * * * Sun' will run *only*
-@@ -205,67 +308,65 @@
- 	for (u = db->head;  u != NULL;  u = u->next) {
- 		for (e = u->crontab;  e != NULL;  e = e->next) {
- 			Debug(DSCH|DEXT, ("user [%s:%d:%d:...] cmd=\"%s\"\n",
--					  env_get("LOGNAME", e->envp),
--					  e->uid, e->gid, e->cmd))
--			if (bit_test(e->minute, minute)
--			 && bit_test(e->hour, hour)
--			 && bit_test(e->month, month)
--			 && ( ((e->flags & DOM_STAR) || (e->flags & DOW_STAR))
-+			    env_get("LOGNAME", e->envp),
-+			    e->uid, e->gid, e->cmd))
-+			if (bit_test(e->minute, minute) &&
-+			    bit_test(e->hour, hour) &&
-+			    bit_test(e->month, month) &&
-+			    ( ((e->flags & DOM_STAR) || (e->flags & DOW_STAR))
- 			      ? (bit_test(e->dow,dow) && bit_test(e->dom,dom))
--			      : (bit_test(e->dow,dow) || bit_test(e->dom,dom))
--			    )
--			   ) {
--				job_add(e, u);
-+			      : (bit_test(e->dow,dow) || bit_test(e->dom,dom)))) {
-+				if ((doNonWild && !(e->flags & (MIN_STAR|HR_STAR)))
-+				    || (doWild && (e->flags & (MIN_STAR|HR_STAR))))
-+					job_add(e, u);
- 			}
- 		}
- 	}
- }
- 
- 
--/* the task here is to figure out how long it's going to be until :00 of the
-- * following minute and initialize TargetTime to this value.  TargetTime
-- * will subsequently slide 60 seconds at a time, with correction applied
-- * implicitly in cron_sleep().  it would be nice to let cron execute in
-- * the "current minute" before going to sleep, but by restarting cron you
-- * could then get it to execute a given minute's jobs more than once.
-- * instead we have the chance of missing a minute's jobs completely, but
-- * that's something sysadmin's know to expect what with crashing computers..
-+/*
-+ * Set StartTime and clockTime to the current time.
-+ * These are used for computing what time it really is right now.
-+ * Note that clockTime is a unix wallclock time converted to minutes.
-  */
- static void
--cron_sync() {
-- 	register struct tm	*tm;
-+set_time(int initialize)
-+{
-+    struct tm tm;
-+    static int isdst;
- 
--	TargetTime = time((time_t*)0);
--	tm = localtime(&TargetTime);
--	TargetTime += (60 - tm->tm_sec);
--}
-+    StartTime = time(NULL);
- 
-+    /* We adjust the time to GMT so we can catch DST changes. */
-+    tm = *localtime(&StartTime);
-+    if (initialize || tm.tm_isdst != isdst) {
-+       isdst = tm.tm_isdst;
-+       GMToff = get_gmtoff(&StartTime, &tm);
-+       Debug(DSCH, ("[%d] GMToff=%ld\n",
-+           getpid(), (long)GMToff))
-+    }
-+    clockTime = (StartTime + GMToff) / (time_t)SECONDS_PER_MINUTE;
-+}
- 
-+/*
-+ * try to just hit the next minute
-+ */
- static void
--cron_sleep() {
--	register int	seconds_to_wait;
-+cron_sleep(target)
-+	time_min target;
-+{
-+	time_t t;
-+	int seconds_to_wait;
- 
--	do {
--		seconds_to_wait = (int) (TargetTime - time((time_t*)0));
--		Debug(DSCH, ("[%d] TargetTime=%ld, sec-to-wait=%d\n",
--			getpid(), TargetTime, seconds_to_wait))
--
--		/* if we intend to sleep, this means that it's finally
--		 * time to empty the job queue (execute it).
--		 *
--		 * if we run any jobs, we'll probably screw up our timing,
--		 * so go recompute.
--		 *
--		 * note that we depend here on the left-to-right nature
--		 * of &&, and the short-circuiting.
--		 */
--	} while (seconds_to_wait > 0 && job_runqueue());
-+	t = time(NULL) + GMToff;
- 
--	while (seconds_to_wait > 0) {
--		Debug(DSCH, ("[%d] sleeping for %d seconds\n",
--			getpid(), seconds_to_wait))
--		seconds_to_wait = (int) sleep((unsigned int) seconds_to_wait);
--	}
-+	seconds_to_wait = (int)(target * SECONDS_PER_MINUTE - t) + 1;
-+	Debug(DSCH, ("[%d] TargetTime=%ld, sec-to-wait=%d\n",
-+	    getpid(), (long)target*SECONDS_PER_MINUTE, seconds_to_wait))
-+
-+        if (seconds_to_wait > 0 && seconds_to_wait < 65)
-+            sleep((unsigned int) seconds_to_wait);
- }
- 
- 
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:50.298436009 +0200
-+++ patched/misc.c	2010-05-06 18:18:51.095435790 +0200
-@@ -651,8 +651,9 @@
- 	struct tm *tm = localtime(&t);
- 	char *qmark;
- 	size_t len;
--	int hours = tm->tm_gmtoff / 3600;
--	int minutes = (tm->tm_gmtoff - (hours * 3600)) / 60;
-+        long gmtoff = get_gmtoff(&t, tm);
-+        int hours = gmtoff / 3600;
-+        int minutes = (gmtoff - (hours * 3600)) / 60;
- 
- 	if (minutes < 0)
- 		minutes = -minutes;
-@@ -682,3 +683,38 @@
- int swap_uids() { return setreuid(geteuid(), getuid()); }
- int swap_uids_back() { return swap_uids(); }
- #endif /*HAVE_SAVED_UIDS*/
-+
-+
-+/* Return the offset from GMT in seconds (algorithm taken from sendmail).
-+ *
-+ * warning:
-+ *	clobbers the static storage space used by localtime() and gmtime().
-+ *	If the local pointer is non-NULL it *must* point to a local copy.
-+ */
-+#ifndef HAVE_TM_GMTOFF
-+long get_gmtoff(time_t *clock, struct tm *local)
-+{
-+	struct tm gmt;
-+	long offset;
-+
-+	gmt = *gmtime(clock);
-+	if (local == NULL)
-+		local = localtime(clock);
-+
-+	offset = (local->tm_sec - gmt.tm_sec) +
-+	    ((local->tm_min - gmt.tm_min) * 60) +
-+	    ((local->tm_hour - gmt.tm_hour) * 3600);
-+
-+	/* Timezone may cause year rollover to happen on a different day. */
-+	if (local->tm_year < gmt.tm_year)
-+		offset -= 24 * 3600;
-+	else if (local->tm_year > gmt.tm_year)
-+		offset += 24 * 3600;
-+	else if (local->tm_yday < gmt.tm_yday)
-+		offset -= 24 * 3600;
-+	else if (local->tm_yday > gmt.tm_yday)
-+		offset += 24 * 3600;
-+
-+	return (offset);
-+}
-+#endif /* HAVE_TM_GMTOFF */
diff --git a/debian/patches/features/recover-from-broken-symlinks b/debian/patches/features/recover-from-broken-symlinks
deleted file mode 100644
index 52fb96b..0000000
--- a/debian/patches/features/recover-from-broken-symlinks
+++ /dev/null
@@ -1,65 +0,0 @@
-Subject: Recover from broken symlinks in /etc/cron.d
-Author: Christian Kastner <debian at kvr.at
-Last-Update: 2010-04-19
-
-The way the current power-management-friendly change detection logic notices
-changes to /etc/cron.d, broken symlinks do not get added back once they are
-restored again.
-This is only relevant to /etc/cron.d because SPOOL_DIR does not allow symlinks.
-
-Bug-Debian: http://bugs.debian.org/433609
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:19:01.607560756 +0200
-+++ patched/database.c	2010-05-06 18:19:02.884526570 +0200
-@@ -126,7 +126,8 @@
- 			if (stat(syscrond_fname, &syscrond_file_stat) < OK)
- 				syscrond_file_stat.st_mtime = 0;
- 
--			if (syscrond_file_stat.st_mtime != systab->mtime) {
-+			if (syscrond_file_stat.st_mtime != systab->mtime ||
-+				systab->mtime == 0) {
- 			        syscrond_change = 1;
-                         }
- 
-@@ -381,9 +382,38 @@
-             }
-             if ((crontab_fd = open(tabname, O_RDONLY, 0)) < OK) {
- 		/* crontab not accessible?
-+
-+                   If tabname is a regular file, this error is bad so we skip
-+		   it instead of adding it to the new DB. If it's a symlink,
-+                   it's most probably just broken, so we emit a warning.
-+                   Then we re-add the old crontab to the new DB, but only after
-+                   removing all entries and resetting its mtime. Once the link
-+                   is fixed, it will get picked up and processed again.
- 		 */
--		log_it(fname, getpid(), "CAN'T OPEN", tabname);
--		goto next_crontab;
-+                if (S_ISREG(statbuf->st_mode)) {
-+		    log_it(fname, getpid(), "CAN'T OPEN", tabname);
-+		    goto next_crontab;
-+                } else {
-+                    log_it(fname, getpid(), "CAN'T OPEN SYMLINK", tabname);
-+
-+                    u = find_user(old_db, fname);
-+                    if (u != NULL) {
-+			Debug(DLOAD, ("\t%s: [using placeholder]\n", fname))
-+                        unlink_user(old_db, u);
-+
-+			if (u->crontab != NULL) {
-+                    	    entry *e, *ne;
-+			    for (e = u->crontab;  e != NULL;  e = ne) {
-+			    	ne = e->next;
-+			    	free_entry(e);
-+			    }
-+			}
-+                        u->crontab = NULL;
-+                        u->mtime = 0;
-+                        link_user(new_db, u);
-+                        goto next_crontab;
-+                    }
-+                }                
-             }
- 
-             if (fstat(crontab_fd, statbuf) < OK) {
diff --git a/debian/patches/features/run-on-reboot b/debian/patches/features/run-on-reboot
deleted file mode 100644
index 94bab7d..0000000
--- a/debian/patches/features/run-on-reboot
+++ /dev/null
@@ -1,56 +0,0 @@
-Subject: Proper handling of @reboot entries
-Last-Update: 2010-04-11
-
-cron runs @reboot jobs on restart instead of on reboot. Fix this.
-
-http://bugs.debian.org/74762
-http://bugs.debian.org/77563
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:51.095435790 +0200
-+++ patched/cron.c	2010-05-06 18:18:53.954560978 +0200
-@@ -255,6 +255,10 @@
- 	}
- }
- 
-+#ifdef DEBIAN
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#endif
- 
- static void
- run_reboot_jobs(db)
-@@ -262,7 +266,31 @@
- {
- 	register user		*u;
- 	register entry		*e;
-+    int rbfd;
-+#ifdef DEBIAN
-+#define REBOOT_FILE "/var/run/crond.reboot"
-+	/* Run on actual reboot, rather than cron restart */
-+	if (access(REBOOT_FILE, F_OK) == 0) {
-+	        /* File exists, return */
-+     	        log_it("CRON", getpid(),"INFO",
-+		       "Skipping @reboot jobs -- not system startup");
-+	        return;
-+	}
-+	/* Create the file */
-+	if ((rbfd = creat(REBOOT_FILE, S_IRUSR&S_IWUSR)) < 0) {
-+		/* Bad news, bail out */
-+	        log_it("CRON",getpid(),"DEATH","Can't create reboot check file");
-+		exit(0);
-+	} else {
-+		close(rbfd);
-+		log_it("CRON", getpid(),"INFO", "Running @reboot jobs");
-+	}
-+      
- 
-+        Debug(DMISC, ("[%d], Debian running reboot jobs\n",getpid()));
-+    
-+#endif
-+        Debug(DMISC, ("[%d], vixie running reboot jobs\n", getpid()));
- 	for (u = db->head;  u != NULL;  u = u->next) {
- 		for (e = u->crontab;  e != NULL;  e = e->next) {
- 			if (e->flags & WHEN_REBOOT) {
diff --git a/debian/patches/features/security-make-crontab-setgid-crontab b/debian/patches/features/security-make-crontab-setgid-crontab
deleted file mode 100644
index 30661fa..0000000
--- a/debian/patches/features/security-make-crontab-setgid-crontab
+++ /dev/null
@@ -1,377 +0,0 @@
-Subject: Make crontab SETGID crontab instead of SETUID root
-Last-Update: 2010-04-11
-
-This reduces the risk of a security incident in connection with crontab(1).
-Nevertheless, Tomi Miettinen's advice in #18333 of not SETing and all but
-instead using sockets should be taken into consideration.
-
-Bug-Debian: http://bugs.debian.org/18333
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:44.880437493 +0200
-+++ patched/crontab.c	2010-05-06 18:18:52.595435667 +0200
-@@ -108,7 +108,6 @@
- 	setlinebuf(stderr);
- #endif
- 	parse_args(argc, argv);		/* sets many globals, opens a file */
--	set_cron_uid();
- 	set_cron_cwd();
- 	if (!allowed(User)) {
-                 if ( getuid() != 0 ) {
-@@ -373,12 +372,6 @@
-                 return -1;
-         }
- 
--        if (chown(Directory, getuid(), getgid()) < 0) {
--                perror(Directory);
--                Directory[0] = '\0';
--                return -1;
--        }
--
-         /* Now create the actual temporary crontab file */
-         if (snprintf(Filename, MAX_FNAME, "%s/crontab", Directory)
-             >= MAX_FNAME) {
-@@ -414,7 +407,7 @@
- 		perror("fstat");
- 		return -1;
- 	}
--	if (statbuf.st_uid != getuid() || statbuf.st_gid != getgid()) {
-+	if (statbuf.st_uid != getuid()) {
- 		fprintf(stderr, "Temporary crontab no longer owned by you.\n");
- 		return -1;;
- 	}
-@@ -568,7 +561,6 @@
- 		editor = EDITOR;
- 	}
- 
-- again:
- 
-         /*  Close before cleanup_tmp_crontab is called or otherwise
-          *  (on NFS mounted /) will get renamed on unlink */
-@@ -577,12 +569,15 @@
-                 goto fatal;
- 	}
- 
-+again: /* Loop point for retrying edit after error */
-+
- 	/* Turn off signals. */
- 	(void)signal(SIGHUP, SIG_IGN);
- 	(void)signal(SIGINT, SIG_IGN);
- 	(void)signal(SIGQUIT, SIG_IGN);
- 
--
-+        /* Give up privileges while editing */
-+        swap_uids();
- 
- 	switch (pid = fork()) {
- 	case -1:
-@@ -590,10 +585,14 @@
- 		goto fatal;
- 	case 0:
- 		/* child */
--		if (setuid(getuid()) < 0) {
--			perror("setuid(getuid())");
--			exit(ERROR_EXIT);
--		}
-+                if (setgid(getgid()) < 0) {
-+                        perror("setgid(getgid())");
-+                        exit(ERROR_EXIT);
-+                }
-+                if (setuid(getuid()) < 0) {
-+                        perror("setuid(getuid())");
-+                        exit(ERROR_EXIT);
-+                }
- 		if (chdir("/tmp") < 0) {
- 			perror("chdir(/tmp)");
- 			exit(ERROR_EXIT);
-@@ -643,6 +642,9 @@
- 	(void)signal(SIGQUIT, SIG_DFL);
- 	(void)signal(SIGTSTP, SIG_DFL);
- 
-+        /* Need privs again */
-+        swap_uids_back();
-+
-         switch (open_tmp_crontab(&fsbuf)) {
-         case -1:
-                 fprintf(stderr, "Error while editing crontab\n");
-@@ -725,21 +727,12 @@
- 	time_t	now = time(NULL);
- 	char	**envp = env_init();
- 	mode_t	um;
--	int	saved_uid;
- 
- 	if (envp == NULL) {
- 		fprintf(stderr, "%s: Cannot allocate memory.\n", ProgramName);
- 		return (-2);
- 	}
- 
--	/* Assume privilege.  This way we can only receive signals on our
--	   input - the ones listed below (or from root - root's problem, not
--	   ours). */
--	saved_uid = getuid();
--	if (setuid(geteuid()) < 0) {
--		perror("setuid");
--		return -2;
--	}
- 
- 	/* Assumes Linux-style signal handlers (takes int, returns void) */
- 	/* Signal handlers, to ensure we do not leave temp files in the
-@@ -813,22 +806,9 @@
- 	if (CheckErrorCount != 0) {
- 		fprintf(stderr, "errors in crontab file, can't install.\n");
- 		fclose(tmp);  unlink(tn);
--		/* Give up privilege, in case we loop. */
--		if (setreuid(saved_uid, -1) < 0)
--			return (-2);
- 		return (-1);
- 	}
- 
--#ifdef HAS_FCHOWN
--	if (fchown(fileno(tmp), ROOT_UID, -1) < OK)
--#else
--	if (chown(tn, ROOT_UID, -1) < OK)
--#endif
--	{
--		perror("chown");
--		fclose(tmp);  unlink(tn);
--		return (-2);
--	}
- 
- #ifdef HAS_FCHMOD
- 	if (fchmod(fileno(tmp), 0600) < OK)
-@@ -848,6 +828,15 @@
- 		return (-2);
- 	}
- 
-+        /* Root on behalf of another user must set file owner to that user */
-+        if (getuid() == ROOT_UID && strcmp(User, RealUser) != 0) {
-+            if (chown(tn, pw->pw_uid, -1) != 0) {
-+                perror("chown");
-+                unlink(tn);
-+                return -2;
-+            }
-+        }
-+
- 	(void) snprintf(n, sizeof(n), CRON_TAB(User));
- 	if (rename(tn, n)) {
- 		fprintf(stderr, "%s: %s: rename: %s\n",
-@@ -861,11 +850,6 @@
- 
- 	poke_daemon();
- 
--	/* Give up privilege, just in case. */
--	/* Don't need to check for error; nothing happens beyond here but a log entry,
--	   and the failure message is incorrect after the rename above. */
--	setreuid(saved_uid, -1);
--
- 	return (0);
- }
- 
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:49.631436001 +0200
-+++ patched/database.c	2010-05-06 18:18:52.595435667 +0200
-@@ -24,7 +24,9 @@
- 
- 
- #include "cron.h"
-+#define __USE_GNU /* For O_NOFOLLOW */
- #include <fcntl.h>
-+#undef __USE_GNU
- #include <sys/stat.h>
- #include <sys/file.h>
- 
-@@ -337,18 +339,77 @@
- 		goto next_crontab;
- 	}
- 
--	if ((crontab_fd = open(tabname, O_RDONLY, 0)) < OK) {
-+        if (pw) {
-+            /* Path for user crontabs (including root's!) */
-+            if ((crontab_fd = open(tabname, O_RDONLY|O_NOFOLLOW, 0)) < OK) {
- 		/* crontab not accessible?
- 		 */
- 		log_it(fname, getpid(), "CAN'T OPEN", tabname);
- 		goto next_crontab;
--	}
-+            }
- 
--	if (fstat(crontab_fd, statbuf) < OK) {
-+            if (fstat(crontab_fd, statbuf) < OK) {
- 		log_it(fname, getpid(), "FSTAT FAILED", tabname);
- 		goto next_crontab;
--	}
-+            }
-+            /* Check to make sure that the crontab is owned by the correct user
-+               (or root) */
-+
-+            if (statbuf->st_uid != pw->pw_uid &&
-+                statbuf->st_uid != ROOT_UID) {
-+                log_it(fname, getpid(), "WRONG FILE OWNER", tabname);
-+		goto next_crontab;
-+            }
-+            if (!S_ISREG(statbuf->st_mode) ||
-+                statbuf->st_nlink != 1 ||
-+                (statbuf->st_mode & 07777) != 0600) {
-+                log_it(fname, getpid(), "WRONG INODE INFO", tabname);
-+ 		goto next_crontab;
-+            }
-+        } else {
-+            /* System crontab path. These can be symlinks, but the
-+               symlink and the target must be owned by root. */
-+            if (lstat(tabname, statbuf) < OK) {
-+		log_it(fname, getpid(), "LSTAT FAILED", tabname);
-+		goto next_crontab;
-+            }
-+            if (S_ISLNK(statbuf->st_mode) && statbuf->st_uid != ROOT_UID) {
-+                log_it(fname, getpid(), "WRONG SYMLINK OWNER", tabname);
-+		goto next_crontab;
-+            }
-+            if ((crontab_fd = open(tabname, O_RDONLY, 0)) < OK) {
-+		/* crontab not accessible?
-+		 */
-+		log_it(fname, getpid(), "CAN'T OPEN", tabname);
-+		goto next_crontab;
-+            }
- 
-+            if (fstat(crontab_fd, statbuf) < OK) {
-+		log_it(fname, getpid(), "FSTAT FAILED", tabname);
-+		goto next_crontab;
-+            }
-+            /* Check to make sure that the crontab is owned by root */
-+            if (statbuf->st_uid != ROOT_UID) {
-+                log_it(fname, getpid(), "WRONG FILE OWNER", tabname);
-+		goto next_crontab;
-+            }
-+            /* Check to make sure that the crontab is writable only by root */
-+            if ((statbuf->st_mode & S_IWGRP) || (statbuf->st_mode & S_IWOTH))  {
-+                log_it(fname, getpid(), "WRONG INODE INFO", tabname);
-+		goto next_crontab;
-+            }
-+            /* Technically, we should also check whether the parent dir is
-+ 	     * writable, and so on. This would only make proper sense for
-+ 	     * regular files; we can't realistically check all possible
-+ 	     * security issues resulting from symlinks. We'll just assume that
-+ 	     * root will handle responsible when creating them.
-+	     */
-+        }
-+        /*
-+         * The link count check is not sufficient (the owner may
-+         * delete their original link, reducing the link count back to
-+         * 1), but this is all we've got.
-+         */
- 	Debug(DLOAD, ("\t%s:", fname))
- 	u = find_user(old_db, fname);
- 	if (u != NULL) {
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:51.875560985 +0200
-+++ patched/misc.c	2010-05-06 18:18:52.595435667 +0200
-@@ -35,6 +35,7 @@
- #include <errno.h>
- #include <string.h>
- #include <fcntl.h>
-+#include <grp.h>
- #if defined(SYSLOG)
- # include <syslog.h>
- #endif
-@@ -191,18 +192,29 @@
- set_cron_cwd()
- {
- 	struct stat	sb;
--
-+	mode_t		um;
-+	struct group	*gr;
-+	
- 	/* first check for CRONDIR ("/var/cron" or some such)
- 	 */
- 	if (stat(CRONDIR, &sb) < OK && errno == ENOENT) {
- 		perror(CRONDIR);
--		if (OK == mkdir(CRONDIR, 0700)) {
-+
-+		/* crontab(1) running SGID crontab shouldn't attempt to create
-+		 * directories */
-+		if (getuid() != 0 )
-+			exit(ERROR_EXIT);
-+
-+		um = umask(000);
-+		if (OK == mkdir(CRONDIR, CRONDIR_MODE)) {
- 			fprintf(stderr, "%s: created\n", CRONDIR);
- 			stat(CRONDIR, &sb);
- 		} else {
--			fprintf(stderr, "%s: mkdir: %s\n", CRONDIR, strerror(errno));
-+			fprintf(stderr, "%s: mkdir: %s\n", CRONDIR,
-+				strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
-+		(void) umask(um);
- 	}
- 	if (!(sb.st_mode & S_IFDIR)) {
- 		fprintf(stderr, "'%s' is not a directory, bailing out.\n",
-@@ -218,11 +230,33 @@
- 	 */
- 	if (stat(SPOOL_DIR, &sb) < OK && errno == ENOENT) {
- 		perror(SPOOL_DIR);
--		if (OK == mkdir(SPOOL_DIR, 0700)) {
-+
-+		/* crontab(1) running SGID crontab shouldn't attempt to create
-+		 * directories */
-+		if (getuid() != 0 )
-+			exit(ERROR_EXIT);
-+
-+		um = umask(000);
-+		if (OK == mkdir(SPOOL_DIR, SPOOL_DIR_MODE)) {
- 			fprintf(stderr, "%s: created\n", SPOOL_DIR);
--			stat(SPOOL_DIR, &sb);
- 		} else {
--			fprintf(stderr, "%s: mkdir: %s\n", SPOOL_DIR, strerror(errno));
-+			fprintf(stderr, "%s: mkdir: %s\n", SPOOL_DIR,
-+				strerror(errno));
-+			exit(ERROR_EXIT);
-+		}
-+		(void) umask(um);
-+
-+		if (!(gr = getgrnam(SPOOL_DIR_GROUP))) {
-+			fprintf(stderr, "%s: getgrnam: %s\n", SPOOL_DIR,
-+				strerror(errno));
-+			exit(ERROR_EXIT);
-+		}
-+		if (OK == chown(SPOOL_DIR, -1, gr->gr_gid)) {
-+			fprintf(stderr, "%s: chowned\n", SPOOL_DIR);
-+				stat(SPOOL_DIR, &sb);
-+		} else {
-+			fprintf(stderr, "%s: chown: %s\n", SPOOL_DIR,
-+			strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 	}
-Index: patched/pathnames.h
-===================================================================
---- patched.orig/pathnames.h	2010-05-06 18:18:50.298436009 +0200
-+++ patched/pathnames.h	2010-05-06 18:18:52.595435667 +0200
-@@ -93,3 +93,25 @@
- #ifndef _PATH_DEFPATH_ROOT
- # define _PATH_DEFPATH_ROOT "/usr/sbin:/usr/bin:/sbin:/bin"
- #endif
-+
-+
-+#ifdef DEBIAN
-+#ifndef CRONDIR_MODE
-+			/* Create mode for CRONDIR; must be in sync with
-+			 * packaging
-+			 */
-+#define CRONDIR_MODE 0755
-+#endif
-+#ifndef SPOOL_DIR_MODE
-+			/* Create mode for SPOOL_DIR; must be in sync with
-+			 * packaging
-+			 */
-+#define SPOOL_DIR_MODE 01730
-+#endif
-+#ifndef SPOOL_DIR_GROUP
-+			/* Chown SPOOL_DIR to this group (needed by Debian's
-+			 * SGID crontab feature)
-+			 */ 
-+#define SPOOL_DIR_GROUP "crontab"
-+#endif
-+#endif
diff --git a/debian/patches/features/selinux-support b/debian/patches/features/selinux-support
deleted file mode 100644
index a958776..0000000
--- a/debian/patches/features/selinux-support
+++ /dev/null
@@ -1,304 +0,0 @@
-Subject: SELinux support
-Author: Manoj Srivastava <srivasta at debian.org>
-
-Enable SELinux support on Linux-based architectures. Also contains patches from
-Russell Coker <russell at coker.com.au>.
- 
-Bug-Debian: http://bugs.debian.org/315509
-Bug-Debian: http://bugs.debian.org/279429
-Bug-Debian: http://bugs.debian.org/264320
-Bug-Debian: http://bugs.debian.org/324017
-Bug-Debian: http://bugs.debian.org/325404
-Bug-Debian: http://bugs.debian.org/361458
-Bug-Debian: http://bugs.debian.org/383857
-Index: patched/Makefile
-===================================================================
---- patched.orig/Makefile	2010-05-06 18:18:47.436487807 +0200
-+++ patched/Makefile	2010-05-06 18:18:48.837561139 +0200
-@@ -55,7 +55,7 @@
- INCLUDE		=	-I.
- #INCLUDE	=
- #<<need getopt()>>
--LIBS		= $(PAM_LIBS)
-+LIBS		= $(PAM_LIBS) $(SELINUX_LIBS)
- #<<optimize or debug?>>
- OPTIM		=	-O2
- #OPTIM		=	-g
-@@ -74,7 +74,7 @@
- # Allow override from command line
- DEBUG_DEFS = -DDEBUGGING=0   
- # The -DUSE_SIGCHLD is needed for the Alpha port
--DEFS = -DDEBIAN -DUSE_SIGCHLD $(DEBUG_DEFS) $(PAM_DEFS)
-+DEFS = -DDEBIAN -DUSE_SIGCHLD $(DEBUG_DEFS) $(PAM_DEFS) $(SELINUX_DEFS)
- #(SGI IRIX systems need this)
- #DEFS		=	-D_BSD_SIGNALS -Dconst=
- #<<the name of the BSD-like install program>>
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:30.896560600 +0200
-+++ patched/cron.h	2010-05-06 18:18:48.838561166 +0200
-@@ -40,6 +40,13 @@
- #include "config.h"
- #include "externs.h"
- 
-+#ifdef WITH_SELINUX
-+#include <selinux/selinux.h>
-+#endif
-+
-+#define SYSUSERNAME "root"
-+
-+
- 	/* these are really immutable, and are
- 	 *   defined for symbolic convenience only
- 	 * TRUE, FALSE, and ERR must be distinct
-@@ -174,6 +181,9 @@
- 	char		*name;
- 	time_t		mtime;		/* last modtime of crontab */
- 	entry		*crontab;	/* this person's crontab */
-+#ifdef WITH_SELINUX
-+        security_context_t scontext;    /* SELinux security context */
-+#endif
- } user;
- 
- typedef	struct _cron_db {
-@@ -220,7 +230,7 @@
- 		**env_copy __P((char **)),
- 		**env_set __P((char **, char *));
- 
--user		*load_user __P((int, struct passwd *, char *)),
-+user		*load_user __P((int, struct passwd *, char *, char *, char *)),
- 		*find_user __P((cron_db *, char *));
- 
- entry		*load_entry __P((FILE *, void (*)(),
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:36.431560887 +0200
-+++ patched/database.c	2010-05-06 18:18:48.838561166 +0200
-@@ -97,7 +97,7 @@
- 	new_db.head = new_db.tail = NULL;
- 
- 	if (syscron_stat.st_mtime) {
--		process_crontab("root", "*system*",
-+		process_crontab(SYSUSERNAME, "*system*",
- 				SYSCRONTAB, &syscron_stat,
- 				&new_db, old_db);
- 	}
-@@ -261,7 +261,8 @@
- 		free_user(u);
- 		log_it(fname, getpid(), "RELOAD", tabname);
- 	}
--	u = load_user(crontab_fd, pw, fname);
-+
-+	u = load_user(crontab_fd, pw, uname, fname, tabname);
- 	if (u != NULL) {
- 		u->mtime = statbuf->st_mtime;
- 		link_user(new_db, u);
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:48.182560885 +0200
-+++ patched/do_command.c	2010-05-06 18:18:48.877435845 +0200
-@@ -42,6 +42,11 @@
-    }
- #endif
- 
-+#ifdef WITH_SELINUX
-+#include <selinux/selinux.h>
-+/* #include <selinux/get_context_list.h> */
-+#endif
-+
- 
- static void		child_process __P((entry *, user *)),
- 			do_univ __P((user *));
-@@ -332,6 +337,23 @@
- 				_exit(OK_EXIT);
- 			}
- # endif /*DEBUGGING*/
-+#ifdef WITH_SELINUX
-+			if (is_selinux_enabled() > 0) {
-+			    if (u->scontext != 0L) {
-+                                if (setexeccon(u->scontext) < 0) {
-+                                    if (security_getenforce() > 0) {
-+                                        fprintf(stderr, "Could not set exec context to %s for user  %s\n", u->scontext,u->name);
-+                                        _exit(ERROR_EXIT);
-+                                    }
-+			        }
-+                            }
-+			    else if(security_getenforce() > 0)
-+			    {
-+                                fprintf(stderr, "Error, must have a security context for the cron job when in enforcing mode.\nUser %s.\n", u->name);
-+                                _exit(ERROR_EXIT);
-+			    }
-+			}
-+#endif
-                         execle(shell, shell, "-c", e->cmd, (char *)0, jobenv);
- 			fprintf(stderr, "%s: execle: %s\n", shell, strerror(errno));
- 			_exit(ERROR_EXIT);
-Index: patched/user.c
-===================================================================
---- patched.orig/user.c	2010-05-06 18:18:32.328436004 +0200
-+++ patched/user.c	2010-05-06 18:18:48.877435845 +0200
-@@ -25,6 +25,107 @@
- 
- #include "cron.h"
- 
-+#ifdef WITH_SELINUX
-+#include <selinux/context.h>
-+#include <selinux/selinux.h>
-+#include <selinux/flask.h>
-+#include <selinux/av_permissions.h>
-+#include <selinux/get_context_list.h>
-+
-+static int get_security_context(char *name, int crontab_fd, security_context_t
-+                                *rcontext, char *tabname) {
-+    security_context_t *context_list = NULL;
-+    security_context_t current_con;
-+    int list_count = 0;
-+    security_context_t  file_context=NULL;
-+    struct av_decision avd;
-+    int retval=0;
-+    char *seuser = NULL;
-+    char *level = NULL;
-+    int i;
-+
-+    if (name != NULL) {
-+        if (getseuserbyname(name, &seuser, &level)) {
-+            log_it(name, getpid(), "getseuserbyname FAILED", tabname);
-+            return (security_getenforce() > 0);
-+        }
-+    }
-+    else
-+    {
-+        seuser = strdup("system_u");
-+    }
-+
-+    *rcontext = NULL;
-+    if(getcon(&current_con)) {
-+        log_it(name, getpid(), "Can't get current context", tabname);
-+        return -1;
-+    }
-+    list_count = get_ordered_context_list_with_level(seuser, level, current_con, &context_list);
-+    freecon(current_con);
-+    free(seuser);
-+    free(level);
-+    if (list_count == -1) {
-+        if (security_getenforce() > 0) {
-+            log_it(name, getpid(), "No SELinux security context", tabname);
-+            return -1;
-+        } else {
-+            log_it(name, getpid(),
-+                   "No security context but SELinux in permissive mode,"
-+                   " continuing", tabname);
-+	    return 0;
-+        }
-+    }
-+
-+    if (fgetfilecon(crontab_fd, &file_context) < OK) {
-+        if (security_getenforce() > 0) {
-+            log_it(name, getpid(), "getfilecon FAILED", tabname);
-+            freeconary(context_list);
-+            return -1;
-+        } else {
-+            log_it(name, getpid(), "getfilecon FAILED but SELinux in "
-+                   "permissive mode, continuing", tabname);
-+            *rcontext = strdup(context_list[0]);
-+            freeconary(context_list);
-+            return 0;
-+        }
-+    }
-+
-+    /*
-+     * Since crontab files are not directly executed,
-+     * crond must ensure that the crontab file has
-+     * a context that is appropriate for the context of
-+     * the user cron job.  It performs an entrypoint
-+     * permission check for this purpose.
-+     */
-+
-+    for(i = 0; i < list_count; i++)
-+    {
-+        retval = security_compute_av(context_list[i],
-+                                 file_context,
-+                                 SECCLASS_FILE,
-+                                 FILE__ENTRYPOINT,
-+                                 &avd);
-+        if(!retval && ((FILE__ENTRYPOINT & avd.allowed) == FILE__ENTRYPOINT)) {
-+            *rcontext = strdup(context_list[i]);
-+            freecon(file_context);
-+            freeconary(context_list);
-+            return 0;
-+        }
-+    }
-+    freecon(file_context);
-+    if (security_getenforce() > 0) {
-+        log_it(name, getpid(), "ENTRYPOINT FAILED", tabname);
-+        freeconary(context_list);
-+        return -1;
-+    } else {
-+        log_it(name, getpid(), "ENTRYPOINT FAILED but SELinux in permissive mode, continuing", tabname);
-+        *rcontext = strdup(context_list[0]);
-+        freeconary(context_list);
-+    }
-+    return 0;
-+}
-+#endif
-+
- 
- void
- free_user(u)
-@@ -37,15 +138,21 @@
- 		ne = e->next;
- 		free_entry(e);
- 	}
-+#ifdef WITH_SELINUX
-+	if (u->scontext)
-+		freecon(u->scontext);
-+#endif
- 	free(u);
- }
- 
- 
- user *
--load_user(crontab_fd, pw, name)
-+load_user(crontab_fd, pw, uname, fname, tabname)
- 	int		crontab_fd;
- 	struct passwd	*pw;		/* NULL implies syscrontab */
--	char		*name;
-+	char		*uname;
-+	char		*fname;
-+	char		*tabname;
- {
- 	char	envstr[MAX_ENVSTR];
- 	FILE	*file;
-@@ -67,13 +174,31 @@
- 		errno = ENOMEM;
- 		return NULL;
- 	}
--	if ((u->name = strdup(name)) == NULL) {
-+	if ((u->name = strdup(fname)) == NULL) {
- 		free(u);
- 		errno = ENOMEM;
- 		return NULL;
- 	}
- 	u->crontab = NULL;
- 
-+#ifdef WITH_SELINUX
-+	u->scontext = NULL;
-+        if (is_selinux_enabled() > 0) {
-+            char *sname=uname;
-+            if (pw==NULL) {
-+                sname="system_u";
-+            }
-+            if (get_security_context(sname, crontab_fd, 
-+                                     &u->scontext, tabname) != 0 ) {
-+		u->scontext = NULL;
-+                free_user(u);
-+                u = NULL;
-+                goto done;
-+            }
-+        }
-+#endif
-+
-+
- 	/* 
- 	 * init environment.  this will be copied/augmented for each entry.
- 	 */
diff --git a/debian/patches/features/set-contenttype-in-mail b/debian/patches/features/set-contenttype-in-mail
deleted file mode 100644
index 4cb33b0..0000000
--- a/debian/patches/features/set-contenttype-in-mail
+++ /dev/null
@@ -1,131 +0,0 @@
-Subject: Set ContentType: header in emails
-Origin: vendor,Fedora Core
-
-Set the ContentType: header based on the system locale or cron's evironment,
-if available.
-
-Bug-Debian: http://bugs.debian.org/338051
-Bug-Debian: http://bugs.debian.org/309150
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:53.954560978 +0200
-+++ patched/cron.c	2010-05-06 18:18:54.665561020 +0200
-@@ -63,6 +63,7 @@
- 	char	*argv[];
- {
- 	cron_db	database;
-+	char *cs;
- 
- 	ProgramName = argv[0];
- 
-@@ -95,6 +96,19 @@
- 	setenv("PATH", _PATH_DEFPATH, 1);
- #endif
- 
-+       /* Get the default locale character set for the mail
-+        * "Content-Type: ...; charset=" header
-+        */
-+       setlocale(LC_ALL,""); /* set locale to system defaults or to
-+                                that specified by any  LC_* env vars */
-+       /* Except that "US-ASCII" is preferred to "ANSI_x3.4-1968" in MIME,
-+        * even though "ANSI_x3.4-1968" is the official charset name. */
-+       if ( ( cs = nl_langinfo( CODESET ) ) != 0L && 
-+               strcmp(cs, "ANSI_x3.4-1968") != 0 )
-+           strncpy( cron_default_mail_charset, cs, MAX_ENVSTR );
-+       else
-+           strcpy( cron_default_mail_charset, "US-ASCII" );
-+
- 	/* if there are no debug flags turned on, fork as a daemon should.
- 	 */
- # if DEBUGGING
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:51.094436073 +0200
-+++ patched/cron.h	2010-05-06 18:18:54.665561020 +0200
-@@ -292,6 +292,8 @@
- 
- int     lsbsysinit_mode;
- 
-+char    cron_default_mail_charset[MAX_ENVSTR] = "";
-+
- # if DEBUGGING
- int	DebugFlags;
- char	*DebugFlagNames[] = {	/* sync with #defines */
-@@ -310,6 +312,7 @@
- extern  time_min timeRunning;
- extern  time_min virtualTime;
- extern  time_min clockTime;
-+extern  char     cron_default_mail_charset[MAX_ENVSTR];
- # if DEBUGGING
- extern	int	DebugFlags;
- extern	char	*DebugFlagNames[];
-Index: patched/externs.h
-===================================================================
---- patched.orig/externs.h	2010-05-06 18:18:22.672435408 +0200
-+++ patched/externs.h	2010-05-06 18:18:54.665561020 +0200
-@@ -26,6 +26,11 @@
- # define WAIT_IS_INT 1
- extern char *tzname[2];
- # define TZONE(tm) tzname[(tm).tm_isdst]
-+/* include locale stuff for mailer "Content-Type":
-+ */
-+#include <locale.h>
-+#include <nl_types.h>
-+#include <langinfo.h>
- #endif
- 
- #if defined(UNIXPC)
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:51.094436073 +0200
-+++ patched/do_command.c	2010-05-06 18:18:54.665561020 +0200
-@@ -486,8 +486,12 @@
- 
- 			if (mailto) {
- 				register char	**env;
-+                        	char    **jobenv = build_env(e->envp); 
- 				auto char	mailcmd[MAX_COMMAND];
- 				auto char	hostname[MAXHOSTNAMELEN];
-+				char    *content_type = env_get("CONTENT_TYPE",jobenv),
-+					*content_transfer_encoding = env_get("CONTENT_TRANSFER_ENCODING",jobenv);
-+
- 
- 				(void) gethostname(hostname, MAXHOSTNAMELEN);
- 				(void) snprintf(mailcmd, sizeof(mailcmd),
-@@ -505,6 +509,36 @@
- 				fprintf(mail, "Date: %s\n",
- 					arpadate(&StartTime));
- # endif /* MAIL_DATE */
-+                               if ( content_type == 0L ) {
-+                                       fprintf(mail, "Content-Type: text/plain; charset=%s\n",
-+                                               cron_default_mail_charset
-+                                              );
-+                               } else {   
-+				    /* user specified Content-Type header.
-+				     * disallow new-lines for security reasons
-+				     * (else users could specify arbitrary mail headers!)
-+				     */
-+				       char *nl=content_type;
-+                                       size_t ctlen = strlen(content_type);
-+
-+                                       while(  (*nl != '\0')
-+                                            && ((nl=strchr(nl,'\n')) != 0L)
-+                                            && (nl < (content_type+ctlen))
-+                                            ) *nl = ' ';
-+                                       fprintf(mail,"Content-Type: %s\n", content_type);
-+                               }
-+                               if ( content_transfer_encoding != 0L ) {
-+                                       char *nl=content_transfer_encoding;
-+                                       size_t ctlen = strlen(content_transfer_encoding);
-+                                       while(  (*nl != '\0')
-+                                            && ((nl=strchr(nl,'\n')) != 0L)
-+                                            && (nl < (content_transfer_encoding+ctlen))
-+                                            ) *nl = ' ';
-+
-+                                       fprintf(mail,"Content-Transfer-Encoding: %s\n", content_transfer_encoding);
-+                               }
-+
-+
- 				for (env = e->envp;  *env;  env++)
- 					fprintf(mail, "X-Cron-Env: <%s>\n",
- 						*env);
diff --git a/debian/patches/features/support-for-drop.d-directory b/debian/patches/features/support-for-drop.d-directory
deleted file mode 100644
index b7ed9e1..0000000
--- a/debian/patches/features/support-for-drop.d-directory
+++ /dev/null
@@ -1,334 +0,0 @@
-Subject: Support for drop-in directory /etc/cron.d
-Last-Update: 2010-04-11
-
-Add support for /etc/cron.d, a drop-in directory for packages. This involves
-numerous features, such as:
-    * Efficiently detecting changes
-    * LSB-conform naming convention
-    * Security concerns
-
-Bug-Debian: http://bugs.debian.org/171587
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:48.838561166 +0200
-+++ patched/database.c	2010-05-06 18:18:49.631436001 +0200
-@@ -46,18 +46,27 @@
- static	void		process_crontab __P((char *, char *, char *,
- 					     struct stat *,
- 					     cron_db *, cron_db *));
--
--
-+#ifdef DEBIAN
-+static int valid_name (char *filename);
-+static user *get_next_system_crontab __P((user *));
-+#endif
- void
- load_database(old_db)
- 	cron_db		*old_db;
- {
--	DIR		*dir;
-+        DIR		*dir;
- 	struct stat	statbuf;
- 	struct stat	syscron_stat;
- 	DIR_T   	*dp;
- 	cron_db		new_db;
- 	user		*u, *nu;
-+#ifdef DEBIAN
-+	struct stat     syscrond_stat;
-+	struct stat     syscrond_file_stat;
-+	
-+        char            syscrond_fname[PATH_MAX+1];
-+	int             syscrond_change = 0;
-+#endif
- 
- 	Debug(DLOAD, ("[%d] load_database()\n", getpid()))
- 
-@@ -75,6 +84,53 @@
- 	if (stat(SYSCRONTAB, &syscron_stat) < OK)
- 		syscron_stat.st_mtime = 0;
- 
-+#ifdef DEBIAN
-+	/* Check mod time of SYSCRONDIR. This won't tell us if a file
-+         * in it changed, but will capture deletions, which the individual
-+         * file check won't
-+	 */
-+	if (stat(SYSCRONDIR, &syscrond_stat) < OK) {
-+		log_it("CRON", getpid(), "STAT FAILED", SYSCRONDIR);
-+		(void) exit(ERROR_EXIT);
-+	}
-+
-+	/* If SYSCRONDIR was modified, we know that something is changed and
-+	 * there is no need for any further checks. If it wasn't, we should
-+	 * pass through the old list of files in SYSCRONDIR and check their
-+	 * mod time. Therefore a stopped hard drive won't be spun up, since
-+	 * we avoid reading of SYSCRONDIR and don't change its access time.
-+	 * This is especially important on laptops with APM.
-+	 */
-+	if (old_db->sysd_mtime != syscrond_stat.st_mtime) {
-+	        syscrond_change = 1;
-+	} else {
-+	        /* Look through the individual files */
-+		user *systab;
-+
-+		Debug(DLOAD, ("[%d] system dir mtime unch, check files now.\n",
-+			      getpid()))
-+
-+		for (systab = old_db->head;
-+		     (systab = get_next_system_crontab (systab)) != NULL;
-+		     systab = systab->next) {
-+
-+			sprintf(syscrond_fname, "%s/%s", SYSCRONDIR,
-+							 systab->name + 8);
-+
-+			Debug(DLOAD, ("\t%s:", syscrond_fname))
-+
-+			if (stat(syscrond_fname, &syscrond_file_stat) < OK)
-+				syscrond_file_stat.st_mtime = 0;
-+
-+			if (syscrond_file_stat.st_mtime != systab->mtime) {
-+			        syscrond_change = 1;
-+                        }
-+
-+			Debug(DLOAD, (" [checked]\n"))
-+		}
-+	}
-+#endif /* DEBIAN */
-+
- 	/* if spooldir's mtime has not changed, we don't need to fiddle with
- 	 * the database.
- 	 *
-@@ -82,7 +138,14 @@
- 	 * so is guaranteed to be different than the stat() mtime the first
- 	 * time this function is called.
- 	 */
--	if (old_db->mtime == TMAX(statbuf.st_mtime, syscron_stat.st_mtime)) {
-+#ifdef DEBIAN
-+	if ((old_db->user_mtime == statbuf.st_mtime) &&
-+	    (old_db->sys_mtime == syscron_stat.st_mtime) &&
-+	    (!syscrond_change)) {
-+#else
-+	if ((old_db->user_mtime == statbuf.st_mtime) &&
-+	    (old_db->sys_mtime == syscron_stat.st_mtime)) {
-+#endif
- 		Debug(DLOAD, ("[%d] spool dir mtime unch, no load needed.\n",
- 			      getpid()))
- 		return;
-@@ -93,7 +156,11 @@
- 	 * actually changed.  Whatever is left in the old database when
- 	 * we're done is chaff -- crontabs that disappeared.
- 	 */
--	new_db.mtime = TMAX(statbuf.st_mtime, syscron_stat.st_mtime);
-+	new_db.user_mtime = statbuf.st_mtime;
-+	new_db.sys_mtime = syscron_stat.st_mtime;
-+#ifdef DEBIAN
-+	new_db.sysd_mtime = syscrond_stat.st_mtime;
-+#endif
- 	new_db.head = new_db.tail = NULL;
- 
- 	if (syscron_stat.st_mtime) {
-@@ -102,6 +169,46 @@
- 				&new_db, old_db);
- 	}
- 
-+#ifdef DEBIAN
-+	/* Read all the package crontabs. */
-+	if (!(dir = opendir(SYSCRONDIR))) {
-+		log_it("CRON", getpid(), "OPENDIR FAILED", SYSCRONDIR);
-+		(void) exit(ERROR_EXIT);
-+	}
-+
-+	while (NULL != (dp = readdir(dir))) {
-+		char	fname[MAXNAMLEN+1],
-+		        tabname[PATH_MAX+1];
-+
-+
-+		/* avoid file names beginning with ".".  this is good
-+		 * because we would otherwise waste two guaranteed calls
-+		 * to stat() for . and .., and also because package names
-+		 * starting with a period are just too nasty to consider.
-+		 */
-+		if (dp->d_name[0] == '.')
-+			continue;
-+
-+		/* skipfile names with letters outside the set
-+		 * [A-Za-z0-9_-], like run-parts.
-+		 */
-+		if (!valid_name(dp->d_name))
-+		  continue;
-+
-+		/* Generate the "fname" */
-+		(void) strcpy(fname,"*system*");
-+		(void) strcat(fname, dp->d_name);
-+		sprintf(tabname,"%s/%s", SYSCRONDIR, dp->d_name);
-+
-+		/* statbuf is used as working storage by process_crontab() --
-+		   current contents are irrelevant */
-+		process_crontab(SYSUSERNAME, fname, tabname,
-+				&statbuf, &new_db, old_db);
-+
-+	}
-+	closedir(dir);
-+#endif
-+
- 	/* we used to keep this dir open all the time, for the sake of
- 	 * efficiency.  however, we need to close it in every fork, and
- 	 * we fork a lot more often than the mtime of the dir changes.
-@@ -214,7 +321,13 @@
- 	int		crontab_fd = OK - 1;
- 	user		*u;
- 
-+#ifdef DEBIAN
-+	/* If the name begins with *system*, don't worry about password -
-+	 it's part of the system crontab */
-+	if (strncmp(fname, "*system*", 8) && !(pw = getpwnam(uname))) {
-+#else
- 	if (strcmp(fname, "*system*") && !(pw = getpwnam(uname))) {
-+#endif
- 		/* file doesn't have a user in passwd file.
- 		 */
- 		if (strncmp(fname, "tmp.", 4)) {
-@@ -274,3 +387,56 @@
- 		close(crontab_fd);
- 	}
- }
-+
-+#ifdef DEBIAN
-+
-+#include <regex.h>
-+
-+/* True or false? Is this a valid filename? */
-+
-+/* Taken from Clint Adams 'run-parts' version to support lsb style
-+   names, originally GPL, but relicensed to cron license per e-mail of
-+   27 September 2003. I've changed it to do regcomp() only once. */
-+
-+static int
-+valid_name(char *filename)
-+{
-+  static regex_t hierre, tradre, excsre, classicalre;
-+  static int donere = 0;
-+
-+  if (!donere) {
-+      donere = 1;
-+      if (regcomp(&hierre, "^_?([a-z0-9_.]+-)+[a-z0-9]+$",
-+                  REG_EXTENDED | REG_NOSUB)
-+          || regcomp(&excsre, "^[a-z0-9-].*dpkg-(old|dist)$",
-+                     REG_EXTENDED | REG_NOSUB)
-+          || regcomp(&tradre, "^[a-z0-9][a-z0-9-]*$", REG_NOSUB)
-+          || regcomp(&classicalre, "^[a-zA-Z0-9_-]+$",
-+                     REG_EXTENDED | REG_NOSUB)) {
-+          log_it("CRON", getpid(), "REGEX FAILED", "valid_name");
-+          (void) exit(ERROR_EXIT);
-+      }
-+  }
-+  if (lsbsysinit_mode) {
-+      if (!regexec(&hierre, filename, 0, NULL, 0)) {
-+          return regexec(&excsre, filename, 0, NULL, 0);
-+      } else {
-+          return !regexec(&tradre, filename, 0, NULL, 0);
-+      }
-+  }
-+  /* Old standard style */
-+  return !regexec(&classicalre, filename, 0, NULL, 0);
-+}
-+
-+
-+static user *
-+get_next_system_crontab (curtab)
-+	user	*curtab;
-+{
-+	for ( ; curtab != NULL; curtab = curtab->next)
-+		if (!strncmp(curtab->name, "*system*", 8) && curtab->name [8])
-+			break;
-+	return curtab;
-+}
-+
-+#endif
-Index: patched/pathnames.h
-===================================================================
---- patched.orig/pathnames.h	2010-05-06 18:18:46.636435718 +0200
-+++ patched/pathnames.h	2010-05-06 18:18:49.631436001 +0200
-@@ -67,7 +67,10 @@
- 
- 			/* 4.3BSD-style crontab */
- #define SYSCRONTAB	"/etc/crontab"
--
-+#ifdef DEBIAN
-+                        /* where package specific crontabs live */ 
-+#define SYSCRONDIR      "/etc/cron.d"
-+#endif
- 			/* what editor to use if no EDITOR or VISUAL
- 			 * environment variable specified.
- 			 */
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:48.838561166 +0200
-+++ patched/cron.h	2010-05-06 18:18:49.631436001 +0200
-@@ -188,7 +188,11 @@
- 
- typedef	struct _cron_db {
- 	user		*head, *tail;	/* links */
--	time_t		mtime;		/* last modtime on spooldir */
-+	time_t		user_mtime;     /* last modtime on spooldir */
-+	time_t		sys_mtime;      /* last modtime on system crontab */
-+#ifdef DEBIAN
-+	time_t		sysd_mtime;     /* last modtime on system crondir */
-+#endif
- } cron_db;
- 
- 
-@@ -267,6 +271,8 @@
- int	LineNumber;
- time_t	TargetTime;
- 
-+int     lsbsysinit_mode;
-+
- # if DEBUGGING
- int	DebugFlags;
- char	*DebugFlagNames[] = {	/* sync with #defines */
-@@ -279,6 +285,7 @@
- 		*MonthNames[],
- 		*DowNames[],
- 		*ProgramName;
-+extern  int     lsbsysinit_mode;
- extern	int	LineNumber;
- extern	time_t	TargetTime;
- # if DEBUGGING
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:44.880437493 +0200
-+++ patched/cron.c	2010-05-06 18:18:49.632435697 +0200
-@@ -131,7 +131,11 @@
- 	acquire_daemonlock(0);
- 	database.head = NULL;
- 	database.tail = NULL;
--	database.mtime = (time_t) 0;
-+	database.sys_mtime = (time_t) 0;
-+	database.user_mtime = (time_t) 0;
-+#ifdef DEBIAN
-+	database.sysd_mtime = (time_t) 0;
-+#endif
- 	load_database(&database);
- 	run_reboot_jobs(&database);
- 	cron_sync();
-@@ -317,7 +321,9 @@
- {
- 	int	argch;
- 
--	while (EOF != (argch = getopt(argc, argv, "x:"))) {
-+        lsbsysinit_mode = 0;
-+
-+	while (EOF != (argch = getopt(argc, argv, "lx:"))) {
- 		switch (argch) {
- 		default:
- 			usage();
-@@ -325,6 +331,9 @@
- 			if (!set_debug_flags(optarg))
- 				usage();
- 			break;
-+                case 'l':
-+                    lsbsysinit_mode = 1;
-+                    break;
- 		}
- 	}
- }
diff --git a/debian/patches/features/swap-both-uid-and-gid b/debian/patches/features/swap-both-uid-and-gid
deleted file mode 100644
index 4e5b7a4..0000000
--- a/debian/patches/features/swap-both-uid-and-gid
+++ /dev/null
@@ -1,36 +0,0 @@
-Subject: swap_uid, swap_uid_back support group ids
-Author: Solar Designer
-Last-Update: 2010-04-11
-
-Save/swap the group id, too.
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:51.095435790 +0200
-+++ patched/misc.c	2010-05-06 18:18:51.875560985 +0200
-@@ -676,11 +676,22 @@
- 
- 
- #ifdef HAVE_SAVED_UIDS
--static int save_euid;
--int swap_uids() { save_euid = geteuid(); return seteuid(getuid()); }
--int swap_uids_back() { return seteuid(save_euid); }
-+static uid_t save_euid, save_egid;
-+int swap_uids()
-+{
-+	save_euid = geteuid(); save_egid = getegid();
-+	return (setegid(getgid()) || seteuid(getuid())) ? -1 : 0;
-+}
-+int swap_uids_back()
-+{
-+	return (setegid(save_egid) || seteuid(save_euid)) ? -1 : 0;
-+}
- #else /*HAVE_SAVED_UIDS*/
--int swap_uids() { return setreuid(geteuid(), getuid()); }
-+int swap_uids()
-+{
-+	return (setregid(getegid(), getgid()) || setreuid(geteuid(), getuid()))
-+		? -1 : 0;
-+}
- int swap_uids_back() { return swap_uids(); }
- #endif /*HAVE_SAVED_UIDS*/
- 
diff --git a/debian/patches/fixes/abort-crontabs-with-errors b/debian/patches/fixes/abort-crontabs-with-errors
deleted file mode 100644
index 995a6c8..0000000
--- a/debian/patches/fixes/abort-crontabs-with-errors
+++ /dev/null
@@ -1,39 +0,0 @@
-Subject: Abort processing of crontabs with errors
-Author: Faidon Liambotis <FIXME>
-Last-Update: 2010-04-11
-
-Abort processing of a crontab when an error is encountered.
-
-Strictly speaking, this fix is mostly relevant only to the /etc/cron.d feature
-patch (in order to prevent a security issue). It is include in fixes/, however,
-because it made general sense. 
-
-Bug-Debian: http://bugs.debian.org/378153
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/user.c
-===================================================================
---- patched.orig/user.c	2010-05-06 18:18:27.646435759 +0200
-+++ patched/user.c	2010-05-06 18:18:32.328436004 +0200
-@@ -97,6 +97,9 @@
-  			 * newline, so we bail out
- 			 */
- 			if (envstr[0] != '\0') {
-+                                log_it(u->name, getpid(), "ERROR", "Missing "
-+                                "newline before EOF, this crontab file will be "
-+                                "ignored");
- 				free_user(u);
- 				u = NULL;
- 			}
-@@ -106,6 +109,11 @@
- 			if (e) {
- 				e->next = u->crontab;
- 				u->crontab = e;
-+			} else {
-+				/* stop processing on syntax error */
-+				free_user(u);
-+				u = NULL;
-+				goto done;
- 			}
- 			break;
- 		case TRUE:
diff --git a/debian/patches/fixes/allow-crontab-by-users b/debian/patches/fixes/allow-crontab-by-users
deleted file mode 100644
index cce01c6..0000000
--- a/debian/patches/fixes/allow-crontab-by-users
+++ /dev/null
@@ -1,36 +0,0 @@
-Subject: Allow use of crontab by users
-Last-Update: 2010-04-11
-
-Remove a bug denying non-privileged users crontab(1).
-
-Debian-Bug: http://bugs.debian.org/8702
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:28.844435899 +0200
-+++ patched/crontab.c	2010-05-06 18:18:30.213560954 +0200
-@@ -156,18 +156,19 @@
- 				usage("bad debug option");
- 			break;
- 		case 'u':
--			if (getuid() != ROOT_UID)
--			{
--				fprintf(stderr,
--					"must be privileged to use -u\n");
--				exit(ERROR_EXIT);
--			}
- 			if (!(pw = getpwnam(optarg)))
- 			{
- 				fprintf(stderr, "%s:  user `%s' unknown\n",
- 					ProgramName, optarg);
- 				exit(ERROR_EXIT);
- 			}
-+			if ((getuid() != ROOT_UID) &&
-+			    (getuid() != pw->pw_uid))
-+			{
-+				fprintf(stderr,
-+					"must be privileged to use -u\n");
-+				exit(ERROR_EXIT);
-+			}
- 			free(User);
- 			if ((User=strdup(pw->pw_name)) == NULL) {
- 			        fprintf(stderr, "Memory allocation error\n");
diff --git a/debian/patches/fixes/allow-editors-with-tmpfiles b/debian/patches/fixes/allow-editors-with-tmpfiles
deleted file mode 100644
index bab2516..0000000
--- a/debian/patches/fixes/allow-editors-with-tmpfiles
+++ /dev/null
@@ -1,311 +0,0 @@
-Subject: Allow editors which create temporary files
-Last-Updated: 2010-04-11
-
-Certain editors such as vi use temporary files for editing. This caused
-problems with crontab's operation mode.
-
-Bug-Debian: http://bugs.debian.org/149908
-Bug-Debian: http://bugs.debian.org/413962
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:40.501560966 +0200
-+++ patched/crontab.c	2010-05-06 18:18:41.216560876 +0200
-@@ -57,6 +57,7 @@
- static	PID_T		Pid;
- static	char		*User, *RealUser;
- static	char		Filename[MAX_FNAME];
-+static	char		Directory[MAX_FNAME];
- static	FILE		*NewCrontab = NULL;
- static	int		CheckErrorCount;
- static	enum opt_t	Option;
-@@ -69,6 +70,10 @@
- 			parse_args __P((int c, char *v[]));
- static	int		replace_cmd __P((void));
- 
-+/* Support edit command */
-+static  int             create_tmp_crontab __P((void));
-+static  int             open_tmp_crontab __P((struct stat *fsbuf));
-+static  void            cleanup_tmp_crontab __P((void));
- 
- static void
- usage(msg)
-@@ -320,13 +325,154 @@
- }
- 
- 
-+/* The next several function implement 'crontab -e' */
-+
-+/* Returns -1 on error, or fd to tempfile. */
-+static int
-+create_tmp_crontab()
-+{
-+        const char *template = "/crontab.XXXXXX";
-+        int nfd;
-+        char *tmp;
-+
-+        /* Create the temp directory. Note that since crontab is
-+           setuid(root), TMPDIR only work for root. */
-+	if ((tmp=getenv("TMPDIR")) && strlen(tmp) < MAX_FNAME) {
-+	  strcpy(Directory, tmp);
-+	} else {
-+	  strcpy(Directory,"/tmp");
-+	}
-+
-+        if (strlen(Directory) + strlen(template) < MAX_FNAME) {
-+                strcat(Directory, template);
-+        } else {
-+                fprintf(stderr, "TMPDIR value is to long -- exiting\n");
-+                Directory[0] = '\0';
-+                return -1;
-+        }
-+
-+        if (!mkdtemp(Directory)) {
-+                perror(Directory);
-+                Directory[0] = '\0';
-+                return -1;
-+        }
-+
-+        if (chown(Directory, getuid(), getgid()) < 0) {
-+                perror(Directory);
-+                Directory[0] = '\0';
-+                return -1;
-+        }
-+
-+        /* Now create the actual temporary crontab file */
-+        if (snprintf(Filename, MAX_FNAME, "%s/crontab", Directory)
-+            >= MAX_FNAME) {
-+                fprintf(stderr, "Temporary filename too long - aborting\n");
-+                Filename[0] = '\0';
-+                return -1;
-+        }
-+        if ((nfd=open(Filename, O_CREAT|O_EXCL|O_WRONLY, 0600)) == -1) {
-+                perror(Filename);
-+                Filename[0] = '\0';
-+                return -1;
-+        }
-+        return nfd;
-+}
-+
-+/* Re-open the new (temporary) crontab, and check to make sure that
-+   no-one is playing games. Return 0 on success, -1 on error. (Why not
-+   just fopen() and stat()? Because there's no guarantee that you
-+   fopen()ed the file you stat()ed.) */
-+static int
-+open_tmp_crontab(fsbuf)
-+      struct stat *fsbuf;
-+{
-+        int t;
-+        struct stat statbuf;
-+
-+        if ((t=open(Filename, O_RDONLY)) < 0) {
-+                perror("Can't open tempfile after edit");
-+                return -1;
-+        }
-+
-+	if (fstat(t, &statbuf) < 0) {
-+		perror("fstat");
-+		return -1;
-+	}
-+	if (statbuf.st_uid != getuid() || statbuf.st_gid != getgid()) {
-+		fprintf(stderr, "Temporary crontab no longer owned by you.\n");
-+		return -1;;
-+	}
-+
-+        if (!S_ISREG(statbuf.st_mode)) {
-+                fprintf(stderr, "The temporary crontab must remain a regular file");
-+                return -1;
-+        }
-+
-+        if (statbuf.st_mtime == fsbuf->st_mtime) {
-+                return 1; /* No change to file */
-+        }
-+
-+        NewCrontab = fdopen(t, "r");
-+        if (!NewCrontab) {
-+                perror("fdopen(): after edit");
-+                return -1;
-+        }
-+        return 0;
-+}
-+
-+/* We can't just delete Filename, because the editor might have
-+   created other temporary files in there. If there's an error, we
-+   just bail, and let the user/admin deal with it.*/
-+
-+static void
-+cleanup_tmp_crontab(void) 
-+{
-+        DIR *dp;
-+        struct dirent *ep;
-+        char fname[MAX_FNAME];
-+
-+        if (Directory[0] == '\0') {
-+                return;
-+        }
-+
-+        /* Delete contents */
-+        dp = opendir (Directory);
-+        if (dp == NULL) {
-+                perror(Directory);
-+                return;
-+        }
-+
-+        while ((ep = readdir (dp))) {
-+                if (!strcmp(ep->d_name, ".") ||
-+                    !strcmp(ep->d_name, "..")) {
-+                        continue;
-+                }
-+                if (snprintf(fname, MAX_FNAME, "%s/%s",
-+                             Directory, ep->d_name) >= MAX_FNAME) {
-+                        fprintf(stderr, "filename too long to delete: %s/%s",
-+                                Directory, ep->d_name);
-+                        return;
-+                }
-+                if (unlink(fname)) {
-+                        perror(ep->d_name);
-+                        return;
-+                }
-+        }
-+        (void) closedir (dp);
-+
-+        if (rmdir(Directory)) {
-+                perror(Directory);
-+                return;
-+        }
-+        return;
-+}
-+
- static void
- edit_cmd() {
- 	char		n[MAX_FNAME], q[MAX_TEMPSTR], *editor;
- 	FILE		*f;
- 	int		ch, t, x;
--	struct stat	statbuf;
--	time_t		mtime;
-+	struct stat     fsbuf;
- 	WAIT_T		waiter;
- 	PID_T		pid, xpid;
- 	mode_t		um;
-@@ -347,23 +493,15 @@
- 	}
- 
- 	um = umask(077);
--	(void) snprintf(Filename, sizeof(Filename)-1, "/tmp/crontab.%d", Pid);
--	Filename[sizeof(Filename)-1] = '\0';
--	if (-1 == (t = open(Filename, O_CREAT|O_EXCL|O_RDWR, 0600))) {
--		perror(Filename);
--		goto fatal;
--	}
--#ifdef HAS_FCHOWN
--	if (fchown(t, getuid(), getgid()) < 0) {
--#else
--	if (chown(Filename, getuid(), getgid()) < 0) {
--#endif
--		perror("fchown");
-+
-+        if ((t=create_tmp_crontab()) < 0) {
-+                fprintf(stderr, "Creation of temporary crontab file failed - aborting\n");
-+                (void) umask(um);
- 		goto fatal;
- 	}
- 
- 	(void) umask(um);
--	if (!(NewCrontab = fdopen(t, "r+"))) {
-+	if (!(NewCrontab = fdopen(t, "w"))) {
- 		perror("fdopen");
- 		goto fatal;
- 	}
-@@ -393,23 +531,16 @@
- 		while (EOF != (ch = get_char(f)))
- 			putc(ch, NewCrontab);
- 	fclose(f);
--	if (fflush(NewCrontab) < OK) {
--		perror(Filename);
--		exit(ERROR_EXIT);
--	}
-- again:
--	rewind(NewCrontab);
-+
- 	if (ferror(NewCrontab)) {
- 		fprintf(stderr, "%s: error while writing new crontab to %s\n",
- 			ProgramName, Filename);
-- fatal:		unlink(Filename);
--		exit(ERROR_EXIT);
- 	}
--	if (fstat(t, &statbuf) < 0) {
--		perror("fstat");
-+
-+	if (fstat(t, &fsbuf) < 0) {
-+		perror("unable to stat temp file");
- 		goto fatal;
- 	}
--	mtime = statbuf.st_mtime;
- 
- 
- 
-@@ -421,13 +552,14 @@
- 		editor = EDITOR;
- 	}
- 
--	/* we still have the file open.  editors will generally rewrite the
--	 * original file rather than renaming/unlinking it and starting a
--	 * new one; even backup files are supposed to be made by copying
--	 * rather than by renaming.  if some editor does not support this,
--	 * then don't use it.  the security problems are more severe if we
--	 * close and reopen the file around the edit.
--	 */
-+ again:
-+
-+        /*  Close before cleanup_tmp_crontab is called or otherwise
-+         *  (on NFS mounted /) will get renamed on unlink */
-+	if (fclose(NewCrontab) != 0) {
-+		perror(Filename);
-+                goto fatal;
-+	}
- 
- 	/* Turn off signals. */
- 	(void)signal(SIGHUP, SIG_IGN);
-@@ -495,6 +627,21 @@
- 	(void)signal(SIGQUIT, SIG_DFL);
- 	(void)signal(SIGTSTP, SIG_DFL);
- 
-+        switch (open_tmp_crontab(&fsbuf)) {
-+        case -1:
-+                fprintf(stderr, "Error while editing crontab\n");
-+                goto fatal;
-+        case 1:
-+                fprintf(stderr, "No modification made\n");
-+                goto remove;
-+        case 0:
-+                break;
-+        default:
-+                fprintf(stderr,
-+                        "cron at packages.debian.org fscked up. Send him a nasty note\n");
-+                break;
-+        }
-+
- 	fprintf(stderr, "%s: installing new crontab\n", ProgramName);
- 	switch (replace_cmd()) {
- 	case 0:
-@@ -525,10 +672,20 @@
- 		    ProgramName);
- 		goto fatal;
- 	}
-+
-+       if (fclose(NewCrontab) != 0) {
-+               perror(Filename);
-+       }
-+
-  remove:
--	unlink(Filename);
-+        cleanup_tmp_crontab();
-  done:
- 	log_it(RealUser, Pid, "END EDIT", User);
-+        return;
-+ fatal:
-+        cleanup_tmp_crontab();
-+        unlink(Filename);
-+        exit(ERROR_EXIT);
- }
- 
- static char tn[MAX_FNAME];
diff --git a/debian/patches/fixes/check-for-broken-command b/debian/patches/fixes/check-for-broken-command
deleted file mode 100644
index 869fdd4..0000000
--- a/debian/patches/fixes/check-for-broken-command
+++ /dev/null
@@ -1,26 +0,0 @@
-Subject: Check for broken command in system crontab
-Last-Update: 2010-04-11
-
-This patch apparently adds a test for a superfluous star in a system crontab
-entry, eg:
-
-    * * * * * * some_command
-
-(Notice the 6th star, where only 5 should be). Otherwise, this patch doesn't
-make sense. Not that it makes much sense this way, either...
-
-NOT Acked
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:35.043561126 +0200
-+++ patched/entry.c	2010-05-06 18:18:35.745561147 +0200
-@@ -246,6 +246,9 @@
- 			goto eof;
- 		}
- 		Debug(DPARS, ("load_entry()...uid %d, gid %d\n",e->uid,e->gid))
-+	} else if (ch == '*') {
-+		ecode = e_cmd;
-+		goto eof;
- 	}
- 
- 	e->uid = pw->pw_uid;
diff --git a/debian/patches/fixes/check-for-full-disk b/debian/patches/fixes/check-for-full-disk
deleted file mode 100644
index 107743e..0000000
--- a/debian/patches/fixes/check-for-full-disk
+++ /dev/null
@@ -1,53 +0,0 @@
-Subject: Check for full disk
-Last-Update: 2010-10-11
-
-Raise an error if we couldn't write the crontab to disk.
- 
-Debian-Bug: http://bugs.debian.org/110612
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:39.796561016 +0200
-+++ patched/crontab.c	2010-05-06 18:18:40.501560966 +0200
-@@ -596,19 +596,17 @@
- 	Set_LineNum(1)
- 	while (EOF != (ch = get_char(NewCrontab)))
- 		putc(ch, tmp);
--	ftruncate(fileno(tmp), ftell(tmp));
--	fflush(tmp);  rewind(tmp);
- 
--	if (ferror(tmp)) {
--		fprintf(stderr, "%s: error while writing new crontab to %s\n",
--			ProgramName, tn);
-+	if (ferror(tmp) || fflush(tmp) || fsync(fd)) {
-+		fprintf(stderr, "%s: %s: %s\n",
-+			ProgramName, tn, strerror(errno));
- 		fclose(tmp);  unlink(tn);
- 		return (-2);
- 	}
- 
- 	/* check the syntax of the file being installed.
- 	 */
--
-+	rewind(tmp);
- 	/* BUG: was reporting errors after the EOF if there were any errors
- 	 * in the file proper -- kludged it by stopping after first error.
- 	 *		vix 31mar87
-@@ -658,6 +656,7 @@
- 		return (-2);
- 	}
- 
-+
- 	if (fclose(tmp) == EOF) {
- 		perror("fclose");
- 		unlink(tn);
-@@ -671,6 +670,8 @@
- 		unlink(tn);
- 		return (-2);
- 	}
-+
-+
- 	log_it(RealUser, Pid, "REPLACE", User);
- 
- 	poke_daemon();
diff --git a/debian/patches/fixes/compilation-issues b/debian/patches/fixes/compilation-issues
deleted file mode 100644
index afb0643..0000000
--- a/debian/patches/fixes/compilation-issues
+++ /dev/null
@@ -1,23 +0,0 @@
-Subject: Fix compilation issues
-Last-Update: 2010-04-11
-
-Resolve issues related to compilation (Makefile, etc).
-
-
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:41.972560882 +0200
-+++ patched/crontab.c	2010-05-06 18:18:43.421561039 +0200
-@@ -137,6 +137,12 @@
- 	case opt_replace:	if (replace_cmd() < 0)
- 					exitstatus = ERROR_EXIT;
- 				break;
-+				/* The following was added to shut
-+				 -Wall up, but it will never be hit,
-+				 because the option parser will catch
-+				 it */
-+	case opt_unknown: usage("unknown option specified");
-+	                  break;
- 	}
- 	exit(exitstatus);
- 	/*NOTREACHED*/
diff --git a/debian/patches/fixes/correct-flag-setting-in-crontab-entry b/debian/patches/fixes/correct-flag-setting-in-crontab-entry
deleted file mode 100644
index b3ef7d1..0000000
--- a/debian/patches/fixes/correct-flag-setting-in-crontab-entry
+++ /dev/null
@@ -1,48 +0,0 @@
-Subject: Correct which/how flags are set for entries
-Last-Update: 2010-04-11
-
-In the entry processing code, either set certain internal flags which are missing or
-correct broken settings. 
-
-Bug-Debian: http://bugs.debian.org/43282
-Bug-Debian: http://bugs.debian.org/62141
-Bug-Debian: http://bugs.debian.org/84727
-Bug-Debian: http://bugs.debian.org/150591
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:28.217435826 +0200
-+++ patched/entry.c	2010-05-06 18:18:35.043561126 +0200
-@@ -130,18 +130,21 @@
- 			bit_set(e->dom, 0);
- 			bit_set(e->month, 0);
- 			bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
-+                        e->flags |= DOW_STAR; 
- 		} else if (!strcmp("monthly", cmd)) {
- 			bit_set(e->minute, 0);
- 			bit_set(e->hour, 0);
- 			bit_set(e->dom, 0);
- 			bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
- 			bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
-+                        e->flags |= DOW_STAR;
- 		} else if (!strcmp("weekly", cmd)) {
- 			bit_set(e->minute, 0);
- 			bit_set(e->hour, 0);
- 			bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1));
-+			e->flags |= DOM_STAR;
- 			bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
--			bit_set(e->dow, 0);
-+			bit_nset(e->dow, 0,0);
- 		} else if (!strcmp("daily", cmd) || !strcmp("midnight", cmd)) {
- 			bit_set(e->minute, 0);
- 			bit_set(e->hour, 0);
-@@ -150,7 +153,7 @@
- 			bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
- 		} else if (!strcmp("hourly", cmd)) {
- 			bit_set(e->minute, 0);
--			bit_set(e->hour, (LAST_HOUR-FIRST_HOUR+1));
-+			bit_nset(e->hour, 0, (LAST_HOUR-FIRST_HOUR+1));
- 			bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1));
- 			bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
- 			bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
diff --git a/debian/patches/fixes/correct-use-of-error-messages b/debian/patches/fixes/correct-use-of-error-messages
deleted file mode 100644
index f159e8a..0000000
--- a/debian/patches/fixes/correct-use-of-error-messages
+++ /dev/null
@@ -1,152 +0,0 @@
-Subject: Correct use of error messages
-Author: Justin Pryzby <justinpryzby at users.sourceforge.net>
-Last Update: 2004-10-11
-
-Fix the use of perror so that the error message is correct when printing the
-reason why an operation failed. Thanks to Justin Pryzby for the patch.
-
-Debian-Bug: http://bugs.debian/org/470587
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:28.216436280 +0200
-+++ patched/do_command.c	2010-05-06 18:18:28.844435899 +0200
-@@ -229,8 +229,7 @@
- 			}
- # endif /*DEBUGGING*/
- 			execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);
--			fprintf(stderr, "execl: couldn't exec `%s'\n", shell);
--			perror("execl");
-+			fprintf(stderr, "%s: execle: %s\n", shell, strerror(errno));
- 			_exit(ERROR_EXIT);
- 		}
- 		break;
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:28.217435826 +0200
-+++ patched/misc.c	2010-05-06 18:18:28.844435899 +0200
-@@ -200,8 +200,7 @@
- 			fprintf(stderr, "%s: created\n", CRONDIR);
- 			stat(CRONDIR, &sb);
- 		} else {
--			fprintf(stderr, "%s: ", CRONDIR);
--			perror("mkdir");
-+			fprintf(stderr, "%s: mkdir: %s\n", CRONDIR, strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 	}
-@@ -211,8 +210,7 @@
- 		exit(ERROR_EXIT);
- 	}
- 	if (chdir(CRONDIR) < OK) {
--		fprintf(stderr, "cannot chdir(%s), bailing out.\n", CRONDIR);
--		perror(CRONDIR);
-+		fprintf(stderr, "%s: chdir: %s\n", CRONDIR, strerror(errno));
- 		exit(ERROR_EXIT);
- 	}
- 
-@@ -224,8 +222,7 @@
- 			fprintf(stderr, "%s: created\n", SPOOL_DIR);
- 			stat(SPOOL_DIR, &sb);
- 		} else {
--			fprintf(stderr, "%s: ", SPOOL_DIR);
--			perror("mkdir");
-+			fprintf(stderr, "%s: mkdir: %s\n", SPOOL_DIR, strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 	}
-@@ -487,9 +484,8 @@
- 	if (LogFD < OK) {
- 		LogFD = open(LOG_FILE, O_WRONLY|O_APPEND|O_CREAT, 0600);
- 		if (LogFD < OK) {
--			fprintf(stderr, "%s: can't open log file\n",
--				ProgramName);
--			perror(LOG_FILE);
-+			fprintf(stderr, "%s: %s: open: %s\n",
-+				ProgramName, LOG_FILE, strerror(errno));
- 		} else {
- 			(void) fcntl(LogFD, F_SETFD, 1);
- 		}
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:28.216436280 +0200
-+++ patched/crontab.c	2010-05-06 18:18:28.844435899 +0200
-@@ -256,10 +256,11 @@
- 	log_it(RealUser, Pid, "LIST", User);
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
- 	if (!(f = fopen(n, "r"))) {
--		if (errno == ENOENT)
-+		if (errno == ENOENT) 
- 			fprintf(stderr, "no crontab for %s\n", User);
--		else
--			perror(n);
-+		else {
-+                        fprintf(stderr, "%s/: fopen: %s\n", n, strerror(errno));
-+                }
- 		exit(ERROR_EXIT);
- 	}
- 
-@@ -281,8 +282,9 @@
- 	if (unlink(n)) {
- 		if (errno == ENOENT)
- 			fprintf(stderr, "no crontab for %s\n", User);
--		else
--			perror(n);
-+		else {
-+                        fprintf(stderr, "%s/: unlink: %s\n", CRONDIR, strerror(errno));
-+                }
- 		exit(ERROR_EXIT);
- 	}
- 	poke_daemon();
-@@ -312,7 +314,7 @@
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
- 	if (!(f = fopen(n, "r"))) {
- 		if (errno != ENOENT) {
--			perror(n);
-+                        fprintf(stderr, "%s/: fdopen: %s", n, strerror(errno));
- 			exit(ERROR_EXIT);
- 		}
- 		fprintf(stderr, "no crontab for %s - using an empty one\n",
-@@ -535,8 +537,8 @@
- 	fflush(tmp);  rewind(tmp);
- 
- 	if (ferror(tmp)) {
--		fprintf(stderr, "%s: error while writing new crontab to %s\n",
--			ProgramName, tn);
-+		fprintf(stderr, "%s: %s: %s\n",
-+			ProgramName, tn, strerror(errno));
- 		fclose(tmp);  unlink(tn);
- 		return (-2);
- 	}
-@@ -601,9 +603,8 @@
- 
- 	(void) snprintf(n, sizeof(n), CRON_TAB(User));
- 	if (rename(tn, n)) {
--		fprintf(stderr, "%s: error renaming %s to %s\n",
--			ProgramName, tn, n);
--		perror("rename");
-+		fprintf(stderr, "%s: %s: rename: %s\n",
-+			ProgramName, n, strerror(errno));
- 		unlink(tn);
- 		return (-2);
- 	}
-@@ -624,14 +625,14 @@
- 	(void) gettimeofday(&tvs[0], &tz);
- 	tvs[1] = tvs[0];
- 	if (utimes(SPOOL_DIR, tvs) < OK) {
--		fprintf(stderr, "crontab: can't update mtime on spooldir\n");
--		perror(SPOOL_DIR);
-+                fprintf(stderr, "%s/: utimes: %s", CRONDIR, strerror(errno));
-+		fputs("crontab: can't update mtime on spooldir\n", stderr);
- 		return;
- 	}
- #else
- 	if (utime(SPOOL_DIR, NULL) < OK) {
--		fprintf(stderr, "crontab: can't update mtime on spooldir\n");
--		perror(SPOOL_DIR);
-+                fprintf(stderr, "%s: utime: %s\n", CRONDIR, strerror(errno));
-+		fputs("crontab: can't update mtime on spooldir\n", stderr);
- 		return;
- 	}
- #endif /*USE_UTIMES*/
diff --git a/debian/patches/fixes/crontab-entry-parsing b/debian/patches/fixes/crontab-entry-parsing
deleted file mode 100644
index bf1b695..0000000
--- a/debian/patches/fixes/crontab-entry-parsing
+++ /dev/null
@@ -1,38 +0,0 @@
-Subject: Fixes for crontab entry parsing
-Last-Update: 2010-04-11
-
-Handle bogues values, whitespace, ...
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:25.803561007 +0200
-+++ patched/entry.c	2010-05-06 18:18:26.422435960 +0200
-@@ -218,6 +218,9 @@
- 		bit_set(e->dow, 7);
- 	}
- 
-+	/* If we used one of the @commands, we may be pointing at
-+       blanks, and if we don't skip over them, we'll miss the user/command */	
-+    Skip_Blanks(ch, file);
- 	/* ch is the first character of a command, or a username */
- 	unget_char(ch, file);
- 
-@@ -418,7 +421,7 @@
- 		 * sent as a 0 since there is no offset either.
- 		 */
- 		ch = get_number(&num3, 0, PPC_NULL, ch, file);
--		if (ch == EOF)
-+		if (ch == EOF || num3 <= 0)
- 			return EOF;
- 	} else {
- 		/* no step.  default==1.
-@@ -468,6 +471,10 @@
- 	}
- 	*pc = '\0';
- 
-+        if (len == 0) {
-+            return EOF;
-+        }
-+
- 	/* try to find the name in the name list
- 	 */
- 	if (names) {
diff --git a/debian/patches/fixes/crontab-file-parsing b/debian/patches/fixes/crontab-file-parsing
deleted file mode 100644
index bbcbcc6..0000000
--- a/debian/patches/fixes/crontab-file-parsing
+++ /dev/null
@@ -1,59 +0,0 @@
-Subject: Fix crontab file parsing
-Author: Christian Kastner <debian at kvr.at>
-Last-Update: 2010-04-14
-
-The crontab parsing code contains a test condition that can never be reached.
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/user.c
-===================================================================
---- patched.orig/user.c	2010-05-06 18:18:15.861436066 +0200
-+++ patched/user.c	2010-05-06 18:18:25.803561007 +0200
-@@ -75,11 +75,20 @@
- 	/*
- 	 * load the crontab
- 	 */
--	while ((status = load_env(envstr, file)) >= OK) {
-+	do {
-+		status = load_env(envstr, file);
- 		switch (status) {
- 		case ERR:
--			free_user(u);
--			u = NULL;
-+			/* If envstr has no content, we reached a proper EOF
-+ 			 * and we can return to continue regular processing.
-+			 *
-+ 			 * If it does have content, we reached EOF without a
-+ 			 * newline, so we bail out
-+			 */
-+			if (envstr[0] != '\0') {
-+				free_user(u);
-+				u = NULL;
-+			}
- 			goto done;
- 		case FALSE:
- 			e = load_entry(file, NULL, pw, envp);
-@@ -92,7 +101,7 @@
- 			envp = env_set(envp, envstr);
- 			break;
- 		}
--	}
-+	} while (status >= OK);
- 
-  done:
- 	env_free(envp);
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:15.855435677 +0200
-+++ patched/entry.c	2010-05-06 18:18:25.803561007 +0200
-@@ -277,6 +277,10 @@
- 	ch = get_string(cmd, MAX_COMMAND, file, "\n");
- 
- 	/* a file without a \n before the EOF is rude, so we'll complain...
-+
-+	   CK 2010-04-14: this code will never be reached. All calls to
-+	   load_entry are proceeded by calls to load_env, which aborts on EOF, and
-+       where load_env fails, the code bails out.
- 	 */
- 	if (ch == EOF) {
- 		ecode = e_cmd;
diff --git a/debian/patches/fixes/crontab-time-parsing b/debian/patches/fixes/crontab-time-parsing
deleted file mode 100644
index 8a053e4..0000000
--- a/debian/patches/fixes/crontab-time-parsing
+++ /dev/null
@@ -1,22 +0,0 @@
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:26.422435960 +0200
-+++ patched/entry.c	2010-05-06 18:18:27.017560712 +0200
-@@ -429,6 +429,17 @@
- 		num3 = 1;
- 	}
- 
-+	/* Explicitly check for sane values. Certain combinations of ranges and
-+	 * steps which should return EOF don't get picked up by the code below,
-+	 * eg:
-+	 *	5-64/30 * * * *	touch /dev/null
-+	 *
-+	 * Code adapted from set_elements() where this error was probably intended
-+	 * to be catched.
-+	 */
-+	if (num1 < low || num1 > high || num2 < low || num2 > high)
-+		return EOF;
-+
- 	/* range. set all elements from num1 to num2, stepping
- 	 * by num3.  (the step is a downward-compatible extension
- 	 * proposed conceptually by bob at acornrc, syntactically
diff --git a/debian/patches/fixes/dont-give-root-on-repeated-edits b/debian/patches/fixes/dont-give-root-on-repeated-edits
deleted file mode 100644
index 5f1db9f..0000000
--- a/debian/patches/fixes/dont-give-root-on-repeated-edits
+++ /dev/null
@@ -1,53 +0,0 @@
-Subject: Don't give root privileges on repeated edits
-Last-Update: 2010-04-11
-
-Because of an oversight, repeated edits wouldn't drop privileges prior to
-editing.
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:41.216560876 +0200
-+++ patched/crontab.c	2010-05-06 18:18:41.972560882 +0200
-@@ -709,12 +709,21 @@
- 	time_t	now = time(NULL);
- 	char	**envp = env_init();
- 	mode_t	um;
-+	int	saved_uid;
- 
- 	if (envp == NULL) {
- 		fprintf(stderr, "%s: Cannot allocate memory.\n", ProgramName);
- 		return (-2);
- 	}
- 
-+	/* Assume privilege.  This way we can only receive signals on our
-+	   input - the ones listed below (or from root - root's problem, not
-+	   ours). */
-+	saved_uid = getuid();
-+	if (setuid(geteuid()) < 0) {
-+		perror("setuid");
-+		return -2;
-+	}
- 
- 	/* Assumes Linux-style signal handlers (takes int, returns void) */
- 	/* Signal handlers, to ensure we do not leave temp files in the
-@@ -788,6 +797,9 @@
- 	if (CheckErrorCount != 0) {
- 		fprintf(stderr, "errors in crontab file, can't install.\n");
- 		fclose(tmp);  unlink(tn);
-+		/* Give up privilege, in case we loop. */
-+		if (setreuid(saved_uid, -1) < 0)
-+			return (-2);
- 		return (-1);
- 	}
- 
-@@ -833,6 +845,11 @@
- 
- 	poke_daemon();
- 
-+	/* Give up privilege, just in case. */
-+	/* Don't need to check for error; nothing happens beyond here but a log entry,
-+	   and the failure message is incorrect after the rename above. */
-+	setreuid(saved_uid, -1);
-+
- 	return (0);
- }
- 
diff --git a/debian/patches/fixes/dont-log-temp-files b/debian/patches/fixes/dont-log-temp-files
deleted file mode 100644
index 83c6702..0000000
--- a/debian/patches/fixes/dont-log-temp-files
+++ /dev/null
@@ -1,17 +0,0 @@
-Subject: Don't log temporary files
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:28.217435826 +0200
-+++ patched/database.c	2010-05-06 18:18:36.431560887 +0200
-@@ -217,7 +217,10 @@
- 	if (strcmp(fname, "*system*") && !(pw = getpwnam(uname))) {
- 		/* file doesn't have a user in passwd file.
- 		 */
--		log_it(fname, getpid(), "ORPHAN", "no passwd entry");
-+		if (strncmp(fname, "tmp.", 4)) {
-+			/* don't log these temporary files */
-+			log_it(fname, getpid(), "ORPHAN", "no passwd entry");
-+		}
- 		goto next_crontab;
- 	}
- 
diff --git a/debian/patches/fixes/drop-privileges b/debian/patches/fixes/drop-privileges
deleted file mode 100644
index a86861d..0000000
--- a/debian/patches/fixes/drop-privileges
+++ /dev/null
@@ -1,119 +0,0 @@
-Subject: Drop privileges where appropriate
-Last-Update: 2010-04-11
-
-Ensure that we drop privileges when running commands on behalf of a user.
-
-Bug-Debian: http://bugs.debian.org/528434
-Bug-Debian: http://bugs.debian.org/85609
-Bug-Debian: http://bugs.debian.org/86775
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:28.216436280 +0200
-+++ patched/cron.h	2010-05-06 18:18:30.896560600 +0200
-@@ -226,7 +226,7 @@
- entry		*load_entry __P((FILE *, void (*)(),
- 				 struct passwd *, char **));
- 
--FILE		*cron_popen __P((char *, char *));
-+FILE		*cron_popen __P((char *, char *, entry *));
- 
- 
- 				/* in the C tradition, we only create
-Index: patched/popen.c
-===================================================================
---- patched.orig/popen.c	2010-05-06 18:18:25.171561124 +0200
-+++ patched/popen.c	2010-05-06 18:18:30.896560600 +0200
-@@ -48,8 +48,9 @@
- static int fds;
- 
- FILE *
--cron_popen(program, type)
-+cron_popen(program, type, e)
- 	char *program, *type;
-+	entry *e;
- {
- 	register char *cp;
- 	FILE *iop;
-@@ -120,6 +121,34 @@
- 			}
- 			(void)close(pdes[1]);
- 		}
-+ 		/* set our directory, uid and gid.  Set gid first, since once
-+         * we set uid, we've lost root privleges.
-+         */
-+        if (setgid(e->gid) !=0) {
-+          char msg[256];
-+          snprintf(msg, 256, "popen:setgid(%lu) failed: %s",
-+               (unsigned long) e->gid, strerror(errno));
-+          log_it("CRON",getpid(),"error",msg);
-+          exit(ERROR_EXIT);
-+        }
-+# if defined(BSD) || defined(POSIX)
-+		if (initgroups(env_get("LOGNAME", e->envp), e->gid) !=0) {
-+		  char msg[256];
-+		  snprintf(msg, 256, "popen:initgroups(%lu) failed: %s",
-+			   (unsigned long) e->gid, strerror(errno));
-+		  log_it("CRON",getpid(),"error",msg);
-+		  exit(ERROR_EXIT);
-+                }
-+# endif
-+		if (setuid(e->uid) !=0) {
-+		  char msg[256];
-+		  snprintf(msg, 256, "popen: setuid(%lu) failed: %s",
-+			   (unsigned long) e->uid, strerror(errno)); 
-+		  log_it("CRON",getpid(),"error",msg);
-+		  exit(ERROR_EXIT);
-+		}	
-+		chdir(env_get("HOME", e->envp));
-+
- #if WANT_GLOBBING
- 		execvp(gargv[0], gargv);
- #else
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:29.548561115 +0200
-+++ patched/do_command.c	2010-05-06 18:18:30.896560600 +0200
-@@ -210,11 +210,29 @@
- 		/* set our directory, uid and gid.  Set gid first, since once
- 		 * we set uid, we've lost root privledges.
- 		 */
--		setgid(e->gid);
-+		if (setgid(e->gid) !=0) {
-+		  char msg[256];
-+		  snprintf(msg, 256, "do_command:setgid(%lu) failed: %s",
-+			   (unsigned long) e->gid, strerror(errno));
-+		  log_it("CRON",getpid(),"error",msg);
-+		  exit(ERROR_EXIT);
-+		}
- # if defined(BSD) || defined(POSIX)
--		initgroups(env_get("LOGNAME", e->envp), e->gid);
-+		if (initgroups(env_get("LOGNAME", e->envp), e->gid) !=0) {
-+		  char msg[256];
-+		  snprintf(msg, 256, "do_command:initgroups(%lu) failed: %s",
-+			   (unsigned long) e->gid, strerror(errno));
-+		  log_it("CRON",getpid(),"error",msg);
-+		  exit(ERROR_EXIT);
-+		}
- # endif
--		setuid(e->uid);		/* we aren't root after this... */
-+		if (setuid(e->uid) !=0) { /* we aren't root after this... */
-+		  char msg[256];
-+		  snprintf(msg, 256, "do_command:setuid(%lu) failed: %s",
-+			   (unsigned long) e->uid, strerror(errno)); 
-+		  log_it("CRON",getpid(),"error",msg);
-+		  exit(ERROR_EXIT);
-+		}	
- 		chdir(env_get("HOME", e->envp));
- 
- 		/* exec the command.
-@@ -371,7 +389,7 @@
- 				(void) gethostname(hostname, MAXHOSTNAMELEN);
- 				(void) snprintf(mailcmd, sizeof(mailcmd),
- 				    MAILARGS, MAILCMD, mailto);
--				if (!(mail = cron_popen(mailcmd, "w"))) {
-+				if (!(mail = cron_popen(mailcmd, "w", e))) {
- 					perror(MAILCMD);
- 					(void) _exit(ERROR_EXIT);
- 				}
diff --git a/debian/patches/fixes/general-coding-errors b/debian/patches/fixes/general-coding-errors
deleted file mode 100644
index b9e00a4..0000000
--- a/debian/patches/fixes/general-coding-errors
+++ /dev/null
@@ -1,161 +0,0 @@
-Subject: General coding errors
-Last-Update: 2010-04-11
-
-These are mostly one-line fixes of obvious errors such as missing arguments,
-typos etc. Creating separate patches for them would be overkill.
-
-Bug-Debian: http://bugs.debian.org/53735
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/compat.c
-===================================================================
---- patched.orig/compat.c	2010-05-06 18:18:16.073435740 +0200
-+++ patched/compat.c	2010-05-06 18:18:24.437560974 +0200
-@@ -227,7 +227,7 @@
- 		return -1;
- 	}
- 
--	sprintf("%s=%s", name, value);
-+	sprintf(tmp, "%s=%s", name, value);
- 	return putenv(tmp);	/* intentionally orphan 'tmp' storage */
- }
- #endif
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:16.078436032 +0200
-+++ patched/crontab.c	2010-05-06 18:18:24.437560974 +0200
-@@ -57,7 +57,7 @@
- static	PID_T		Pid;
- static	char		User[MAX_UNAME], RealUser[MAX_UNAME];
- static	char		Filename[MAX_FNAME];
--static	FILE		*NewCrontab;
-+static	FILE		*NewCrontab = NULL;
- static	int		CheckErrorCount;
- static	enum opt_t	Option;
- static	struct passwd	*pw;
-@@ -125,7 +125,7 @@
- 					exitstatus = ERROR_EXIT;
- 				break;
- 	}
--	exit(0);
-+	exit(exitstatus);
- 	/*NOTREACHED*/
- }
- 	
-@@ -227,7 +227,7 @@
- 				perror(Filename);
- 				exit(ERROR_EXIT);
- 			}
--			if (swap_uids() < OK) {
-+			if (swap_uids_back() < OK) {
- 				perror("swapping uids back");
- 				exit(ERROR_EXIT);
- 			}
-@@ -453,7 +453,7 @@
- 		break;
- 	case -1:
- 		for (;;) {
--			printf("Do you want to retry the same edit? ");
-+			printf("Do you want to retry the same edit? (y/n) ");
- 			fflush(stdout);
- 			q[0] = '\0';
- 			(void) fgets(q, sizeof q, stdin);
-@@ -473,7 +473,8 @@
- 			ProgramName, Filename);
- 		goto done;
- 	default:
--		fprintf(stderr, "%s: panic: bad switch() in replace_cmd()\n");
-+		fprintf(stderr, "%s: panic: bad switch() in replace_cmd()\n",
-+		    ProgramName);
- 		goto fatal;
- 	}
-  remove:
-@@ -574,7 +575,7 @@
- 	if (chmod(tn, 0600) < OK)
- #endif
- 	{
--		perror("chown");
-+		perror("chmod");
- 		fclose(tmp);  unlink(tn);
- 		return (-2);
- 	}
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:16.094435737 +0200
-+++ patched/misc.c	2010-05-06 18:18:24.458435579 +0200
-@@ -308,7 +308,7 @@
- 
- 	ch = getc(file);
- 	if (ch == '\n')
--		Set_LineNum(LineNumber + 1)
-+		Set_LineNum(LineNumber + 1);
- 	return ch;
- }
- 
-@@ -322,7 +322,7 @@
- {
- 	ungetc(ch, file);
- 	if (ch == '\n')
--		Set_LineNum(LineNumber - 1)
-+	       Set_LineNum(LineNumber - 1);
- }
- 
- 
-@@ -533,7 +533,7 @@
- #if DEBUGGING
- 	if (DebugFlags) {
- 		fprintf(stderr, "log_it: (%s %d) %s (%s)\n",
--			username, pid, event, detail);
-+			username, xpid, event, detail);
- 	}
- #endif
- }
-Index: patched/env.c
-===================================================================
---- patched.orig/env.c	2010-05-06 18:18:16.088435734 +0200
-+++ patched/env.c	2010-05-06 18:18:24.458435579 +0200
-@@ -39,6 +39,9 @@
- {
- 	char	**p;
- 
-+	if(!envp)
-+		return;
-+
- 	for (p = envp;  *p;  p++)
- 		free(*p);
- 	free(envp);
-@@ -168,7 +171,7 @@
- 	register int	len = strlen(name);
- 	register char	*p, *q;
- 
--	while (p = *envp++) {
-+	while ((p = *envp++)) {
- 		if (!(q = strchr(p, '=')))
- 			continue;
- 		if ((q - p) == len && !strncmp(p, name, len))
-Index: patched/popen.c
-===================================================================
---- patched.orig/popen.c	2010-05-06 18:18:22.672435408 +0200
-+++ patched/popen.c	2010-05-06 18:18:24.458435579 +0200
-@@ -62,7 +62,7 @@
- 	extern char **glob(), **copyblk();
- #endif
- 
--	if (*type != 'r' && *type != 'w' || type[1])
-+	if ((*type != 'r' && *type != 'w') || type[1])
- 		return(NULL);
- 
- 	if (!pids) {
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:22.672435408 +0200
-+++ patched/do_command.c	2010-05-06 18:18:24.458435579 +0200
-@@ -331,7 +331,7 @@
- 		register int	ch = getc(in);
- 
- 		if (ch != EOF) {
--			register FILE	*mail;
-+			register FILE	*mail = NULL;
- 			register int	bytes = 1;
- 			int		status = 0;
- 
diff --git a/debian/patches/fixes/general-platform-issues b/debian/patches/fixes/general-platform-issues
deleted file mode 100644
index 51a469e..0000000
--- a/debian/patches/fixes/general-platform-issues
+++ /dev/null
@@ -1,194 +0,0 @@
-Subject: General platform-related issues
-Author: Steve Greenland <stevegr at debian.org>
-Last-Update: 2010-04-11
-
-Various platform-related fixes, additions or updates. These are quite numerous
-because the upstream code is from 1993.
-
-Bug-Debian: http://bugs.debian.org/64382
-Bug-Debian: http://bugs.debian.org/50240
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/externs.h
-===================================================================
---- patched.orig/externs.h	2010-05-06 18:18:16.268435775 +0200
-+++ patched/externs.h	2010-05-06 18:18:22.672435408 +0200
-@@ -20,6 +20,7 @@
- # include <unistd.h>
- # include <string.h>
- # include <dirent.h>
-+# include <errno.h>
- # define DIR_T	struct dirent
- # define WAIT_T	int
- # define WAIT_IS_INT 1
-@@ -55,6 +56,7 @@
- extern	void		perror(), exit(), free();
- extern	char		*getenv(), *strcpy(), *strchr(), *strtok();
- extern	void		*malloc(), *realloc();
-+
- # define SIG_T	void
- # define TIME_T	long
- # define PID_T int
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:16.252435886 +0200
-+++ patched/cron.c	2010-05-06 18:18:22.672435408 +0200
-@@ -24,7 +24,7 @@
- 
- 
- #include "cron.h"
--#include <sys/signal.h>
-+#include <signal.h>
- #if SYS_TIME_H
- # include <sys/time.h>
- #else
-Index: patched/popen.c
-===================================================================
---- patched.orig/popen.c	2010-05-06 18:18:16.279435871 +0200
-+++ patched/popen.c	2010-05-06 18:18:22.672435408 +0200
-@@ -29,7 +29,11 @@
- #endif /* not lint */
- 
- #include "cron.h"
--#include <sys/signal.h>
-+#include <signal.h>
-+
-+#if defined(BSD) || defined(POSIX)
-+#  include <grp.h>
-+#endif
- 
- 
- #define WANT_GLOBBING 0
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:16.263436081 +0200
-+++ patched/do_command.c	2010-05-06 18:18:22.672435408 +0200
-@@ -21,7 +21,8 @@
- 
- 
- #include "cron.h"
--#include <sys/signal.h>
-+#include <signal.h>
-+#include <grp.h>
- #if defined(sequent)
- # include <sys/universe.h>
- #endif
-@@ -207,7 +208,7 @@
- 		 * we set uid, we've lost root privledges.
- 		 */
- 		setgid(e->gid);
--# if defined(BSD)
-+# if defined(BSD) || defined(POSIX)
- 		initgroups(env_get("LOGNAME", e->envp), e->gid);
- # endif
- 		setuid(e->uid);		/* we aren't root after this... */
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:16.257436063 +0200
-+++ patched/database.c	2010-05-06 18:18:22.672435408 +0200
-@@ -28,9 +28,20 @@
- #include <sys/stat.h>
- #include <sys/file.h>
- 
--
- #define TMAX(a,b) ((a)>(b)?(a):(b))
- 
-+/* Try to get maximum path name -- this isn't really correct, but we're
-+going to be lazy */
-+
-+#ifndef PATH_MAX
-+
-+#ifdef MAXPATHLEN
-+#define PATH_MAX MAXPATHLEN 
-+#else
-+#define PATH_MAX 2048
-+#endif
-+
-+#endif /* ifndef PATH_MAX */
- 
- static	void		process_crontab __P((char *, char *, char *,
- 					     struct stat *,
-@@ -102,7 +113,7 @@
- 
- 	while (NULL != (dp = readdir(dir))) {
- 		char	fname[MAXNAMLEN+1],
--			tabname[MAXNAMLEN+1];
-+			tabname[PATH_MAX+1];
- 
- 		/* avoid file names beginning with ".".  this is good
- 		 * because we would otherwise waste two guaranteed calls
-Index: patched/compat.h
-===================================================================
---- patched.orig/compat.h	2010-05-06 18:18:16.247436070 +0200
-+++ patched/compat.h	2010-05-06 18:18:22.672435408 +0200
-@@ -62,8 +62,8 @@
- #endif
- 
- #ifndef POSIX
--# if (BSD >= 199103) || defined(__linux) || defined(ultrix) || defined(AIX) ||\
--	defined(HPUX) || defined(CONVEX) || defined(IRIX)
-+# if (BSD >= 199103) || defined(__linux__) || defined(__GNU__) || defined(ultrix) ||\
-+        defined(AIX) ||\ defined(HPUX) || defined(CONVEX) || defined(IRIX) || defined(__GLIBC__)
- #  define POSIX
- # endif
- #endif
-@@ -76,17 +76,17 @@
- 
- /*****************************************************************/
- 
--#if !defined(BSD) && !defined(HPUX) && !defined(CONVEX) && !defined(__linux)
-+#if !defined(BSD) && !defined(HPUX) && !defined(CONVEX) && !defined(__linux__) && !defined(__GNU__)
- # define NEED_VFORK
- #endif
- 
--#if (!defined(BSD) || (BSD < 198902)) && !defined(__linux) && \
--	!defined(IRIX) && !defined(NeXT) && !defined(HPUX)
-+#if (!defined(BSD) || (BSD < 198902)) && !defined(__linux__) && \
-+	!defined(IRIX) && !defined(NeXT) && !defined(HPUX) && !defined(__GNU__) && !defined(__GLIBC__)
- # define NEED_STRCASECMP
- #endif
- 
--#if (!defined(BSD) || (BSD < 198911)) && !defined(__linux) &&\
--	!defined(IRIX) && !defined(UNICOS) && !defined(HPUX)
-+#if (!defined(BSD) || (BSD < 198911)) && !defined(__linux__) &&\
-+	!defined(IRIX) && !defined(UNICOS) && !defined(HPUX) && !defined(__GNU__) && !defined(__GLIBC__)
- # define NEED_STRDUP
- #endif
- 
-@@ -102,19 +102,19 @@
- # define NEED_SETSID
- #endif
- 
--#if (defined(POSIX) && !defined(BSD)) && !defined(__linux)
-+#if (defined(POSIX) && !defined(BSD)) && !defined(__linux__) && !defined(__GNU__) && !defined(__GLIBC__)
- # define NEED_GETDTABLESIZE
- #endif
- 
--#if (BSD >= 199103)
-+#if (BSD >= 199103) || defined(__linux)
- # define HAVE_SAVED_UIDS
- #endif
- 
--#if !defined(ATT) && !defined(__linux) && !defined(IRIX) && !defined(UNICOS)
-+#if !defined(ATT) && !defined(__linux__) && !defined(__GNU__) && !defined(IRIX) && !defined(UNICOS) && !defined(__GLIBC__)
- # define USE_SIGCHLD
- #endif
- 
--#if !defined(AIX) && !defined(UNICOS)
-+#if !defined(AIX) && !defined(UNICOS) && !defined(DEBIAN)
- # define SYS_TIME_H 1
- #else
- # define SYS_TIME_H 0
-Index: patched/pathnames.h
-===================================================================
---- patched.orig/pathnames.h	2010-05-06 18:18:16.273435823 +0200
-+++ patched/pathnames.h	2010-05-06 18:18:22.673435429 +0200
-@@ -19,7 +19,7 @@
-  * $Id: pathnames.h,v 1.3 1994/01/15 20:43:43 vixie Exp $
-  */
- 
--#if (defined(BSD)) && (BSD >= 199103) || defined(__linux) || defined(AIX)
-+#if (defined(BSD)) && (BSD >= 199103) || defined(__linux__) || defined(AIX) || defined(__GNU__) || defined(__GLIBC__)
- # include <paths.h>
- #endif /*BSD*/
- 
diff --git a/debian/patches/fixes/handle-escapes-in-commands b/debian/patches/fixes/handle-escapes-in-commands
deleted file mode 100644
index 3cfd044..0000000
--- a/debian/patches/fixes/handle-escapes-in-commands
+++ /dev/null
@@ -1,48 +0,0 @@
-Subject: Properly process escapes in commands
-Last-Update: 2010-04-11
-
-Certain escape sequence are not handled correctly.
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:31.634435779 +0200
-+++ patched/do_command.c	2010-05-06 18:18:33.012435990 +0200
-@@ -138,13 +138,21 @@
- 	 * command, and subsequent characters are the additional input to
- 	 * the command.  Subsequent %'s will be transformed into newlines,
- 	 * but that happens later.
-+	 *
-+	 * If there are escaped %'s, remove the escape character.
- 	 */
- 	/*local*/{
- 		register int escaped = FALSE;
- 		register int ch;
-+		register char *p;
- 
--		for (input_data = e->cmd;  ch = *input_data;  input_data++) {
-+		for (input_data = p = e->cmd; (ch = *input_data);
-+		    input_data++, p++) {
-+			if (p != input_data)
-+				*p = ch;
- 			if (escaped) {
-+				if (ch == '%' || ch == '\\')
-+					*--p = ch;
- 				escaped = FALSE;
- 				continue;
- 			}
-@@ -157,6 +165,7 @@
- 				break;
- 			}
- 		}
-+		*p = '\0';
- 	}
- 
- 	/* fork again, this time so we can exec the user's command.
-@@ -317,7 +326,7 @@
- 		 *	%  -> \n
- 		 *	\x -> \x	for all x != %
- 		 */
--		while (ch = *input_data++) {
-+		while ((ch = *input_data++) != '\0') {
- 			if (escaped) {
- 				if (ch != '%')
- 					putc('\\', out);
diff --git a/debian/patches/fixes/limit-args-for-commands b/debian/patches/fixes/limit-args-for-commands
deleted file mode 100644
index e939648..0000000
--- a/debian/patches/fixes/limit-args-for-commands
+++ /dev/null
@@ -1,35 +0,0 @@
-Subject: Limit the maximum number of arguments to commands
-Last-Update: 2010-04-11
-Index: patched/popen.c
-===================================================================
---- patched.orig/popen.c	2010-05-06 18:18:24.458435579 +0200
-+++ patched/popen.c	2010-05-06 18:18:25.171561124 +0200
-@@ -36,6 +36,7 @@
- #endif
- 
- 
-+#define MAX_ARGS 100
- #define WANT_GLOBBING 0
- 
- /*
-@@ -54,7 +55,7 @@
- 	FILE *iop;
- 	int argc, pdes[2];
- 	PID_T pid;
--	char *argv[100];
-+	char *argv[MAX_ARGS + 1];
- #if WANT_GLOBBING
- 	char **pop, *vv[2];
- 	int gargc;
-@@ -76,9 +77,10 @@
- 		return(NULL);
- 
- 	/* break up string into pieces */
--	for (argc = 0, cp = program;; cp = NULL)
-+	for (argc = 0, cp = program; argc < MAX_ARGS; cp = NULL)
- 		if (!(argv[argc++] = strtok(cp, " \t\n")))
- 			break;
-+    argv[MAX_ARGS] = NULL;
- 
- #if WANT_GLOBBING
- 	/* glob each piece */
diff --git a/debian/patches/fixes/make-it-buildable b/debian/patches/fixes/make-it-buildable
deleted file mode 100644
index 8490c00..0000000
--- a/debian/patches/fixes/make-it-buildable
+++ /dev/null
@@ -1,66 +0,0 @@
-Subject: Make source buildable on Debian
-
-The fixes/* directory shouldn't contain any Debian-specific fixes, only common
-ones. Unfortunately, this approach fails without patching the Makefile, simply
-because the original source (cron 3.0) was release in 1993, and certain things
-such as POSIX are considered a "feature".
-Index: patched/Makefile
-===================================================================
---- patched.orig/Makefile	2010-05-06 18:18:16.350561149 +0200
-+++ patched/Makefile	2010-05-06 18:18:21.821436206 +0200
-@@ -57,28 +57,32 @@
- #<<need getopt()>>
- LIBS		=
- #<<optimize or debug?>>
--#OPTIM		=	-O
--OPTIM		=	-g
-+OPTIM		=	-O2
-+#OPTIM		=	-g
- #<<ATT or BSD or POSIX?>>
- # (ATT untested)
- #COMPAT		=	-DATT
- #(BSD is only needed if <sys/params.h> does not define it, as on ULTRIX)
- #COMPAT		=	-DBSD
- # (POSIX)
--#COMPAT		=	-DPOSIX
-+COMPAT		=	-DPOSIX
- #<<lint flags of choice?>>
- LINTFLAGS	=	-hbxa $(INCLUDE) $(COMPAT) $(DEBUGGING)
- #<<want to use a nonstandard CC?>>
- #CC		=	vcc
- #<<manifest defines>>
- DEFS		=
-+# The -DUSE_SIGCHLD is needed for the Alpha port
-+DEFS = -DDEBIAN -DUSE_SIGCHLD
- #(SGI IRIX systems need this)
- #DEFS		=	-D_BSD_SIGNALS -Dconst=
- #<<the name of the BSD-like install program>>
- #INSTALL = installbsd
--INSTALL = install
-+INSTALL = install -s
- #<<any special load flags>>
--LDFLAGS		=
-+# LDFLAGS		=	-s
-+# Let install do the strip
-+
- #################################### end configurable stuff
- 
- SHELL		=	/bin/sh
-@@ -113,13 +117,14 @@
- 			$(CC) $(LDFLAGS) -o crontab $(CRONTAB_OBJ) $(LIBS)
- 
- install		:	all
--			$(INSTALL) -c -m  111 -o root -s cron    $(DESTSBIN)/
--			$(INSTALL) -c -m 4111 -o root -s crontab $(DESTBIN)/
-+			$(INSTALL) -c -m  755 -o root cron    $(DESTSBIN)/
-+			$(INSTALL) -c -m 4755 -o root crontab $(DESTBIN)/
- 			sh putman.sh crontab.1 $(DESTMAN)
- 			sh putman.sh cron.8    $(DESTMAN)
- 			sh putman.sh crontab.5 $(DESTMAN)
- 
--clean		:;	rm -f *.o cron crontab a.out core tags *~ #*
-+clean		:
-+			rm -f *.o cron crontab a.out core tags *~ #*
- 
- kit		:	$(SHAR_SOURCE)
- 			makekit -m -s99k $(SHAR_SOURCE)
diff --git a/debian/patches/fixes/memory-management-issues b/debian/patches/fixes/memory-management-issues
deleted file mode 100644
index 45bc9b7..0000000
--- a/debian/patches/fixes/memory-management-issues
+++ /dev/null
@@ -1,300 +0,0 @@
-Subject: Correct memory management issues
-Last-Update: 2010-04-11
-
-Three kinds of fixes:
-  1) Do not just assume that malloc() et al. return successfully
-  2) Don't forget to free memory 
-  3) Function implicitly relying on allocation have to test for successful
-     return, too. These are usually env_init(), etc. They are included here
-     because of the close way they are all tied together.
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/compat.c
-===================================================================
---- patched.orig/compat.c	2010-05-06 18:18:24.437560974 +0200
-+++ patched/compat.c	2010-05-06 18:18:27.645727100 +0200
-@@ -53,7 +53,10 @@
- {
- 	char	*temp;
- 
--	temp = malloc(strlen(str) + 1);
-+	if ((temp = malloc(strlen(str) + 1)) == NULL) {
-+		errno = ENOMEM;
-+		return NULL;
-+	}
- 	(void) strcpy(temp, str);
- 	return temp;
- }
-Index: patched/env.c
-===================================================================
---- patched.orig/env.c	2010-05-06 18:18:24.458435579 +0200
-+++ patched/env.c	2010-05-06 18:18:27.645727100 +0200
-@@ -28,7 +28,8 @@
- {
- 	register char	**p = (char **) malloc(sizeof(char **));
- 
--	p[0] = NULL;
-+	if (p)
-+		p[0] = NULL;
- 	return (p);
- }
- 
-@@ -58,8 +59,18 @@
- 	for (count = 0;  envp[count] != NULL;  count++)
- 		;
- 	p = (char **) malloc((count+1) * sizeof(char *));  /* 1 for the NULL */
-+	if (p == NULL) {
-+		errno = ENOMEM;
-+		return NULL;
-+	}
- 	for (i = 0;  i < count;  i++)
--		p[i] = strdup(envp[i]);
-+		if ((p[i] = strdup(envp[i])) == NULL) {
-+			while (--i >= 0)
-+				(void) free(p[i]);
-+			free(p);
-+			errno = ENOMEM;
-+			return NULL;
-+		}
- 	p[count] = NULL;
- 	return (p);
- }
-@@ -90,7 +101,11 @@
- 		 * save our new one there, and return the existing array.
- 		 */
- 		free(envp[found]);
--		envp[found] = strdup(envstr);
-+		if ((envp[found] = strdup(envstr)) == NULL) {
-+			envp[found] = "";
-+			errno = ENOMEM;
-+			return NULL;
-+		}
- 		return (envp);
- 	}
- 
-@@ -101,8 +116,15 @@
- 	 */
- 	p = (char **) realloc((void *) envp,
- 			      (unsigned) ((count+1) * sizeof(char **)));
-+	if (p == NULL) 	{
-+		errno = ENOMEM;
-+		return NULL;
-+	}
- 	p[count] = p[count-1];
--	p[count-1] = strdup(envstr);
-+	if ((p[count-1] = strdup(envstr)) == NULL) {
-+		errno = ENOMEM;
-+		return NULL;
-+	}
- 	return (p);
- }
- 
-Index: patched/job.c
-===================================================================
---- patched.orig/job.c	2010-05-06 18:18:15.622435978 +0200
-+++ patched/job.c	2010-05-06 18:18:27.645727100 +0200
-@@ -45,7 +45,8 @@
- 		if (j->e == e && j->u == u) { return; }
- 
- 	/* build a job queue element */
--	j = (job*)malloc(sizeof(job));
-+	if ((j = (job*)malloc(sizeof(job))) == NULL)
-+		return;
- 	j->next = (job*) NULL;
- 	j->e = e;
- 	j->u = u;
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:24.458435579 +0200
-+++ patched/misc.c	2010-05-06 18:18:27.646435759 +0200
-@@ -479,7 +479,12 @@
- 		     + strlen(event)
- 		     + strlen(detail)
- 		     + MAX_TEMPSTR);
--
-+	if (msg == NULL) {
-+	    /* damn, out of mem and we did not test that before... */
-+	    fprintf(stderr, "%s: Run OUT OF MEMORY while %s\n",
-+		    ProgramName, __FUNCTION__);
-+	    return;
-+	}
- 	if (LogFD < OK) {
- 		LogFD = open(LOG_FILE, O_WRONLY|O_APPEND|O_CREAT, 0600);
- 		if (LogFD < OK) {
-@@ -622,7 +627,8 @@
- {
- 	register char *dst = malloc(len*4 + 1);
- 
--	mkprint(dst, src, len);
-+	if (dst)
-+		mkprint(dst, src, len);
- 
- 	return dst;
- }
-Index: patched/user.c
-===================================================================
---- patched.orig/user.c	2010-05-06 18:18:25.803561007 +0200
-+++ patched/user.c	2010-05-06 18:18:27.646435759 +0200
-@@ -52,7 +52,7 @@
- 	user	*u;
- 	entry	*e;
- 	int	status;
--	char	**envp;
-+	char	**envp = NULL, **tenvp;
- 
- 	if (!(file = fdopen(crontab_fd, "r"))) {
- 		perror("fdopen on crontab_fd in load_user");
-@@ -63,14 +63,25 @@
- 
- 	/* file is open.  build user entry, then read the crontab file.
- 	 */
--	u = (user *) malloc(sizeof(user));
--	u->name = strdup(name);
-+	if ((u = (user *) malloc(sizeof(user))) == NULL) {
-+		errno = ENOMEM;
-+		return NULL;
-+	}
-+	if ((u->name = strdup(name)) == NULL) {
-+		free(u);
-+		errno = ENOMEM;
-+		return NULL;
-+	}
- 	u->crontab = NULL;
- 
- 	/* 
- 	 * init environment.  this will be copied/augmented for each entry.
- 	 */
--	envp = env_init();
-+	if ((envp = env_init()) == NULL) {
-+		free(u->name);
-+		free(u);
-+		return NULL;
-+	}
- 
- 	/*
- 	 * load the crontab
-@@ -98,7 +109,13 @@
- 			}
- 			break;
- 		case TRUE:
--			envp = env_set(envp, envstr);
-+			if ((tenvp = env_set(envp, envstr))) {
-+				envp = tenvp;
-+			} else {
-+				free_user(u);
-+				u = NULL;
-+				goto done;
-+			}
- 			break;
- 		}
- 	} while (status >= OK);
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:27.017560712 +0200
-+++ patched/entry.c	2010-05-06 18:18:27.646435759 +0200
-@@ -91,6 +91,7 @@
- 	int	ch;
- 	char	cmd[MAX_COMMAND];
- 	char	envstr[MAX_ENVSTR];
-+	char	**tenvp;
- 
- 	Debug(DPARS, ("load_entry()...about to eat comments\n"))
- 
-@@ -250,24 +251,52 @@
- 	/* copy and fix up environment.  some variables are just defaults and
- 	 * others are overrides.
- 	 */
--	e->envp = env_copy(envp);
-+	if ((e->envp = env_copy(envp)) == NULL) {
-+		ecode = e_none;
-+		goto eof;
-+	}
- 	if (!env_get("SHELL", e->envp)) {
- 		sprintf(envstr, "SHELL=%s", _PATH_BSHELL);
--		e->envp = env_set(e->envp, envstr);
-+		if ((tenvp = env_set(e->envp, envstr))) {
-+			e->envp = tenvp;
-+		} else {
-+			ecode = e_none;
-+			goto eof;
-+		}
- 	}
- 	if (!env_get("HOME", e->envp)) {
- 		sprintf(envstr, "HOME=%s", pw->pw_dir);
--		e->envp = env_set(e->envp, envstr);
-+		if ((tenvp = env_set(e->envp, envstr))) {
-+			e->envp = tenvp;
-+		} else {
-+			ecode = e_none;
-+			goto eof;
-+		}
- 	}
- 	if (!env_get("PATH", e->envp)) {
- 		sprintf(envstr, "PATH=%s", _PATH_DEFPATH);
--		e->envp = env_set(e->envp, envstr);
-+		if ((tenvp = env_set(e->envp, envstr))) {
-+			e->envp = tenvp;
-+		} else {
-+			ecode = e_none;
-+			goto eof;
-+		}
-+	}
-+	snprintf(envstr, MAX_ENVSTR, "%s=%s", "LOGNAME", pw->pw_name);
-+	if ((tenvp = env_set(e->envp, envstr))) {
-+		e->envp = tenvp;
-+	} else {
-+		ecode = e_none;
-+		goto eof;
- 	}
--	sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name);
--	e->envp = env_set(e->envp, envstr);
- #if defined(BSD)
- 	sprintf(envstr, "%s=%s", "USER", pw->pw_name);
--	e->envp = env_set(e->envp, envstr);
-+	if ((tenvp = env_set(e->envp, envstr))) {
-+		e->envp = tenvp;
-+	} else {
-+		ecode = e_none;
-+		goto eof;
-+	}
- #endif
- 
- 	Debug(DPARS, ("load_entry()...about to parse command\n"))
-@@ -292,7 +321,10 @@
- 
- 	/* got the command in the 'cmd' string; save it in *e.
- 	 */
--	e->cmd = strdup(cmd);
-+	if ((e->cmd = strdup(cmd)) == NULL) {
-+		ecode = e_none;
-+		goto eof;
-+	}
- 
- 	Debug(DPARS, ("load_entry()...returning successfully\n"))
- 
-@@ -301,6 +333,10 @@
- 	return e;
- 
-  eof:
-+	if (e->envp)
-+		env_free(e->envp);
-+	if (e->cmd)
-+		free(e->cmd);
- 	free(e);
- 	if (ecode != e_none && error_func)
- 		(*error_func)(ecodes[(int)ecode]);
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:24.437560974 +0200
-+++ patched/crontab.c	2010-05-06 18:18:27.646435759 +0200
-@@ -497,6 +497,10 @@
- 	time_t	now = time(NULL);
- 	char	**envp = env_init();
- 
-+	if (envp == NULL) {
-+		fprintf(stderr, "%s: Cannot allocate memory.\n", ProgramName);
-+		return (-2);
-+	}
- 	(void) sprintf(n, "tmp.%d", Pid);
- 	(void) sprintf(tn, CRON_TAB(n));
- 	if (!(tmp = fopen(tn, "w+"))) {
diff --git a/debian/patches/fixes/missing-or-broken-defs-and-decls b/debian/patches/fixes/missing-or-broken-defs-and-decls
deleted file mode 100644
index 13e6a6d..0000000
--- a/debian/patches/fixes/missing-or-broken-defs-and-decls
+++ /dev/null
@@ -1,27 +0,0 @@
-Subject: Add or fix definitions and declarations
-Last-Update: 2010-04-11
-
-Add or fix definitions and declarations in headers which are NOT associated
-with a particular feature but considered either an omission, a bug or simply
-outdated.
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:16.151435957 +0200
-+++ patched/cron.h	2010-05-06 18:18:23.394435942 +0200
-@@ -105,7 +105,7 @@
- 
- #if DEBUGGING
- # define Debug(mask, message) \
--			if ( (DebugFlags & (mask) ) == (mask) ) \
-+			if ( (DebugFlags & (mask) )  ) \
- 				printf message;
- #else /* !DEBUGGING */
- # define Debug(mask, message) \
-@@ -205,6 +205,7 @@
- 		get_char __P((FILE *)),
- 		get_string __P((char *, int, FILE *, char *)),
- 		swap_uids __P((void)),
-+		swap_uids_back __P((void)),
- 		load_env __P((char *, FILE *)),
- 		cron_pclose __P((FILE *)),
- 		strcmp_until __P((char *, char *, int)),
diff --git a/debian/patches/fixes/parse-envvars-correctly b/debian/patches/fixes/parse-envvars-correctly
deleted file mode 100644
index 6600cc9..0000000
--- a/debian/patches/fixes/parse-envvars-correctly
+++ /dev/null
@@ -1,156 +0,0 @@
-Subject: Correctly pars environment variables in crontab
-Origin: ftp://ftp.isc.org/isc/cron/cron_4.1.shar
-Last-Update: 2010-04-22
-
-The parsing code for environment variables in crontabs is broken. This patch
-backports the parsing code from cron-4.1.
-Index: patched/env.c
-===================================================================
---- patched.orig/env.c	2010-04-22 20:15:54.192691828 +0200
-+++ patched/env.c	2010-04-22 20:23:25.871565946 +0200
-@@ -128,6 +128,17 @@
- 	return (p);
- }
- 
-+/* The following states are used by load_env(), traversed in order: */
-+enum env_state {
-+	NAMEI,		/* First char of NAME, may be quote */
-+	NAME,		/* Subsequent chars of NAME */
-+	EQ1,		/* After end of name, looking for '=' sign */
-+	EQ2,		/* After '=', skipping whitespace */
-+	VALUEI,		/* First char of VALUE, may be quote */
-+	VALUE,		/* Subsequent chars of VALUE */
-+	FINI,		/* All done, skipping trailing whitespace */
-+	ERROR,		/* Error */
-+};
- 
- /* return	ERR = end of file
-  *		FALSE = not an env setting (file was repositioned)
-@@ -140,8 +151,9 @@
- {
- 	long	filepos;
- 	int	fileline;
--	char	name[MAX_ENVSTR], val[MAX_ENVSTR];
--	int	fields;
-+	enum env_state state;
-+	char name[MAX_ENVSTR], val[MAX_ENVSTR];
-+	char quotechar, *c, *str;
- 
- 	filepos = ftell(f);
- 	fileline = LineNumber;
-@@ -153,37 +165,93 @@
- 
- 	Debug(DPARS, ("load_env, read <%s>\n", envstr))
- 
--	name[0] = val[0] = '\0';
--	fields = sscanf(envstr, "%[^ =] = %[^\n#]", name, val);
--	if (fields != 2) {
--		Debug(DPARS, ("load_env, not 2 fields (%d)\n", fields))
-+	bzero(name, sizeof name);
-+	bzero(val, sizeof val);
-+	str = name;
-+	state = NAMEI;
-+	quotechar = '\0';
-+	c = envstr;
-+	while (state != ERROR && *c) {
-+		switch (state) {
-+		case NAMEI:
-+		case VALUEI:
-+			if (*c == '\'' || *c == '"')
-+				quotechar = *c++;
-+			state++;
-+			/* FALLTHROUGH */
-+		case NAME:
-+		case VALUE:
-+			if (quotechar) {
-+				if (*c == quotechar) {
-+					state++;
-+					c++;
-+					break;
-+				}
-+				if (state == NAME && *c == '=') {
-+					state = ERROR;
-+					break;
-+				}
-+			} else {
-+				if (state == NAME) {
-+					if (isspace((unsigned char)*c)) {
-+						c++;
-+						state++;
-+						break;
-+					}
-+					if (*c == '=') {
-+						state++;
-+						break;
-+					}
-+				}
-+			}
-+			*str++ = *c++;
-+			break;
-+
-+		case EQ1:
-+			if (*c == '=') {
-+				state++;
-+				str = val;
-+				quotechar = '\0';
-+			} else {
-+				if (!isspace((unsigned char)*c))
-+					state = ERROR;
-+			}
-+			c++;
-+			break;
-+
-+		case EQ2:
-+		case FINI:
-+			if (isspace((unsigned char)*c))
-+				c++;
-+			else
-+				state++;
-+			break;
-+
-+		default:
-+			abort();
-+		}
-+	}
-+	if (state != FINI && !(state == VALUE && !quotechar)) {
-+		Debug(DPARS, ("load_env, not an env var, state = %d\n", state))
- 		fseek(f, filepos, 0);
- 		Set_LineNum(fileline);
- 		return (FALSE);
- 	}
-+	if (state == VALUE) {
-+		/* End of unquoted value: trim trailing whitespace */
-+		c = val + strlen(val);
-+		while (c > val && isspace((unsigned char)c[-1]))
-+			*(--c) = '\0';
-+	}
- 
--	/* 2 fields from scanf; looks like an env setting
--	 */
-+	/* 2 fields from parser; looks like an env setting */
- 
- 	/*
--	 * process value string
-+	 * This can't overflow because get_string() limited the size of the
-+	 * name and val fields.  Still, it doesn't hurt to be careful...
- 	 */
--	/*local*/{
--		int	len = strdtb(val);
--
--		if (len >= 2) {
--			if (val[0] == '\'' || val[0] == '"') {
--				if (val[len-1] == val[0]) {
--					val[len-1] = '\0';
--					(void) strcpy(val, val+1);
--				}
--			}
--		}
--	}
--
--	if (strlen(name) + 1 + strlen(val) >= MAX_ENVSTR-1)
-+	if (!glue_strings(envstr, MAX_ENVSTR, name, val, '='))
- 		return (FALSE);
--	(void) sprintf(envstr, "%s=%s", name, val);
- 	Debug(DPARS, ("load_env, <%s> <%s> -> <%s>\n", name, val, envstr))
- 	return (TRUE);
- }
diff --git a/debian/patches/fixes/prevent-tmpfiles-attack b/debian/patches/fixes/prevent-tmpfiles-attack
deleted file mode 100644
index 12c9547..0000000
--- a/debian/patches/fixes/prevent-tmpfiles-attack
+++ /dev/null
@@ -1,113 +0,0 @@
-Subject: Prevent symlink attack
-Last-Update: 2010-10-11
-Author: Daniel Jacobowitz, Steeve Greenland <stevegr at debian.org>
-
-Prevent symlink attack by ensuring we open a regular file. Also, add some
-additional security measures.
-
-IMPORTANT NOTE for Debian: most of this patch will get replaced by a
-Debian-specific solution (see features/*).
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:39.119435834 +0200
-+++ patched/crontab.c	2010-05-06 18:18:39.796561016 +0200
-@@ -144,6 +144,7 @@
- 	char	*argv[];
- {
- 	int		argch;
-+	struct stat	statbuf;
- 
- 	if (!(pw = getpwuid(getuid()))) {
- 		fprintf(stderr, "%s: your UID isn't in the passwd file.\n",
-@@ -245,6 +246,15 @@
- 				perror(Filename);
- 				exit(ERROR_EXIT);
- 			}
-+			/* Make sure we opened a normal file. */
-+			if (fstat(fileno(NewCrontab), &statbuf) < 0) {
-+				perror("fstat");
-+				exit(ERROR_EXIT);
-+			}
-+			if (!S_ISREG(statbuf.st_mode)) {
-+				fprintf(stderr, "%s: Not a regular file.\n", Filename);
-+				exit(ERROR_EXIT);
-+			}
- 			if (swap_uids_back() < OK) {
- 				perror("swapping uids back");
- 				exit(ERROR_EXIT);
-@@ -520,7 +530,14 @@
-  done:
- 	log_it(RealUser, Pid, "END EDIT", User);
- }
--	
-+
-+static char tn[MAX_FNAME];
-+
-+static void sig_handler(int x)
-+{
-+	unlink(tn);
-+	exit(1);
-+}	
- 
- /* returns	0	on success
-  *		-1	on syntax error
-@@ -528,23 +545,42 @@
-  */
- static int
- replace_cmd() {
--	char	n[MAX_FNAME], envstr[MAX_ENVSTR], tn[MAX_FNAME];
-+	char	n[MAX_FNAME], envstr[MAX_ENVSTR];
- 	FILE	*tmp;
--	int	ch, eof;
-+	int	ch, eof, fd;
- 	entry	*e;
- 	time_t	now = time(NULL);
- 	char	**envp = env_init();
-+	mode_t	um;
- 
- 	if (envp == NULL) {
- 		fprintf(stderr, "%s: Cannot allocate memory.\n", ProgramName);
- 		return (-2);
- 	}
--	(void) snprintf(n, MAX_FNAME, "tmp.%d", Pid);
--	(void) snprintf(tn, MAX_FNAME, CRON_TAB(n));
--	if (!(tmp = fopen(tn, "w+"))) {
--		perror(tn);
-+
-+
-+	/* Assumes Linux-style signal handlers (takes int, returns void) */
-+	/* Signal handlers, to ensure we do not leave temp files in the
-+	   spool dir.  We don't remove these on exiting this function;
-+	   but that's OK, we exit immediately afterwards anyway. */
-+	signal(SIGHUP, sig_handler);
-+	signal(SIGINT, sig_handler);
-+	signal(SIGQUIT, sig_handler);
-+	signal(SIGTSTP, SIG_IGN);
-+
-+	(void) snprintf(tn, MAX_FNAME, CRON_TAB("tmp.XXXXXX"));
-+	um = umask(077);
-+	fd = mkstemp(tn);
-+	if (fd < 0) {
-+                fprintf(stderr, "%s/: mkstemp: %s\n", CRONDIR, strerror(errno));
-+		return(-2);
-+	}
-+	tmp = fdopen(fd, "w+");
-+	if (!tmp) {
-+                fprintf(stderr, "%s/: fdopen: %s\n", CRONDIR, strerror(errno));
- 		return (-2);
- 	}
-+	(void) umask(um);
- 
- 	/* write a signature at the top of the file.
- 	 *
-@@ -564,8 +600,8 @@
- 	fflush(tmp);  rewind(tmp);
- 
- 	if (ferror(tmp)) {
--		fprintf(stderr, "%s: %s: %s\n",
--			ProgramName, tn, strerror(errno));
-+		fprintf(stderr, "%s: error while writing new crontab to %s\n",
-+			ProgramName, tn);
- 		fclose(tmp);  unlink(tn);
- 		return (-2);
- 	}
diff --git a/debian/patches/fixes/proper-handling-of-stdstreams b/debian/patches/fixes/proper-handling-of-stdstreams
deleted file mode 100644
index e6cb7f1..0000000
--- a/debian/patches/fixes/proper-handling-of-stdstreams
+++ /dev/null
@@ -1,68 +0,0 @@
-Subject: Proper handling of standard streams
-Last-Update: 2010-04-11
-
-Fixes related to stdin, stdout, stderr WRT to daemonizing, etc.
-
-Debian-Bug: http://bugs.debian.org/295589
-Debian-Bug: http://bugs.debian.org/37189
-Debian-Bug: http://bugs.debian.org/23231
-Debian-Bug: http://bugs.debian.org/30653
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:22.672435408 +0200
-+++ patched/cron.c	2010-05-06 18:18:29.548561115 +0200
-@@ -31,6 +31,8 @@
- # include <time.h>
- #endif
- 
-+#include <sys/types.h>
-+#include <fcntl.h>
- 
- static	void	usage __P((void)),
- 		run_reboot_jobs __P((cron_db *)),
-@@ -74,6 +76,13 @@
- #endif
- 	(void) signal(SIGHUP, sighup_handler);
- 
-+        /* Reopen stdin in case some idiot closed it before starting
-+           us - it will only be closed, but not having it open here
-+           screws up other things that will be opened */
-+        if (fdopen(0,"r") == NULL) {
-+            (void) open("dev/null", 0);
-+        }
-+
- 	acquire_daemonlock(0);
- 	set_cron_uid();
- 	set_cron_cwd();
-@@ -100,6 +109,9 @@
- 			/* child process */
- 			log_it("CRON",getpid(),"STARTUP","fork ok");
- 			(void) setsid();
-+			freopen("/dev/null", "r", stdin);
-+			freopen("/dev/null", "w", stdout);
-+			freopen("/dev/null", "w", stderr);
- 			break;
- 		default:
- 			/* parent process should just die */
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:28.844435899 +0200
-+++ patched/do_command.c	2010-05-06 18:18:29.548561115 +0200
-@@ -189,9 +189,12 @@
- 		/* grandchild process.  make std{in,out} be the ends of
- 		 * pipes opened by our daddy; make stderr go to stdout.
- 		 */
--		close(STDIN);	dup2(stdin_pipe[READ_PIPE], STDIN);
--		close(STDOUT);	dup2(stdout_pipe[WRITE_PIPE], STDOUT);
--		close(STDERR);	dup2(STDOUT, STDERR);
-+		/* Closes are unnecessary -- let dup2() do it */
-+
-+		  /* close(STDIN) */; dup2(stdin_pipe[READ_PIPE], STDIN);
-+		  /* close(STDOUT) */;  dup2(stdout_pipe[WRITE_PIPE], STDOUT);
-+		  /* close(STDERR)*/; dup2(STDOUT, STDERR);
-+
- 
- 		/* close the pipes we just dup'ed.  The resources will remain.
- 		 */
diff --git a/debian/patches/fixes/properly-wait-for-spawned-editor b/debian/patches/fixes/properly-wait-for-spawned-editor
deleted file mode 100644
index 5e4d937..0000000
--- a/debian/patches/fixes/properly-wait-for-spawned-editor
+++ /dev/null
@@ -1,93 +0,0 @@
-Subject: Properly wait for spawned editor to return
-Last-Update: 2010-10-11
-
-Clean up the process of waiting for the spawned editor to return.
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:37.766435855 +0200
-+++ patched/crontab.c	2010-05-06 18:18:39.119435834 +0200
-@@ -31,6 +31,7 @@
- #include "cron.h"
- #include <errno.h>
- #include <fcntl.h>
-+#include <signal.h>
- #include <sys/file.h>
- #include <sys/stat.h>
- #ifdef USE_UTIMES
-@@ -418,6 +419,13 @@
- 	 * close and reopen the file around the edit.
- 	 */
- 
-+	/* Turn off signals. */
-+	(void)signal(SIGHUP, SIG_IGN);
-+	(void)signal(SIGINT, SIG_IGN);
-+	(void)signal(SIGQUIT, SIG_IGN);
-+
-+
-+
- 	switch (pid = fork()) {
- 	case -1:
- 		perror("fork");
-@@ -448,33 +456,35 @@
- 	}
- 
- 	/* parent */
--	xpid = wait(&waiter);
--	if (xpid != pid) {
--		fprintf(stderr, "%s: wrong PID (%d != %d) from \"%s\"\n",
--			ProgramName, xpid, pid, editor);
--		goto fatal;
--	}
--	if (WIFEXITED(waiter) && WEXITSTATUS(waiter)) {
--		fprintf(stderr, "%s: \"%s\" exited with status %d\n",
--			ProgramName, editor, WEXITSTATUS(waiter));
--		goto fatal;
--	}
--	if (WIFSIGNALED(waiter)) {
--		fprintf(stderr,
--			"%s: \"%s\" killed; signal %d (%score dumped)\n",
--			ProgramName, editor, WTERMSIG(waiter),
--			WCOREDUMP(waiter) ?"" :"no ");
--		goto fatal;
--	}
--	if (fstat(t, &statbuf) < 0) {
--		perror("fstat");
--		goto fatal;
--	}
--	if (mtime == statbuf.st_mtime) {
--		fprintf(stderr, "%s: no changes made to crontab\n",
--			ProgramName);
--		goto remove;
--	}
-+	while (1) {
-+		xpid = waitpid(pid, &waiter, WUNTRACED);
-+		if (xpid == -1) {
-+			fprintf(stderr, "%s: waitpid() failed waiting for PID %d from \"%s\": %s\n",
-+				ProgramName, pid, editor, strerror(errno));
-+		} else if (xpid != pid) {
-+			fprintf(stderr, "%s: wrong PID (%d != %d) from \"%s\"\n",
-+				ProgramName, xpid, pid, editor);
-+			goto fatal;
-+		} else if (WIFSTOPPED(waiter)) {
-+		        /* raise(WSTOPSIG(waiter)); Not needed and breaks in job control shell*/
-+		} else if (WIFEXITED(waiter) && WEXITSTATUS(waiter)) {
-+			fprintf(stderr, "%s: \"%s\" exited with status %d\n",
-+				ProgramName, editor, WEXITSTATUS(waiter));
-+			goto fatal;
-+		} else if (WIFSIGNALED(waiter)) {
-+			fprintf(stderr,
-+				"%s: \"%s\" killed; signal %d (%score dumped)\n",
-+				ProgramName, editor, WTERMSIG(waiter),
-+				WCOREDUMP(waiter) ?"" :"no ");
-+			goto fatal;
-+		} else
-+			break;
-+	}
-+	(void)signal(SIGHUP, SIG_DFL);
-+	(void)signal(SIGINT, SIG_DFL);
-+	(void)signal(SIGQUIT, SIG_DFL);
-+	(void)signal(SIGTSTP, SIG_DFL);
-+
- 	fprintf(stderr, "%s: installing new crontab\n", ProgramName);
- 	switch (replace_cmd()) {
- 	case 0:
diff --git a/debian/patches/fixes/protect-against-buffer-overflows b/debian/patches/fixes/protect-against-buffer-overflows
deleted file mode 100644
index b0d208f..0000000
--- a/debian/patches/fixes/protect-against-buffer-overflows
+++ /dev/null
@@ -1,387 +0,0 @@
-Subject: Protect against buffer overflows
-Origin: vendor, Redhat vixie-cron-3.0.1-24.src.rpm
-Last-Update: 2010-04-11
-
-Use safe string functions instead of unsafe ones; protect buffer boundaries,
-etc.
-
-Bug-Debian: http://bugs.debian.org/89040
-Bug-Debian: http://bugs.debian.org/62268
-Bug-Debian: http://bugs.debian.org/26705
-Bug-Debian: http://bugs.debian.org/26749
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/compat.c
-===================================================================
---- patched.orig/compat.c	2010-05-06 18:18:27.645727100 +0200
-+++ patched/compat.c	2010-05-06 18:18:28.215435834 +0200
-@@ -76,7 +76,7 @@
- 		return sys_errlist[error];
- 	}
- 
--	sprintf(buf, "Unknown error: %d", error);
-+	snprintf(buf, 32, "Unknown error: %d", error);
- 	return buf;
- }
- #endif
-@@ -221,16 +221,18 @@
- 	int overwrite;
- {
- 	char *tmp;
-+ 	int tmp_size;
- 
- 	if (overwrite && getenv(name))
- 		return -1;
- 
--	if (!(tmp = malloc(strlen(name) + strlen(value) + 2))) {
-+	tmp_size = strlen(name) + strlen(value) + 2;
-+ 	if (!(tmp = malloc(tmp_size))) {
- 		errno = ENOMEM;
- 		return -1;
- 	}
- 
--	sprintf(tmp, "%s=%s", name, value);
-+ 	snprintf(tmp, tmp_size, "%s=%s", name, value);
- 	return putenv(tmp);	/* intentionally orphan 'tmp' storage */
- }
- #endif
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:27.646435759 +0200
-+++ patched/crontab.c	2010-05-06 18:18:28.216436280 +0200
-@@ -46,7 +46,6 @@
- 
- #define NHEADER_LINES 3
- 
--
- enum opt_t	{ opt_unknown, opt_list, opt_delete, opt_edit, opt_replace };
- 
- #if DEBUGGING
-@@ -55,7 +54,7 @@
- 
- 
- static	PID_T		Pid;
--static	char		User[MAX_UNAME], RealUser[MAX_UNAME];
-+static	char		*User, *RealUser;
- static	char		Filename[MAX_FNAME];
- static	FILE		*NewCrontab = NULL;
- static	int		CheckErrorCount;
-@@ -143,8 +142,11 @@
- 		fprintf(stderr, "bailing out.\n");
- 		exit(ERROR_EXIT);
- 	}
--	strcpy(User, pw->pw_name);
--	strcpy(RealUser, User);
-+	if (((User=strdup(pw->pw_name)) == NULL) ||
-+	    ((RealUser=strdup(pw->pw_name)) == NULL)) {
-+	        fprintf(stderr, "Memory allocation error\n");
-+		exit(ERROR_EXIT);
-+	}
- 	Filename[0] = '\0';
- 	Option = opt_unknown;
- 	while (EOF != (argch = getopt(argc, argv, "u:lerx:"))) {
-@@ -166,7 +168,11 @@
- 					ProgramName, optarg);
- 				exit(ERROR_EXIT);
- 			}
--			(void) strcpy(User, optarg);
-+			free(User);
-+			if ((User=strdup(pw->pw_name)) == NULL) {
-+			        fprintf(stderr, "Memory allocation error\n");
-+				exit(ERROR_EXIT);
-+			}
- 			break;
- 		case 'l':
- 			if (Option != opt_unknown)
-@@ -197,7 +203,9 @@
- 	} else {
- 		if (argv[optind] != NULL) {
- 			Option = opt_replace;
--			(void) strcpy (Filename, argv[optind]);
-+			(void) strncpy (Filename, argv[optind], (sizeof Filename)-1);
-+			Filename[(sizeof Filename)-1] = '\0';
-+
- 		} else {
- 			usage("file name must be specified for replace");
- 		}
-@@ -246,7 +254,7 @@
- 	int	ch;
- 
- 	log_it(RealUser, Pid, "LIST", User);
--	(void) sprintf(n, CRON_TAB(User));
-+	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
- 	if (!(f = fopen(n, "r"))) {
- 		if (errno == ENOENT)
- 			fprintf(stderr, "no crontab for %s\n", User);
-@@ -269,7 +277,7 @@
- 	char	n[MAX_FNAME];
- 
- 	log_it(RealUser, Pid, "DELETE", User);
--	(void) sprintf(n, CRON_TAB(User));
-+	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
- 	if (unlink(n)) {
- 		if (errno == ENOENT)
- 			fprintf(stderr, "no crontab for %s\n", User);
-@@ -301,7 +309,7 @@
- 	PID_T		pid, xpid;
- 
- 	log_it(RealUser, Pid, "BEGIN EDIT", User);
--	(void) sprintf(n, CRON_TAB(User));
-+	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
- 	if (!(f = fopen(n, "r"))) {
- 		if (errno != ENOENT) {
- 			perror(n);
-@@ -315,7 +323,8 @@
- 		}
- 	}
- 
--	(void) sprintf(Filename, "/tmp/crontab.%d", Pid);
-+	(void) snprintf(Filename, sizeof(Filename)-1, "/tmp/crontab.%d", Pid);
-+	Filename[sizeof(Filename)-1] = '\0';
- 	if (-1 == (t = open(Filename, O_CREAT|O_EXCL|O_RDWR, 0600))) {
- 		perror(Filename);
- 		goto fatal;
-@@ -409,7 +418,7 @@
- 				ProgramName);
- 			exit(ERROR_EXIT);
- 		}
--		sprintf(q, "%s %s", editor, Filename);
-+		snprintf(q, MAX_TEMPSTR, "%s %s", editor, Filename);
- 		execlp(_PATH_BSHELL, _PATH_BSHELL, "-c", q, NULL);
- 		perror(editor);
- 		exit(ERROR_EXIT);
-@@ -501,8 +510,8 @@
- 		fprintf(stderr, "%s: Cannot allocate memory.\n", ProgramName);
- 		return (-2);
- 	}
--	(void) sprintf(n, "tmp.%d", Pid);
--	(void) sprintf(tn, CRON_TAB(n));
-+	(void) snprintf(n, MAX_FNAME, "tmp.%d", Pid);
-+	(void) snprintf(tn, MAX_FNAME, CRON_TAB(n));
- 	if (!(tmp = fopen(tn, "w+"))) {
- 		perror(tn);
- 		return (-2);
-@@ -590,7 +599,7 @@
- 		return (-2);
- 	}
- 
--	(void) sprintf(n, CRON_TAB(User));
-+	(void) snprintf(n, sizeof(n), CRON_TAB(User));
- 	if (rename(tn, n)) {
- 		fprintf(stderr, "%s: error renaming %s to %s\n",
- 			ProgramName, tn, n);
-Index: patched/cron.h
-===================================================================
---- patched.orig/cron.h	2010-05-06 18:18:23.394435942 +0200
-+++ patched/cron.h	2010-05-06 18:18:28.216436280 +0200
-@@ -66,8 +66,8 @@
- #define	OK_EXIT		0	/* exit() with this is considered 'normal' */
- #define	MAX_FNAME	100	/* max length of internally generated fn */
- #define	MAX_COMMAND	1000	/* max length of internally generated cmd */
--#define	MAX_ENVSTR	1000	/* max length of envvar=value\0 strings */
--#define	MAX_TEMPSTR	100	/* obvious */
-+#define	MAX_TEMPSTR	1000	/* max length of envvar=value\0 strings */
-+#define	MAX_ENVSTR	MAX_TEMPSTR	/* DO NOT change - buffer overruns otherwise */
- #define	MAX_UNAME	20	/* max length of username, should be overkill */
- #define	ROOT_UID	0	/* don't change this, it really must be root */
- #define	ROOT_USER	"root"	/* ditto */
-Index: patched/env.c
-===================================================================
---- patched.orig/env.c	2010-05-06 18:18:27.645727100 +0200
-+++ patched/env.c	2010-05-06 18:18:28.216436280 +0200
-@@ -140,15 +140,17 @@
- {
- 	long	filepos;
- 	int	fileline;
--	char	name[MAX_TEMPSTR], val[MAX_ENVSTR];
-+	char	name[MAX_ENVSTR], val[MAX_ENVSTR];
- 	int	fields;
- 
- 	filepos = ftell(f);
- 	fileline = LineNumber;
- 	skip_comments(f);
--	if (EOF == get_string(envstr, MAX_ENVSTR, f, "\n"))
-+	if (EOF == get_string(envstr, MAX_ENVSTR - 1, f, "\n"))
- 		return (ERR);
- 
-+    envstr[MAX_ENVSTR - 1] = '\0';
-+
- 	Debug(DPARS, ("load_env, read <%s>\n", envstr))
- 
- 	name[0] = val[0] = '\0';
-@@ -179,6 +181,8 @@
- 		}
- 	}
- 
-+	if (strlen(name) + 1 + strlen(val) >= MAX_ENVSTR-1)
-+		return (FALSE);
- 	(void) sprintf(envstr, "%s=%s", name, val);
- 	Debug(DPARS, ("load_env, <%s> <%s> -> <%s>\n", name, val, envstr))
- 	return (TRUE);
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:24.458435579 +0200
-+++ patched/do_command.c	2010-05-06 18:18:28.216436280 +0200
-@@ -367,8 +367,8 @@
- 				auto char	hostname[MAXHOSTNAMELEN];
- 
- 				(void) gethostname(hostname, MAXHOSTNAMELEN);
--				(void) sprintf(mailcmd, MAILARGS,
--					       MAILCMD, mailto);
-+				(void) snprintf(mailcmd, sizeof(mailcmd),
-+				    MAILARGS, MAILCMD, mailto);
- 				if (!(mail = cron_popen(mailcmd, "w"))) {
- 					perror(MAILCMD);
- 					(void) _exit(ERROR_EXIT);
-@@ -426,7 +426,7 @@
- 			if (mailto && status) {
- 				char buf[MAX_TEMPSTR];
- 
--				sprintf(buf,
-+				snprintf(buf, MAX_TEMPSTR,
- 			"mailed %d byte%s of output but got status 0x%04x\n",
- 					bytes, (bytes==1)?"":"s",
- 					status);
-Index: patched/entry.c
-===================================================================
---- patched.orig/entry.c	2010-05-06 18:18:27.646435759 +0200
-+++ patched/entry.c	2010-05-06 18:18:28.217435826 +0200
-@@ -256,7 +256,7 @@
- 		goto eof;
- 	}
- 	if (!env_get("SHELL", e->envp)) {
--		sprintf(envstr, "SHELL=%s", _PATH_BSHELL);
-+		snprintf(envstr, MAX_ENVSTR, "SHELL=%s", _PATH_BSHELL);
- 		if ((tenvp = env_set(e->envp, envstr))) {
- 			e->envp = tenvp;
- 		} else {
-@@ -265,7 +265,7 @@
- 		}
- 	}
- 	if (!env_get("HOME", e->envp)) {
--		sprintf(envstr, "HOME=%s", pw->pw_dir);
-+		snprintf(envstr, MAX_ENVSTR, "HOME=%s", pw->pw_dir);
- 		if ((tenvp = env_set(e->envp, envstr))) {
- 			e->envp = tenvp;
- 		} else {
-@@ -274,7 +274,7 @@
- 		}
- 	}
- 	if (!env_get("PATH", e->envp)) {
--		sprintf(envstr, "PATH=%s", _PATH_DEFPATH);
-+		snprintf(envstr, MAX_ENVSTR, "PATH=%s", _PATH_DEFPATH);
- 		if ((tenvp = env_set(e->envp, envstr))) {
- 			e->envp = tenvp;
- 		} else {
-@@ -290,7 +290,7 @@
- 		goto eof;
- 	}
- #if defined(BSD)
--	sprintf(envstr, "%s=%s", "USER", pw->pw_name);
-+	snprintf(envstr, MAX_ENVSTR, "%s=%s", "USER", pw->pw_name);
- 	if ((tenvp = env_set(e->envp, envstr))) {
- 		e->envp = tenvp;
- 	} else {
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:27.646435759 +0200
-+++ patched/misc.c	2010-05-06 18:18:28.217435826 +0200
-@@ -263,11 +263,11 @@
- 		char	buf[MAX_TEMPSTR];
- 		int	fd, otherpid;
- 
--		(void) sprintf(pidfile, PIDFILE, PIDDIR);
-+		(void) snprintf(pidfile, MAX_FNAME, PIDFILE, PIDDIR);
- 		if ((-1 == (fd = open(pidfile, O_RDWR|O_CREAT, 0644)))
- 		    || (NULL == (fp = fdopen(fd, "r+")))
- 		    ) {
--			sprintf(buf, "can't open or create %s: %s",
-+			snprintf(buf, MAX_TEMPSTR, "can't open or create %s: %s",
- 				pidfile, strerror(errno));
- 			fprintf(stderr, "%s: %s\n", ProgramName, buf);
- 			log_it("CRON", getpid(), "DEATH", buf);
-@@ -278,7 +278,7 @@
- 			int save_errno = errno;
- 
- 			fscanf(fp, "%d", &otherpid);
--			sprintf(buf, "can't lock %s, otherpid may be %d: %s",
-+			snprintf(buf, MAX_TEMPSTR, "can't lock %s, otherpid may be %d: %s",
- 				pidfile, otherpid, strerror(save_errno));
- 			fprintf(stderr, "%s: %s\n", ProgramName, buf);
- 			log_it("CRON", getpid(), "DEATH", buf);
-@@ -466,6 +466,7 @@
- 	char			*msg;
- 	TIME_T			now = time((TIME_T) 0);
- 	register struct tm	*t = localtime(&now);
-+	int 			msg_size;
- #endif /*LOG_FILE*/
- 
- #if defined(SYSLOG)
-@@ -475,10 +476,8 @@
- #if defined(LOG_FILE)
- 	/* we assume that MAX_TEMPSTR will hold the date, time, &punctuation.
- 	 */
--	msg = malloc(strlen(username)
--		     + strlen(event)
--		     + strlen(detail)
--		     + MAX_TEMPSTR);
-+	msg_size = strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR;
-+	msg = malloc(msg_size);
- 	if (msg == NULL) {
- 	    /* damn, out of mem and we did not test that before... */
- 	    fprintf(stderr, "%s: Run OUT OF MEMORY while %s\n",
-@@ -496,16 +495,16 @@
- 		}
- 	}
- 
--	/* we have to sprintf() it because fprintf() doesn't always write
-+	/* we have to snprintf() it because fprintf() doesn't always write
- 	 * everything out in one chunk and this has to be atomically appended
- 	 * to the log file.
- 	 */
--	sprintf(msg, "%s (%02d/%02d-%02d:%02d:%02d-%d) %s (%s)\n",
-+	snprintf(msg, msg_size, "%s (%02d/%02d-%02d:%02d:%02d-%d) %s (%s)\n",
- 		username,
- 		t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, pid,
- 		event, detail);
- 
--	/* we have to run strlen() because sprintf() returns (char*) on old BSD
-+	/* we have to run strlen() because snprintf() returns (char*) on old BSD
- 	 */
- 	if (LogFD < OK || write(LogFD, msg, strlen(msg)) < OK) {
- 		if (LogFD >= OK)
-@@ -609,8 +608,10 @@
- 			*dst++ = '^';
- 			*dst++ = '?';
- 		} else {			/* parity character */
--			sprintf(dst, "\\%03o", ch);
--			dst += 4;
-+		    /* well, the following snprintf is paranoid, but that will
-+		     * keep grep happy */
-+		    snprintf(dst, 5, "\\%03o", ch);
-+		    dst += 4;
- 		}
- 	}
- 	*dst = '\0';
-@@ -646,7 +647,7 @@
- 	struct tm *tm = localtime(&t);
- 	static char ret[30];	/* zone name might be >3 chars */
- 	
--	(void) sprintf(ret, "%s, %2d %s %2d %02d:%02d:%02d %s",
-+	(void) snprintf(ret, 30, "%s, %2d %s %2d %02d:%02d:%02d %s",
- 		       DowNames[tm->tm_wday],
- 		       tm->tm_mday,
- 		       MonthNames[tm->tm_mon],
-Index: patched/database.c
-===================================================================
---- patched.orig/database.c	2010-05-06 18:18:22.672435408 +0200
-+++ patched/database.c	2010-05-06 18:18:28.217435826 +0200
-@@ -124,7 +124,7 @@
- 			continue;
- 
- 		(void) strcpy(fname, dp->d_name);
--		sprintf(tabname, CRON_TAB(fname));
-+		snprintf(tabname, PATH_MAX+1, CRON_TAB(fname));
- 
- 		process_crontab(fname, fname, tabname,
- 				&statbuf, &new_db, old_db);
diff --git a/debian/patches/fixes/root-does-not-override-allowdeny b/debian/patches/fixes/root-does-not-override-allowdeny
deleted file mode 100644
index f8f6780..0000000
--- a/debian/patches/fixes/root-does-not-override-allowdeny
+++ /dev/null
@@ -1,40 +0,0 @@
-Subject: Do not allow override of cron.{allow,deny} by root
-Author: Javier Fernández-Sanguino Peña <jfs at debian.org>
-Last-Update: 2010-04-11
-
-Prevent root from using "crontab -u" with a user not allowed to use cron via
-cron.{allow,deny}. (Actually, root may not do that anyway. This just prints a
-different error message).
-
-Bug-Debian: http://bugs.debian.org/505288
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:33.711435964 +0200
-+++ patched/crontab.c	2010-05-06 18:18:34.351435790 +0200
-@@ -105,11 +105,19 @@
- 	set_cron_uid();
- 	set_cron_cwd();
- 	if (!allowed(User)) {
--		fprintf(stderr,
--			"You (%s) are not allowed to use this program (%s)\n",
--			User, ProgramName);
--		fprintf(stderr, "See crontab(1) for more information\n");
--		log_it(RealUser, Pid, "AUTH", "crontab command not allowed");
-+                if ( getuid() != 0 ) {
-+                    fprintf(stderr,
-+                            "You (%s) are not allowed to use this program (%s)\n",
-+                            User, ProgramName);
-+                    fprintf(stderr, "See crontab(1) for more information\n");
-+                    log_it(RealUser, Pid, "AUTH", "crontab command not allowed");
-+                } else {
-+                /* If the user is not allowed but root is running the
-+                 * program warn but do not log */
-+                    fprintf(stderr,
-+                            "The user %s cannot use this program (%s)\n",
-+                            User, ProgramName);
-+                }
- 		exit(ERROR_EXIT);
- 	}
- 	exitstatus = OK_EXIT;
diff --git a/debian/patches/fixes/set-umask-while-editing-crontab b/debian/patches/fixes/set-umask-while-editing-crontab
deleted file mode 100644
index 11f860f..0000000
--- a/debian/patches/fixes/set-umask-while-editing-crontab
+++ /dev/null
@@ -1,33 +0,0 @@
-Subject: Set a tight umask when ediing a crontab
-Last-Update: 2010-04-11
-
-When editing a crontab, set the umask to 077.
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:34.351435790 +0200
-+++ patched/crontab.c	2010-05-06 18:18:37.766435855 +0200
-@@ -318,6 +318,7 @@
- 	time_t		mtime;
- 	WAIT_T		waiter;
- 	PID_T		pid, xpid;
-+	mode_t		um;
- 
- 	log_it(RealUser, Pid, "BEGIN EDIT", User);
- 	(void) snprintf(n, MAX_FNAME, CRON_TAB(User));
-@@ -334,6 +335,7 @@
- 		}
- 	}
- 
-+	um = umask(077);
- 	(void) snprintf(Filename, sizeof(Filename)-1, "/tmp/crontab.%d", Pid);
- 	Filename[sizeof(Filename)-1] = '\0';
- 	if (-1 == (t = open(Filename, O_CREAT|O_EXCL|O_RDWR, 0600))) {
-@@ -348,6 +350,8 @@
- 		perror("fchown");
- 		goto fatal;
- 	}
-+
-+	(void) umask(um);
- 	if (!(NewCrontab = fdopen(t, "r+"))) {
- 		perror("fdopen");
- 		goto fatal;
diff --git a/debian/patches/fixes/signal-handling-issues b/debian/patches/fixes/signal-handling-issues
deleted file mode 100644
index 3e60691..0000000
--- a/debian/patches/fixes/signal-handling-issues
+++ /dev/null
@@ -1,89 +0,0 @@
-Subject: Fixes to signal handling issues
-Last-Update: 2010-04-11
-
-Fixes to signal handling issues. Includes a patch from Justin Pryzby
-<justinpryzby at users.sourceforge.net> from Debian Bug #155109; this moves away
-from the depreceated signal handling API.
-
-The possible race condition warned about
-should be fixed, so:
-
-NOT Acked
-Index: patched/cron.c
-===================================================================
---- patched.orig/cron.c	2010-05-06 18:18:29.548561115 +0200
-+++ patched/cron.c	2010-05-06 18:18:38.503560917 +0200
-@@ -259,6 +259,7 @@
- #ifdef USE_SIGCHLD
- static void
- sigchld_handler(x) {
-+	int save_errno = errno;
- 	WAIT_T		waiter;
- 	PID_T		pid;
- 
-@@ -272,10 +273,12 @@
- 		case -1:
- 			Debug(DPROC,
- 				("[%d] sigchld...no children\n", getpid()))
-+			errno = save_errno;
- 			return;
- 		case 0:
- 			Debug(DPROC,
- 				("[%d] sigchld...no dead kids\n", getpid()))
-+			errno = save_errno;
- 			return;
- 		default:
- 			Debug(DPROC,
-@@ -283,6 +286,7 @@
- 				getpid(), pid, WEXITSTATUS(waiter)))
- 		}
- 	}
-+	errno = save_errno;
- }
- #endif /*USE_SIGCHLD*/
- 
-@@ -290,6 +294,10 @@
- static void
- sighup_handler(x) {
- 	log_close();
-+
-+	/* we should use sigaction for proper signal blocking as this 
-+	   has a race, but... */
-+	signal(SIGHUP, sighup_handler);
- }
- 
- 
-Index: patched/popen.c
-===================================================================
---- patched.orig/popen.c	2010-05-06 18:18:30.896560600 +0200
-+++ patched/popen.c	2010-05-06 18:18:38.504560854 +0200
-@@ -181,7 +181,7 @@
- 	FILE *iop;
- {
- 	register int fdes;
--	int omask;
-+	sigset_t omask, mask;
- 	WAIT_T stat_loc;
- 	PID_T pid;
- 
-@@ -192,10 +192,15 @@
- 	if (pids == 0 || pids[fdes = fileno(iop)] == 0)
- 		return(-1);
- 	(void)fclose(iop);
--	omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP));
--	while ((pid = wait(&stat_loc)) != pids[fdes] && pid != -1)
--		;
--	(void)sigsetmask(omask);
-+	sigemptyset(&mask);
-+	sigaddset(&mask, SIGQUIT);
-+	sigaddset(&mask, SIGINT);
-+	sigaddset(&mask, SIGHUP);
-+	sigprocmask(SIG_BLOCK, &mask, &omask);
-+	pid = waitpid(pids[fdes], &stat_loc, 0);
-+	sigprocmask(SIG_SETMASK, &omask, NULL);
- 	pids[fdes] = 0;
--	return (pid == -1 ? -1 : WEXITSTATUS(stat_loc));
-+	if (pid == -1 || !WIFEXITED(stat_loc))
-+		return -1;
-+	return WEXITSTATUS(stat_loc);
- }
diff --git a/debian/patches/fixes/tolerate-empty-editor-and-visual-envs b/debian/patches/fixes/tolerate-empty-editor-and-visual-envs
deleted file mode 100644
index 812c746..0000000
--- a/debian/patches/fixes/tolerate-empty-editor-and-visual-envs
+++ /dev/null
@@ -1,28 +0,0 @@
-Subject: Tolerate empty EDITOR and VISUAL envvars
-Last-Updated: 2010-04-11
-
-Empty EDITOR and VISUAL environment variables (as opposed to unset ones) should
-not cause fatal errors.
-
-Bug-Debian: http://bugs.debian.org/148809
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/crontab.c
-===================================================================
---- patched.orig/crontab.c	2010-05-06 18:18:30.213560954 +0200
-+++ patched/crontab.c	2010-05-06 18:18:33.711435964 +0200
-@@ -388,8 +388,12 @@
- 	}
- 	mtime = statbuf.st_mtime;
- 
--	if ((!(editor = getenv("VISUAL")))
--	 && (!(editor = getenv("EDITOR")))
-+
-+
-+        /* Okay, edit the file */
-+
-+	if ((!((editor = getenv("VISUAL")) && strlen(editor)))
-+	 && (!((editor = getenv("EDITOR")) && strlen(editor)))
- 	    ) {
- 		editor = EDITOR;
- 	}
diff --git a/debian/patches/fixes/use-stdlib-for-time b/debian/patches/fixes/use-stdlib-for-time
deleted file mode 100644
index 6f9625c..0000000
--- a/debian/patches/fixes/use-stdlib-for-time
+++ /dev/null
@@ -1,61 +0,0 @@
-Subject: Use standard library functions for time stuff
-Last-Update: 2010-04-11
-
-Use standard library functions for time stuff
-
-Acked-by: Christian Kastner <debian at kvr.at>
-Index: patched/misc.c
-===================================================================
---- patched.orig/misc.c	2010-05-06 18:18:28.844435899 +0200
-+++ patched/misc.c	2010-05-06 18:18:37.114561029 +0200
-@@ -632,26 +632,36 @@
- 
- 
- #ifdef MAIL_DATE
--/* Sat, 27 Feb 93 11:44:51 CST
-- * 123456789012345678901234567
-+/* Sat, 27 Feb 1993 11:44:51 -0800 (CST)
-+ * 1234567890123456789012345678901234567
-  */
- char *
- arpadate(clock)
- 	time_t *clock;
- {
--	time_t t = clock ?*clock :time(0L);
-+	static char ret[64];	/* zone name might be >3 chars */
-+	time_t t = clock ? *clock : time(NULL);
- 	struct tm *tm = localtime(&t);
--	static char ret[30];	/* zone name might be >3 chars */
--	
--	(void) snprintf(ret, 30, "%s, %2d %s %2d %02d:%02d:%02d %s",
--		       DowNames[tm->tm_wday],
--		       tm->tm_mday,
--		       MonthNames[tm->tm_mon],
--		       tm->tm_year,
--		       tm->tm_hour,
--		       tm->tm_min,
--		       tm->tm_sec,
--		       TZONE(*tm));
-+	char *qmark;
-+	size_t len;
-+	int hours = tm->tm_gmtoff / 3600;
-+	int minutes = (tm->tm_gmtoff - (hours * 3600)) / 60;
-+
-+	if (minutes < 0)
-+		minutes = -minutes;
-+
-+	/* Defensive coding (almost) never hurts... */
-+	len = strftime(ret, sizeof(ret), "%a, %e %b %Y %T ????? (%Z)", tm);
-+	if (len == 0) {
-+		ret[0] = '?';
-+		ret[1] = '\0';
-+		return ret;
-+	}
-+	qmark = strchr(ret, '?');
-+	if (qmark && len - (qmark - ret) >= 6) {
-+		snprintf(qmark, 6, "% .2d%.2d", hours, minutes);
-+		qmark[5] = ' ';
-+	}
- 	return ret;
- }
- #endif /*MAIL_DATE*/
diff --git a/debian/patches/fixes/various-mail-fixes b/debian/patches/fixes/various-mail-fixes
deleted file mode 100644
index b61baf6..0000000
--- a/debian/patches/fixes/various-mail-fixes
+++ /dev/null
@@ -1,97 +0,0 @@
-Subject: Various mail fixes
-Last-Update: 2010-04-11
-
-* rDoS fix: Unchecked contents of MAILTO would allow sending arbitrary commands
-  to sendmail. Prevent this.
-* Don't terminate when finding a dot "." on a line by itself. (sendmail -i)
-* Don't force immediate delivery
-* Style/formatting
-
-Bug-Debian: http://bugs.debian.org/36338
-Bug-Debian: http://bugs.debian.org/146224
-
-
-POSSIBLE BUG:
-  
-   mailto += strspn(mailto, " \t\n");
-
-why is mailto altered, apparently without reversing the effect?
-
-The entire MAILTO sanitation code appears a bit dodgy and could use a rewrite
-(ie, a correct parsing for a valid local or remote address).
-
-NOT-Acked as of 4010-04-11
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:30.896560600 +0200
-+++ patched/do_command.c	2010-05-06 18:18:31.634435779 +0200
-@@ -96,6 +96,21 @@
- 	usernm = env_get("LOGNAME", e->envp);
- 	mailto = env_get("MAILTO", e->envp);
- 
-+	/* Check for arguments */
-+	if (mailto) {
-+		const char	*end;
-+
-+		/* These chars have to match those cron_popen()
-+		 * uses to split the command string */
-+		mailto += strspn(mailto, " \t\n");
-+		end = mailto + strcspn(mailto, " \t\n");
-+		if (*mailto == '-' || *end != '\0') {
-+			printf("Bad Mailto karma.\n");
-+			log_it("CRON",getpid(),"error","bad mailto");
-+			mailto = NULL;
-+		}
-+	}
-+
- #ifdef USE_SIGCHLD
- 	/* our parent is watching for our death by catching SIGCHLD.  we
- 	 * do not care to watch for our children's deaths this way -- we
-Index: patched/config.h
-===================================================================
---- patched.orig/config.h	2010-05-06 18:18:14.096435742 +0200
-+++ patched/config.h	2010-05-06 18:18:31.635435778 +0200
-@@ -42,22 +42,27 @@
- 			 */
- 
- #define MAILCMD _PATH_SENDMAIL					/*-*/
--#define MAILARGS "%s -FCronDaemon -odi -oem -or0s %s"		/*-*/
--			/* -Fx	 = set full-name of sender
-+/* #define MAILARGS "%s -i -FCronDaemon -odi -oem  %s"		/*-*/
-+#define MAILARGS "%s -i -FCronDaemon -oem  %s"		/*-*/
-+			/* -i    = don't terminate on "." by itself
-+                         * -Fx	 = set full-name of sender
- 			 * -odi	 = Option Deliverymode Interactive
- 			 * -oem	 = Option Errors Mailedtosender
-+ 			 * -t    = read recipient from header of message
- 			 * -or0s = Option Readtimeout -- don't time out
-+			 * XXX: sendmail doesn't allow -or0s when invoked
-+			 * by joe user.  --okir
- 			 */
- 
--/* #define MAILCMD "/bin/mail"			/*-*/
--/* #define MAILARGS "%s -d  %s"			/*-*/
-+/* #define MAILCMD "/bin/mail"			-*/
-+/* #define MAILARGS "%s -d  %s"			-*/
- 			/* -d = undocumented but common flag: deliver locally?
- 			 */
- 
--/* #define MAILCMD "/usr/mmdf/bin/submit"	/*-*/
--/* #define MAILARGS "%s -mlrxto %s"		/*-*/
-+/* #define MAILCMD "/usr/mmdf/bin/submit"	-*/
-+/* #define MAILARGS "%s -mlrxto %s"		-*/
- 
--/* #define MAIL_DATE				/*-*/
-+/* #define MAIL_DATE				-*/
- 			/* should we include an ersatz Date: header in
- 			 * generated mail?  if you are using sendmail
- 			 * for MAILCMD, it is better to let sendmail
-@@ -68,7 +73,7 @@
- 			 * defined but neither exists, should crontab(1) be
- 			 * usable only by root?
- 			 */
--/*#define ALLOW_ONLY_ROOT			/*-*/
-+/*#define ALLOW_ONLY_ROOT			-*/
- 
- 			/* if you want to use syslog(3) instead of appending
- 			 * to CRONDIR/LOG_FILE (/var/cron/log, e.g.), define
diff --git a/debian/patches/other/DEAD-CODE b/debian/patches/other/DEAD-CODE
deleted file mode 100644
index 6102538..0000000
--- a/debian/patches/other/DEAD-CODE
+++ /dev/null
@@ -1,18 +0,0 @@
-Index: patched/do_command.c
-===================================================================
---- patched.orig/do_command.c	2010-05-06 18:18:59.713435868 +0200
-+++ patched/do_command.c	2010-05-06 18:19:06.789435772 +0200
-@@ -349,6 +349,13 @@
- 				_exit(OK_EXIT);
- 			}
- # endif /*DEBUGGING*/
-+#if 0
-+			{
-+			  struct sigaction oact;
-+			  sigaction(SIGCHLD, NULL, &oact);
-+			}
-+			fprintf(stdout,"error");
-+#endif
- #ifdef WITH_SELINUX
- 			if (is_selinux_enabled() > 0) {
- 			    if (u->scontext != 0L) {
diff --git a/debian/patches/other/changes-to-cron-8 b/debian/patches/other/changes-to-cron-8
deleted file mode 100644
index 13cb98a..0000000
--- a/debian/patches/other/changes-to-cron-8
+++ /dev/null
@@ -1,158 +0,0 @@
-Index: patched/cron.8
-===================================================================
---- patched.orig/cron.8	2010-05-06 18:17:51.496436204 +0200
-+++ patched/cron.8	2010-05-06 18:19:04.696435830 +0200
-@@ -17,28 +17,87 @@
- .\" 
- .\" $Id: cron.8,v 2.2 1993/12/28 08:34:43 vixie Exp $
- .\" 
--.TH CRON 8 "20 December 1993"
-+.TH CRON 8 "19 April 2010"
- .UC 4
- .SH NAME
- cron \- daemon to execute scheduled commands (Vixie Cron)
- .SH SYNOPSIS
- cron
-+.RB [ -f ]
-+.RB [ -l ]
-+.RB [ -L
-+.IR loglevel ]
- .SH DESCRIPTION
--.I Cron
--should be started from /etc/rc or /etc/rc.local.  It will return immediately,
--so you don't need to start it with '&'.
--.PP
--.I Cron
--searches /var/cron/tabs for crontab files which are named after accounts in
--/etc/passwd; crontabs found are loaded into memory.
--.I Cron
--also searches for /etc/crontab which is in a different format (see
--.IR crontab(5)).
--.I Cron
--then wakes up every minute, examining all stored crontabs, checking each
--command to see if it should be run in the current minute.  When executing
--commands, any output is mailed to the owner of the crontab (or to the user
--named in the MAILTO environment variable in the crontab, if such exists).
-+.I cron
-+is started automatically from /etc/init.d on entering multi-user
-+runlevels.
-+.SH OPTIONS
-+.TP 8
-+.B -f
-+Stay in foreground mode, don't daemonize.
-+.TP
-+.B -l
-+Enable LSB compliant names for /etc/cron.d files
-+.TP
-+.B -L loglevel
-+Sets the loglevel for cron. The standard logging level (1) will log 
-+the start of all the cron jobs. A higher loglevel (2) will cause
-+cron to log also the end of all cronjobs, which can be useful to
-+audit the behaviour of tasks run by cron. Logging will be disabled
-+if the \fIloglevel\fR is set to zero (0).
-+.SH NOTES
-+.PP
-+.I cron
-+searches its spool area (/var/spool/cron/crontabs) for crontab
-+files (which are named after accounts in
-+/etc/passwd); crontabs found are loaded into memory.  Note that
-+crontabs in this directory should not be accessed directly -
-+the
-+.I crontab
-+command should be used to access and update them.
-+
-+.I cron
-+also reads /etc/crontab, which is in a slightly different format (see
-+.IR crontab(5) ). 
-+Additionally,
-+.I cron
-+reads the files in /etc/cron.d: it
-+treats the files in /etc/cron.d as in the same way as the /etc/crontab file (they
-+follow the special format of that file, i.e. they include the 
-+.I user
-+field). However, they are independent of /etc/crontab: they do not, for 
-+example, inherit environment variable settings from it. The intended purpose
-+of this feature is to allow packages that require
-+finer control of their scheduling than the /etc/cron.{daily,weekly,monthly} 
-+directories to add a crontab file to /etc/cron.d. Such files
-+should be named after the package that supplies them. Files must
-+conform to the same naming convention as used by 
-+.IR run-parts(8) :
-+they
-+must consist solely of upper- and lower-case letters, digits, underscores,
-+and hyphens. If the 
-+.B -l
-+option is specified, then they must conform to the LSB namespace specification,
-+exactly as in the
-+.B --lsbsysinit
-+option in 
-+.IR run-parts .
-+
-+Like /etc/crontab, the files in the /etc/cron.d directory are
-+monitored for changes. In general, the admin should not use /etc/cron.d/,
-+but use the standard system crontab /etc/crontab.
-+
-+In contrast to the spool area, files in /etc/cron.d may be symlinks, provided
-+that both the symlink and the file it points to are owned by root.
-+
-+.I cron
-+then wakes up every minute, examining all stored crontabs, checking
-+each command to see if it should be run in the current minute.  When
-+executing commands, any output is mailed to the owner of the crontab
-+(or to the user named in the MAILTO environment variable in the
-+crontab, if such exists).  The children copies of cron running these
-+processes have their name coerced to uppercase, as will be seen in the
-+syslog and ps output.
- .PP
- Additionally,
- .I cron
-@@ -51,9 +110,48 @@
- changed.  Thus
- .I cron
- need not be restarted whenever a crontab file is modified.  Note that the
--.IR Crontab (1)
-+.IR crontab (1)
- command updates the modtime of the spool directory whenever it changes a
- crontab.
-+.PP
-+Special considerations exist when the clock is changed by less than 3
-+hours, for example at the beginning and end of daylight savings
-+time. If the time has moved forwards, those jobs which would have
-+run in the time that was skipped will be run soon after the change. 
-+Conversely, if the time has moved backwards by less than 3 hours,
-+those jobs that fall into the repeated time will not be re-run.
-+.PP
-+Only jobs that run at a particular time (not specified as
-+ at hourly, nor with '*' in the hour or minute specifier) are
-+affected. Jobs which are specified with wildcards are run based on the
-+new time immediately.
-+.PP
-+Clock changes of more than 3 hours are considered to be corrections to
-+the clock, and the new time is used immediately.
-+.PP
-+.I cron
-+logs its action to the syslog facility 'cron', and logging may be
-+controlled using the standard syslogd(8) facility.
-+.SH ENVIRONMENT
-+If configured in
-+.I /etc/default/cron
-+in Debian systems, the
-+.I cron
-+daemon localisation settings environment can be managed through the use of 
-+.I /etc/environment
-+or through the use of
-+.I /etc/default/locale
-+whichever is available (with the latter one taking precedence). These
-+files are read and they will use to setup the LANG, LC_ALL, and
-+LC_CTYPE environment variables.
-+.PP
-+The daemon will use, if present, the definition from
-+.I /etc/timezone
-+for the timezone.
-+.PP
-+The environment can be redefined in user's crontab definitions but
-+.I cron
-+will only handle tasks in a single timezone.
- .SH "SEE ALSO"
- crontab(1), crontab(5)
- .SH AUTHOR
diff --git a/debian/patches/other/changes-to-crontab-1 b/debian/patches/other/changes-to-crontab-1
deleted file mode 100644
index 33747de..0000000
--- a/debian/patches/other/changes-to-crontab-1
+++ /dev/null
@@ -1,170 +0,0 @@
-Index: patched/crontab.1
-===================================================================
---- patched.orig/crontab.1	2010-05-06 18:17:51.441435609 +0200
-+++ patched/crontab.1	2010-05-06 18:19:05.363435648 +0200
-@@ -17,40 +17,54 @@
- .\"
- .\" $Id: crontab.1,v 2.4 1993/12/31 10:47:33 vixie Exp $
- .\"
--.TH CRONTAB 1 "29 December 1993"
-+.TH CRONTAB 1 "19 April 2010"
- .UC 4
- .SH NAME
--crontab \- maintain crontab files for individual users (V3)
-+crontab \- maintain crontab files for individual users (Vixie Cron)
- .SH SYNOPSIS
- crontab [ -u user ] file
- .br
--crontab [ -u user ] { -l | -r | -e }
-+crontab [ -u user ] [ -i ] { -e | -l | -r }
- .SH DESCRIPTION
--.I Crontab
-+.I crontab
- is the program used to install, deinstall or list the tables
- used to drive the
- .IR cron (8)
- daemon in Vixie Cron.  Each user can have their own crontab, and though
--these are files in /var, they are not intended to be edited directly.
-+these are files in /var/spool/cron/crontabs,
-+they are not intended to be edited directly.
- .PP
- If the
--.I allow
--file exists, then you must be listed therein in order to be allowed to use
--this command.  If the
--.I allow
-+.I /etc/cron.allow
-+file exists, then you must be listed (one user per line) therein in order to be
-+allowed to use this command.  If the
-+.I /etc/cron.allow
- file does not exist but the
--.I deny
-+.I /etc/cron.deny
- file does exist, then you must \fBnot\fR be listed in the
--.I deny
--file in order to use this command.  If neither of these files exists, then
--depending on site-dependent configuration parameters, only the super user
--will be allowed to use this command, or all users will be able to use this
--command.
-+.I /etc/cron.deny
-+file in order to use this command. 
-+.PP
-+If neither of these files exists, then depending on site-dependent
-+configuration parameters, only the super user will be allowed to use this
-+command, or all users will be able to use this command. 
-+.PP
-+If both files exist then 
-+.I /etc/cron.allow
-+takes precendence. Which means that 
-+.I /etc/cron.deny
-+is not considered and your user must be listed in 
-+.I /etc/cron.allow
-+in order to be able to use the crontab.
-+.PP
-+Regardless of the existance of any of these files, the root administrative
-+user is always allowed to setup a crontab.  For standard Debian systems, all
-+users may use this command.
- .PP
- If the
- .I -u
- option is given, it specifies the name of the user whose crontab is to be
--tweaked.  If this option is not given,
-+used (when listing) or modified (when editing). If this option is not given,
- .I crontab
- examines "your" crontab, i.e., the crontab of the person executing the
- command.  Note that
-@@ -58,7 +72,7 @@
- can confuse
- .I crontab
- and that if you are running inside of
--.IR su (8)
-+.IR su (8) 
- you should always use the
- .I -u
- option for safety's sake.
-@@ -68,7 +82,10 @@
- .PP
- The
- .I -l
--option causes the current crontab to be displayed on standard output.
-+option causes the current crontab to be displayed on standard output. See
-+the note under 
-+.B DEBIAN SPECIFIC
-+below.
- .PP
- The
- .I -r
-@@ -77,24 +94,69 @@
- The
- .I -e
- option is used to edit the current crontab using the editor specified by
--the \s-1VISUAL\s+1 or \s-1EDITOR\s+1 environment variables.  After you exit
--from the editor, the modified crontab will be installed automatically.
-+the \s-1VISUAL\s+1 or \s-1EDITOR\s+1 environment variables.
-+After you exit
-+from the editor, the modified crontab will be installed automatically. If
-+neither of the environment variables is defined, then the
-+default editor /usr/bin/editor is used.
-+.PP
-+The
-+.I -i
-+option modifies the -r option to prompt the user for a 'y/Y' response
-+before actually removing the crontab.
-+.SH DEBIAN SPECIFIC
-+The "out-of-the-box" behaviour for
-+.I crontab -l
-+is to display the three line "DO NOT EDIT THIS FILE" header 
-+that is placed at the
-+beginning of the crontab when it is installed. The problem is that
-+it makes the sequence
-+.PP
-+crontab -l | crontab -
-+.PP
-+non-idempotent -- you keep adding copies of the header. This causes
-+pain to scripts that use sed to edit a crontab. Therefore, the default
-+behaviour of the 
-+.B -l
-+option has been changed to not output such header. You may obtain the
-+original behaviour by setting the environment variable 
-+.B CRONTAB_NOHEADER
-+to 'N', which will cause the
-+.I crontab -l
-+command to emit the extraneous header.
- .SH "SEE ALSO"
- crontab(5), cron(8)
- .SH FILES
- .nf
--/var/cron/allow
--/var/cron/deny
-+/etc/cron.allow
-+/etc/cron.deny
-+/var/spool/cron/crontabs
- .fi
-+.PP
-+There is one file for each user's crontab under the /var/spool/cron/crontabs
-+directory. Users are not allowed to edit the files under that directory
-+directly to ensure that only users allowed by the system to run periodic tasks
-+can add them, and only syntactically correct crontabs will be written there.
-+This is enforced by having the directory writable only by the
-+.I crontab
-+group and configuring
-+.I crontab
-+command with the setgid bid set for that specific group.
- .SH STANDARDS
- The
- .I crontab
- command conforms to IEEE Std1003.2-1992 (``POSIX'').  This new command syntax
- differs from previous versions of Vixie Cron, as well as from the classic
- SVR3 syntax.
-+
- .SH DIAGNOSTICS
- A fairly informative usage message appears if you run it with a bad command
- line.
-+
-+cron requires that each entry in a crontab end in a newline character. If the
-+last entry in a crontab is missing the newline, cron will consider the crontab
-+(at least partially) broken and refuse to install it.
-+
- .SH AUTHOR
- .nf
- Paul Vixie <paul at vix.com>
diff --git a/debian/patches/other/changes-to-crontab-5 b/debian/patches/other/changes-to-crontab-5
deleted file mode 100644
index e9b1ad0..0000000
--- a/debian/patches/other/changes-to-crontab-5
+++ /dev/null
@@ -1,268 +0,0 @@
-Index: patched/crontab.5
-===================================================================
---- patched.orig/crontab.5	2010-05-06 18:17:51.399560787 +0200
-+++ patched/crontab.5	2010-05-06 18:19:06.107981321 +0200
-@@ -17,7 +17,7 @@
- .\"
- .\" $Id: crontab.5,v 2.4 1994/01/15 20:43:43 vixie Exp $
- .\" 
--.TH CRONTAB 5 "24 January 1994"
-+.TH CRONTAB 5 "19 April 2010"
- .UC 4
- .SH NAME
- crontab \- tables for driving cron
-@@ -34,7 +34,7 @@
- as part of a cron command.
- .PP
- Blank lines and leading spaces and tabs are ignored.  Lines whose first
--non-space character is a pound-sign (#) are comments, and are ignored.
-+non-space character is a hash-sign (#) are comments, and are ignored.
- Note that comments are not allowed on the same line as cron commands, since
- they will be taken to be part of the command.  Similarly, comments are not
- allowed on the same line as environment variable settings.
-@@ -52,15 +52,41 @@
- The
- .I value
- string may be placed in quotes (single or double, but matching) to preserve
--leading or trailing blanks.
-+leading or trailing blanks. To define an empty variable, quotes
-+.B must
-+be used. The  
-+.I value
-+string is 
-+.B not
-+parsed for environmental substitutions or replacement of variables, thus lines
-+like
-+.PP
-+    PATH = $HOME/bin:$PATH
-+.PP
-+will not work as you might expect. And neither will this work
-+.PP
-+    A=1
-+    B=2
-+    C=$A $B
-+.PP
-+There will not be any subsitution for the defined variables in the
-+last value.
- .PP
--Several environment variables are set up
--automatically by the
-+An alternative for setting up the commands path is using the fact that
-+many shells will treat the tilde(~) as substitution of $HOME, so if you use 
-+.I bash
-+for your tasks you can use this:
-+.PP
-+     SHELL=/bin/bash
-+     PATH=~/bin:/usr/bin/:/bin
-+.PP
-+Several environment variables are set up automatically by the
- .IR cron (8)
- daemon.
- SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd 
--line of the crontab's owner.
--HOME and SHELL may be overridden by settings in the crontab; LOGNAME may not.
-+line of the crontab's owner. PATH is set to "/usr/bin:/bin".
-+HOME, SHELL, and PATH may be overridden by settings in the crontab;
-+LOGNAME is the user that the job is running from, and may not be changed.
- .PP
- (Another note: the LOGNAME variable is sometimes called USER on BSD systems...
- on these systems, USER will be set also.)
-@@ -69,16 +95,45 @@
- .IR cron (8)
- will look at MAILTO if it has any reason to send mail as a result of running
- commands in ``this'' crontab.  If MAILTO is defined (and non-empty), mail is
--sent to the user so named.  If MAILTO is defined but empty (MAILTO=""), no
--mail will be sent.  Otherwise mail is sent to the owner of the crontab.  This
--option is useful if you decide on /bin/mail instead of /usr/lib/sendmail as
--your mailer when you install cron -- /bin/mail doesn't do aliasing, and UUCP
--usually doesn't read its mail.
-+sent to the user so named.  MAILTO may also be used to direct mail to multiple
-+recipients by separating recipient users with a comma. If MAILTO is defined
-+but empty (MAILTO=""), no mail will be sent.  Otherwise mail is sent to the
-+owner of the crontab.
-+.PP
-+On the Debian GNU/Linux system, cron supports the
-+.B pam_env
-+module, and loads the environment specified by 
-+.IR /etc/environment
-+and
-+.IR /etc/security/pam_env.conf .
-+However, the PAM setting do
-+.B NOT
-+override the settings described above nor any settings in the 
-+.I crontab
-+file itself. Note in particular that if you want a PATH other than
-+"/usr/bin:/bin", you will need to set it in the crontab file.
-+.PP
-+By default, cron will send mail using the mail "Content-Type:" header of
-+"text/plain" with the "charset=" parameter set to the charmap / codeset of the
-+locale in which
-+.IR crond (8)
-+is started up - ie. either the default system locale, if no LC_* environment
-+variables are set, or the locale specified by the LC_* environment variables 
-+( see
-+.IR locale (7) ).
-+You can use different character encodings for mailed cron job output by
-+setting the CONTENT_TYPE and CONTENT_TRANSFER_ENCODING variables in crontabs,
-+to the correct values of the mail headers of those names.
- .PP
- The format of a cron command is very much the V7 standard, with a number of
- upward-compatible extensions.  Each line has five time and date fields,
--followed by a user name if this is the system crontab file,
--followed by a command.  Commands are executed by
-+followed by a command, followed by a newline character ('\\n').  
-+The system crontab (/etc/crontab) uses the same format, except that
-+the username for the command is specified after the time and
-+date fields and before the command. The fields may be separated
-+by spaces or tabs.
-+.PP
-+Commands are executed by
- .IR cron (8)
- when the minute, hour, and month of year fields match the current time,
- .I and
-@@ -97,9 +152,9 @@
- .br
- hour	0-23
- .br
--day of month	0-31
-+day of month	1-31
- .br
--month	0-12 (or names, see below)
-+month	1-12 (or names, see below)
- .br
- day of week	0-7 (0 or 7 is Sun, or use names)
- .br
-@@ -131,26 +186,51 @@
- run.
- The entire command portion of the line, up to a newline or %
- character, will be executed by /bin/sh or by the shell
--specified in the SHELL variable of the cronfile.
-+specified in the SHELL variable of the crontab file.
- Percent-signs (%) in the command, unless escaped with backslash
- (\\), will be changed into newline characters, and all data
- after the first % will be sent to the command as standard
--input.
-+input. There is no way to split a single command line onto multiple
-+lines, like the shell's trailing "\\".
- .PP
- Note: The day of a command's execution can be specified by two
- fields \(em day of month, and day of week.  If both fields are
--restricted (ie, aren't *), the command will be run when
-+restricted (i.e., aren't *), the command will be run when
- .I either
- field matches the current time.  For example,
- .br
- ``30 4 1,15 * 5''
- would cause a command to be run at 4:30 am on the 1st and 15th of each
- month, plus every Friday.
-+.PP
-+Instead of the first five fields, one of eight special strings may appear:
-+.IP
-+.ta 1.5i
-+string	meaning
-+.br
-+------	-------
-+.br
-+ at reboot	Run once, at startup.
-+.br
-+ at yearly	Run once a year, "0 0 1 1 *".
-+.br
-+ at annually	(same as @yearly)
-+.br
-+ at monthly	Run once a month, "0 0 1 * *".
-+.br
-+ at weekly	Run once a week, "0 0 * * 0".
-+.br
-+ at daily	Run once a day, "0 0 * * *".
-+.br
-+ at midnight	(same as @daily)
-+.br
-+ at hourly	Run once an hour, "0 * * * *".
-+.br
- .SH EXAMPLE CRON FILE
- .nf
- 
--# use /bin/sh to run commands, no matter what /etc/passwd says
--SHELL=/bin/sh
-+# use /bin/bash to run commands, instead of the default /bin/sh
-+SHELL=/bin/bash
- # mail any output to `paul', no matter whose crontab this is
- MAILTO=paul
- #
-@@ -159,30 +239,71 @@
- # run at 2:15pm on the first of every month -- output mailed to paul
- 15 14 1 * *     $HOME/bin/monthly
- # run at 10 pm on weekdays, annoy Joe
--0 22 * * 1-5	mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
-+0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
- 23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
- 5 4 * * sun     echo "run at 5 after 4 every sunday"
- .fi
-+.SH EXAMPLE SYSTEM CRON FILE
-+This has the username field, as used by /etc/crontab.
-+.nf
-+# /etc/crontab: system-wide crontab
-+# Unlike any other crontab you don't have to run the `crontab'
-+# command to install the new version when you edit this file
-+# and files in /etc/cron.d. These files also have username fields,
-+# that none of other the crontabs do.
-+
-+SHELL=/bin/sh
-+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-+
-+# m h dom mon dow user    command
-+42 6 * * *        root    run-parts --report /etc/cron.daily
-+47 6 * * 7        root    run-parts --report /etc/cron.weekly
-+52 6 1 * *        root    run-parts --report /etc/cron.monthly
-+#
-+# Removed invocation of anacron, as this is now handled by a 
-+# /etc/cron.d file
-+.fi
- .SH SEE ALSO
- cron(8), crontab(1)
- .SH EXTENSIONS
- When specifying day of week, both day 0 and day 7 will be considered Sunday.
--BSD and ATT seem to disagree about this.
-+BSD and AT&T seem to disagree about this.
- .PP
- Lists and ranges are allowed to co-exist in the same field.  "1-3,7-9" would
--be rejected by ATT or BSD cron -- they want to see "1-3" or "7,8,9" ONLY.
-+be rejected by AT&T or BSD cron -- they want to see "1-3" or "7,8,9" ONLY.
- .PP
- Ranges can include "steps", so "1-9/2" is the same as "1,3,5,7,9".
- .PP
--Names of months or days of the week can be specified by name.
-+Months or days of the week can be specified by name.
- .PP
--Environment variables can be set in the crontab.  In BSD or ATT, the
-+Environment variables can be set in the crontab.  In BSD or AT&T, the
- environment handed to child processes is basically the one from /etc/rc.
- .PP
- Command output is mailed to the crontab owner (BSD can't do this), can be
- mailed to a person other than the crontab owner (SysV can't do this), or the
- feature can be turned off and no mail will be sent at all (SysV can't do this
- either).
-+.PP
-+All of the `@' commands that can appear in place of the first five fields
-+are extensions.
-+.SH LIMITATIONS
-+The
-+.I cron
-+daemon runs with a defined timezone. It currently does not support 
-+per-user timezones. All the tasks: system's and user's will be run based on the
-+configured timezone. Even if a user specifies the 
-+.I TZ
-+environment variable in his
-+.I crontab
-+this will affect only the commands executed in the crontab, not the execution
-+of the crontab tasks themselves.
-+
-+.SH DIAGNOSTICS
-+cron requires that each entry in a crontab end in a newline character. If the
-+last entry in a crontab is missing a newline (ie, terminated by EOF), cron will
-+consider the crontab (at least partially) broken. A warning will be written to
-+syslog.
-+
- .SH AUTHOR
- .nf
- Paul Vixie <paul at vix.com>
diff --git a/debian/patches/other/changes-to-upstream-README b/debian/patches/other/changes-to-upstream-README
deleted file mode 100644
index a9326d9..0000000
--- a/debian/patches/other/changes-to-upstream-README
+++ /dev/null
@@ -1,17 +0,0 @@
-Index: patched/README
-===================================================================
---- patched.orig/README	2010-05-06 18:17:51.539561005 +0200
-+++ patched/README	2010-05-06 18:19:04.037962120 +0200
-@@ -24,6 +24,12 @@
- [V1.0 was May 6, 1987]
- Paul Vixie
- 
-+[Note from Debian cron maintainer: This is the original README from
-+the the vixie-cron package. The location of many cron files has been
-+changed in order to comply with Debian policy and common sense -- look
-+in the cron(8), crontab(1) and crontab(5) man pages for more info, as
-+well as the README.Debian file in this directory.]
-+
- This is a version of 'cron' that is known to run on BSD 4.[23] systems.  It
- is functionally based on the SysV cron, which means that each user can have
- their own crontab file (all crontab files are stored in a read-protected
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index e4e0988..0000000
--- a/debian/patches/series
+++ /dev/null
@@ -1,62 +0,0 @@
-fixes/make-it-buildable
-fixes/general-platform-issues
-fixes/missing-or-broken-defs-and-decls
-fixes/general-coding-errors
-fixes/limit-args-for-commands
-fixes/crontab-file-parsing
-fixes/crontab-entry-parsing
-fixes/crontab-time-parsing
-fixes/memory-management-issues
-fixes/protect-against-buffer-overflows
-fixes/correct-use-of-error-messages
-fixes/proper-handling-of-stdstreams
-fixes/allow-crontab-by-users
-fixes/drop-privileges
-fixes/various-mail-fixes
-fixes/abort-crontabs-with-errors
-fixes/handle-escapes-in-commands
-fixes/tolerate-empty-editor-and-visual-envs
-fixes/root-does-not-override-allowdeny
-fixes/correct-flag-setting-in-crontab-entry
-fixes/check-for-broken-command
-fixes/dont-log-temp-files
-fixes/use-stdlib-for-time
-fixes/set-umask-while-editing-crontab
-fixes/signal-handling-issues
-fixes/properly-wait-for-spawned-editor
-fixes/prevent-tmpfiles-attack
-fixes/check-for-full-disk
-fixes/allow-editors-with-tmpfiles
-fixes/dont-give-root-on-repeated-edits
-fixes/compilation-issues
-features/debian-specific-issues
-features/better-debugging-support
-features/debian-paths-and-commands
-features/pam-support
-features/pam-env-support
-features/selinux-support
-features/support-for-drop.d-directory
-features/debian-logging-configuration
-features/properly-handle-time-skips
-features/swap-both-uid-and-gid
-features/security-make-crontab-setgid-crontab
-features/auditlog-support
-features/run-on-reboot
-features/set-contenttype-in-mail
-features/allow-running-cron-in-foreground
-features/control-header-output
-features/confirm-crontab-deletion
-features/add-helpmsg-to-new-crontab
-features/option-log-completed-jobs
-features/mailcmd-dont-timeout
-features/dont-fail-on-missing-MTA
-features/no-argument-is-stdin
-features/dont-die-on-missing-dirs
-features/crontab-refuse-eof-without-nl
-features/recover-from-broken-symlinks
-features/backport-envparser
-other/changes-to-upstream-README
-other/changes-to-cron-8
-other/changes-to-crontab-1
-other/changes-to-crontab-5
-other/DEAD-CODE

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-cron/pkg-cron.git



More information about the Pkg-cron-devel mailing list