--- /dev/null
+--- postfix-2.9.4/src/virtual/maildir.c.orig 2012-12-07 08:38:15.031182187 +0100
++++ postfix-2.9.4/src/virtual/maildir.c 2012-12-07 08:39:11.291180202 +0100
+@@ -972,19 +972,19 @@
+ if (*var_virt_maildir_limit_message_maps != 0 && (limit_message = mail_addr_find(virtual_maildir_limit_message_maps, state.msg_attr.user, (char **) NULL)) != 0) {
+ errno = errnored;
+ if (errno == EFBIG) {
+- dsb_simple(why, "5.2.2", limit_message);
++ dsb_simple(why, "5.2.2", "%s", limit_message);
+ }
+ if (errno == EDQUOT) {
+- dsb_simple(why, "4.2.2", limit_message);
++ dsb_simple(why, "4.2.2", "%s", limit_message);
+ }
+ }
+ else {
+ errno = errnored;
+ if (errno == EFBIG) {
+- dsb_simple(why, "5.2.2", var_virt_maildir_limit_message);
++ dsb_simple(why, "5.2.2", "%s", var_virt_maildir_limit_message);
+ }
+ if (errno == EDQUOT) {
+- dsb_simple(why, "4.2.2", var_virt_maildir_limit_message);
++ dsb_simple(why, "4.2.2", "%s", var_virt_maildir_limit_message);
+ }
+ }
+
--- /dev/null
+# $Id$
+#
+# Deutsch-sprachige Vorlagen fuer Postfix Zustell-Status-Benachrichtigungen
+# (engl. DSN, Delivery Status Notification)
+#
+# Uebersetzt und an die deutsche Sprache angepasst von Patrick Koetter
+# <p@state-of-mind.de> und Ralf Hildebrandt <ralf.hildebrandt@charite.de>.
+#
+# Folgen Sie den Anweisungen der bounce(5) manual page, um die in dieser Datei
+# enthaltenen Zustell-Status-Benachrichtigungen in Ihren Postfix-Server
+# einzubinden.
+
+
+# failure_template
+# Das failure_template kommt zum Einsatz, wenn der empfangende Mail-Server die
+# Nachricht entweder zurueckgewiesen hat oder wenn die Nachricht nicht
+# innerhalb eines vorgegebenen Zeitraums ($maximal_queue_lifetime) zugestellt
+# werden konnte.
+#
+# In beiden Faellen wird der Inhalt von failure_template zusammen mit der
+# urspruenglich gesendeten Nachricht und dem Fehler, der die Benachrichtigung
+# hervorgerufen hat an den Absender der E-Mail gesendet.
+
+failure_template = <<EOF
+Charset: iso-8859-1
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Rueckgabe nicht zustellbarer Nachricht an Absender
+Postmaster-Subject: Postmaster Copy: Undelivered Mail
+
+Dies ist eine automatisch generierte Nachricht des $mail_name E-Mail-Dienstes.
+Dieser Dienst wird auf dem Server $myhostname betrieben und teilt Ihnen
+folgendes mit:
+
+
+ Ihre Nachricht konnte an einen oder mehrere Empfaenger nicht zugestellt
+ werden. Ein Problem-Bericht, sowie Ihre uspruengliche Nachricht wurden an
+ das Ende dieser Nachricht angehaengt.
+
+
+Fuer weitere Hilfe kontaktieren Sie bitte den fuer Sie zustaendigen
+<postmaster>.
+
+Senden Sie dazu den an diese E-Mail angefuegten Problem-Bericht mit.
+Den Inhalt Ihrer urspruenglichen Nachricht koennen Sie - zum Schutz Ihrer
+Privatsphaere - entfernen; er ist fuer eine Fehler-Diagnose nicht zwingend
+notwendig.
+
+ Der $mail_name E-Mail-Dienst
+
+ INTERNATIONAL VERSION
+
+This is the $mail_name program at host $myhostname.
+
+I'm sorry to have to inform you that your message could not
+be delivered to one or more recipients. It's attached below.
+
+For further assistance, please send mail to <postmaster>
+
+If you do so, please include this problem report. You can
+delete your own text from the attached returned message.
+
+EOF
+
+
+# delay_template
+# Das delay_template kommt zum Einsatz, wenn sich die Zustellung einer
+# Nachricht verzoegert - die Zustellung wird so lange versucht, bis der Postfix
+# Server sie wegen Ueberschreitung der $maximal_queue_lifetime abbrechen muss.
+#
+# Anmerkung:
+# Die Standardvorgaben in Postfix sehen vor, dass Zustell-Verzoegerungen in
+# Stunden ($delay_warning_time_hours) und die maximale Lebenszeit einer
+# Nachricht in der Postfix Zustell-Warteschlange in Tagen
+# ($maximal_queue_lifetime_days) angegeben werden.
+#
+# Alternativ koennen Sie anstatt der genannten Zeiteinheiten auch Sekunden,
+# Minuten oder Wochen angeben, indem Sie die aktuelle Zeiteinheit des
+# Parameters durch _seconds, _minutes oder _weeks austauschen und den
+# begleitenden Text in der Vorlage anpassen.
+
+delay_template = <<EOF
+Charset: iso-8859-1
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Nachricht wurde verzoegert (Zustellung wird weiter versucht)
+Postmaster-Subject: Postmaster Warning: Delayed Mail
+
+Dies ist eine automatisch generierte Nachricht des $mail_name E-Mail-Dienstes.
+Dieser Dienst wird auf dem Server $myhostname betrieben und teilt Ihnen
+folgendes mit:
+
+
+ Eine von Ihnen gesendete Nachricht konnte seit $delay_warning_time_hours
+ Stunden nicht zugestellt werden.
+
+ Sie muessen die Nachricht nicht noch einmal senden. Der $mail_name
+ E-Mail-Dienst wird so lange versuchen Ihre Nachricht zuzustellen,
+ bis sie $maximal_queue_lifetime_days Tage alt ist.
+
+ Sollte eine Zustellung bis in $maximal_queue_lifetime_days Tagen nicht
+ gelingen, wird der $mail_name E-Mail-Dienst die Zustellung abbrechen und
+ Sie davon in Kenntnis setzen.
+
+
+Fuer weitere Hilfe kontaktieren Sie bitte den fuer Sie zustaendigen
+<postmaster>.
+
+Senden Sie dazu den, in dieser E-Mail angefuegten, Problem-Bericht mit.
+Den Inhalt Ihrer urspruenglichen Nachricht koennen Sie, zum Schutz Ihrer
+Privatsphaere, entfernen; er ist fuer eine Fehler-Diagnose nicht zwingend
+notwendig.
+
+ Der $mail_name E-Mail-Dienst
+
+
+ INTERNATIONAL VERSION
+
+This is the $mail_name program at host $myhostname.
+
+####################################################################
+# THIS IS A WARNING ONLY. YOU DO NOT NEED TO RESEND YOUR MESSAGE. #
+####################################################################
+
+Your message could not be delivered for $delay_warning_time_hours hour(s).
+It will be retried until it is $maximal_queue_lifetime_days day(s) old.
+
+For further assistance, please send mail to <postmaster>
+
+If you do so, please include this problem report. You can
+delete your own text from the attached returned message.
+
+ The $mail_name program
+EOF
+
+
+# success_template
+# Das success_template kommt zum Einsatz, wenn eine Nachricht an ein Postfach
+# zugestellt wurde, wenn ein Alias-Name oder eine Liste von Empfaengern in ihre
+# Zieladressen aufgeloest wurde oder wenn eine Nachricht an ein System
+# zugestellt wurde, das im Dialog mit Ihrem Postfix-Server keine
+# DSN-Faehigkeiten erkennen lies.
+#
+# Achtung:
+# Sie duerfen fuer diese Art von Zustell-Status-Benachrichtigung kein
+# Postmaster-Subject: angeben.
+
+success_template = <<EOF
+Charset: iso-8859-1
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Bericht ueber erfolgreiche Zustellung
+
+Dies ist eine automatisch generierte Nachricht des $mail_name E-Mail-Dienstes.
+Dieser Dienst wird auf dem Server $myhostname betrieben und teilt Ihnen
+folgendes mit:
+
+
+ Ihre Nachricht wurde erfolgreich an die E-Mail-Server der am Ende dieser
+ E-Mail aufgelisteten Empfaenger ausgeliefert.
+
+ Falls Sie eine Zustellbericht angefordet haben und der empfangende
+ E-Mail-Server diese Funktionalitaet unterstuetzt erhalten Sie
+ auch von diesem E-Mail-Server eine entsprechende Benachrichtigung.
+
+
+ Der $mail_name E-Mail-Dienst
+
+
+ INTERNATIONAL VERSION
+
+This is the $mail_name program at host $myhostname.
+
+Your message was successfully delivered to the destination(s)
+listed below. If the message was delivered to mailbox you will
+receive no further notifications. Otherwise you may still receive
+notifications of mail delivery errors from other systems.
+
+ The $mail_name program
+EOF
+
+
+# verify_template
+# Das verify_template kommt zum Einsatz, wenn Adress-Ueberpruefung (sendmail
+# -bv adresse...) oder ausfuehrliche Protokollierung (sendmail -v adresse...)
+# angefordert wurde.
+#
+# Achtung:
+# Sie duerfen fuer diese Art von Zustell-Status-Benachrichtigung kein
+# Postmaster-Subject: angeben.
+
+verify_template = <<EOF
+Charset: iso-8859-1
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Zustellbericht (Mail Delivery Status Report)
+
+Dies ist eine automatisch generierte Nachricht des $mail_name E-Mail-Dienstes.
+Dieser Dienst wird auf dem Server $myhostname betrieben und teilt Ihnen
+folgendes mit:
+
+
+ Sie haben einen Empfaenger-Adressen-Bericht angefordert. Der Bericht wurde
+ an diese Nachricht angehaengt.
+
+
+ Der $mail_name E-Mail-Dienst
+
+
+ INTERNATIONAL VERSION
+
+This is the $mail_name program at host $myhostname.
+
+Enclosed is the mail delivery report that you requested.
+
+ The $mail_name program
+EOF
--- /dev/null
+#
+# Do not edit this file. This file shows the default delivery status
+# notification (DSN) messages that are built into Postfix.
+#
+# To change Postfix DSN messages, perhaps to add non-English text,
+# follow instructions in the bounce(5) manual page.
+#
+
+#
+# The failure template is used when mail is returned to the sender;
+# either the destination rejected the message, or the destination
+# could not be reached before the message expired in the queue.
+#
+
+failure_template = <<EOF
+Charset: iso-8859-2
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Niedostarczona Korespondencja Zwrocona Nadawcy / Undelivered Mail Returned to Sender
+Postmaster-Subject: Postmaster Copy: Undelivered Mail
+
+Wiadomo¶æ wygenerowana przez system pocztowy $myhostname.
+
+Z przykro¶ci± informujê, ¿e twoja wiadomo¶æ nie mog³a byæ
+dostarczona do jednego z odbiorców. Jest za³±czona poni¿ej.
+
+W celu uzyskania dalszej pomocy, skontaktuj siê z <postmaster>
+Koniecznie przeka¿ niniejszy raport; mo¿esz usun±æ w³asn±
+tre¶æ z za³±czonego listu, który zosta³ zwrócony.
+
+ System pocztowy
+
+==============================================================
+
+This is the mail system at host $myhostname.
+
+I'm sorry to have to inform you that your message could not
+be delivered to one or more recipients. It's attached below.
+
+For further assistance, please send mail to <postmaster>
+
+If you do so, please include this problem report. You can
+delete your own text from the attached returned message.
+
+ The mail system
+EOF
+
+
+#
+# The delay template is used when mail is delayed. Note a neat trick:
+# the default template displays the delay_warning_time value as hours
+# by appending the _hours suffix to the parameter name; it displays
+# the maximal_queue_lifetime value as days by appending the _days
+# suffix.
+#
+# Other suffixes are: _seconds, _minutes, _weeks. There are no other
+# main.cf parameters that have this special behavior.
+#
+# You need to adjust these suffixes (and the surrounding text) if
+# you have very different settings for these time parameters.
+#
+
+delay_template = <<EOF
+Charset: iso-8859-2
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Opozniona Korespondencja (proby wciaz ponawiane) / Delayed Mail (still being retried)
+Postmaster-Subject: Postmaster Warning: Delayed Mail
+
+Wiadomo¶æ wygenerowana przez system pocztowy $myhostname.
+
+########################################################################
+# TO JEST TYLKO OSTRZE¯ENIE. NIE MUSISZ WYSY£AÆ PONOWNIE SWOJEGO LISTU #
+########################################################################
+
+Twoja wiadomo¶æ nie mog³a byæ dostarczona ponad $delay_warning_time_hours godzin.
+Próby bêd± ponawiane przez $maximal_queue_lifetime_days dni.
+
+W celu uzyskania dalszej pomocy, skontaktuj siê z <postmaster>
+Koniecznie przeka¿ niniejszy raport; mo¿esz usun±æ w³asn±
+tre¶æ z za³±czonego listu, który zosta³ zwrócony.
+
+ System pocztowy
+
+==============================================================
+
+This is the mail system at host $myhostname.
+
+####################################################################
+# THIS IS A WARNING ONLY. YOU DO NOT NEED TO RESEND YOUR MESSAGE. #
+####################################################################
+
+Your message could not be delivered for more than $delay_warning_time_hours hour(s).
+It will be retried until it is $maximal_queue_lifetime_days day(s) old.
+
+For further assistance, please send mail to <postmaster>
+
+If you do so, please include this problem report. You can
+delete your own text from the attached returned message.
+
+ The mail system
+EOF
+
+
+#
+# The success template is used when mail is delivered to mailbox,
+# when an alias or list is expanded, or when mail is delivered to a
+# system that does not announce DSN support. It is an error to specify
+# a Postmaster-Subject: here.
+#
+
+success_template = <<EOF
+Charset: iso-8859-2
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Raport Udanego Dostarczenia Korespondencji / Successful Mail Delivery Report
+
+Wiadomo¶æ wygenerowana przez system pocztowy $myhostname.
+
+Twoja wiadomo¶æ zosta³a dostarczona wymienionym poni¿ej adresatom.
+Je¶li poczta dotar³a do skrzynki nie otrzymasz wiêcej powiadomieñ.
+W przeciwnym wypadku mo¿esz jeszcze dostaæ powiadomienia o b³êdach
+z innych systemów.
+
+ System pocztowy
+
+==============================================================
+
+This is the mail system at host $myhostname.
+
+Your message was successfully delivered to the destination(s)
+listed below. If the message was delivered to mailbox you will
+receive no further notifications. Otherwise you may still receive
+notifications of mail delivery errors from other systems.
+
+ The mail system
+EOF
+
+
+#
+# The verify template is used for address verification (sendmail -bv
+# address...). or for verbose mail delivery (sendmail -v address...).
+# It is an error to specify a Postmaster-Subject: here.
+#
+
+verify_template = <<EOF
+Charset: iso-8859-2
+From: MAILER-DAEMON (Mail Delivery System)
+Subject: Raport Stanu Dostarczania Korespondencji / Mail Delivery Status Report
+
+Wiadomo¶æ wygenerowana przez system pocztowy $myhostname.
+
+Za³±czony raport o dorêczeniu korespondencji, o który prosi³e¶.
+
+ System pocztowy
+
+==============================================================
+
+This is the mail system at host $myhostname.
+
+Enclosed is the mail delivery report that you requested.
+
+ The mail system
+EOF
--- /dev/null
+--- postfix-2.3.0/conf/master.cf~ 2006-07-25 13:36:17.245609587 +0300
++++ postfix-2.3.0/conf/master.cf 2006-07-25 13:37:53.847756797 +0300
+@@ -55,7 +55,7 @@
+ # Also specify in main.cf: maildrop_destination_recipient_limit=1
+ #
+ #maildrop unix - n n - - pipe
+-# flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
++# flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
+ #
+ # ====================================================================
+ #
+@@ -76,7 +76,7 @@
+ # flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
+ #
+ #bsmtp unix - n n - - pipe
+-# flags=Fq. user=bsmtp argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
++# flags=Fq. user=bsmtp argv=/usr/sbin/bsmtp -f $sender $nexthop $recipient
+ #
+ #scalemail-backend unix - n n - 2 pipe
+ # flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store
--- /dev/null
+--- src/global/mail_params.h.orig 2004-06-22 14:32:58.615734426 +0200
++++ src/global/mail_params.h 2004-06-22 14:33:21.260418134 +0200
+@@ -2204,6 +2204,13 @@
+ extern char *var_anvil_service;
+ #endif
+
++ /*
++ * SMTPD messages
++ */
++#define VAR_REJECT_REPLY_MSG_ACCESS_DENIED "smtpd_reject_msg_access_denied"
++#define DEF_REJECT_REPLY_MSG_ACCESS_DENIED "rejected: Relay access denied."
++extern char *var_reject_reply_msg_access_denied;
++
+ /* LICENSE
+ /* .ad
+ /* .fi
+--- src/smtpd/smtpd.c.orig 2009-05-25 19:13:15.584397697 +0200
++++ src/smtpd/smtpd.c 2009-05-25 19:14:31.066487776 +0200
+@@ -5062,6 +5062,7 @@
+ VAR_MILT_DAEMON_NAME, DEF_MILT_DAEMON_NAME, &var_milt_daemon_name, 1, 0,
+ VAR_MILT_V, DEF_MILT_V, &var_milt_v, 1, 0,
+ VAR_STRESS, DEF_STRESS, &var_stress, 0, 0,
++ VAR_REJECT_REPLY_MSG_ACCESS_DENIED, DEF_REJECT_REPLY_MSG_ACCESS_DENIED, &var_reject_reply_msg_access_denied, 1, 0,
+ VAR_UNV_FROM_WHY, DEF_UNV_FROM_WHY, &var_unv_from_why, 0, 0,
+ VAR_UNV_RCPT_WHY, DEF_UNV_RCPT_WHY, &var_unv_rcpt_why, 0, 0,
+ VAR_REJECT_TMPF_ACT, DEF_REJECT_TMPF_ACT, &var_reject_tmpf_act, 1, 0,
+--- src/global/mail_params.c.orig 2010-04-05 21:25:33.331592727 +0200
++++ src/global/mail_params.c 2010-04-05 21:27:01.504746061 +0200
+@@ -80,6 +80,7 @@
+ /* char *var_debug_peer_list;
+ /* int var_debug_peer_level;
+ /* int var_in_flow_delay;
++/* char *var_reject_reply_msg_access_denied;
+ /* int var_fault_inj_code;
+ /* char *var_bounce_service;
+ /* char *var_cleanup_service;
+@@ -265,6 +266,7 @@
+ char *var_export_environ;
+ char *var_debug_peer_list;
+ int var_debug_peer_level;
++char *var_reject_reply_msg_access_denied;
+ int var_fault_inj_code;
+ char *var_bounce_service;
+ char *var_cleanup_service;
+@@ -569,6 +571,7 @@
+ VAR_INT_FILT_CLASSES, DEF_INT_FILT_CLASSES, &var_int_filt_classes, 0, 0,
+ /* multi_instance_wrapper may have dependencies but not dependents. */
+ VAR_MULTI_WRAPPER, DEF_MULTI_WRAPPER, &var_multi_wrapper, 0, 0,
++ VAR_REJECT_REPLY_MSG_ACCESS_DENIED, DEF_REJECT_REPLY_MSG_ACCESS_DENIED, &var_reject_reply_msg_access_denied, 1, 0,
+ 0,
+ };
+ static const CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
--- /dev/null
+diff -dur postfix-2.1.3.orig/src/global/mail_params.h postfix-2.1.3/src/global/mail_params.h
+--- postfix-2.1.3.orig/src/global/mail_params.h 2004-06-22 14:20:57.890585644 +0200
++++ postfix-2.1.3/src/global/mail_params.h 2004-06-22 14:21:17.963422126 +0200
+@@ -64,7 +64,7 @@
+ extern gid_t var_owner_gid;
+
+ #define VAR_SGID_GROUP "setgid_group"
+-#define DEF_SGID_GROUP "postdrop"
++#define DEF_SGID_GROUP "maildrop"
+ extern char *var_sgid_group;
+ extern gid_t var_sgid_gid;
+
+#@@ -231,7 +231,7 @@
+# */
+# #define VAR_CONFIG_DIR "config_directory"
+# #ifndef DEF_CONFIG_DIR
+#-#define DEF_CONFIG_DIR "/etc/postfix"
+#+#define DEF_CONFIG_DIR "/etc/mail"
+# #endif
+# extern char *var_config_dir;
+#
+--- postfix-2.9.0/conf/main.cf.orig 2012-02-04 19:05:20.960656539 +0100
++++ postfix-2.9.0/conf/main.cf 2012-02-04 19:12:31.810624906 +0100
+@@ -39,7 +39,7 @@
+ # daemon programs (i.e. programs listed in the master.cf file). This
+ # directory must be owned by root.
+ #
+-daemon_directory = /usr/libexec/postfix
++daemon_directory = /usr/lib/postfix
+
+ # The data_directory parameter specifies the location of Postfix-writable
+ # data files (caches, random numbers). This directory must be owned
+@@ -63,7 +63,7 @@
+ # These rights are used in the absence of a recipient user context.
+ # DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER.
+ #
+-#default_privs = nobody
++default_privs = nobody
+
+ # INTERNET HOST AND DOMAIN NAMES
+ #
+@@ -95,7 +95,7 @@
+ # myorigin also specifies the default domain name that is appended
+ # to recipient addresses that have no @domain part.
+ #
+-#myorigin = $myhostname
++myorigin = $myhostname
+ #myorigin = $mydomain
+
+ # RECEIVING MAIL
+@@ -379,7 +379,7 @@
+ # "postfix reload" to eliminate the delay.
+ #
+ #alias_maps = dbm:/etc/aliases
+-#alias_maps = hash:/etc/aliases
++alias_maps = hash:/etc/mail/aliases
+ #alias_maps = hash:/etc/aliases, nis:mail.aliases
+ #alias_maps = netinfo:/aliases
+
+@@ -390,7 +390,7 @@
+ #
+ #alias_database = dbm:/etc/aliases
+ #alias_database = dbm:/etc/mail/aliases
+-#alias_database = hash:/etc/aliases
++alias_database = hash:/etc/mail/aliases
+ #alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
+
+ # ADDRESS EXTENSIONS (e.g., user+foo)
+@@ -418,7 +418,7 @@
+ # UNIX-style mailboxes are kept. The default setting depends on the
+ # system type.
+ #
+-#mail_spool_directory = /var/mail
++mail_spool_directory = /var/mail
+ #mail_spool_directory = /var/spool/mail
+
+ # The mailbox_command parameter specifies the optional external
+@@ -440,8 +440,8 @@
+ # IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN
+ # ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER.
+ #
+-#mailbox_command = /some/where/procmail
+-#mailbox_command = /some/where/procmail -a "$EXTENSION"
++#mailbox_command = /usr/bin/procmail
++#mailbox_command = /usr/bin/procmail -a "$EXTENSION"
+
+ # The mailbox_transport specifies the optional transport in master.cf
+ # to use after processing aliases and .forward files. This parameter
+@@ -613,45 +613,24 @@
+ # -dmS $process_name gdb $daemon_directory/$process_name
+ # $process_id & sleep 1
+
++biff = no
++
+ # INSTALL-TIME CONFIGURATION INFORMATION
+ #
+ # The following parameters are used when installing a new Postfix version.
+-#
+-# sendmail_path: The full pathname of the Postfix sendmail command.
+-# This is the Sendmail-compatible mail posting interface.
+-#
+-sendmail_path =
+-
+-# newaliases_path: The full pathname of the Postfix newaliases command.
+-# This is the Sendmail-compatible command to build alias databases.
+-#
+-newaliases_path =
+-
+-# mailq_path: The full pathname of the Postfix mailq command. This
+-# is the Sendmail-compatible mail queue listing command.
+-#
+-mailq_path =
+
+ # setgid_group: The group for mail submission and queue management
+ # commands. This must be a group name with a numerical group ID that
+ # is not shared with other accounts, not even with the Postfix account.
+ #
+-setgid_group =
++setgid_group = maildrop
+
+-# html_directory: The location of the Postfix HTML documentation.
+-#
+-html_directory =
+-
+-# manpage_directory: The location of the Postfix on-line manual pages.
+-#
+-manpage_directory =
++inet_protocols = ipv4
+
+-# sample_directory: The location of the Postfix sample configuration files.
+-# This parameter is obsolete as of Postfix 2.1.
++# The unknown_address_reject_code parameter specifies the SMTP server
++# response when a client violates the reject_unknown_sender_domain
++# or reject_unknown_recipient_domain restrictions.
+ #
+-sample_directory =
+-
+-# readme_directory: The location of the Postfix README files.
++# Contrary to what Wietse thinks (450) this should be 550
+ #
+-readme_directory =
+-inet_protocols = ipv4
++unknown_address_reject_code = 550
+--- postfix-2.9.0/src/util/sys_defs.h.orig 2012-02-04 19:05:23.000000000 +0100
++++ postfix-2.9.0/src/util/sys_defs.h 2012-02-04 19:15:31.153933031 +0100
+@@ -54,7 +54,7 @@
+ #define ALIAS_DB_MAP "hash:/etc/mail/aliases" /* OpenBSD 2.7 */
+ #endif
+ #ifndef ALIAS_DB_MAP
+-#define ALIAS_DB_MAP "hash:/etc/aliases"
++#define ALIAS_DB_MAP "hash:/etc/mail/aliases"
+ #endif
+ #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
+ #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin"
--- /dev/null
+--- postfix-2.9.0/src/util/dict_open.c.orig 2012-02-04 19:42:26.000000000 +0100
++++ postfix-2.9.0/src/util/dict_open.c 2012-02-04 19:43:42.937093038 +0100
+@@ -365,7 +365,7 @@
+ lib=vstring_alloc(1);
+ vstring_sprintf(lib,dl->soname,dict_type);
+ if (stat(vstring_str(lib),&st) < 0) {
+- msg_fatal("%s: unsupported dictionary type: %s (%s not found. Is the postfix-%s package installed?)",
++ msg_fatal("%s: unsupported dictionary type: %s (%s not found. Is the postfix-dict-%s package installed?)",
+ myname, dict_type, vstring_str(lib), dict_type);
+ }
+ func=vstring_alloc(1);
--- /dev/null
+diff -durN postfix-2.1.3.orig/src/dns/Makefile.in postfix-2.1.3/src/dns/Makefile.in
+--- postfix-2.1.3.orig/src/dns/Makefile.in 2004-04-22 21:37:34.000000000 +0200
++++ postfix-2.1.3/src/dns/Makefile.in 2004-06-22 15:39:24.242860389 +0200
+@@ -12,7 +12,7 @@
+ LIB_DIR = ../../lib
+ INC_DIR = ../../include
+
+-.c.o:; $(CC) $(CFLAGS) -c $*.c
++.c.o:; $(CC) -fPIC $(CFLAGS) -c $*.c
+
+ all: $(LIB)
+
+@@ -24,12 +24,10 @@
+ tests: test
+
+ $(LIB): $(OBJS)
+- $(AR) $(ARFL) $(LIB) $?
+- $(RANLIB) $(LIB)
++ gcc -shared -Wl,-soname,libpostfix-dns.so.1 -o $(LIB) $(OBJS)
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)
+- $(RANLIB) $(LIB_DIR)/$(LIB)
+
+ update: $(LIB_DIR)/$(LIB) $(HDRS)
+ -for i in $(HDRS); \
+diff -durN postfix-2.1.3.orig/src/global/mail_conf.c postfix-2.1.3/src/global/mail_conf.c
+--- postfix-2.1.3.orig/src/global/mail_conf.c 2004-04-10 16:52:51.000000000 +0200
++++ postfix-2.1.3/src/global/mail_conf.c 2004-06-22 15:39:24.247860093 +0200
+@@ -175,6 +175,13 @@
+ path = concatenate(var_config_dir, "/", "main.cf", (char *) 0);
+ dict_load_file(CONFIG_DICT, path);
+ myfree(path);
++
++#ifndef NO_DYNAMIC_MAPS
++ path = concatenate(var_config_dir, "/", "dynamicmaps.cf", (char *) 0);
++ dict_open_dlinfo(path);
++ myfree(path);
++#endif
++
+ }
+
+ /* mail_conf_eval - expand macros in string */
+diff -durN postfix-2.1.3.orig/src/master/Makefile.in postfix-2.1.3/src/master/Makefile.in
+--- postfix-2.1.3.orig/src/master/Makefile.in 2004-04-22 21:37:35.000000000 +0200
++++ postfix-2.1.3/src/master/Makefile.in 2004-06-22 15:39:24.249859975 +0200
+@@ -20,7 +20,7 @@
+ INC_DIR = ../../include
+ BIN_DIR = ../../libexec
+
+-.c.o:; $(CC) $(CFLAGS) -c $*.c
++.c.o:; $(CC) `for i in $(LIB_OBJ); do [ $$i = $@ ] && echo -fPIC; done` $(CFLAGS) -c $*.c
+
+ all: $(PROG) $(LIB)
+
+@@ -35,12 +35,10 @@
+ tests: test
+
+ $(LIB): $(LIB_OBJ)
+- $(AR) $(ARFL) $(LIB) $?
+- $(RANLIB) $(LIB)
++ gcc -shared -Wl,-soname,libpostfix-master.so.1 -o $(LIB) $(LIB_OBJ)
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)/$(LIB)
+- $(RANLIB) $(LIB_DIR)/$(LIB)
+
+ $(BIN_DIR)/$(PROG): $(PROG)
+ cp $(PROG) $(BIN_DIR)
+diff -durN postfix-2.1.3.orig/src/util/dict.h postfix-2.1.3/src/util/dict.h
+--- postfix-2.1.3.orig/src/util/dict.h 2003-07-03 17:04:13.000000000 +0200
++++ postfix-2.1.3/src/util/dict.h 2004-06-22 15:39:24.253859738 +0200
+@@ -82,6 +82,20 @@
+ */
+ extern ARGV *dict_mapnames(void);
+
++#ifndef NO_DYNAMIC_MAPS
++ /*
++ * Interface for dynamic map loading.
++ */
++typedef struct {
++ const char *pattern;
++ const char *soname;
++ const char *openfunc;
++} DLINFO;
++
++extern void dict_open_dlinfo(const char *path);
++extern DLINFO *dict_open_dlfind(const char *type);
++#endif
++
+ /*
+ * High-level interface, with logical dictionary names.
+ */
+diff -durN postfix-2.1.3.orig/src/util/load_lib.c postfix-2.1.3/src/util/load_lib.c
+--- postfix-2.1.3.orig/src/util/load_lib.c 1970-01-01 01:00:00.000000000 +0100
++++ postfix-2.1.3/src/util/load_lib.c 2004-06-22 15:39:24.257859501 +0200
+@@ -0,0 +1,135 @@
++/*++
++/* NAME
++/* load_lib 3
++/* SUMMARY
++/* library loading wrappers
++/* SYNOPSIS
++/* #include <load_lib.h>
++/*
++/* extern int load_library_symbols(const char *, LIB_FN *, LIB_FN *);
++/* const char *libname;
++/* LIB_FN *libfuncs;
++/* LIB_FN *libdata;
++/*
++/* DESCRIPTION
++/* This module loads functions from libraries, returnine pointers
++/* to the named functions.
++/*
++/* load_library_symbols() loads all of the desired functions, and
++/* returns zero for success, or exits via msg_fatal().
++/*
++/* SEE ALSO
++/* msg(3) diagnostics interface
++/* DIAGNOSTICS
++/* Problems are reported via the msg(3) diagnostics routines:
++/* library not found, symbols not found, other fatal errors.
++/* LICENSE
++/* .ad
++/* .fi
++/* The Secure Mailer license must be distributed with this software.
++/* AUTHOR(S)
++/* LaMont Jones
++/* Hewlett-Packard Company
++/* 3404 Harmony Road
++/* Fort Collins, CO 80528, USA
++/*
++/* Wietse Venema
++/* IBM T.J. Watson Research
++/* P.O. Box 704
++/* Yorktown Heights, NY 10598, USA
++/*--*/
++
++/* System libraries. */
++
++#include "sys_defs.h"
++#include <stdlib.h>
++#include <stddef.h>
++#include <string.h>
++#if defined(HAS_DLOPEN)
++#include <dlfcn.h>
++#elif defined(HAS_SHL_LOAD)
++#include <dl.h>
++#endif
++
++/* Application-specific. */
++
++#include "msg.h"
++#include "load_lib.h"
++
++extern int load_library_symbols(const char * libname, LIB_FN * libfuncs, LIB_FN * libdata)
++{
++ char *myname = "load_library_symbols";
++ LIB_FN *fn;
++
++#if defined(HAS_DLOPEN)
++ void *handle;
++ char *emsg;
++
++ handle=dlopen(libname,RTLD_NOW);
++ emsg=dlerror();
++ if (emsg) {
++ msg_fatal("%s: dlopen failure loading %s: %s", myname, libname, emsg);
++ }
++
++ if (libfuncs) {
++ for (fn=libfuncs; fn->name; fn++) {
++ *(fn->ptr) = dlsym(handle,fn->name);
++ emsg=dlerror();
++ if (emsg) {
++ msg_fatal("%s: dlsym failure looking up %s in %s: %s", myname,
++ fn->name, libname, emsg);
++ }
++ if (msg_verbose>1) {
++ msg_info("loaded %s = %lx",fn->name, *((long*)(fn->ptr)));
++ }
++ }
++ }
++
++ if (libdata) {
++ for (fn=libdata; fn->name; fn++) {
++ *(fn->ptr) = dlsym(handle,fn->name);
++ emsg=dlerror();
++ if (emsg) {
++ msg_fatal("%s: dlsym failure looking up %s in %s: %s", myname,
++ fn->name, libname, emsg);
++ }
++ if (msg_verbose>1) {
++ msg_info("loaded %s = %lx",fn->name, *((long*)(fn->ptr)));
++ }
++ }
++ }
++#elif defined(HAS_SHL_LOAD)
++ shl_t handle;
++
++ handle = shl_load(libname,BIND_IMMEDIATE,0);
++
++ if (libfuncs) {
++ for (fn=libfuncs; fn->name; fn++) {
++ if (shl_findsym(&handle,fn->name,TYPE_PROCEDURE,fn->ptr) != 0) {
++ msg_fatal("%s: shl_findsym failure looking up %s in %s: %m",
++ myname, fn->name, libname);
++ }
++ if (msg_verbose>1) {
++ msg_info("loaded %s = %x",fn->name, *((long*)(fn->ptr)));
++ }
++ }
++ }
++
++ if (libdata) {
++ for (fn=libdata; fn->name; fn++) {
++ if (shl_findsym(&handle,fn->name,TYPE_DATA,fn->ptr) != 0) {
++ msg_fatal("%s: shl_findsym failure looking up %s in %s: %m",
++ myname, fn->name, libname);
++ }
++ if (msg_verbose>1) {
++ msg_info("loaded %s = %x",fn->name, *((long*)(fn->ptr)));
++ }
++ }
++ }
++
++#else
++ msg_fatal("%s: need dlopen or shl_load support for dynamic libraries",
++ myname);
++#endif
++ return 0;
++}
+diff -durN postfix-2.1.3.orig/src/util/load_lib.h postfix-2.1.3/src/util/load_lib.h
+--- postfix-2.1.3.orig/src/util/load_lib.h 1970-01-01 01:00:00.000000000 +0100
++++ postfix-2.1.3/src/util/load_lib.h 2004-06-22 15:39:24.257859501 +0200
+@@ -0,0 +1,41 @@
++#ifndef _LOAD_LIB_H_INCLUDED_
++#define _LOAD_LIB_H_INCLUDED_
++
++/*++
++/* NAME
++/* load_lib 3h
++/* SUMMARY
++/* library loading wrappers
++/* SYNOPSIS
++/* #include "load_lib.h"
++/* DESCRIPTION
++/* .nf
++
++ /*
++ * External interface.
++ */
++/* NULL name terminates list */
++typedef struct LIB_FN {
++ const char *name;
++ void **ptr;
++} LIB_FN;
++
++extern int load_library_symbols(const char *, LIB_FN *, LIB_FN *);
++
++/* LICENSE
++/* .ad
++/* .fi
++/* The Secure Mailer license must be distributed with this software.
++/* AUTHOR(S)
++/* LaMont Jones
++/* Hewlett-Packard Company
++/* 3404 Harmony Road
++/* Fort Collins, CO 80528, USA
++/*
++/* Wietse Venema
++/* IBM T.J. Watson Research
++/* P.O. Box 704
++/* Yorktown Heights, NY 10598, USA
++/*--*/
++
++#endif
+--- postfix-2.0.16.orig/conf/dynamicmaps.cf 1970-01-01 01:00:00.000000000 +0100
++++ postfix-2.0.16/conf/dynamicmaps.cf 2003-11-08 19:52:14.000000000 +0100
+@@ -0,0 +1,9 @@
++# Postfix dynamic maps configuration file.
++#
++# The first match found is the one that is used. The only wildcard
++# allowed is '*', which matches everything. The first %s is expanded
++# to the map type.
++#
++#type location of .so file name of open function
++#==== ================================ =====================
++* /usr/lib/postfix/dict_%s.so dict_%s_open
+--- postfix-2.3-RC9/src/global/mail_params.c.orig 2006-07-11 19:37:10.708815544 +0200
++++ postfix-2.3-RC9/src/global/mail_params.c 2006-07-11 19:38:56.587719504 +0200
+@@ -148,6 +148,8 @@
+ #ifdef STRCASECMP_IN_STRINGS_H
+ #include <strings.h>
+ #endif
++#include <safe_open.h>
++#include <mymalloc.h>
+
+ /* Utility library. */
+
+@@ -248,6 +250,7 @@
+ char *var_debug_peer_list;
+ int var_debug_peer_level;
+ char *var_reject_reply_msg_access_denied;
++int var_command_maxtime;
+ int var_fault_inj_code;
+ char *var_bounce_service;
+ char *var_cleanup_service;
+@@ -433,6 +436,38 @@
+ (long) var_sgid_gid);
+ }
+
++static char *read_file(const char *name)
++{
++ char *ret;
++ VSTRING *why=vstring_alloc(1);
++ VSTRING *new_name=vstring_alloc(1);
++ VSTREAM *vp=safe_open(name, O_RDONLY, 0, NULL, -1, -1, why);
++
++ /*
++ * Ugly macros to make complex expressions less unreadable.
++ */
++#define SKIP(start, var, cond) \
++ for (var = start; *var && (cond); var++);
++
++#define TRIM(s) { \
++ char *p; \
++ for (p = (s) + strlen(s); p > (s) && ISSPACE(p[-1]); p--); \
++ *p = 0; \
++ }
++
++ if (!vp) {
++ msg_fatal("%s: unable to open: %s",name,vstring_str(why));
++ }
++ vstring_get_nonl(new_name,vp);
++ vstream_fclose(vp);
++ SKIP(vstring_str(new_name),ret,ISSPACE(*ret));
++ ret=mystrdup(ret);
++ TRIM(ret);
++ vstring_free(why);
++ vstring_free(new_name);
++ return ret;
++}
++
+ /* mail_params_init - configure built-in parameters */
+
+ void mail_params_init()
+diff -durN postfix-2.1.3.orig/src/util/sys_defs.h postfix-2.1.3/src/util/sys_defs.h
+--- postfix-2.1.3.orig/src/util/sys_defs.h 2004-06-22 15:38:57.190461088 +0200
++++ postfix-2.1.3/src/util/sys_defs.h 2004-06-22 15:39:24.255859620 +0200
+@@ -700,6 +700,7 @@
+ #define STATFS_IN_SYS_VFS_H
+ #define PREPEND_PLUS_TO_OPTSTRING
+ #define HAS_POSIX_REGEXP
++#define HAS_DLOPEN
+ #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define NATIVE_MAILQ_PATH "/usr/bin/mailq"
+ #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases"
+@@ -754,6 +755,7 @@
+ #define STATFS_IN_SYS_VFS_H
+ #define PREPEND_PLUS_TO_OPTSTRING
+ #define HAS_POSIX_REGEXP
++#define HAS_DLOPEN
+ #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define NATIVE_MAILQ_PATH "/usr/bin/mailq"
+ #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases"
+@@ -638,6 +640,7 @@
+ #define USE_STATFS
+ #define STATFS_IN_SYS_VFS_H
+ #define HAS_POSIX_REGEXP
++#define HAS_SHL_LOAD
+ #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define NATIVE_MAILQ_PATH "/usr/bin/mailq"
+ #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases"
+@@ -673,6 +676,7 @@
+ #define USE_STATFS
+ #define STATFS_IN_SYS_VFS_H
+ #define HAS_POSIX_REGEXP
++#define HAS_SHL_LOAD
+ #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define NATIVE_MAILQ_PATH "/usr/bin/mailq"
+ #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases"
+--- postfix-2.8.3/src/global/Makefile.in~ 2011-05-17 14:11:58.243333401 +0200
++++ postfix-2.8.3/src/global/Makefile.in 2011-05-17 14:27:36.783333538 +0200
+@@ -35,7 +35,7 @@
+ canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
+ clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
+ defer.o deliver_completed.o deliver_flock.o deliver_pass.o \
+- deliver_request.o dict_ldap.o dict_mysql.o dict_pgsql.o \
++ deliver_request.o \
+ dict_proxy.o dict_sqlite.o domain_list.o dot_lockfile.o dot_lockfile_as.o \
+ dsb_scan.o dsn.o dsn_buf.o dsn_mask.o dsn_print.o dsn_util.o \
+ ehlo_mask.o ext_prop.o file_id.o flush_clnt.o header_opts.o \
+@@ -106,8 +106,12 @@
+ LIB_DIR = ../../lib
+ INC_DIR = ../../include
+ MAKES =
++LDAPSO = dict_ldap.so
++MYSQLSO = dict_mysql.so
++PGSQLSO = dict_pgsql.so
++SQLITESO= dict_sqlite.so
+
+-.c.o:; $(CC) $(CFLAGS) -c $*.c
++.c.o:; $(CC) -fPIC $(CFLAGS) -c $*.c
+
+ all: $(LIB)
+
+@@ -119,14 +123,36 @@
+ test: $(TESTPROG)
+
+ $(LIB): $(OBJS)
+- $(AR) $(ARFL) $(LIB) $?
+- $(RANLIB) $(LIB)
++ gcc -shared -Wl,-soname,libpostfix-global.so.1 -o $(LIB) $(OBJS)
++
++$(LDAPSO): dict_ldap.o $(LIB)
++ gcc -shared -Wl,-soname,dict_ldap.so -o $@ $? -lldap -llber -L../../lib -lutil -L. -lglobal
++
++$(MYSQLSO): dict_mysql.o $(LIB)
++ gcc -shared -Wl,-soname,dict_mysql.so -o $@ $? -lmysqlclient -L../../lib -lutil -L. -lglobal
++
++$(PGSQLSO): dict_pgsql.o $(LIB)
++ gcc -shared -Wl,-soname,dict_pgsql.so -o $@ $? -lpq -L../../lib -lutil -L. -lglobal
++
++$(SQLITESO): dict_sqlite.o $(LIB)
++ gcc -shared -Wl,-soname,dict_sqlite.so -o $@ $? -lsqlite3 -L../../lib -lutil -L. -lglobal
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)
+- $(RANLIB) $(LIB_DIR)/$(LIB)
+
+-update: $(LIB_DIR)/$(LIB) $(HDRS)
++$(LIB_DIR)/$(LDAPSO): $(LDAPSO)
++ cp $(LDAPSO) $(LIB_DIR)
++
++$(LIB_DIR)/$(MYSQLSO): $(MYSQLSO)
++ cp $(MYSQLSO) $(LIB_DIR)
++
++$(LIB_DIR)/$(PGSQLSO): $(PGSQLSO)
++ cp $(PGSQLSO) $(LIB_DIR)
++
++$(LIB_DIR)/$(SQLITESO): $(SQLITESO)
++ cp $(SQLITESO) $(LIB_DIR)
++
++update: $(LIB_DIR)/$(LIB) $(LIB_DIR)/${LDAPSO} $(LIB_DIR)/${MYSQLSO} $(LIB_DIR)/${PGSQLSO} $(LIB_DIR)/${SQLITESO} $(HDRS)
+ -for i in $(HDRS); \
+ do \
+ cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
+@@ -497,7 +523,7 @@
+ lint $(DEFS) $(SRCS) $(LINTFIX)
+
+ clean:
+- rm -f *.o $(LIB) *core $(TESTPROG) junk
++ rm -f *.o $(LIB) $(LDAPSO) $(MYSQLSO) $(PGSQLSO) $(SQLITESO) *core $(TESTPROG) junk
+ rm -rf printfck
+
+ tidy: clean
+--- postfix-2.9.0/src/util/dict_open.c.orig 2012-02-04 19:16:54.231837262 +0100
++++ postfix-2.9.0/src/util/dict_open.c 2012-02-04 19:27:54.884124599 +0100
+@@ -213,6 +213,9 @@
+ #include <strings.h>
+ #endif
+
++#include <sys/stat.h>
++#include <unistd.h>
++
+ /* Utility library. */
+
+ #include <argv.h>
+@@ -241,6 +244,14 @@
+ #include <htable.h>
+ #include <myflock.h>
+
++#ifndef NO_DYNAMIC_MAPS
++#include <load_lib.h>
++#include <vstring.h>
++#include <vstream.h>
++#include <vstring_vstream.h>
++#include <mvect.h>
++#endif
++
+ /*
+ * lookup table for available map types.
+ */
+@@ -276,9 +287,11 @@
+ #ifdef HAS_NETINFO
+ DICT_TYPE_NETINFO, dict_ni_open,
+ #endif
++#ifndef MAX_DYNAMIC_MAPS
+ #ifdef HAS_PCRE
+ DICT_TYPE_PCRE, dict_pcre_open,
+ #endif
++#endif /* MAX_DYNAMIC_MAPS */
+ #ifdef HAS_POSIX_REGEXP
+ DICT_TYPE_REGEXP, dict_regexp_open,
+ #endif
+@@ -338,9 +351,38 @@
+ dict_type, dict_name);
+ if (dict_open_hash == 0)
+ dict_open_init();
+- if ((dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type)) == 0)
+- return (dict_surrogate(dict_type, dict_name, open_flags, dict_flags,
+- "unsupported dictionary type: %s", dict_type));
++ if ((dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type)) == 0) {
++#ifndef NO_DYNAMIC_MAPS
++ struct stat st;
++ VSTRING *lib, *func;
++ LIB_FN fn[2];
++ DICT *(*open) (const char *, int, int);
++ DLINFO *dl=dict_open_dlfind(dict_type);
++ if (!dl)
++#endif
++ msg_fatal("%s: unsupported dictionary type: %s", myname, dict_type);
++#ifndef NO_DYNAMIC_MAPS
++ lib=vstring_alloc(1);
++ vstring_sprintf(lib,dl->soname,dict_type);
++ if (stat(vstring_str(lib),&st) < 0) {
++ msg_fatal("%s: unsupported dictionary type: %s (%s not found. Is the postfix-%s package installed?)",
++ myname, dict_type, vstring_str(lib), dict_type);
++ }
++ func=vstring_alloc(1);
++ vstring_sprintf(func,dl->openfunc,dict_type);
++ fn[0].name = vstring_str(func);
++ fn[0].ptr = (void**)&open;
++ fn[1].name = NULL;
++ load_library_symbols(vstring_str(lib), fn, NULL);
++ dict_open_register(dict_type, open);
++ dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type);
++ vstring_free(lib);
++ vstring_free(func);
++#endif
++ }
++ if (msg_verbose>1) {
++ msg_info("%s: calling %s open routine",myname,dict_type);
++ }
+ if ((dict = dp->open(dict_name, open_flags, dict_flags)) == 0)
+ return (dict_surrogate(dict_type, dict_name, open_flags, dict_flags,
+ "cannot open %s:%s: %m", dict_type, dict_name));
+@@ -407,6 +449,76 @@
+ return mapnames;
+ }
+
++#ifndef NO_DYNAMIC_MAPS
++static DLINFO *dict_dlinfo;
++
++void dict_open_dlinfo(const char *path)
++{
++ char *myname="dict_open_dlinfo";
++ VSTREAM *conf_fp=vstream_fopen(path,O_RDONLY,0);
++ VSTRING *buf = vstring_alloc(100);
++ char *cp;
++ ARGV *argv;
++ MVECT vector;
++ int nelm=0;
++ int linenum=0;
++
++ dict_dlinfo=(DLINFO*)mvect_alloc(&vector,sizeof(DLINFO),3,NULL,NULL);
++
++ if (!conf_fp) {
++ msg_warn("%s: cannot open %s. No dynamic maps will be allowed.",
++ myname, path);
++ } else {
++ while (vstring_get_nonl(buf,conf_fp) != VSTREAM_EOF) {
++ cp = vstring_str(buf);
++ linenum++;
++ if (*cp == '#' || *cp == '\0')
++ continue;
++ argv = argv_split(cp, " \t");
++ if (argv->argc != 3) {
++ msg_fatal("%s: Expected \"pattern .so-name function\" at line %d",
++ myname, linenum);
++ }
++ if (argv->argv[1][0] != '/') {
++ msg_fatal("%s: .so name must begin with a \"/\" at line %d",
++ myname, linenum);
++ }
++ if (nelm >= vector.nelm) {
++ dict_dlinfo=(DLINFO*)mvect_realloc(&vector,vector.nelm+3);
++ }
++ dict_dlinfo[nelm].pattern = mystrdup(argv->argv[0]);
++ dict_dlinfo[nelm].soname = mystrdup(argv->argv[1]);
++ dict_dlinfo[nelm].openfunc = mystrdup(argv->argv[2]);
++ nelm++;
++ argv_free(argv);
++ }
++ }
++ if (nelm >= vector.nelm) {
++ dict_dlinfo=(DLINFO*)mvect_realloc(&vector,vector.nelm+1);
++ }
++ dict_dlinfo[nelm].pattern = NULL;
++ dict_dlinfo[nelm].soname = NULL;
++ dict_dlinfo[nelm].openfunc = NULL;
++ if (conf_fp)
++ vstream_fclose(conf_fp);
++ vstring_free(buf);
++}
++
++DLINFO *dict_open_dlfind(const char *type)
++{
++ DLINFO *dp;
++
++ if (!dict_dlinfo)
++ return NULL;
++
++ for (dp=dict_dlinfo; dp->pattern; dp++) {
++ if (strcmp(dp->pattern,type)==0 || strcmp(dp->pattern,"*")==0)
++ return dp;
++ }
++ return NULL;
++}
++#endif /* !NO_DYNAMIC_MAPS */
++
+ #ifdef TEST
+
+ /*
+--- postfix-2.9.0/src/util/Makefile.in.orig 2012-02-04 19:16:54.187276228 +0100
++++ postfix-2.9.0/src/util/Makefile.in 2012-02-04 19:30:39.503837753 +0100
+@@ -30,7 +30,7 @@
+ username.c valid_hostname.c vbuf.c vbuf_print.c vstream.c \
+ vstream_popen.c vstring.c vstring_vstream.c watchdog.c writable.c \
+ write_buf.c write_wait.c sane_basename.c format_tv.c allspace.c \
+- allascii.c load_file.c killme_after.c vstream_tweak.c \
++ allascii.c load_file.c killme_after.c vstream_tweak.c load_lib.c \
+ unix_pass_listen.c unix_pass_trigger.c edit_file.c inet_windowsize.c \
+ unix_pass_fd_fix.c dict_cache.c valid_utf_8.c dict_thash.c \
+ ip_match.c nbbio.c stream_pass_connect.c base32_code.c dict_test.c \
+@@ -41,7 +41,7 @@
+ chroot_uid.o cidr_match.o clean_env.o close_on_exec.o concatenate.o \
+ ctable.o dict.o dict_alloc.o dict_cdb.o dict_cidr.o dict_db.o \
+ dict_dbm.o dict_debug.o dict_env.o dict_ht.o dict_ni.o dict_nis.o \
+- dict_nisplus.o dict_open.o dict_pcre.o dict_regexp.o dict_sdbm.o \
++ dict_nisplus.o dict_open.o dict_regexp.o dict_sdbm.o \
+ dict_static.o dict_tcp.o dict_unix.o dir_forest.o doze.o dummy_read.o \
+ dummy_write.o duplex_pipe.o environ.o events.o exec_command.o \
+ fifo_listen.o fifo_trigger.o file_limit.o find_inet.o fsspace.o \
+@@ -66,7 +66,7 @@
+ username.o valid_hostname.o vbuf.o vbuf_print.o vstream.o \
+ vstream_popen.o vstring.o vstring_vstream.o watchdog.o writable.o \
+ write_buf.o write_wait.o sane_basename.o format_tv.o allspace.o \
+- allascii.o load_file.o killme_after.o vstream_tweak.o \
++ allascii.o load_file.o killme_after.o vstream_tweak.o load_lib.o \
+ unix_pass_listen.o unix_pass_trigger.o edit_file.o inet_windowsize.o \
+ unix_pass_fd_fix.o dict_cache.o valid_utf_8.o dict_thash.o \
+ ip_match.o nbbio.o stream_pass_connect.o base32_code.o dict_test.o \
+@@ -89,7 +89,7 @@
+ sigdelay.h sock_addr.h spawn_command.h split_at.h stat_as.h \
+ stringops.h sys_defs.h timed_connect.h timed_wait.h trigger.h \
+ username.h valid_hostname.h vbuf.h vbuf_print.h vstream.h vstring.h \
+- vstring_vstream.h watchdog.h format_tv.h load_file.h killme_after.h \
++ vstring_vstream.h watchdog.h format_tv.h load_file.h killme_after.h load_lib.h \
+ edit_file.h dict_cache.h dict_thash.h ip_match.h nbbio.h base32_code.h \
+ dict_fail.h warn_stat.h
+ TESTSRC = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
+@@ -98,6 +98,7 @@
+ CFLAGS = $(DEBUG) $(OPT) $(DEFS)
+ FILES = Makefile $(SRCS) $(HDRS)
+ INCL =
++PCRESO = dict_pcre.so
+ LIB = libutil.a
+ TESTPROG= dict_open dup2_pass_on_exec events exec_command fifo_open \
+ fifo_rdonly_bug fifo_rdwr_bug fifo_trigger fsspace fullname \
+@@ -113,8 +114,9 @@
+
+ LIB_DIR = ../../lib
+ INC_DIR = ../../include
++LIBS = $(LIB_DIR)/$(LIB) $(LIB_DIR)/$(PCRESO)
+
+-.c.o:; $(CC) $(CFLAGS) -c $*.c
++.c.o:; $(CC) -fPIC $(CFLAGS) -c $*.c
+
+ all: $(LIB)
+
+@@ -125,15 +127,19 @@
+
+ test: $(TESTPROG)
+
++$(PCRESO): dict_pcre.o
++ gcc -shared -Wl,-soname,dict_pcre.so -o $@ $? -lpcre -L. -lutil
++
+ $(LIB): $(OBJS)
+- $(AR) $(ARFL) $(LIB) $?
+- $(RANLIB) $(LIB)
++ gcc -shared -Wl,-soname,libpostfix-util.so.1 -o $(LIB) $(OBJS) -ldl
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)
+- $(RANLIB) $(LIB_DIR)/$(LIB)
+
+-update: $(LIB_DIR)/$(LIB) $(HDRS)
++$(LIB_DIR)/$(PCRESO): $(PCRESO)
++ cp $(PCRESO) $(LIB_DIR)
++
++update: $(LIBS) $(HDRS)
+ -for i in $(HDRS); \
+ do \
+ cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
+@@ -155,7 +161,8 @@
+ lint $(DEFS) $(SRCS) $(LINTFIX)
+
+ clean:
+- rm -f *.o $(LIB) *core $(TESTPROG) junk $(MAKES) *.tmp
++ rm -f *.o $(LIB) $(PCRESO) *core $(TESTPROG) \
++ junk $(MAKES) *.tmp
+ rm -rf printfck
+
+ tidy: clean
+--- postfix-2.9.0/src/global/mail_dict.c.orig 2012-02-04 19:16:53.000000000 +0100
++++ postfix-2.9.0/src/global/mail_dict.c 2012-02-04 19:33:20.047179113 +0100
+@@ -47,18 +47,6 @@
+
+ static const DICT_OPEN_INFO dict_open_info[] = {
+ DICT_TYPE_PROXY, dict_proxy_open,
+-#ifdef HAS_LDAP
+- DICT_TYPE_LDAP, dict_ldap_open,
+-#endif
+-#ifdef HAS_MYSQL
+- DICT_TYPE_MYSQL, dict_mysql_open,
+-#endif
+-#ifdef HAS_PGSQL
+- DICT_TYPE_PGSQL, dict_pgsql_open,
+-#endif
+-#ifdef HAS_SQLITE
+- DICT_TYPE_SQLITE, dict_sqlite_open,
+-#endif
+ DICT_TYPE_MEMCACHE, dict_memcache_open,
+ 0,
+ };
--- /dev/null
+--- src/smtpd/smtpd.h.org Wed Feb 9 03:00:14 2005
++++ src/smtpd/smtpd.h Mon Feb 7 20:06:58 2005
+@@ -111,6 +111,7 @@
+ int sender_rcptmap_checked; /* sender validated against maps */
+ int recipient_rcptmap_checked; /* recipient validated against maps */
+ int warn_if_reject; /* force reject into warning */
++ int header_if_reject; /* add header instead of rejecting */
+ SMTPD_DEFER defer_if_reject; /* force reject into deferral */
+ SMTPD_DEFER defer_if_permit; /* force permit into deferral */
+ int defer_if_permit_client; /* force permit into warning */
+--- src/global/mail_params.h.org Wed Feb 9 03:01:31 2005
++++ src/global/mail_params.h Wed Feb 9 02:01:01 2005
+@@ -1578,6 +1578,7 @@
+ #define CHECK_RECIP_NS_ACL "check_recipient_ns_access"
+
+ #define WARN_IF_REJECT "warn_if_reject"
++#define HEADER_IF_REJECT "header_if_reject"
+
+ #define REJECT_RBL "reject_rbl" /* LaMont compatibility */
+ #define REJECT_RBL_CLIENT "reject_rbl_client"
+--- src/smtpd/smtpd_check.c.org Sat Dec 27 03:54:03 2003
++++ src/smtpd/smtpd_check.c Wed Feb 9 06:04:25 2005
+@@ -351,29 +351,29 @@
+ * permit-style restriction fails. Otherwise, we could reject legitimate
+ * mail.
+ */
+-static void PRINTFLIKE(3, 4) defer_if(SMTPD_DEFER *, int, const char *,...);
++static void PRINTFLIKE(4, 5) defer_if(SMTPD_STATE *, SMTPD_DEFER *, int, const char *,...);
+
+ #define DEFER_IF_REJECT2(state, class, fmt, a1, a2) \
+- defer_if(&(state)->defer_if_reject, (class), (fmt), (a1), (a2))
++ defer_if((state), &(state)->defer_if_reject, (class), (fmt), (a1), (a2))
+ #define DEFER_IF_REJECT3(state, class, fmt, a1, a2, a3) \
+- defer_if(&(state)->defer_if_reject, (class), (fmt), (a1), (a2), (a3))
++ defer_if((state), &(state)->defer_if_reject, (class), (fmt), (a1), (a2), (a3))
+ #define DEFER_IF_REJECT4(state, class, fmt, a1, a2, a3, a4) \
+ defer_if(&(state)->defer_if_reject, (class), (fmt), (a1), (a2), (a3), (a4))
+ #define DEFER_IF_PERMIT2(state, class, fmt, a1, a2) do { \
+ if ((state)->warn_if_reject == 0) \
+- defer_if(&(state)->defer_if_permit, (class), (fmt), (a1), (a2)); \
++ defer_if((state), &(state)->defer_if_permit, (class), (fmt), (a1), (a2)); \
+ else \
+ (void) smtpd_check_reject((state), (class), (fmt), (a1), (a2)); \
+ } while (0)
+ #define DEFER_IF_PERMIT3(state, class, fmt, a1, a2, a3) do { \
+ if ((state)->warn_if_reject == 0) \
+- defer_if(&(state)->defer_if_permit, (class), (fmt), (a1), (a2), (a3)); \
++ defer_if((state), &(state)->defer_if_permit, (class), (fmt), (a1), (a2), (a3)); \
+ else \
+ (void) smtpd_check_reject((state), (class), (fmt), (a1), (a2), (a3)); \
+ } while (0)
+ #define DEFER_IF_PERMIT4(state, class, fmt, a1, a2, a3, a4) do { \
+ if ((state)->warn_if_reject == 0) \
+- defer_if(&(state)->defer_if_permit, (class), (fmt), (a1), (a2), (a3), (a4)); \
++ defer_if((state), &(state)->defer_if_permit, (class), (fmt), (a1), (a2), (a3), (a4)); \
+ else \
+ (void) smtpd_check_reject((state), (class), (fmt), (a1), (a2), (a3), (a4)); \
+ } while (0)
+@@ -712,7 +712,18 @@
+ char *format,...)
+ {
+ va_list ap;
++
++ va_start(ap, format);
++ vstring_vsprintf(error_text, format, ap);
++ va_end(ap);
++
++ return(xsmtpd_check_reject(state, error_class, error_text));
++}
++static int xsmtpd_check_reject(SMTPD_STATE *state, int error_class,
++ VSTRING *error_text)
++{
+ int warn_if_reject;
++ int header_if_reject;
+ const char *whatsup;
+
+ /*
+@@ -726,15 +737,18 @@
+ warn_if_reject = 0;
+ whatsup = "reject";
+ }
++ if (state->header_if_reject && error_class != MAIL_ERROR_SOFTWARE) {
++ header_if_reject = 1;
++ whatsup = "header_warning";
++ } else {
++ header_if_reject = 0;
++ }
+
+ /*
+ * Update the error class mask, and format the response. XXX What about
+ * multi-line responses? For now we cheat and send whitespace.
+ */
+ state->error_mask |= error_class;
+- va_start(ap, format);
+- vstring_vsprintf(error_text, format, ap);
+- va_end(ap);
+
+ /*
+ * Ensure RFC compliance. We could do this inside smtpd_chat_reply() and
+@@ -796,15 +810,58 @@
+ */
+ log_whatsup(state, whatsup, STR(error_text));
+
+- return (warn_if_reject ? 0 : SMTPD_CHECK_REJECT);
++ if (state->header_if_reject) {
++ VSTRING *hbuf = vstring_alloc(100);
++ int elen = strlen(STR(error_text));
++
++ if (state->prepend == 0)
++ state->prepend = argv_alloc(1);
++ printable(STR(error_text), '?');
++
++#define PRETTY_HEADER
++#ifdef PRETTY_HEADER
++ if (elen > 65) {
++ int len = 0, n;
++ char *p;
++
++ vstring_sprintf(hbuf, "%s", "X-Reject: ");
++ while (len < elen-65 && (p = strchr(STR(error_text)+len+64, ' '))) {
++ *p = '\t';
++ n = p-(STR(error_text)+len);
++ vstring_sprintf_append(hbuf, "%.*s\n", n, STR(error_text)+len);
++ len+=n;
++ }
++ vstring_sprintf_append(hbuf, "%s", STR(error_text)+len);
++ }
++ else {
++ vstring_sprintf(hbuf, "X-Reject: %s", STR(error_text));
++ }
++#else
++ vstring_sprintf(hbuf, "X-Reject: %.*s", 999, STR(error_text));
++#endif
++ argv_add(state->prepend, STR(hbuf), ARGV_END);
++ vstring_free(hbuf);
++ }
++
++ return (warn_if_reject || header_if_reject ? 0 : SMTPD_CHECK_REJECT);
+ }
+
+ /* defer_if - prepare to change our mind */
+
+-static void defer_if(SMTPD_DEFER *defer, int error_class, const char *fmt,...)
++static void defer_if(SMTPD_STATE *state, SMTPD_DEFER *defer, int error_class, const char *fmt,...)
+ {
+ va_list ap;
+
++ if (state->header_if_reject) {
++ va_start(ap, fmt);
++ vstring_vsprintf(error_text, fmt, ap);
++ va_end(ap);
++ if (STR(error_text)[0] == '5') {
++ xsmtpd_check_reject(state, error_class, error_text);
++ return;
++ }
++ }
++
+ /*
+ * Keep the first reason for this type of deferral, to minimize
+ * confusion.
+@@ -3147,6 +3204,11 @@
+ state->warn_if_reject = state->recursion;
+ continue;
+ }
++ if (strcasecmp(name, HEADER_IF_REJECT) == 0) {
++ if (state->header_if_reject == 0)
++ state->header_if_reject = state->recursion;
++ continue;
++ }
+
+ /*
+ * Spoof the is_map_command() routine, so that we do not have to make
+@@ -3500,6 +3562,8 @@
+
+ if (state->warn_if_reject >= state->recursion)
+ state->warn_if_reject = 0;
++ if (state->header_if_reject >= state->recursion)
++ state->header_if_reject = 0;
+
+ if (status != 0)
+ break;
+@@ -3554,6 +3618,7 @@
+ #define SMTPD_CHECK_RESET() { \
+ state->recursion = 0; \
+ state->warn_if_reject = 0; \
++ state->header_if_reject = 0; \
+ state->defer_if_reject.active = 0; \
+ }
+
--- /dev/null
+diff -urN -x '*~' postfix-2.2.5/src/global/mail_params.h postfix-2.2.5-ident/src/global/mail_params.h
+--- postfix-2.2.5/src/global/mail_params.h 2006-02-22 16:20:15.000000000 +0100
++++ postfix-2.2.5-ident/src/global/mail_params.h 2006-02-22 15:56:31.000000000 +0100
+@@ -2346,6 +2346,9 @@
+ #define DEF_SMTP_EHLO_DIS_MAPS ""
+ extern char *var_smtp_ehlo_dis_maps;
+
++#define VAR_SMTPD_IDENT_LOOKUP "smtpd_ident_lookup"
++#define DEF_SMTPD_IDENT_LOOKUP ""
++extern char *var_smtpd_ident_lookup;
+ /*
+ * SMTPD messages
+ */
+diff -urN -x '*~' postfix-2.2.5/src/smtpd/smtpd_ident.c postfix-2.2.5-ident/src/smtpd/smtpd_ident.c
+--- postfix-2.2.5/src/smtpd/smtpd_ident.c 1970-01-01 01:00:00.000000000 +0100
++++ postfix-2.2.5-ident/src/smtpd/smtpd_ident.c 2006-02-22 15:56:31.000000000 +0100
+@@ -0,0 +1,138 @@
++#include <sys_defs.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <stdio.h> /* strerror() */
++#include <errno.h>
++#include <string.h>
++#include <mymalloc.h>
++#include <sys/types.h>
++#include <sys/time.h>
++#include <unistd.h>
++#include <vstream.h>
++
++#include <iostuff.h>
++#include "smtpd.h"
++
++#define IDENT_MSGSIZE 256
++#define IDENT_TIMEOUT 10
++
++#define CHOMP(STR) { char *tmp; tmp = STR; while (*tmp) { \
++ if (*tmp == '\n' || *tmp == '\r') *tmp = '\0'; tmp++ ; } }
++
++char *smtpd_ident(struct sockaddr_in *peer_addr, struct sockaddr_in *smtpd_addr)
++{
++ int ident_sock;
++ char ident_msg[IDENT_MSGSIZE + 1], *sp;
++ char ident_user[IDENT_MSGSIZE + 1];
++ struct sockaddr_in local_addr;
++ struct sockaddr_in ident_addr;
++ char *return_val;
++ VSTREAM *ident_stream;
++
++ memset(ident_msg, 0, IDENT_MSGSIZE + 1);
++ memset(ident_user, 0, IDENT_MSGSIZE + 1);
++
++ /*
++ * Bind the local sockaddr to the same interface as smtpd before
++ * connecting back to the auth port on the peer. This helps
++ * with multihomed postfix servers. First, set up the address.
++ */
++
++ /* Local sockname */
++
++ memset((char *) &local_addr, 0, sizeof(local_addr));
++ local_addr.sin_family = AF_INET;
++ memcpy((void *) &local_addr.sin_addr, (void *) &smtpd_addr->sin_addr, sizeof(local_addr.sin_addr));
++
++ /* Remote sockname + port */
++
++ memset((char *) &ident_addr, 0, sizeof(ident_addr));
++ ident_addr.sin_family = AF_INET;
++ memcpy((void *) &ident_addr.sin_addr, (void *) &peer_addr->sin_addr, sizeof(ident_addr.sin_addr));
++ ident_addr.sin_port = htons(113);
++
++ do {
++ /* socket call */
++
++ if ((ident_sock = socket(ident_addr.sin_family, SOCK_STREAM, 0)) < 0) {
++ msg_warn("Can't allocate socket for ident lookup: %s", strerror(errno));
++ break;
++ }
++
++ /* Now bind the local sock to the interface */
++
++ if (bind(ident_sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0) {
++ msg_warn("local bind of ident sock failed: %s", strerror(errno));
++ break;
++ }
++
++ /* connect() back to the smtp client host on port 113 */
++
++ if (connect(ident_sock, (struct sockaddr *) &ident_addr, sizeof(ident_addr )) < 0) {
++ msg_warn( "ident connect to %s: %s", inet_ntoa(peer_addr->sin_addr),
++ strerror(errno));
++ break;
++ }
++
++ /* Ok, make this a vstream */
++
++ ident_stream = vstream_fdopen(ident_sock, O_RDWR);
++ ident_stream->timeout = IDENT_TIMEOUT;
++
++ /* Print the ident message to the remote host */
++
++ vstream_fprintf(ident_stream, "%d, %d\n", ntohs(peer_addr->sin_port), ntohs(smtpd_addr->sin_port));
++ if (vstream_ftimeout(ident_stream)) {
++ msg_warn( "ident write timed out to %s", inet_ntoa(peer_addr->sin_addr));
++ break;
++ }
++
++ /* Read back the result */
++
++ vstream_fread(ident_stream, ident_msg, IDENT_MSGSIZE);
++ if (vstream_ftimeout(ident_stream)) {
++ msg_warn( "ident read timed out to %s", inet_ntoa(peer_addr->sin_addr));
++ break;
++ }
++
++ /*
++ * Should I even bother with this?
++ *
++ * Even if so, don't worry about this failing, set the timeout low
++ */
++
++ ident_stream->timeout = 2;
++ vstream_fwrite(ident_stream, "quit\n", strlen("quit\n"));
++
++ if (strlen(ident_msg) == 0) {
++ msg_warn( "Failed to get ident string from %s", inet_ntoa(peer_addr->sin_addr));
++ break;
++ }
++
++ if ((sp = strrchr(ident_msg, ':')) == NULL) {
++ msg_warn( "Invalid ident string from %s", inet_ntoa(peer_addr->sin_addr));
++ break;
++ }
++ sp++;
++ CHOMP(sp);
++ while (*sp && (*sp == ' ' || *sp == '\t')) {
++ sp++;
++ }
++
++ /* If we break before this line, we know we had some sort of bad error */
++
++ strncpy(ident_user, sp, IDENT_MSGSIZE);
++ msg_info( "Received ident string %s from %s", sp, inet_ntoa(peer_addr->sin_addr));
++
++ } while (0);
++
++ if (strlen(ident_user) == 0) {
++ msg_warn( "Failed to get ident user for %s", inet_ntoa(peer_addr->sin_addr));
++ return NULL;
++ }
++
++ vstream_fclose(ident_stream);
++ return_val = mystrdup(ident_user);
++ return return_val;
++}
+--- postfix-2.3-RC9/src/smtpd/smtpd.h.orig 2006-07-09 21:49:21.000000000 +0200
++++ postfix-2.3-RC9/src/smtpd/smtpd.h 2006-07-11 20:30:43.993322048 +0200
+@@ -77,6 +77,7 @@
+ char *addr; /* client host address string */
+ char *namaddr; /* combined name and address */
+ char *rfc_addr; /* address for RFC 2821 */
++ char *ident_user; /* user name returned by ident RFC 1413 */
+ int addr_family; /* address family */
+ struct sockaddr_storage sockaddr; /* binary client endpoint */
+ int name_status; /* 2=ok 4=soft 5=hard 6=forged */
+@@ -266,6 +267,8 @@
+ extern void smtpd_peer_init(SMTPD_STATE *state);
+ extern void smtpd_peer_reset(SMTPD_STATE *state);
+
++extern char *smtpd_ident(struct sockaddr_in *peer_addr, struct sockaddr_in *smtpd_addr);
++
+ #define SMTPD_PEER_CODE_OK 2
+ #define SMTPD_PEER_CODE_TEMP 4
+ #define SMTPD_PEER_CODE_PERM 5
+--- postfix-2.8.3/src/smtpd/Makefile.in~ 2011-05-17 14:28:28.406666872 +0200
++++ postfix-2.8.3/src/smtpd/Makefile.in 2011-05-17 14:31:06.946666872 +0200
+@@ -2,11 +2,11 @@
+ SRCS = smtpd.c smtpd_token.c smtpd_check.c smtpd_chat.c smtpd_state.c \
+ smtpd_peer.c smtpd_sasl_proto.c smtpd_sasl_glue.c smtpd_proxy.c \
+ smtpd_xforward.c smtpd_dsn_fix.c smtpd_milter.c smtpd_resolve.c \
+- smtpd_expand.c
++ smtpd_expand.c smtpd_ident.c
+ OBJS = smtpd.o smtpd_token.o smtpd_check.o smtpd_chat.o smtpd_state.o \
+ smtpd_peer.o smtpd_sasl_proto.o smtpd_sasl_glue.o smtpd_proxy.o \
+ smtpd_xforward.o smtpd_dsn_fix.o smtpd_milter.o smtpd_resolve.o \
+- smtpd_expand.o
++ smtpd_expand.o smtpd_ident.o
+ HDRS = smtpd_token.h smtpd_check.h smtpd_chat.h smtpd_sasl_proto.h \
+ smtpd_sasl_glue.h smtpd_proxy.h smtpd_dsn_fix.h smtpd_milter.h \
+ smtpd_resolve.h smtpd_expand.h
+--- postfix-2.9.0/src/smtpd/smtpd.c.orig 2012-02-04 19:34:17.737149536 +0100
++++ postfix-2.9.0/src/smtpd/smtpd.c 2012-02-04 19:36:43.414073592 +0100
+@@ -1208,6 +1208,7 @@
+ char *var_local_rwr_clients;
+ char *var_smtpd_ehlo_dis_words;
+ char *var_smtpd_ehlo_dis_maps;
++char *var_smtpd_ident_lookup;
+
+ char *var_smtpd_tls_level;
+ bool var_smtpd_use_tls;
+@@ -1329,6 +1330,11 @@
+ int smtpd_input_transp_mask;
+
+ /*
++ * Hosts that should be ident-queried
++ */
++NAMADR_LIST *smtpd_ident_lookup;
++
++ /*
+ * Forward declarations.
+ */
+ static void helo_reset(SMTPD_STATE *);
+@@ -2950,10 +2956,18 @@
+ * intermediate proxy.
+ */
+ if (!proxy || state->xforward.flags == 0) {
+- out_fprintf(out_stream, REC_TYPE_NORM,
+- "Received: from %s (%s [%s])",
+- state->helo_name ? state->helo_name : state->name,
+- state->name, state->rfc_addr);
++ if (namadr_list_match(smtpd_ident_lookup, state->name, state->addr)) {
++ out_fprintf(out_stream, REC_TYPE_NORM,
++ "Received: from %s (%s [%s] ident=%s)",
++ state->helo_name ? state->helo_name : state->name,
++ state->name, state->rfc_addr,
++ state->ident_user);
++ } else {
++ out_fprintf(out_stream, REC_TYPE_NORM,
++ "Received: from %s (%s [%s])",
++ state->helo_name ? state->helo_name : state->name,
++ state->name, state->rfc_addr);
++ }
+
+ #define VSTRING_STRDUP(s) vstring_strcpy(vstring_alloc(strlen(s) + 1), (s))
+
+@@ -4954,6 +4968,9 @@
+ xclient_hosts = namadr_list_init(MATCH_FLAG_RETURN, var_xclient_hosts);
+ xforward_hosts = namadr_list_init(MATCH_FLAG_RETURN, var_xforward_hosts);
+ hogger_list = namadr_list_init(MATCH_FLAG_RETURN, var_smtpd_hoggers);
++ smtpd_ident_lookup =
++ namadr_list_init(match_parent_style(VAR_SMTPD_IDENT_LOOKUP),
++ var_smtpd_ident_lookup);
+
+ /*
+ * Open maps before dropping privileges so we can read passwords etc.
+@@ -5382,6 +5399,7 @@
+ VAR_MILT_V, DEF_MILT_V, &var_milt_v, 1, 0,
+ VAR_STRESS, DEF_STRESS, &var_stress, 0, 0,
+ VAR_REJECT_REPLY_MSG_ACCESS_DENIED, DEF_REJECT_REPLY_MSG_ACCESS_DENIED, &var_reject_reply_msg_access_denied, 1, 0,
++ VAR_SMTPD_IDENT_LOOKUP, DEF_SMTPD_IDENT_LOOKUP, &var_smtpd_ident_lookup, 0, 0,
+ VAR_UNV_FROM_WHY, DEF_UNV_FROM_WHY, &var_unv_from_why, 0, 0,
+ VAR_UNV_RCPT_WHY, DEF_UNV_RCPT_WHY, &var_unv_rcpt_why, 0, 0,
+ VAR_REJECT_TMPF_ACT, DEF_REJECT_TMPF_ACT, &var_reject_tmpf_act, 1, 0,
+--- postfix-2.9.0/src/smtpd/smtpd_peer.c.orig 2012-02-04 19:34:17.294233547 +0100
++++ postfix-2.9.0/src/smtpd/smtpd_peer.c 2012-02-04 19:40:48.203777370 +0100
+@@ -98,6 +98,7 @@
+
+ #include <sys_defs.h>
+ #include <sys/socket.h>
++#include <sys/types.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ #include <stdio.h> /* strerror() */
+@@ -117,6 +118,7 @@
+
+ /* Global library. */
+
++#include <namadr_list.h>
+ #include <mail_proto.h>
+ #include <valid_mailhost_addr.h>
+ #include <mail_params.h>
+@@ -125,6 +127,8 @@
+
+ #include "smtpd.h"
+
++extern NAMADR_LIST *smtpd_ident_lookup;
++
+ /* smtpd_peer_init - initialize peer information */
+
+ void smtpd_peer_init(SMTPD_STATE *state)
+@@ -132,6 +136,9 @@
+ const char *myname = "smtpd_peer_init";
+ SOCKADDR_SIZE sa_length;
+ struct sockaddr *sa;
++ struct sockaddr_in serv_sin;
++ char *ident_user = NULL;
++ SOCKADDR_SIZE sa_len;
+ INET_PROTO_INFO *proto_info = inet_proto_info();
+
+ sa = (struct sockaddr *) & (state->sockaddr);
+@@ -171,6 +178,7 @@
+ state->addr_family = AF_UNSPEC;
+ state->name_status = SMTPD_PEER_CODE_PERM;
+ state->reverse_name_status = SMTPD_PEER_CODE_PERM;
++ state->ident_user = mystrdup("NO-USER");
+ state->port = mystrdup(CLIENT_PORT_UNKNOWN);
+ }
+
+@@ -342,6 +350,7 @@
+ if (aierr) {
+ msg_warn("hostname %s does not resolve to address %s: %s",
+ state->name, state->addr, MAI_STRERROR(aierr));
++ state->ident_user = mystrdup("NO-USER");
+ REJECT_PEER_NAME(state, (TEMP_AI_ERROR(aierr) ?
+ SMTPD_PEER_CODE_TEMP : SMTPD_PEER_CODE_FORGED));
+ } else {
+@@ -363,6 +372,20 @@
+ freeaddrinfo(res0);
+ }
+ }
++
++ if (namadr_list_match(smtpd_ident_lookup, state->name, state->addr)) {
++ /* If getsockname fails, just forget it */
++ sa_len = sizeof(serv_sin);
++ if (getsockname(vstream_fileno(state->client), (struct sockaddr *)&serv_sin, &sa_len) >= 0) {
++ ident_user = smtpd_ident((struct sockaddr_in *)sa, &serv_sin);
++ if (ident_user == NULL)
++ state->ident_user = mystrdup("NO-USER");
++ else
++ state->ident_user = ident_user;
++ } else
++ msg_warn("getsockname failed while doing ident lookup: %s", strerror(errno));
++ } else
++ state->ident_user = mystrdup("NO-USER");
+ }
+
+ /*
+@@ -383,6 +406,7 @@
+ state->name_status = SMTPD_PEER_CODE_OK;
+ state->reverse_name_status = SMTPD_PEER_CODE_OK;
+ state->port = mystrdup("0"); /* XXX bogus. */
++ state->ident_user = mystrdup("NO-USER");
+ }
+
+ /*
+@@ -401,5 +425,6 @@
+ myfree(state->addr);
+ myfree(state->namaddr);
+ myfree(state->rfc_addr);
++ myfree(state->ident_user);
+ myfree(state->port);
+ }
--- /dev/null
+--- postfix-2.3.0/conf/dynamicmaps.cf~ 2006-07-25 13:36:17.245609587 +0300
++++ postfix-2.3.0/conf/dynamicmaps.cf 2006-07-25 13:37:00.056561114 +0300
+@@ -6,4 +6,4 @@
+ #
+ #type location of .so file name of open function
+ #==== ================================ =====================
+-* /usr/lib/postfix/dict_%s.so dict_%s_open
++* /usr/lib64/postfix/dict_%s.so dict_%s_open
--- /dev/null
+diff -ur postfix-2.7.1/src/dns/Makefile.in postfix-2.7.1-libs/src/dns/Makefile.in
+--- postfix-2.7.1/src/dns/Makefile.in 2010-11-08 20:14:18.394139054 +0100
++++ postfix-2.7.1-libs/src/dns/Makefile.in 2010-11-08 20:12:39.300139053 +0100
+@@ -31,7 +31,7 @@
+ root_tests:
+
+ $(LIB): $(OBJS)
+- gcc -shared -Wl,-soname,libpostfix-dns.so.1 -o $(LIB) $(OBJS)
++ gcc -shared -Wl,-soname,libpostfix-dns.so.1 -o $(LIB) $(OBJS) $(LIBS) -lresolv
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)
+diff -ur postfix-2.7.1/src/global/Makefile.in postfix-2.7.1-libs/src/global/Makefile.in
+--- postfix-2.7.1/src/global/Makefile.in 2010-11-08 20:14:18.424139054 +0100
++++ postfix-2.7.1-libs/src/global/Makefile.in 2010-11-08 20:10:05.004139060 +0100
+@@ -120,7 +120,7 @@
+ test: $(TESTPROG)
+
+ $(LIB): $(OBJS)
+- gcc -shared -Wl,-soname,libpostfix-global.so.1 -o $(LIB) $(OBJS)
++ gcc -shared -Wl,-soname,libpostfix-global.so.1 -o $(LIB) $(OBJS) $(LIBS)
+
+ $(LDAPSO): dict_ldap.o $(LIB)
+ gcc -shared -Wl,-soname,dict_ldap.so -o $@ $? -lldap -llber -L../../lib -lutil -L. -lglobal
+diff -ur postfix-2.7.1/src/master/Makefile.in postfix-2.7.1-libs/src/master/Makefile.in
+--- postfix-2.7.1/src/master/Makefile.in 2010-11-08 20:14:18.400139054 +0100
++++ postfix-2.7.1-libs/src/master/Makefile.in 2010-11-08 20:10:24.072139054 +0100
+@@ -39,7 +39,7 @@
+ root_tests:
+
+ $(LIB): $(LIB_OBJ)
+- gcc -shared -Wl,-soname,libpostfix-master.so.1 -o $(LIB) $(LIB_OBJ)
++ gcc -shared -Wl,-soname,libpostfix-master.so.1 -o $(LIB) $(LIB_OBJ) $(LIBS)
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)/$(LIB)
+diff -ur postfix-2.7.1/src/util/Makefile.in postfix-2.7.1-libs/src/util/Makefile.in
+--- postfix-2.7.1/src/util/Makefile.in 2010-11-08 20:14:18.465139054 +0100
++++ postfix-2.7.1-libs/src/util/Makefile.in 2010-11-08 20:12:49.982139058 +0100
+@@ -126,7 +126,7 @@
+ gcc -shared -Wl,-soname,dict_pcre.so -o $@ $? -lpcre -L. -lutil
+
+ $(LIB): $(OBJS)
+- gcc -shared -Wl,-soname,libpostfix-util.so.1 -o $(LIB) $(OBJS) -ldl
++ gcc -shared -Wl,-soname,libpostfix-util.so.1 -o $(LIB) $(OBJS) -ldl -lcdb -lnsl -ldb
+
+ $(LIB_DIR)/$(LIB): $(LIB)
+ cp $(LIB) $(LIB_DIR)
--- /dev/null
+--- postfix-2.5.1/src/util/Makefile.in.orig 2008-04-01 08:29:37.168090190 +0200
++++ postfix-2.5.1/src/util/Makefile.in 2008-04-01 08:30:10.665787970 +0200
+@@ -118,7 +118,7 @@
+
+ test: $(TESTPROG)
+
+-$(PCRESO): dict_pcre.o
++$(PCRESO): dict_pcre.o libutil.a
+ gcc -shared -Wl,-soname,dict_pcre.so -o $@ $? -lpcre -L. -lutil
+
+ $(LIB): $(OBJS)
--- /dev/null
+--- postfix-2.2.2/conf/master.cf.orig 2005-01-24 20:12:46.000000000 +0100
++++ postfix-2.2.2/conf/master.cf 2005-04-26 11:46:51.000000000 +0200
+@@ -60,14 +60,14 @@
+ # Also specify in main.cf: cyrus_destination_recipient_limit=1
+ #
+ #cyrus unix - n n - - pipe
+-# user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
++# user=cyrus argv=/usr/lib/cyrus/deliver -e -r ${sender} -m ${extension} ${user}
+ #
+ # ====================================================================
+ #
+ # Old example of delivery via Cyrus.
+ #
+ #old-cyrus unix - n n - - pipe
+-# flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
++# flags=R user=cyrus argv=/usr/lib/cyrus/deliver -e -m ${extension} ${user}
+ #
+ # ====================================================================
+ #
--- /dev/null
+--- postfix-2.8.3/src/global/scache_clnt.c.orig 2011-05-17 14:24:55.245798704 +0200
++++ postfix-2.8.3/src/global/scache_clnt.c 2011-05-17 14:24:26.382381790 +0200
+@@ -414,7 +414,7 @@
+ sp->scache->size = scache_clnt_size;
+ sp->scache->free = scache_clnt_free;
+
+- service = concatenate("local:private/", server, (char *) 0);
++ service = concatenate("local:private/", var_scache_service, (char *) 0);
+ sp->auto_clnt = auto_clnt_create(service, timeout, idle_limit, ttl_limit);
+ myfree(service);
+
--- /dev/null
+diff -ur postfix-2.7.0/src/virtual/maildir.c postfix-2.7.0-bg/src/virtual/maildir.c
+--- postfix-2.7.0/src/virtual/maildir.c 2010-04-15 16:46:03.766130197 +0200
++++ postfix-2.7.0-bg/src/virtual/maildir.c 2010-04-15 16:55:02.496126981 +0200
+@@ -65,6 +65,7 @@
+
+ /* Patch library. */
+
++#include <stdint.h>
+ #include <sys/types.h> /* opendir(3), stat(2) */
+ #include <sys/stat.h> /* stat(2) */
+ #include <dirent.h> /* opendir(3) */
+@@ -98,14 +99,14 @@
+ * Returns the size of all mails as read from maildirsize,
+ * zero if it couldn't read the file.
+ */
+-static long read_maildirsize(char *filename, long *sumptr, long *countptr)
++static long read_maildirsize(char *filename, int64_t *sumptr, int64_t *countptr)
+ {
+ char *myname = "read_maildirsize";
+ struct stat statbuf;
+ VSTREAM *sizefile;
+ char *p;
+ int len, first;
+- long sum = 0, count = 0, ret_value = -1;
++ int64_t sum = 0, count = 0, ret_value = -1;
+
+ if (msg_verbose)
+ msg_info("%s: we will use sizefile = '%s'", myname, filename);
+@@ -136,7 +137,7 @@
+ first = 1;
+
+ while (*p) {
+- long n = 0, c = 0;
++ int64_t n = 0, c = 0;
+ char *q = p;
+
+ while (*p) {
+@@ -151,7 +152,7 @@
+ continue;
+ }
+
+- if (sscanf(q, "%ld %ld", &n, &c) == 2) {
++ if (sscanf(q, "%lld %lld", &n, &c) == 2) {
+ sum += n;
+ count += c;
+ /* if (msg_verbose)
+@@ -179,7 +180,7 @@
+ ret_value = -1;
+ } else {
+ if (msg_verbose)
+- msg_info("%s: we will return Maildir size = %ld, count = %ld", myname, *sumptr, *countptr);
++ msg_info("%s: we will return Maildir size = %lld, count = %lld", myname, *sumptr, *countptr);
+
+ ret_value = sum;
+ }
+@@ -200,7 +201,7 @@
+ * Returns the size given in ",S=<size>" in the filename,
+ * zero if it cannot find ",S=<size>" in the filename.
+ */
+-static long maildir_parsequota(const char *n)
++static int64_t maildir_parsequota(const char *n)
+ {
+ const char *o;
+ int yes = 0;
+@@ -225,7 +226,7 @@
+ }
+
+ if (yes) {
+- long s = 0;
++ int64_t s = 0;
+
+ while (*o >= '0' && *o <= '9')
+ s = s*10 + (*o++ - '0');
+@@ -252,11 +253,11 @@
+ * Returns the sum of the sizes of all measurable files,
+ * zero if the directory could not be opened.
+ */
+-static long check_dir_size(char *dirname, long *countptr)
++static int64_t check_dir_size(char *dirname, int64_t *countptr)
+ {
+ char *myname = "check_dir_size";
+ DIR *dir;
+- long sum = 0;
++ int64_t sum = 0;
+ struct dirent *ent;
+ struct stat statbuf;
+
+@@ -277,7 +278,7 @@
+
+ while ((ent = readdir(dir)) != NULL) {
+ char *name = ent->d_name;
+- long tmpsum = 0;
++ int64_t tmpsum = 0;
+ VSTRING *buffer;
+
+ /* do not count dot a double-dot dirs */
+@@ -324,7 +325,7 @@
+ }
+ if ((statbuf.st_mode & S_IFREG) != 0) {
+ if (strcmp(dirname + strlen(dirname) - 3, "new") == 0 || strcmp(dirname + strlen(dirname) - 3, "cur") == 0 || strcmp(dirname + strlen(dirname) - 3, "tmp") == 0) {
+- sum += (long) statbuf.st_size;
++ sum += (int64_t) statbuf.st_size;
+ (*countptr)++;
+ }
+ }
+@@ -338,7 +339,7 @@
+ closedir(dir);
+
+ if (msg_verbose)
+- msg_info("%s: full scan done: dir=%s sum=%ld count=%ld", myname, dirname, sum, *countptr);
++ msg_info("%s: full scan done: dir=%s sum=%lld count=%lld", myname, dirname, sum, *countptr);
+
+ return sum;
+ }
+@@ -456,9 +457,9 @@
+ char *sizefilename = (char *) 0; /* Maildirsize file name. */
+ VSTRING *filequota; /* Quota setting from the maildirsize file. */
+ VSTREAM *sizefile; /* Maildirsize file handle. */
+- long n = 0; /* Limit in long integer format. */
+- long saved_count = 0; /* The total number of files. */
+- long saved_size = 0; /* The total quota of all files. */
++ int64_t n = 0; /* Limit in long integer format. */
++ int64_t saved_count = 0; /* The total number of files. */
++ int64_t saved_size = 0; /* The total quota of all files. */
+ struct stat mail_stat; /* To check the size of the mail to be written. */
+ struct stat sizefile_stat; /* To check the size of the maildirsize file. */
+ time_t tm; /* To check the age of the maildirsize file. */
+@@ -541,7 +542,7 @@
+ * warn the user, else use the value directly as the maildir limit.
+ */
+ if (*var_virt_mailbox_limit_maps != 0 && (limit_res = mail_addr_find(virtual_mailbox_limit_maps, state.msg_attr.user, (char **) NULL)) != 0) {
+- n = atol(limit_res);
++ n = strtoll(limit_res, NULL, 10);
+ if (n > 0) {
+ if ((n < var_message_limit) && (!var_virt_mailbox_limit_override)) {
+ n = var_virt_mailbox_limit;
+@@ -552,13 +553,13 @@
+ }
+ else {
+ if (msg_verbose)
+- msg_info("%s: set virtual maildir limit size for %s to %ld",
++ msg_info("%s: set virtual maildir limit size for %s to %lld",
+ myname, usr_attr.mailbox, n);
+ }
+ }
+ else if (n == 0) {
+ if (msg_verbose)
+- msg_info("%s: set virtual maildir limit size for %s to %ld",
++ msg_info("%s: set virtual maildir limit size for %s to %lld",
+ myname, usr_attr.mailbox, n);
+ }
+ else {
+@@ -580,7 +581,7 @@
+ x >= 0 = reading successfully finished - sum si returned, so sum size of Maildir was 0 or more */
+ if (!var_virt_mailbox_limit_inbox && var_virt_maildir_extended && read_maildirsize(sizefilename, &saved_size, &saved_count) >= 0) {
+ if (msg_verbose)
+- msg_info("%s: maildirsize used=%s sum=%ld count=%ld", myname, sizefilename, saved_size, saved_count);
++ msg_info("%s: maildirsize used=%s sum=%lld count=%lld", myname, sizefilename, saved_size, saved_count);
+ } else {
+ if (msg_verbose)
+ msg_info("%s: var_virt_mailbox_limit == 1 OR var_virt_maildir_extended == 0 OR read_maildidrsize() returned value x < 0 as saying something failed", myname);
+@@ -693,7 +694,7 @@
+ */
+ if (stat(tmpfile, &mail_stat) == 0) {
+ if (n != 0) {
+- saved_size += (long) mail_stat.st_size;
++ saved_size += (int64_t) mail_stat.st_size;
+ saved_count++;
+ }
+ if (var_virt_maildir_extended) {
+@@ -710,7 +711,7 @@
+ */
+ if (saved_size > n) {
+ mail_copy_status = MAIL_COPY_STAT_WRITE;
+- if (((long) mail_stat.st_size > n) || (var_virt_overquota_bounce))
++ if (((int64_t) mail_stat.st_size > n) || (var_virt_overquota_bounce))
+ errno = EFBIG;
+ else
+ errno = EDQUOT;
+@@ -889,7 +890,7 @@
+ filequota = vstring_alloc(128);
+ vstring_get_null_bound(filequota, sizefile, 127);
+ vstream_fclose(sizefile);
+- if (atol(vstring_export(filequota)) != n)
++ if (strtoll(vstring_export(filequota), NULL, 10) != n)
+ unlink(sizefilename);
+ }
+
+@@ -909,13 +910,13 @@
+
+ /* If the creation worked, write to the file, otherwise just give up. */
+ if (sizefile) {
+- vstream_fprintf(sizefile, "%ldS\n%ld %ld\n", n, saved_size, saved_count);
++ vstream_fprintf(sizefile, "%lldS\n%lld %lld\n", n, saved_size, saved_count);
+ vstream_fclose(sizefile);
+ }
+ }
+ else {
+ /* We opened maildirsize, so let's just append this transaction and close it. */
+- vstream_fprintf(sizefile, "%ld 1\n", (long) mail_stat.st_size);
++ vstream_fprintf(sizefile, "%lld 1\n", (int64_t) mail_stat.st_size);
+ vstream_fclose(sizefile);
+ }
+
--- /dev/null
+#
+# @(#)aliases 8.2 (Berkeley) 3/5/94
+#
+# Aliases in this file will NOT be expanded in the header from
+# Mail, but WILL be visible over networks or from /bin/mail.
+#
+# >>>>>>>>>> The program "newaliases" must be run after
+# >> NOTE >> this file is updated for any changes to
+# >>>>>>>>>> show through to postfix.
+#
+
+# Basic system aliases -- these MUST be present.
+MAILER-DAEMON: postmaster
+postmaster: root
+
+# General redirections for pseudo accounts.
+bin: root
+daemon: root
+games: root
+ingres: root
+nobody: root
+system: root
+toor: root
+uucp: root
+
+# Well-known aliases.
+manager: root
+dumper: root
+operator: root
+
+# trap decode to catch security attacks
+decode: root
+
+# Standard users added by PLD:
+stats: root
+
+# Person who should get root's mail
+#root: marc
--- /dev/null
+#!/bin/sh
+#
+# Check for problems with Postfix
+
+/usr/sbin/postfix check
\ No newline at end of file
--- /dev/null
+#!/bin/sh
+#
+# postfix This shell script takes care of starting and stopping
+# postfix.
+#
+# chkconfig: 345 80 20
+#
+# description: Postfix is a Mail Transport Agent, which is the program \
+# that moves mail from one machine to another.
+
+
+# Source function library
+. /etc/rc.d/init.d/functions
+
+# Get network config
+. /etc/sysconfig/network
+
+# Get service config
+[ -f /etc/sysconfig/postfix ] && . /etc/sysconfig/postfix
+
+# Check that networking is up.
+networking_check() {
+ if is_yes "${NETWORKING}"; then
+ if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status ]; then
+ msg_network_down "Postfix"
+ exit 1
+ fi
+ else
+ exit 0
+ fi
+}
+
+start() {
+ if [ -f /var/lock/subsys/postfix ]; then
+ msg_already_running "Postfix"
+ return
+ fi
+
+ local msg
+ msg_starting "Postfix"
+ busy
+ _daemon_set_ulimits
+ msg=$(nice -n ${SERVICE_RUN_NICE_LEVEL:-${DEFAULT_SERVICE_RUN_NICE_LEVEL:-0}} /usr/sbin/postfix start 2>&1)
+ RETVAL=$?
+ if [ $RETVAL -eq 0 ]; then
+ ok
+ touch /var/lock/subsys/postfix
+ else
+ fail
+ echo >&2 "$msg"
+ fi
+}
+
+stop() {
+ if [ ! -f /var/lock/subsys/postfix ]; then
+ msg_not_running "Postfix"
+ return
+ fi
+
+ local msg
+ msg_stopping "Postfix"
+ busy
+ msg=$(/usr/sbin/postfix stop 2>&1)
+ if [ $? -eq 0 ]; then
+ ok
+ else
+ fail
+ echo >&2 "$msg"
+ fi
+ rm -f /var/lock/subsys/postfix >/dev/null 2>&1
+}
+
+reload() {
+ if [ ! -f /var/lock/subsys/postfix ]; then
+ msg_not_running "Postfix"
+ RETVAL=7
+ return
+ fi
+
+ local msg
+ msg_reloading "Postfix"
+ busy
+ msg=$(/usr/sbin/postfix reload 2>&1)
+ RETVAL=$?
+ if [ $RETVAL -eq 0 ]; then
+ ok
+ else
+ fail
+ echo >&2 "$msg"
+ RETVAL=7
+ fi
+}
+
+RETVAL=0
+# See how we were called.
+case "$1" in
+ start)
+ networking_check
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ networking_check
+ stop
+ start
+ ;;
+ reload|force-reload)
+ networking_check
+ reload
+ ;;
+ rebuilddb)
+ standard_db="access canonical relocated transport virtual"
+ extra_db=$(ls -1 /etc/mail/*.db 2> /dev/null | grep -Ev '/(access|canonical|relocated|transport|virtual|aliases)\.db$')
+
+ echo -n "Rebuilding databases: "
+ for base in $standard_db $extra_db; do
+ db=$(basename "$base" .db)
+
+ if [ -f /etc/mail/$db ]; then
+ echo -n "$db "
+ /usr/sbin/postmap hash:/etc/mail/$db < /etc/mail/$db
+ fi
+ done
+ echo "...DONE"
+
+ echo -n "Rebuilding aliases database"
+ /usr/bin/newaliases
+ echo "...DONE"
+ ;;
+ status)
+ status master
+ exit $?
+ ;;
+ *)
+ msg_usage "$0 {start|stop|restart|reload|force-reload|rebuilddb|status}"
+ exit 3
+esac
+
+exit $RETVAL
--- /dev/null
+check process postfix with pidfile /var/spool/postfix/pid/master.pid
+ group mail
+ start program = "/etc/rc.d/init.d/postfix start"
+ stop program = "/etc/rc.d/init.d/postfix stop"
+ if failed port 25 protocol smtp then restart
+ if 5 restarts within 5 cycles then timeout
+ depends on postfix_rc
+
+check file postfix_rc with path /etc/rc.d/init.d/postfix
+ group mail
+ if failed checksum then unmonitor
+ if failed permission 754 then unmonitor
+ if failed uid root then unmonitor
+ if failed gid root then unmonitor
--- /dev/null
+#%PAM-1.0
+auth required pam_listfile.so item=user sense=deny file=/etc/security/blacklist.smtp onerr=succeed
+auth include system-auth
+account required pam_nologin.so
+account include system-auth
--- /dev/null
+pwcheck_method:saslauthd
--- /dev/null
+[Unit]
+Description=Postfix Mail Transport Agent
+After=syslog.target network.target
+Conflicts=sendmail.service exim.service
+
+[Service]
+Type=forking
+PIDFile=/var/spool/postfix/pid/master.pid
+ExecStart=/usr/sbin/postfix start
+ExecReload=/usr/sbin/postfix reload
+ExecStop=/usr/sbin/postfix stop
+
+[Install]
+WantedBy=multi-user.target
--- /dev/null
+#
+# Conditional build:
+%bcond_without ldap # without LDAP map module
+%bcond_without mysql # without MySQL map module
+%bcond_without pgsql # without PostgreSQL map module
+%bcond_without sqlite # without SQLite map module
+%bcond_without sasl # without SMTP AUTH support
+%bcond_without ssl # without SSL/TLS support
+%bcond_without cdb # without cdb map support
+%if "%{pld_release}" == "th"
+%bcond_without vda # without VDA patch
+%else
+%bcond_with vda # with VDA patch
+%endif
+%bcond_with hir # with Beeth's header_if_reject patch
+%bcond_with tcp # with unofficial tcp: lookup table
+%if "%{pld_release}" == "ac"
+%bcond_with epoll # enable epoll for 2.6 kernels
+# there didn't exist x86_64 2.4 kernel in PLD, so can safely enable epoll
+%ifarch %{x8664}
+%define with_epoll 1
+%endif
+%else
+%bcond_without epoll # disable epoll for 2.4 kernels
+%endif
+
+%define vda_ver v11-2.9.1
+Summary: Postfix Mail Transport Agent
+Summary(cs.UTF-8): Postfix - program pro přepravu pošty (MTA)
+Summary(es.UTF-8): Postfix - Un MTA (Mail Transport Agent) de alto desempeño
+Summary(fr.UTF-8): Agent de transport de courrier Postfix
+Summary(pl.UTF-8): Serwer SMTP Postfix
+Summary(pt_BR.UTF-8): Postfix - Um MTA (Mail Transport Agent) de alto desempenho
+Summary(sk.UTF-8): Agent prenosu pošty Postfix
+Name: postfix
+Version: 2.9.6
+Release: 1
+Epoch: 2
+License: distributable
+Group: Networking/Daemons/SMTP
+Source0: ftp://ftp.porcupine.org/mirrors/postfix-release/official/%{name}-%{version}.tar.gz
+# Source0-md5: 62eba08ce4acfa6b421e8fa88f2422d1
+Source1: %{name}.aliases
+Source2: %{name}.cron
+Source3: %{name}.init
+Source4: %{name}.sysconfig
+Source5: %{name}.sasl
+Source6: %{name}.pamd
+Source7: http://vda.sourceforge.net/VDA/%{name}-vda-%{vda_ver}.patch
+# Source7-md5: a54a21428de5eeae91b4bb670976e37a
+Source8: %{name}-bounce.cf.pl
+# http://postfix.state-of-mind.de/bounce-templates/bounce.de-DE.cf
+Source9: %{name}-bounce.cf.de
+Source10: %{name}.monitrc
+Source11: %{name}-vda-bigquota.patch
+#Source11: http://vda.sourceforge.net/VDA/%{name}-%{vda_ver}-vda-ng-bigquota.patch.gz
+# -ource11-md5: d46103195b43ec5784ea2c166b238f71
+Source12: %{name}.service
+Patch0: %{name}-config.patch
+Patch1: %{name}-conf_msg.patch
+Patch2: %{name}-dynamicmaps.patch
+Patch3: %{name}-master.cf_cyrus.patch
+# from http://akson.sgh.waw.pl/~chopin/unix/postfix-2.1.5-header_if_reject.diff
+Patch4: %{name}-header_if_reject.patch
+Patch5: %{name}-ident.patch
+Patch6: %{name}-lib64.patch
+Patch7: %{name}-conf.patch
+Patch8: %{name}-dictname.patch
+Patch9: %{name}-make-jN.patch
+Patch10: %{name}-link.patch
+Patch11: %{name}-scache_clnt.patch
+Patch12: format-security.patch
+URL: http://www.postfix.org/
+%{?with_sasl:BuildRequires: cyrus-sasl-devel}
+BuildRequires: db-devel
+# getifaddrs() with IPv6 support
+BuildRequires: glibc-devel >= 6:2.3.4
+%{?with_mysql:BuildRequires: mysql-devel}
+%{?with_ldap:BuildRequires: openldap-devel >= 2.0.12}
+%{?with_ssl:BuildRequires: openssl-devel >= 0.9.7l}
+BuildRequires: pcre-devel
+BuildRequires: perl-base
+%{?with_pgsql:BuildRequires: postgresql-devel}
+BuildRequires: rpm >= 4.4.9-56
+BuildRequires: rpmbuild(macros) >= 1.644
+BuildRequires: sed >= 4.0
+%{?with_sqlite:BuildRequires: sqlite3-devel}
+%{?with_cdb:BuildRequires: tinycdb-devel}
+%{?with_mysql:BuildRequires: zlib-devel}
+Requires(post): /bin/hostname
+Requires(post,postun): /sbin/ldconfig
+Requires(post,preun): /sbin/chkconfig
+Requires(postun): /usr/sbin/groupdel
+Requires(postun): /usr/sbin/userdel
+Requires(pre): /bin/id
+Requires(pre): /usr/bin/getgid
+Requires(pre): /usr/sbin/groupadd
+Requires(pre): /usr/sbin/useradd
+Requires: /sbin/chkconfig
+Requires: diffutils
+Requires: findutils
+Requires: rc-scripts
+Requires: sed
+%{?with_cdb:Requires:tinycdb}
+Requires: systemd-units >= 38
+Suggests: cyrus-sasl-saslauthd
+Provides: group(postfix)
+Provides: smtpdaemon
+Provides: user(postfix)
+Obsoletes: smtpdaemon
+BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%description
+Postfix is attempt to provide an alternative to the widely-used
+Sendmail program. Postfix attempts to be fast, easy to administer, and
+hopefully secure, while at the same time being sendmail compatible
+enough to not upset your users. This version has IPv6 support.
+
+%description -l es.UTF-8
+Postfix es una alternativa para el mundialmente utilizado sendmail. Si
+desea tener un servidor SMTP *rápido*, debe instalar este paquete.
+
+%description -l fr.UTF-8
+Postfix (voir http://www.postfix.org/) se veut une alternative à
+sendmail, responsable de l'acheminement de 70% des courriers
+électroniques sur Internet. IBM en a suppotré le développement, mais
+ne contrôle pas son évolution. Le but est d'installer Postfix sur le
+plus grand nombre de systèmes possible. Dans cette optique, il a été
+écrit pour être totalement sous le contrôle de l'utilisateur.
+
+%description -l it.UTF-8
+Postfix (http://www.postfix.org/) e' un'alternativa al programma
+sendmail utilizzato per la gestione del 70 per cento della posta
+Internet.
+
+Seppur IBM supporti lo sviluppo di Postfix, non controlla la sua
+evoluzione.
+
+Consultate la pagine web http://www.moongroup.com/how-to.phtml nella
+quale troverete le indicazioni per una corretta installazione e
+configurazione di questo programma.
+
+%description -l pl.UTF-8
+Postfix jest próbą dostarczenia alternatywnego MTA w stosunku do
+szeroko używanego sendmaila. Postfix w zamierzeniu ma być szybki,
+łatwy w administrowaniu, bezpieczny oraz ma być na tyle kompatybilny z
+sendmailem by nie denerwować użytkowników. Ta wersja obsługuje IPv6.
+
+%description -l pt_BR.UTF-8
+O Postfix é uma alternativa para o mundialmente utilizado sendmail. Se
+você deseja um servidor SMTP *rápido*, instale este pacote.
+
+%description -l sk.UTF-8
+Postfix (pozri http://www.postfix.org/) má za cieľ byť alternatívou k
+široko rozšírenému programu sendmail, zodpovednému za 70% všetkej
+elektronickej pošty doručenej na Internete.
+
+Aj keď IBM podporovala vývoj Postfixu, zdržiava sa vplyvu na jeho
+vývoj. Cieľom je inštalácia Postfixu na čo najväčšom počte systémov.
+Do tohoto momentu je softvér poskytovaný bez ovplyvňovania, takže sa
+môže vyvíjať podľa jeho používateľov.
+
+Určite si prečítajte http://www.moongroup.com/how-to.phtml, kde sú
+popísané kroky potrebné pred a po inštalácii Postfixu.
+
+%package devel
+Summary: Postfix loadable modules development package
+Summary(pl.UTF-8): Pakiet dla programistów ładowanych modułów do postfiksa
+Group: Development/Libraries
+Requires: %{name} = %{epoch}:%{version}-%{release}
+
+%description devel
+Header files to build additional map types for Postfix.
+
+%description devel -l pl.UTF-8
+Pliki nagłówkowe do tworzenia dodatkowych typów map dla Postfiksa.
+
+%package dict-ldap
+Summary: LDAP map support for Postfix
+Summary(pl.UTF-8): Obsługa map LDAP dla Postfiksa
+Group: Networking/Daemons/SMTP
+Requires: %{name} = %{epoch}:%{version}-%{release}
+Requires: openldap >= 2.3.6
+
+%description dict-ldap
+This package provides support for LDAP maps in Postfix.
+
+%description dict-ldap -l pl.UTF-8
+Ten pakiet dodaje obsługę map LDAP do Postfiksa.
+
+%package dict-mysql
+Summary: MySQL map support for Postfix
+Summary(pl.UTF-8): Obsługa map MySQL dla Postfiksa
+Group: Networking/Daemons/SMTP
+Requires: %{name} = %{epoch}:%{version}-%{release}
+
+%description dict-mysql
+This package provides support for MySQL maps in Postfix.
+
+%description dict-mysql -l pl.UTF-8
+Ten pakiet dodaje obsługę map MySQL do Postfiksa.
+
+%package dict-pcre
+Summary: PCRE map support for Postfix
+Summary(pl.UTF-8): Obsługa map PCRE dla Postfiksa
+Group: Networking/Daemons/SMTP
+Requires: %{name} = %{epoch}:%{version}-%{release}
+
+%description dict-pcre
+This package provides support for PCRE maps in Postfix.
+
+%description dict-pcre -l pl.UTF-8
+Ten pakiet dodaje obsługę map PCRE do Postfiksa.
+
+%package dict-pgsql
+Summary: PostgreSQL map support for Postfix
+Summary(pl.UTF-8): Obsługa map PostgreSQL dla Postfiksa
+Group: Networking/Daemons/SMTP
+Requires: %{name} = %{epoch}:%{version}-%{release}
+
+%description dict-pgsql
+This package provides support for PostgreSQL maps in Postfix.
+
+%description dict-pgsql -l pl.UTF-8
+Ten pakiet dodaje obsługę map PostgreSQL do Postfiksa.
+
+%package dict-sqlite
+Summary: SQLite map support for Postfix
+Summary(pl.UTF-8): Obsługa map SQLite dla Postfiksa
+Group: Networking/Daemons/SMTP
+Requires: %{name} = %{epoch}:%{version}-%{release}
+
+%description dict-sqlite
+This package provides support for SQLite maps in Postfix.
+
+%description dict-sqlite -l pl.UTF-8
+Ten pakiet dodaje obsługę map SQLite do Postfiksa.
+
+%package qshape
+Summary: qshape - Print Postfix queue domain and age distribution
+Summary(pl.UTF-8): qshape - wypisywanie rozkładu domen i wieku z kolejki Postfiksa
+Group: Networking/Daemons/SMTP
+Requires: %{name} = %{epoch}:%{version}-%{release}
+
+%description qshape
+The qshape program helps the administrator understand the Postfix
+queue message distribution in time and by sender domain or recipient
+domain. The program needs read access to the queue directories and
+queue files, so it must run as the superuser or the mail_owner
+specified in main.cf (typically postfix).
+
+%description qshape -l pl.UTF-8
+Program qshape pomaga administratorowi zrozumieć rozkład kolejki
+wiadomości Postfiksa w czasie i w zależności od domeny nadawcy lub
+adresata. Program wymaga prawa odczytu do katalogów kolejki i plików
+kolejki, więc musi być uruchamiany przez superużytkownika lub
+użytkownika mail_owner podanego w main.cf (zwykle nazywającego się
+postfix).
+
+%package -n monit-rc-%{name}
+Summary: monit support for Postfix
+Summary(pl.UTF-8): Wsparcie monita dla Postfiksa
+Group: Applications/System
+Requires: %{name} = %{epoch}:%{version}-%{release}
+Requires: monit
+
+%description -n monit-rc-%{name}
+monitrc file for monitoring Postfix.
+
+%description -n monit-rc-%{name} -l pl.UTF-8
+Plik monitrc do monitorowania serwera Postfix.
+
+%prep
+%setup -q
+%if %{with vda}
+cat %{SOURCE7} | %{__patch} -p1 -s
+cat %{SOURCE11} | %{__patch} -p1 -s
+%endif
+
+find -type f | xargs sed -i -e 's|/etc/postfix|/etc/mail|g'
+
+%patch0 -p1
+%patch1 -p0
+%patch2 -p1
+%patch3 -p1
+%{?with_hir:%patch4 -p0}
+%patch5 -p1
+sed -i '/scache_clnt_create/s/server/var_scache_service/' src/global/scache_clnt.c
+%if "%{_lib}" == "lib64"
+%patch6 -p1
+%endif
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%if %{with vda}
+%patch12 -p1
+%endif
+
+%if %{with tcp}
+sed -i 's/ifdef SNAPSHOT/if 1/' src/util/dict_open.c
+%endif
+
+%build
+%{__make} -f Makefile.init makefiles
+%{__make} tidy
+CC="%{__cc}"
+export CC
+%{__make} \
+ DEBUG="" \
+ OPT="%{rpmcflags} %{rpmcppflags} -D_FILE_OFFSET_BITS=64" \
+ %{!?with_ldap:LDAPSO=""} \
+ %{!?with_mysql:MYSQLSO=""} \
+ %{!?with_pgsql:PGSQLSO=""} \
+ CCARGS="%{!?with_epoll:-DNO_EPOLL} %{?with_ldap:-DHAS_LDAP} -DHAS_PCRE %{?with_sasl:-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl} %{?with_mysql:-DHAS_MYSQL -I/usr/include/mysql} %{?with_pgsql:-DHAS_PGSQL} %{?with_ssl:-DUSE_TLS} -DMAX_DYNAMIC_MAPS %{?with_cdb:-DHAS_CDB}" \
+ AUXLIBS="-ldb -lresolv %{?with_sasl:-lsasl} %{?with_ssl:-lssl -lcrypto} %{?with_cdb:-lcdb} -lpcre"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT/etc/{cron.daily,rc.d/init.d,sysconfig,pam.d,security,monit} \
+ $RPM_BUILD_ROOT%{_sysconfdir}/{mail,sasl} \
+ $RPM_BUILD_ROOT{%{_bindir},%{_sbindir},%{_libdir}/postfix,/usr/lib}\
+ $RPM_BUILD_ROOT{%{_includedir}/postfix,%{_mandir}} \
+ $RPM_BUILD_ROOT%{_var}/spool/postfix/{active,corrupt,deferred,maildrop,private,saved,bounce,defer,incoming,pid,public} \
+ $RPM_BUILD_ROOT%{_var}/lib/postfix \
+ $RPM_BUILD_ROOT%{systemdunitdir}
+
+%{__rm} html/Makefile.in conf/{LICENSE,main.cf.default}
+
+install -p bin/* $RPM_BUILD_ROOT%{_sbindir}
+install -p libexec/* $RPM_BUILD_ROOT%{_libdir}/postfix
+ln $RPM_BUILD_ROOT%{_libdir}/postfix/smtp $RPM_BUILD_ROOT%{_libdir}/postfix/lmtp
+ln $RPM_BUILD_ROOT%{_libdir}/postfix/qmgr $RPM_BUILD_ROOT%{_libdir}/postfix/nqmgr
+cp -a conf/* $RPM_BUILD_ROOT%{_sysconfdir}/mail
+sed -e's,^daemon_directory = .*,daemon_directory = %{_libdir}/postfix,' \
+ conf/main.cf > $RPM_BUILD_ROOT%{_sysconfdir}/mail/main.cf
+
+for f in dns global master util ; do
+ cp -a lib/lib${f}.a $RPM_BUILD_ROOT%{_libdir}/libpostfix-${f}.so.1
+ ln -sf lib${f}.so.1 $RPM_BUILD_ROOT%{_libdir}/libpostfix-${f}.so
+done
+install -p lib/dict*.so $RPM_BUILD_ROOT%{_libdir}/postfix
+cp -a include/*.h $RPM_BUILD_ROOT%{_includedir}/postfix
+
+cp -a man/man* $RPM_BUILD_ROOT%{_mandir}
+
+cp -a %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/mail/aliases
+install -p %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.daily/postfix
+install %{SOURCE3} $RPM_BUILD_ROOT/etc/rc.d/init.d/postfix
+cp -a %{SOURCE4} $RPM_BUILD_ROOT/etc/sysconfig/postfix
+cp -a %{SOURCE5} $RPM_BUILD_ROOT%{_sysconfdir}/sasl/smtpd.conf
+cp -a %{SOURCE6} $RPM_BUILD_ROOT/etc/pam.d/smtp
+cp -a %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/mail/bounce.cf.pl
+cp -a %{SOURCE9} $RPM_BUILD_ROOT%{_sysconfdir}/mail/bounce.cf.de
+cp -a %{SOURCE10} $RPM_BUILD_ROOT/etc/monit/%{name}.monitrc
+cp -a %{SOURCE12} $RPM_BUILD_ROOT%{systemdunitdir}/%{name}.service
+install -p auxiliary/rmail/rmail $RPM_BUILD_ROOT%{_bindir}/rmail
+install -p auxiliary/qshape/qshape.pl $RPM_BUILD_ROOT%{_bindir}/qshape
+
+ln -sf %{_sbindir}/sendmail $RPM_BUILD_ROOT%{_bindir}/mailq
+ln -sf %{_sbindir}/sendmail $RPM_BUILD_ROOT%{_bindir}/newaliases
+ln -sf %{_sbindir}/sendmail $RPM_BUILD_ROOT/usr/lib/sendmail
+
+touch $RPM_BUILD_ROOT%{_sysconfdir}/mail/\
+ {aliases,access,canonical,relocated,transport,virtual}{,.db}
+
+touch $RPM_BUILD_ROOT/etc/security/blacklist.smtp
+
+> $RPM_BUILD_ROOT/var/spool/postfix/.nofinger
+
+%{__rm} -r $RPM_BUILD_ROOT%{_sysconfdir}/mail/makedefs.out
+%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/mail/TLS_LICENSE
+
+%{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/mail/{postfix-files,postfix-script,post-install}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+%groupadd -g 62 postfix
+%groupadd -g 63 maildrop
+%useradd -u 62 -d /var/spool/postfix -s /bin/false -c "Postfix User" -g postfix postfix
+
+%post
+/sbin/ldconfig
+if ! grep -q "^postmaster:" %{_sysconfdir}/mail/aliases; then
+ echo "Adding Entry for postmaster in %{_sysconfdir}/mail/aliases" >&2
+ echo "postmaster: root" >>%{_sysconfdir}/mail/aliases
+fi
+if [ "$1" = "1" ]; then
+ # only on installation, not upgrade; set sane defaults
+ # postfix expects gethostname() to return FQDN, which is obviously wrong
+ if ! grep -qE "^my(domain|hostname)" %{_sysconfdir}/mail/main.cf; then
+ domain=$(/bin/hostname -d 2>/dev/null)
+ [ -n "$domain" -a "$domain" != 'localdomain' ] && \
+ postconf -e mydomain="$domain"
+ fi
+else
+ %{_sbindir}/postfix upgrade-configuration
+fi
+
+%{_bindir}/newaliases
+/sbin/chkconfig --add postfix
+%service postfix restart "Postfix Daemon"
+%systemd_post
+
+%preun
+if [ "$1" = "0" ]; then
+ %service postfix stop
+ /sbin/chkconfig --del postfix
+fi
+%systemd_preun
+
+%postun
+/sbin/ldconfig
+if [ "$1" = "0" ]; then
+ %groupremove maildrop
+ %userremove postfix
+ %groupremove postfix
+fi
+%systemd_postun
+
+%files
+%defattr(644,root,root,755)
+%doc html COMPATIBILITY HISTORY LICENSE RELEASE_NOTES* TLS_*
+%doc README_FILES/*README
+%doc examples/smtpd-policy
+%dir %{_sysconfdir}/mail
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/access
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/aliases
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/bounce.cf.default
+%lang(de) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/bounce.cf.de
+%lang(pl) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/bounce.cf.pl
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/canonical
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/generic
+#%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/regexp_table
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/relocated
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/transport
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/virtual
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/header_checks
+#%ghost %{_sysconfdir}/mail/*.db
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/dynamicmaps.cf
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/main.cf
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/master.cf
+%{_sysconfdir}/mail/postfix-wrapper
+%{_sysconfdir}/mail/postmulti-script
+%attr(740,root,root) /etc/cron.daily/postfix
+%attr(754,root,root) /etc/rc.d/init.d/postfix
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/sysconfig/postfix
+%config(noreplace) %verify(not md5 mtime size) /etc/pam.d/smtp
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/security/blacklist.smtp
+%{?with_sasl:%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/sasl/smtpd.conf}
+%attr(755,root,root) %{_libdir}/libpostfix-*.so.*
+%attr(755,root,root) %{_bindir}/mailq
+%attr(755,root,root) %{_bindir}/newaliases
+%attr(755,root,root) %{_bindir}/rmail
+%attr(755,root,root) %{_sbindir}/s*
+%attr(755,root,root) %{_sbindir}/postfix
+%attr(755,root,root) %{_sbindir}/postalias
+%attr(755,root,root) %{_sbindir}/postkick
+%attr(755,root,root) %{_sbindir}/postl*
+%attr(755,root,root) %{_sbindir}/postc*
+%attr(755,root,root) %{_sbindir}/postmap
+%attr(755,root,root) %{_sbindir}/postmulti
+%attr(2755,root,maildrop) %{_sbindir}/postqueue
+%attr(755,root,root) %{_sbindir}/postsuper
+%attr(2755,root,maildrop) %{_sbindir}/postdrop
+%attr(755,root,root) %{_sbindir}/qmqp-sink
+%attr(755,root,root) %{_sbindir}/qmqp-source
+%attr(755,root,root) /usr/lib/sendmail
+%dir %{_libdir}/postfix
+%attr(755,root,root) %{_libdir}/postfix/[!d]*
+%attr(755,root,root) %{_libdir}/postfix/discard
+%attr(755,root,root) %{_libdir}/postfix/dnsblog
+%attr(755,root,root) %dir %{_var}/spool/postfix
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/active
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/bounce
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/corrupt
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/defer
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/deferred
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/incoming
+%attr(1730,postfix,maildrop) %dir %{_var}/spool/postfix/maildrop
+%attr(755,postfix,root) %dir %{_var}/spool/postfix/pid
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/private
+%attr(710,postfix,maildrop) %dir %{_var}/spool/postfix/public
+%attr(700,postfix,root) %dir %{_var}/spool/postfix/saved
+%attr(644,postfix,root) %{_var}/spool/postfix/.nofinger
+%attr(700,postfix,root) %{_var}/lib/postfix
+%{_mandir}/man1/mailq.1*
+%{_mandir}/man1/newaliases.1*
+%{_mandir}/man1/post*.1*
+%{_mandir}/man1/qmqp-*.1*
+%{_mandir}/man1/sendmail.1*
+%{_mandir}/man1/smtp-*.1*
+%{_mandir}/man5/access.5*
+%{_mandir}/man5/aliases.5*
+%{_mandir}/man5/body_checks.5*
+%{_mandir}/man5/bounce.5*
+%{_mandir}/man5/canonical.5*
+%{_mandir}/man5/cidr_table.5*
+%{_mandir}/man5/generic.5*
+%{_mandir}/man5/header_checks.5*
+%{_mandir}/man5/master.5*
+%{_mandir}/man5/memcache_table.5*
+%{_mandir}/man5/nisplus_table.5*
+%{_mandir}/man5/postconf.5*
+%{_mandir}/man5/postfix-wrapper.5*
+%{_mandir}/man5/regexp_table.5*
+%{_mandir}/man5/relocated.5*
+%{_mandir}/man5/tcp_table.5*
+%{_mandir}/man5/transport.5*
+%{_mandir}/man5/virtual.5*
+%{_mandir}/man8/*.8*
+%{systemdunitdir}/%{name}.service
+
+%files devel
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/libpostfix-*.so
+%{_includedir}/postfix
+
+%if %{with ldap}
+%files dict-ldap
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/postfix/dict_ldap.so
+%{_mandir}/man5/ldap_table.5*
+%endif
+
+%if %{with mysql}
+%files dict-mysql
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/postfix/dict_mysql.so
+%{_mandir}/man5/mysql_table.5*
+%endif
+
+%files dict-pcre
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/postfix/dict_pcre.so
+#%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/mail/pcre_table
+%{_mandir}/man5/pcre_table.5*
+
+%if %{with pgsql}
+%files dict-pgsql
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/postfix/dict_pgsql.so
+%{_mandir}/man5/pgsql_table.5*
+%endif
+
+%if %{with sqlite}
+%files dict-sqlite
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/postfix/dict_sqlite.so
+%{_mandir}/man5/sqlite_table.5*
+%endif
+
+%files qshape
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_bindir}/qshape
+%{_mandir}/man1/qshape.1*
+
+%files -n monit-rc-%{name}
+%defattr(644,root,root,755)
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/monit/%{name}.monitrc
--- /dev/null
+# Customized settings for postfix
+
+# Define nice level for postfix & config
+SERVICE_RUN_NICE_LEVEL="+5"
--- /dev/null
+#!/bin/sh
+# script to run after "release bump" style change.
+# takes Release from spec and creates commit with message
+# groups similiar commits together.
+# "- release $rel"
+
+set -e
+
+get_dump() {
+ local specfile="$1"
+ if ! out=$(rpm --specfile "$specfile" --define 'prep %dump' -q 2>&1); then
+ echo >&2 "$out"
+ echo >&2 "You need icon files being present in SOURCES."
+ exit 1
+ fi
+ echo "$out"
+}
+
+usage="Usage:
+${0##*/} [-i] [-u] [-t] [-n] [-m <MESSAGE>] <SPECLIST>
+
+Options:
+-i
+ Try to increment package release
+-u
+ git pull first
+-t | -n
+ Test mode (dry-run). do not commit
+-m
+ Specify commit message
+
+"
+
+get_release() {
+ local specfile="$1"
+ rel=$(awk '/^%define[ ]+_?rel[ ]+/{print $NF}' $specfile)
+ if [ -z "$rel" ]; then
+ dump=$(get_dump "$specfile")
+ rel=$(echo "$dump" | awk '/PACKAGE_RELEASE/{print $NF; exit}')
+ fi
+ echo $rel
+}
+
+set_release() {
+ local specfile="$1"
+ local rel="$2"
+ local newrel="$3"
+ sed -i -e "
+ s/^\(%define[ \t]\+_\?rel[ \t]\+\)$rel\$/\1$newrel/
+ s/^\(Release:[ \t]\+\)$rel\$/\1$newrel/
+ " $specfile
+}
+
+if [ ! -x /usr/bin/getopt ]; then
+ echo >&1 "You need to install util-linux to use relup.sh"
+ exit 1
+fi
+
+t=$(getopt -o 'm:inuth' -n "${0##*/}" -- "$@") || exit $?
+# Note the quotes around `$t': they are essential!
+eval set -- "$t"
+
+while true; do
+ case "$1" in
+ -i)
+ inc=1
+ ;;
+ -u)
+ update=1
+ ;;
+ -t | -n)
+ test=1
+ ;;
+ -m)
+ shift
+ message="${1#- }"
+ ;;
+ -h)
+ echo "$usage"
+ exit 0
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ echo 2>&1 "Internal error: [$1] not recognized!"
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+tmpd=$(mktemp -d "${TMPDIR:-/tmp}/relXXXXXX")
+topdir=$(rpm -E '%{_topdir}')
+cd "$topdir"
+for pkg in "$@"; do
+ name=${pkg%.spec} name=${name##*/}
+ spec=$(rpm -D "name $name" -E '%{_specdir}/%{name}.spec')
+ spec=${spec#$topdir/}
+ if [ "$update" = "1" ]; then
+ ./builder -g -ns "$spec"
+ fi
+ rel=$(get_release "$spec")
+ if [ "$inc" = 1 ]; then
+ if [[ $rel = *%* ]]; then
+ relmacro=${rel#*%}
+ relnum=${rel%%%*}
+ newrel=$(expr ${relnum} + 1)
+ set_release "$spec" $rel "${newrel}%${relmacro}"
+ else
+ newrel=$(expr ${rel} + 1)
+ set_release "$spec" $rel $newrel
+ fi
+
+ # refetch release
+ rel=$(get_release "$spec")
+ fi
+ echo "$spec" >> "$tmpd/$rel"
+done
+
+n="$(echo -e '\nn')"
+n="${n%%n}"
+for file in $(ls "$tmpd" 2>/dev/null); do
+ files=$(cat "$tmpd/$file")
+ pkg=$(cat "$tmpd/$file" |sed -e 's|/.*||')
+ spec=$(cat "$tmpd/$file" |sed -e 's|.*/||')
+ rel=$(basename "$file")
+ msg=""
+ [ -n "$message" ] && msg="$msg- $message$n"
+ msg="$msg- release ${rel%%%*} (by relup.sh)$n"
+ if [ "$test" != 1 ]; then
+ cd $pkg
+ git commit -m "$msg" $spec
+ git push
+ cd ..
+ fi
+done
+rm -rf $tmpd