2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-22 18:07:41 +00:00

snapshot-19990904

This commit is contained in:
Wietse Venema 1999-09-04 00:00:00 -05:00
parent eacbb63439
commit 92ecf320ac
99 changed files with 3881 additions and 81 deletions

View File

@ -2993,5 +2993,18 @@ Apologies for any names omitted.
that rejects destinations not in $relay_domains. By Lamont that rejects destinations not in $relay_domains. By Lamont
Jones of Hewlett-Packard. File: smtpd/smtpd_check.c. Jones of Hewlett-Packard. File: smtpd/smtpd_check.c.
Robustness: postconf now validates the syntax of all main.cf Security: do not allow weird characters in the expansion
parameters. of $names that appear in $forward_path. Just like with
shell commands, replace bad characters in expansions by
underscores. Configuration parameter: forward_expansion_filter.
19990902
Documentation: added a sample postfix alias to the examples
in the INSTALL document and in the conf/aliases file.
Reminded by Simon J. Mudd @ alltrading.com.
19990903
Bugfix: in case of some error conditions the pickup daemon
could leak small amounts of memory.

View File

@ -389,6 +389,10 @@ like this:
postfix:*:12345:12345:postfix:/no/where:/no/shell postfix:*:12345:12345:postfix:/no/where:/no/shell
And there is a corresponding alias in /etc/aliases:
postfix: root
Secondly, you must specify what domain will be appended to a Secondly, you must specify what domain will be appended to a
local address. The "myorigin" parameter defaults to the local local address. The "myorigin" parameter defaults to the local
hostname, but that is probably OK only for very small sites. hostname, but that is probably OK only for very small sites.

View File

@ -20,6 +20,8 @@ update printfck:
(set -e; echo "[$$i]"; cd $$i; $(MAKE) $(OPTS) $@) || exit 1; \ (set -e; echo "[$$i]"; cd $$i; $(MAKE) $(OPTS) $@) || exit 1; \
done done
printfck: update
depend clean: depend clean:
set -e; for i in $(DIRS); do \ set -e; for i in $(DIRS); do \
(set -e; echo "[$$i]"; cd $$i; $(MAKE) $@) || exit 1; \ (set -e; echo "[$$i]"; cd $$i; $(MAKE) $@) || exit 1; \

View File

@ -16,6 +16,7 @@ nobody: root
uucp: root uucp: root
www: root www: root
ftp-bugs: root ftp-bugs: root
postfix: root
# Put your local aliases here. # Put your local aliases here.

View File

@ -290,7 +290,7 @@ program_directory = /some/where/postfix/bin
# is built-in. Specify "/^header-name: stuff you do not want/ REJECT" # is built-in. Specify "/^header-name: stuff you do not want/ REJECT"
# in the pattern file. Patterns are case-insensitive by default. Note: # in the pattern file. Patterns are case-insensitive by default. Note:
# specify only patterns ending in REJECT. Patterns ending in OK are # specify only patterns ending in REJECT. Patterns ending in OK are
# a waste of cycles. # mostly a waste of cycles.
# #
#header_checks = regexp:/etc/postfix/filename #header_checks = regexp:/etc/postfix/filename
#header_checks = pcre:/etc/postfix/filename #header_checks = pcre:/etc/postfix/filename

View File

@ -169,8 +169,8 @@ smtpd_helo_restrictions =
# Specify a list of restrictions, separated by commas and/or whitespace. # Specify a list of restrictions, separated by commas and/or whitespace.
# Continue long lines by starting the next line with whitespace. # Continue long lines by starting the next line with whitespace.
# #
# smtpd_sender_restrictions = reject_unknown_address # smtpd_sender_restrictions = reject_unknown_sender_domain
# smtpd_sender_restrictions = reject_unknown_address, hash:/etc/postfix/access # smtpd_sender_restrictions = reject_unknown_sender_domain, hash:/etc/postfix/access
smtpd_sender_restrictions = smtpd_sender_restrictions =
# The smtpd_recipient_restrictions parameter specifies restrictions on # The smtpd_recipient_restrictions parameter specifies restrictions on
@ -289,7 +289,8 @@ reject_code = 550
relay_domains_reject_code = 550 relay_domains_reject_code = 550
# The unknown_address_reject_code parameter specifies the SMTP server # The unknown_address_reject_code parameter specifies the SMTP server
# response when a client violates the reject_unknown_address restriction. # response when a client violates the reject_unknown_sender_domain
# or reject_unknown_recipient_domain restrictions.
# #
# Do not change this unless you have a complete understanding of RFC 822. # Do not change this unless you have a complete understanding of RFC 822.
# #

View File

@ -343,7 +343,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ"
extern char *var_cmd_exp_filter; extern char *var_cmd_exp_filter;
#define VAR_FWD_EXP_FILTER "forward_expansion_filter" #define VAR_FWD_EXP_FILTER "forward_expansion_filter"
#define DEF_FWD_EXP_FILTER "1234567890!@%-_=+:,.\ #define DEF_FWD_EXP_FILTER "1234567890!@%-_=+:,./\
abcdefghijklmnopqrstuvwxyz\ abcdefghijklmnopqrstuvwxyz\
ABCDEFGHIJKLMNOPQRSTUVWXYZ" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
extern char *var_fwd_exp_filter; extern char *var_fwd_exp_filter;

View File

@ -15,7 +15,7 @@
* Version of this program. * Version of this program.
*/ */
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "Snapshot-19990831" #define DEF_MAIL_VERSION "Snapshot-19990904"
extern char *var_mail_version; extern char *var_mail_version;
/* LICENSE /* LICENSE

View File

@ -327,8 +327,8 @@ that are disconnected most of the time)
<i> When you disable DNS lookups, you must specify the</i> <i> When you disable DNS lookups, you must specify the</i>
<b>relayhost</b> <i> as either a numeric IP address, or as a hostname <b>relayhost</b> <i> as either a numeric IP address, or as a hostname
that resolves to one or more IP addresses (Postfix does no</i> that resolves to one or more IP addresses (with DNS lookup disabled,
<b>MX</b> lookup). Postfix does no</i> <b>MX</b> lookup).
<p> <p>

View File

@ -103,9 +103,14 @@ is allowed in message headers.
<dt>Syntax: <dt>Syntax:
<dd>Specify a list of zero or more lookup tables. Whenever a <dd>Specify a list of zero or more lookup tables. Whenever a header
header matches a table, a REJECT result means reject the matches a table, a REJECT result means reject the message.
message; an OK result means pass.
<p>
<i>A rule ending in OK affects only the header being matched. The
next header may still result in a REJECT match, causing the mail
still to be rejected.</i>
</dl> </dl>
@ -797,7 +802,7 @@ subdomain under any of the domains listed in <b>$maps_rbl_domains.</b>
<dt> <b>relay_domains</b> <dt> <b>relay_domains</b>
<dd> This parameter controls the behavior of the <a <dd> This parameter controls the behavior of the <a
href="#check_relay_domains"> check_relay_domains</a> and a href="#check_relay_domains"> check_relay_domains</a> and <a
href="#reject_unauth_destination"> reject_unauth_destination</a> href="#reject_unauth_destination"> reject_unauth_destination</a>
restrictions that can appear as part of a recipient address restrictions that can appear as part of a recipient address
restriction list. restriction list.

44
postfix/include/argv.h Normal file
View File

@ -0,0 +1,44 @@
#ifndef _ARGV_H_INCLUDED_
#define _ARGV_H_INCLUDED_
/*++
/* NAME
/* argv 3h
/* SUMMARY
/* string array utilities
/* SYNOPSIS
/* #include "argv.h"
DESCRIPTION
.nf
/*
* External interface.
*/
typedef struct ARGV {
int len; /* number of array elements */
int argc; /* array elements in use */
char **argv; /* string array */
} ARGV;
extern ARGV *argv_alloc(int);
extern void argv_add(ARGV *,...);
extern void argv_terminate(ARGV *);
extern ARGV *argv_free(ARGV *);
extern ARGV *argv_split(const char *, const char *);
extern ARGV *argv_split_append(ARGV *, const char *, const char *);
#define ARGV_END ((char *) 0)
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

33
postfix/include/attr.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef _ATTR_H_INCLUDED_
#define _ATTR_H_INCLUDED_
/*++
/* NAME
/* attr 3h
/* SUMMARY
/* attribute list manager
/* SYNOPSIS
/* #include <attr.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern void attr_enter(HTABLE *, const char *, const char *);
extern void attr_free(HTABLE *);
#define attr_find(table, name) htable_find((table), (name))
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

58
postfix/include/binhash.h Normal file
View File

@ -0,0 +1,58 @@
#ifndef _BINHASH_H_INCLUDED_
#define _BINHASH_H_INCLUDED_
/*++
/* NAME
/* binhash 3h
/* SUMMARY
/* hash table manager
/* SYNOPSIS
/* #include <binhash.h>
/* DESCRIPTION
/* .nf
/* Structure of one hash table entry. */
typedef struct BINHASH_INFO {
char *key; /* lookup key */
int key_len; /* key length */
char *value; /* associated value */
struct BINHASH_INFO *next; /* colliding entry */
struct BINHASH_INFO *prev; /* colliding entry */
} BINHASH_INFO;
/* Structure of one hash table. */
typedef struct BINHASH {
int size; /* length of entries array */
int used; /* number of entries in table */
BINHASH_INFO **data; /* entries array, auto-resized */
} BINHASH;
extern BINHASH *binhash_create(int);
extern BINHASH_INFO *binhash_enter(BINHASH *, const char *, int, char *);
extern BINHASH_INFO *binhash_locate(BINHASH *, const char *, int);
extern char *binhash_find(BINHASH *, const char *, int);
extern void binhash_delete(BINHASH *, const char *, int, void (*) (char *));
extern void binhash_free(BINHASH *, void (*) (char *));
extern void binhash_walk(BINHASH *, void (*) (BINHASH_INFO *, char *), char *);
extern BINHASH_INFO **binhash_list(BINHASH *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/* CREATION DATE
/* Thu Feb 20 16:54:29 EST 1997
/* LAST MODIFICATION
/* %E% %U%
/* VERSION/RELEASE
/* %I%
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _CHROOT_UID_H_INCLUDED_
#define _CHROOT_UID_H_INCLUDED_
/*++
/* NAME
/* chroot_uid 3h
/* SUMMARY
/* limit possible damage a process can do
/* SYNOPSIS
/* #include <chroot_uid.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern void chroot_uid(const char *, const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

37
postfix/include/connect.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef _CONNECT_H_INCLUDED_
#define _CONNECT_H_INCLUDED_
/*++
/* NAME
/* connect 3h
/* SUMMARY
/* client interface file
/* SYNOPSIS
/* #include <connect.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <iostuff.h>
/*
* Client external interface.
*/
extern int unix_connect(const char *, int, int);
extern int inet_connect(const char *, int, int);
extern int stream_connect(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

100
postfix/include/dict.h Normal file
View File

@ -0,0 +1,100 @@
#ifndef _DICT_H_INCLUDED_
#define _DICT_H_INCLUDED_
/*++
/* NAME
/* dict 3h
/* SUMMARY
/* dictionary manager
/* SYNOPSIS
/* #include <dict.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <fcntl.h>
/*
* Utility library.
*/
#include <vstream.h>
/*
* Generic dictionary interface - in reality, a dictionary extends this
* structure with private members to maintain internal state.
*/
typedef struct DICT {
int flags; /* see below */
const char *(*lookup) (struct DICT *, const char *);
void (*update) (struct DICT *, const char *, const char *);
int (*delete) (struct DICT *, const char *);
int (*sequence) (struct DICT *, int, const char **, const char **);
void (*close) (struct DICT *);
int fd; /* for dict_update() lock */
time_t mtime; /* mod time at open */
} DICT;
#define DICT_FLAG_DUP_WARN (1<<0) /* if file, warn about dups */
#define DICT_FLAG_DUP_IGNORE (1<<1) /* if file, ignore dups */
#define DICT_FLAG_TRY0NULL (1<<2) /* do not append 0 to key/value */
#define DICT_FLAG_TRY1NULL (1<<3) /* append 0 to key/value */
#define DICT_FLAG_FIXED (1<<4) /* fixed key map */
#define DICT_FLAG_PATTERN (1<<5) /* keys are patterns */
#define DICT_FLAG_LOCK (1<<6) /* lock before access */
#define DICT_FLAG_DUP_REPLACE (1<<7) /* if file, replace dups */
extern int dict_unknown_allowed;
extern int dict_errno;
#define DICT_ERR_RETRY 1 /* soft error */
/*
* Sequence function types.
*/
#define DICT_SEQ_FUN_FIRST 0 /* set cursor to first record */
#define DICT_SEQ_FUN_NEXT 1 /* set cursor to next record */
/*
* High-level interface, with logical dictionary names.
*/
extern void dict_register(const char *, DICT *);
extern DICT *dict_handle(const char *);
extern void dict_unregister(const char *);
extern void dict_update(const char *, const char *, const char *);
extern const char *dict_lookup(const char *, const char *);
extern int dict_delete(const char *, const char *);
extern int dict_sequence(const char *, const int, const char **, const char **);
extern void dict_load_file(const char *, const char *);
extern void dict_load_fp(const char *, VSTREAM *);
extern const char *dict_eval(const char *, const char *, int);
/*
* Low-level interface, with physical dictionary handles.
*/
extern DICT *dict_open(const char *, int, int);
extern DICT *dict_open3(const char *, const char *, int, int);
extern void dict_open_register(const char *, DICT *(*) (const char *, int, int));
#define dict_get(dp, key) (dp)->lookup((dp), (key))
#define dict_put(dp, key, val) (dp)->update((dp), (key), (val))
#define dict_del(dp, key) (dp)->delete((dp), (key))
#define dict_seq(dp, f, key, val) (dp)->sequence((dp), (f), (key), (val))
#define dict_close(dp) (dp)->close(dp)
typedef void (*DICT_WALK_ACTION) (const char *, DICT *, char *);
extern void dict_walk(DICT_WALK_ACTION, char *);
extern int dict_changed(void);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

36
postfix/include/dict_db.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef _DICT_DB_H_INCLUDED_
#define _DICT_DB_H_INCLUDED_
/*++
/* NAME
/* dict_db 3h
/* SUMMARY
/* dictionary manager interface to DB files
/* SYNOPSIS
/* #include <dict_db.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_hash_open(const char *, int, int);
extern DICT *dict_btree_open(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _DICT_DBN_H_INCLUDED_
#define _DICT_DBN_H_INCLUDED_
/*++
/* NAME
/* dict_dbm 3h
/* SUMMARY
/* dictionary manager interface to DBM files
/* SYNOPSIS
/* #include <dict_dbm.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_dbm_open(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _DICT_ENV_H_INCLUDED_
#define _DICT_ENV_H_INCLUDED_
/*++
/* NAME
/* dict_env 3h
/* SUMMARY
/* dictionary manager interface to environment variables
/* SYNOPSIS
/* #include <dict_env.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_env_open(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

36
postfix/include/dict_ht.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef _DICT_HT_H_INCLUDED_
#define _DICT_HT_H_INCLUDED_
/*++
/* NAME
/* dict_ht 3h
/* SUMMARY
/* dictionary manager interface to hash tables
/* SYNOPSIS
/* #include <dict_ht.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <htable.h>
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_ht_open(HTABLE *, void (*) (char *));
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,31 @@
#ifndef _DICT_LDAP_H_INCLUDED_
#define _DICT_LDAP_H_INCLUDED_
/*++
/* NAME
/* dict_ldap 3h
/* SUMMARY
/* dictionary manager interface to LDAP maps
/* SYNOPSIS
/* #include <dict_ldap.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_ldap_open(const char *, int, int);
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10532, USA
/*--*/
#endif

View File

@ -0,0 +1,46 @@
#ifdef HAS_MYSQL
#include <time.h>
#include "mysql.h"
#define STATACTIVE 0
#define STATFAIL 1
#define STATUNTRIED 2
#define RETRY_CONN_INTV 300 /* 5 minutes */
extern DICT *dict_mysql_open(const char *name, int unused_flags, int dict_flags);
typedef struct {
char *hostname;
int stat; /* STATUNTRIED | STATFAIL | STATCUR */
time_t ts; /* used for attempting reconnection
* every so often if a host is down */
MYSQL db;
} HOST;
typedef struct {
char *username; /* login for database */
char *password; /* password for database */
char *dbname; /* the name of the database on all
* the servers */
HOST *db_hosts; /* the hosts on which the databases
* reside */
int len_hosts; /* number of hosts */
} PLMYSQL;
extern PLMYSQL *plmysql_init(char *dbname, char *hostnames[], int len_hosts);
extern int plmysql_connect(PLMYSQL *PLDB, char *username, char *password);
MYSQL_RES *plmysql_query(PLMYSQL *PLDB, const char *query);
void plmysql_dealloc(PLMYSQL *PLDB);
inline void plmysql_down_host(HOST *host);
int plmysql_connect_single(PLMYSQL *PLDB, int host);
int plmysql_ready_reconn(HOST host);
#endif

32
postfix/include/dict_ni.h Normal file
View File

@ -0,0 +1,32 @@
#ifndef _DICT_NI_H_INCLUDED_
#define _DICT_NI_H_INCLUDED_
/*++
/* NAME
/* dict_ni 3h
/* SUMMARY
/* dictionary manager interface to NetInfo maps
/* SYNOPSIS
/* #include <dict_ni.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_ni_open(const char *, int, int);
/* AUTHOR(S)
/* Pieter Schoenmakers
/* Eindhoven University of Technology
/* P.O. Box 513
/* 5600 MB Eindhoven
/* The Netherlands
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _DIST_NIS_H_INCLUDED_
#define _DIST_NIS_H_INCLUDED_
/*++
/* NAME
/* dict_nis 3h
/* SUMMARY
/* dictionary manager interface to NIS maps
/* SYNOPSIS
/* #include <dict_nis.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_nis_open(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _DICT_NISPLUS_H_INCLUDED_
#define _DICT_NISPLUS_H_INCLUDED_
/*++
/* NAME
/* dict_nisplus 3h
/* SUMMARY
/* dictionary manager interface to NIS+ maps
/* SYNOPSIS
/* #include <dict_nisplus.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <dict.h>
/*
* External interface.
*/
extern DICT *dict_nisplus_open(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _DIR_FOREST_H_INCLUDED_
#define _DIR_FOREST_H_INCLUDED_
/*++
/* NAME
/* dir_forest 3h
/* SUMMARY
/* file name to directory forest
/* SYNOPSIS
/* #include <dir_forest.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <vstring.h>
/*
* External interface.
*/
extern char *dir_forest(VSTRING *, const char *, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

62
postfix/include/events.h Normal file
View File

@ -0,0 +1,62 @@
#ifndef _EVENTS_H_INCLUDED_
#define _EVENTS_H_INCLUDED_
/*++
/* NAME
/* events 3h
/* SUMMARY
/* event manager
/* SYNOPSIS
/* #include <events.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <time.h>
/*
* External interface.
*/
typedef void (*EVENT_NOTIFY_RDWR) (int, char *);
typedef void (*EVENT_NOTIFY_TIME) (int, char *);
extern time_t event_time(void);
extern void event_enable_read(int, EVENT_NOTIFY_RDWR, char *);
extern void event_enable_write(int, EVENT_NOTIFY_RDWR, char *);
extern void event_disable_readwrite(int);
extern time_t event_request_timer(EVENT_NOTIFY_TIME, char *, int);
extern int event_cancel_timer(EVENT_NOTIFY_TIME, char *);
extern void event_loop(int);
/*
* Event codes.
*/
#define EVENT_READ (1<<0) /* read event */
#define EVENT_WRITE (1<<1) /* write event */
#define EVENT_XCPT (1<<2) /* exception */
#define EVENT_TIME (1<<3) /* timer event */
#define EVENT_ERROR EVENT_XCPT
/*
* Dummies.
*/
#define EVENT_NULL_TYPE 0
#define EVENT_NULL_CONTEXT ((char *) 0)
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/* CREATION DATE
/* Wed Jan 29 17:00:03 EST 1997
/*--*/
#endif

View File

@ -0,0 +1,30 @@
#ifndef _EXEC_COMMAND_H_INCLUDED_
#define _EXEC_COMMAND_H_INCLUDED_
/*++
/* NAME
/* exec_command 3h
/* SUMMARY
/* execute command
/* SYNOPSIS
/* #include <exec_command.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern NORETURN exec_command(const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,33 @@
#ifndef _FIND_INET_H_INCLUDED_
#define _FIND_INET_H_INCLUDED_
/*++
/* NAME
/* find_inet 3h
/* SUMMARY
/* inet-domain name services
/* SYNOPSIS
/* #include <find_inet.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern unsigned find_inet_addr(const char *);
extern int find_inet_port(const char *, const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/* LAST MODIFICATION
/* Thu Feb 6 12:46:36 EST 1997
/*--*/
#endif

33
postfix/include/fsspace.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef _FSSPACE_H_INCLUDED_
#define _FSSPACE_H_INCLUDED_
/*++
/* NAME
/* fsspace 3h
/* SUMMARY
/* determine available file system space
/* SYNOPSIS
/* #include <fsspace.h>
/* DESCRIPTION
/* .nf
/* External interface. */
struct fsspace {
unsigned long block_size; /* block size */
unsigned long block_free; /* free space */
};
extern void fsspace(const char *, struct fsspace *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _FULLNAME_H_INCLUDED_
#define _FULLNAME_H_INCLUDED_
/*++
/* NAME
/* fullname 3h
/* SUMMARY
/* lookup personal name of invoking user
/* SYNOPSIS
/* #include <fullname.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern const char *fullname(void);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _GET_DOMAINNAME_H_INCLUDED_
#define _GET_DOMAINNAME_H_INCLUDED_
/*++
/* NAME
/* get_domainname 3h
/* SUMMARY
/* network domain name lookup
/* SYNOPSIS
/* #include <get_domainname.h>
/* DESCRIPTION
/* .nf
/* External interface */
extern const char *get_domainname(void);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _GET_HOSTNAME_H_INCLUDED_
#define _GET_HOSTNAME_H_INCLUDED_
/*++
/* NAME
/* get_hostname 3h
/* SUMMARY
/* network name lookup
/* SYNOPSIS
/* #include <get_hostname.h>
/* DESCRIPTION
/* .nf
/* External interface */
extern const char *get_hostname(void);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

57
postfix/include/htable.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef _HTABLE_H_INCLUDED_
#define _HTABLE_H_INCLUDED_
/*++
/* NAME
/* htable 3h
/* SUMMARY
/* hash table manager
/* SYNOPSIS
/* #include <htable.h>
/* DESCRIPTION
/* .nf
/* Structure of one hash table entry. */
typedef struct HTABLE_INFO {
char *key; /* lookup key */
char *value; /* associated value */
struct HTABLE_INFO *next; /* colliding entry */
struct HTABLE_INFO *prev; /* colliding entry */
} HTABLE_INFO;
/* Structure of one hash table. */
typedef struct HTABLE {
int size; /* length of entries array */
int used; /* number of entries in table */
HTABLE_INFO **data; /* entries array, auto-resized */
} HTABLE;
extern HTABLE *htable_create(int);
extern HTABLE_INFO *htable_enter(HTABLE *, const char *, char *);
extern HTABLE_INFO *htable_locate(HTABLE *, const char *);
extern char *htable_find(HTABLE *, const char *);
extern void htable_delete(HTABLE *, const char *, void (*) (char *));
extern void htable_free(HTABLE *, void (*) (char *));
extern void htable_walk(HTABLE *, void (*) (HTABLE_INFO *, char *), char *);
extern HTABLE_INFO **htable_list(HTABLE *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/* CREATION DATE
/* Fri Feb 14 13:43:19 EST 1997
/* LAST MODIFICATION
/* %E% %U%
/* VERSION/RELEASE
/* %I%
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef INET_ADDR_HOST_H_INCLUDED_
#define INET_ADDR_HOST_H_INCLUDED_
/*++
/* NAME
/* inet_addr_host 3h
/* SUMMARY
/* determine all host internet interface addresses
/* SYNOPSIS
/* #include <inet_addr_host.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <inet_addr_list.h>
/*
* External interface.
*/
extern int inet_addr_host(INET_ADDR_LIST *, const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,43 @@
#ifndef _INET_ADDR_LIST_H_INCLUDED_
#define _INET_ADDR_LIST_H_INCLUDED_
/*++
/* NAME
/* inet_addr_list 3h
/* SUMMARY
/* internet address list manager
/* SYNOPSIS
/* #include <inet_addr_list.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <netinet/in.h>
/*
* External interface.
*/
typedef struct INET_ADDR_LIST {
int used; /* nr of elements in use */
int size; /* actual list size */
struct in_addr *addrs; /* payload */
} INET_ADDR_LIST;
extern void inet_addr_list_init(INET_ADDR_LIST *);
extern void inet_addr_list_free(INET_ADDR_LIST *);
extern void inet_addr_list_append(INET_ADDR_LIST *, struct in_addr *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _INET_ADDR_LOCAL_H_INCLUDED_
#define _INET_ADDR_LOCAL_H_INCLUDED_
/*++
/* NAME
/* inet_addr_local 3h
/* SUMMARY
/* determine if IP address is local
/* SYNOPSIS
/* #include <inet_addr_local.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <inet_addr_list.h>
/*
* External interface.
*/
extern int inet_addr_local(INET_ADDR_LIST *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _INET_UTIL_H_INCLUDED_
#define _INET_UTIL_H_INCLUDED_
/*++
/* NAME
/* inet_util 3h
/* SUMMARY
/* INET-domain utilities
/* SYNOPSIS
/* #include <inet_util.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern char *inet_parse(const char *, char **, char **);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

48
postfix/include/iostuff.h Normal file
View File

@ -0,0 +1,48 @@
#ifndef _IOSTUFF_H_INCLUDED_
#define _IOSTUFF_H_INCLUDED_
/*++
/* NAME
/* iostuff 3h
/* SUMMARY
/* miscellaneous I/O primitives
/* SYNOPSIS
/* #include <iostuff.h>
/* DESCRIPTION
/*
* External interface.
*/
extern int non_blocking(int, int);
extern int close_on_exec(int, int);
extern int open_limit(int);
extern int readable(int);
extern int writable(int);
extern off_t get_file_limit(void);
extern void set_file_limit(off_t);
extern int peekfd(int);
extern int read_wait(int, int);
extern int write_wait(int, int);
extern int write_buf(int, const char *, int, int);
extern void doze(unsigned);
#define BLOCKING 0
#define NON_BLOCKING 1
#define CLOSE_ON_EXEC 1
#define PASS_ON_EXEC 0
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/* CREATION DATE
/* Sat Jan 25 16:54:13 EST 1997
/*--*/
#endif

View File

@ -0,0 +1,31 @@
#ifndef _LINE_WRAP_H_INCLUDED_
#define _LINE_WRAP_H_INCLUDED_
/*++
/* NAME
/* line_wrap 3h
/* SUMMARY
/* wrap long lines upon output
/* SYNOPSIS
/* #include <line_wrap.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
typedef void (*LINE_WRAP_FN) (const char *, int, int, char *);
extern void line_wrap(const char *, int, int, LINE_WRAP_FN, char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

42
postfix/include/listen.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef _LISTEN_H_INCLUDED_
#define _LISTEN_H_INCLUDED_
/*++
/* NAME
/* listen 3h
/* SUMMARY
/* listener interface file
/* SYNOPSIS
/* #include <listen.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <iostuff.h>
/*
* Listener external interface.
*/
extern int unix_listen(const char *, int, int);
extern int inet_listen(const char *, int, int);
extern int fifo_listen(const char *, int, int);
extern int stream_listen(const char *, int, int);
extern int inet_accept(int);
extern int unix_accept(int);
extern int stream_accept(int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,30 @@
#ifndef _LSTAT_AS_H_INCLUDED_
#define _LSTAT_AS_H_INCLUDED_
/*++
/* NAME
/* lstat_as 3h
/* SUMMARY
/* lstat file as user
/* SYNOPSIS
/* #include <sys/stat.h>
/* #include <lstat_as.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern int lstat_as(const char *, struct stat *, uid_t, gid_t);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,44 @@
#ifndef _MAC_PARSE_H_INCLUDED_
#define _MAC_PARSE_H_INCLUDED_
/*++
/* NAME
/* mac_parse 3h
/* SUMMARY
/* locate macro references in string
/* SYNOPSIS
/* #include <mac_parse.h>
DESCRIPTION
.nf
/*
* Utility library.
*/
#include <vstring.h>
/*
* External interface.
*/
#define MAC_PARSE_LITERAL 1
#define MAC_PARSE_VARNAME 2
#define MAC_PARSE_ERROR (1<<0)
#define MAC_PARSE_UNDEF (1<<1)
#define MAC_PARSE_USER 2 /* start user definitions */
typedef int (*MAC_PARSE_FN)(int, VSTRING *, char *);
extern int mac_parse(const char *, MAC_PARSE_FN, char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,30 @@
#ifndef MAKE_DIRS_H_INCLUDED_
#define MAKE_DIRS_H_INCLUDED_
/*++
/* NAME
/* make_dirs 3h
/* SUMMARY
/* create directory hierarchy
/* SYNOPSIS
/* #include <make_dirs.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern int make_dirs(const char *, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _MATCH_LIST_H_INCLUDED_
#define _MATCH_LIST_H_INCLUDED_
/*++
/* NAME
/* match_list 3h
/* SUMMARY
/* generic list-based pattern matching
/* SYNOPSIS
/* #include <match_list.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
typedef struct MATCH_LIST MATCH_LIST;
typedef int (*MATCH_LIST_FN) (const char *, const char *);
extern MATCH_LIST *match_list_init(const char *, int,...);
extern int match_list_match(MATCH_LIST *,...);
extern void match_list_free(MATCH_LIST *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,31 @@
#ifndef _MATCH_OPS_H_INCLUDED_
#define _MATCH_OPS_H_INCLUDED_
/*++
/* NAME
/* match_ops 3h
/* SUMMARY
/* simple string or host pattern matching
/* SYNOPSIS
/* #include <match_ops.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern int match_string(const char *, const char *);
extern int match_hostname(const char *, const char *);
extern int match_hostaddr(const char *, const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

42
postfix/include/msg.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef _MSG_H_INCLUDED_
#define _MSG_H_INCLUDED_
/*++
/* NAME
/* msg 3h
/* SUMMARY
/* diagnostics interface
/* SYNOPSIS
/* #include "msg.h"
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
typedef void (*MSG_CLEANUP_FN) (void);
extern int msg_verbose;
extern void msg_info(const char *,...);
extern void msg_warn(const char *,...);
extern void msg_error(const char *,...);
extern NORETURN msg_fatal(const char *,...);
extern NORETURN msg_panic(const char *,...);
extern int msg_error_limit(int);
extern void msg_error_clear(void);
extern MSG_CLEANUP_FN msg_cleanup(MSG_CLEANUP_FN);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,47 @@
#ifndef _MSG_OUTPUT_FN_
#define _MSG_OUTPUT_FN_
/*++
/* NAME
/* msg_output 3h
/* SUMMARY
/* diagnostics output management
/* SYNOPSIS
/* #include <msg_output.h>
/* DESCRIPTION
/*
* System library.
*/
#include <stdarg.h>
/*
* External interface. Severity levels are documented to be monotonically
* increasing from 0 up to MSG_LAST.
*/
typedef void (*MSG_OUTPUT_FN) (int, const char *);
extern void msg_output(MSG_OUTPUT_FN);
extern void msg_printf(int, const char *,...);
extern void msg_vprintf(int, const char *, va_list);
extern void msg_text(int, const char *);
#define MSG_INFO 0 /* informative */
#define MSG_WARN 1 /* warning (non-fatal) */
#define MSG_ERROR 2 /* error (fatal) */
#define MSG_FATAL 3 /* software error (fatal) */
#define MSG_PANIC 4 /* software error (fatal) */
#define MSG_LAST 4 /* highest-numbered severity level */
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,34 @@
#ifndef _MSG_SYSLOG_H_INCLUDED_
#define _MSG_SYSLOG_H_INCLUDED_
/*++
/* NAME
/* msg_syslog 3h
/* SUMMARY
/* direct diagnostics to syslog daemon
/* SYNOPSIS
/* #include <msg_syslog.h>
/* DESCRIPTION
/*
* System library.
*/
#include <syslog.h>
/*
* External interface.
*/
extern void msg_syslog_init(const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,34 @@
#ifndef _MSG_VSTREAM_H_INCLUDED_
#define _MSG_VSTREAM_H_INCLUDED_
/*++
/* NAME
/* msg_vstream 3h
/* SUMMARY
/* direct diagnostics to VSTREAM
/* SYNOPSIS
/* #include <msg_vstream.h>
/* DESCRIPTION
/*
* Utility library.
*/
#include <vstream.h>
/*
* External interface.
*/
extern void msg_vstream_init(const char *, VSTREAM *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

42
postfix/include/mvect.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef _MVECT_H_INCLUDED_
#define _MVECT_H_INCLUDED_
/*++
/* NAME
/* mvect 3h
/* SUMMARY
/* memory vector management
/* SYNOPSIS
/* #include <mvect.h>
/* DESCRIPTION
/* .nf
/*
* Generic memory vector interface.
*/
typedef void (*MVECT_FN) (char *, int);
typedef struct {
char *ptr;
int elsize;
int nelm;
MVECT_FN init_fn;
MVECT_FN wipe_fn;
} MVECT;
extern char *mvect_alloc(MVECT *, int, int, MVECT_FN, MVECT_FN);
extern char *mvect_realloc(MVECT *, int);
extern char *mvect_free(MVECT *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

38
postfix/include/myflock.h Normal file
View File

@ -0,0 +1,38 @@
#ifndef _MYFLOCK_H_INCLUDED_
#define _MYFLOCK_H_INCLUDED_
/*++
/* NAME
/* myflock 3h
/* SUMMARY
/* lock open file
/* SYNOPSIS
/* #include <myflock.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern int myflock(int, int);
extern int myflock_locked(int);
#define MYFLOCK_NONE 0
#define MYFLOCK_SHARED 1
#define MYFLOCK_EXCLUSIVE 2
#define MYFLOCK_LOCK_MASK (MYFLOCK_SHARED | MYFLOCK_EXCLUSIVE)
#define MYFLOCK_NOWAIT 4
#define MYFLOCK_BITS (MYFLOCK_LOCK_MASK | MYFLOCK_NOWAIT)
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _MALLOC_H_INCLUDED_
#define _MALLOC_H_INCLUDED_
/*++
/* NAME
/* mymalloc 3h
/* SUMMARY
/* memory management wrappers
/* SYNOPSIS
/* #include "mymalloc.h"
DESCRIPTION
.nf
/*
* External interface.
*/
extern char *mymalloc(int);
extern char *myrealloc(char *, int);
extern void myfree(char *);
extern char *mystrdup(const char *);
extern char *mystrndup(const char *, int len);
extern char *mymemdup(const char *, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _NAME_MASK_H_INCLUDED_
#define _NAME_MASK_H_INCLUDED_
/*++
/* NAME
/* name_mask 3h
/* SUMMARY
/* map names to bit mask
/* SYNOPSIS
/* #include <name_mask.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
typedef struct {
const char *name;
int mask;
} NAME_MASK;
extern int name_mask(NAME_MASK *, const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

30
postfix/include/open_as.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef _OPEN_H_INCLUDED_
#define _OPEN_H_INCLUDED_
/*++
/* NAME
/* open_as 3h
/* SUMMARY
/* open file as user
/* SYNOPSIS
/* #include <fcntl.h>
/* #include <open_as.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern int open_as(const char *, int, int, uid_t, gid_t);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,41 @@
#ifndef _OPEN_LOCK_H_INCLUDED_
#define _OPEN_LOCK_H_INCLUDED_
/*++
/* NAME
/* open_lock 3h
/* SUMMARY
/* open or create file and lock it for exclusive access
/* SYNOPSIS
/* #include <open_lock.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <fcntl.h>
/*
* Utility library.
*/
#include <vstream.h>
#include <vstring.h>
/*
* External interface.
*/
extern VSTREAM *open_lock(const char *, int, int, VSTRING *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _PERCENT_H_INCLUDED_
#define _PERCENT_H_INCLUDED_
/*++
/* NAME
/* percentm 3h
/* SUMMARY
/* expand %m embedded in string to system error text
/* SYNOPSIS
/* #include <percentm.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern char *percentm(const char *, int);
/* HISTORY
/* .ad
/* .fi
/* A percentm() routine appears in the TCP Wrapper software
/* by Wietse Venema.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,59 @@
#ifndef _POSIX_SIGNALS_H_INCLUDED_
#define _POSIX_SIGNALS_H_INCLUDED_
/*++
/* NAME
/* posix_signals 3h
/* SUMMARY
/* POSIX signal handling compatibility
/* SYNOPSIS
/* #include <posix_signals.h>
/* DESCRIPTION
/* .nf
/*
* Compatibility interface.
*/
#ifdef MISSING_SIGSET_T
typedef int sigset_t;
enum {
SIG_BLOCK,
SIG_UNBLOCK,
SIG_SETMASK
};
extern int sigemptyset(sigset_t *);
extern int sigaddset(sigset_t *, int);
extern int sigprocmask(int, sigset_t *, sigset_t *);
#endif
#ifdef MISSING_SIGACTION
struct sigaction {
void (*sa_handler) ();
sigset_t sa_mask;
int sa_flags;
};
/* Possible values for sa_flags. Or them to set multiple. */
enum {
SA_RESTART,
SA_NOCLDSTOP = 4 /* drop the = 4. */
};
extern int sigaction(int, struct sigaction *, struct sigaction *);
#endif
/* AUTHOR(S)
/* Pieter Schoenmakers
/* Eindhoven University of Technology
/* P.O. Box 513
/* 5600 MB Eindhoven
/* The Netherlands
/*--*/
#endif

View File

@ -0,0 +1,36 @@
#ifndef _READLINE_H_INCLUDED_
#define _READLINE_H_INCLUDED_
/*++
/* NAME
/* readlline 3h
/* SUMMARY
/* read logical line
/* SYNOPSIS
/* #include <readlline.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <vstream.h>
#include <vstring.h>
/*
* External interface.
*/
extern VSTRING *readlline(VSTRING *, VSTREAM *, int *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

45
postfix/include/ring.h Normal file
View File

@ -0,0 +1,45 @@
#ifndef _RING_H_INCLUDED_
#define _RING_H_INCLUDED_
/*++
/* NAME
/* ring 3h
/* SUMMARY
/* circular list management
/* SYNOPSIS
/* #include <ring.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
typedef struct RING RING;
struct RING {
RING *succ; /* successor */
RING *pred; /* predecessor */
};
extern void ring_init(RING *);
extern void ring_prepend(RING *, RING *);
extern void ring_append(RING *, RING *);
extern void ring_detach(RING *);
#define ring_succ(c) ((c)->succ)
#define ring_pred(c) ((c)->pred)
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/* LAST MODIFICATION
/* Tue Jan 28 16:50:20 EST 1997
/*--*/
#endif

30
postfix/include/safe.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef _SAFE_H_INCLUDED_
#define _SAFE_H_INCLUDED_
/*++
/* NAME
/* safe 3h
/* SUMMARY
/* miscellaneous taint checks
/* SYNOPSIS
/* #include <safe.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern int unsafe(void);
extern char *safe_getenv(const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,41 @@
#ifndef _SAFE_OPEN_H_INCLUDED_
#define _SAFE_OPEN_H_INCLUDED_
/*++
/* NAME
/* safe_open 3h
/* SUMMARY
/* safely open or create regular file
/* SYNOPSIS
/* #include <safe_open.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <fcntl.h>
/*
* Utility library.
*/
#include <vstream.h>
#include <vstring.h>
/*
* External interface.
*/
extern VSTREAM *safe_open(const char *, int, int, uid_t, gid_t, VSTRING *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _SANE_ACCEPT_H_
#define _SANE_ACCEPT_H_
/*++
/* NAME
/* sane_accept 3h
/* SUMMARY
/* sanitize accept() error returns
/* SYNOPSIS
/* #include <sane_accept.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern int sane_accept(int, struct sockaddr *, SOCKADDR_SIZE *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,37 @@
#ifndef _SCAN_DIR_H_INCLUDED_
#define _SCAN_DIR_H_INCLUDED_
/*++
/* NAME
/* scan_dir 3h
/* SUMMARY
/* directory scanner
/* SYNOPSIS
/* #include <scan_dir.h>
/* DESCRIPTION
/* .nf
/*
* The directory scanner interface.
*/
typedef struct SCAN_DIR SCAN_DIR;
extern SCAN_DIR *scan_dir_open(const char *);
extern char *scan_dir_next(SCAN_DIR *);
extern char *scan_dir_path(SCAN_DIR *);
extern void scan_dir_push(SCAN_DIR *, const char *);
extern SCAN_DIR *scan_dir_pop(SCAN_DIR *);
extern SCAN_DIR *scan_dir_close(SCAN_DIR *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _SET_EUGID_H_INCLUDED_
#define _SET_EUGID_H_INCLUDED_
/*++
/* NAME
/* set_eugid 3h
/* SUMMARY
/* set effective user and group attributes
/* SYNOPSIS
/* #include <set_eugid.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern void set_eugid(uid_t, gid_t);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _SET_UGID_H_INCLUDED_
#define _SET_UGID_H_INCLUDED_
/*++
/* NAME
/* set_ugid 3h
/* SUMMARY
/* set real, effective and saved user and group attributes
/* SYNOPSIS
/* #include <set_ugid.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern void set_ugid(uid_t, gid_t);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,31 @@
#ifndef _SIGDELAY_H_INCLUDED_
#define _SIGDELAY_H_INCLUDED_
/*++
/* NAME
/* sigdelay 3h
/* SUMMARY
/* delay/resume signal delivery
/* SYNOPSIS
/* #include <sigdelay.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern void sigdelay(void);
extern void sigresume(void);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,35 @@
#ifndef _SPLIT_AT_H_INCLUDED_
#define _SPLIT_AT_H_INCLUDED_
/*++
/* NAME
/* split_at 3h
/* SUMMARY
/* trivial token splitter
/* SYNOPSIS
/* #include <split_at.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern char *split_at(char *, int);
extern char *split_at_right(char *, int);
/* HISTORY
/* .ad
/* .fi
/* A split_at() routine appears in the TCP Wrapper software
/* by Wietse Venema.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

30
postfix/include/stat_as.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef _STAT_AS_H_INCLUDED_
#define _STAT_AS_H_INCLUDED_
/*++
/* NAME
/* stat_as 3h
/* SUMMARY
/* stat file as user
/* SYNOPSIS
/* #include <sys/stat.h>
/* #include <stat_as.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern int stat_as(const char *, struct stat *, uid_t, gid_t);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,38 @@
#ifndef _STRINGOPS_H_INCLUDED_
#define _STRINGOPS_H_INCLUDED_
/*++
/* NAME
/* stringops 3h
/* SUMMARY
/* string operations
/* SYNOPSIS
/* #include <stringops.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern char *printable(char *, int);
extern char *lowercase(char *);
extern char *skipblanks(const char *);
extern char *trimblanks(char *, int);
extern char *concatenate(const char *,...);
extern char *mystrtok(char **, const char *);
extern char *translit(char *, const char *, const char *);
#ifndef HAVE_BASENAME
extern char *basename(const char *);
#endif
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

772
postfix/include/sys_defs.h Normal file
View File

@ -0,0 +1,772 @@
#ifndef _SYS_DEFS_H_INCLUDED_
#define _SYS_DEFS_H_INCLUDED_
/*++
/* NAME
/* sys_defs 3h
/* SUMMARY
/* portability header
/* SYNOPSIS
/* #include <sys_defs.h>
/* DESCRIPTION
/* .nf
/*
* Specific platforms. Major release numbers differ for a good reason. So be
* a good girl, plan for the future, and at least include the major release
* number in the system type (for example, SUNOS5 or FREEBSD2). The system
* type is determined by the makedefs shell script in the top-level
* directory. Adding support for a new system type means updating the
* makedefs script, and adding a section below for the new system.
*/
#if defined(FREEBSD2) || defined(FREEBSD3) || defined(FREEBSD4) \
|| defined(BSDI2) || defined(BSDI3) || defined(BSDI4) \
|| defined(OPENBSD2) || defined(NETBSD1) || defined(RHAPSODY5)
#define SUPPORTED
#include <sys/types.h>
#define USE_PATHS_H
#define USE_FLOCK_LOCK
#define HAS_SUN_LEN
#define HAS_FSYNC
#define HAS_DB
#define HAS_SA_LEN
#define DEF_DB_TYPE "hash"
#define ALIAS_DB_MAP "hash:/etc/aliases"
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin"
#define USE_STATFS
#define STATFS_IN_SYS_MOUNT_H
#define HAS_POSIX_REGEXP
#endif
#if defined(OPENBSD2)
#define HAS_ISSETUGID
#endif
#if defined(NETBSD1)
#define USE_DOT_LOCK
#endif
#if defined(RHAPSODY5)
#define NORETURN void
#define HAS_NETINFO
#endif
#ifdef ULTRIX4
#define SUPPORTED
/* Ultrix by default has only 64 descriptors per process */
#ifndef FD_SETSIZE
#define FD_SETSIZE 96
#endif
#include <sys/types.h>
#define UNSAFE_CTYPE /* XXX verify */
#define _PATH_MAILDIR "/var/spool/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/etc:/usr/ucb"
#define USE_FLOCK_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
/* might be set by makedef */
#ifdef HAS_DB
#define DEF_DB_TYPE "hash"
#define ALIAS_DB_MAP "hash:/etc/aliases"
#else
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/aliases"
#endif
extern int optind;
extern char *optarg;
extern int opterr;
#define MISSING_STRFTIME_E
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define ROOT_PATH "/bin:/usr/bin:/etc:/usr/etc:/usr/ucb"
#define USE_STATFS
#define USE_STRUCT_FS_DATA
#define STATFS_IN_SYS_MOUNT_H
/* Ultrix misses just S_ISSOCK, the others are there */
#define S_ISSOCK(mode) (((mode) & (S_IFMT)) == (S_IFSOCK))
#define DUP2_DUPS_CLOSE_ON_EXEC
#define MISSING_USLEEP
#endif
#ifdef OSF1
#define SUPPORTED
#include <sys/types.h>
#define MISSING_SETENV
#define USE_PATHS_H
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define USE_FLOCK_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAVE_BASENAME
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/var/adm/sendmail/aliases"
extern int optind; /* XXX use <getopt.h> */
extern char *optarg; /* XXX use <getopt.h> */
extern int opterr; /* XXX use <getopt.h> */
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define USE_STATFS
#define STATFS_IN_SYS_MOUNT_H
#define HAS_POSIX_REGEXP
#endif
#ifdef SUNOS4
#define SUPPORTED
#include <sys/types.h>
#define UNSAFE_CTYPE
#define fpos_t long
#define MISSING_SETENV
#define MISSING_STRERROR
#define _PATH_MAILDIR "/var/spool/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/etc:/usr/ucb"
#define USE_FLOCK_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/aliases"
extern int optind;
extern char *optarg;
extern int opterr;
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define ROOT_PATH "/bin:/usr/bin:/etc:/usr/etc:/usr/ucb"
#define USE_STATFS
#define STATFS_IN_SYS_VFS_H
#define memmove(d,s,l) bcopy(s,d,l)
#endif
#ifdef SUNOS5
#define SUPPORTED
#define _SVID_GETTOD /* Solaris 2.5, XSH4.2 versus SVID */
#include <sys/types.h>
#define MISSING_SETENV
#define _PATH_MAILDIR "/var/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb"
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/mail/aliases"
#define HAS_NIS
#define USE_SYS_SOCKIO_H /* Solaris 2.5, changed sys/ioctl.h */
#define GETTIMEOFDAY(t) gettimeofday(t)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define FIONREAD_IN_SYS_FILIO_H
#define USE_STATVFS
#define STATVFS_IN_SYS_STATVFS_H
#define STREAM_CONNECTIONS /* avoid UNIX-domain sockets */
#define LOCAL_LISTEN stream_listen
#define LOCAL_ACCEPT stream_accept
#define LOCAL_CONNECT stream_connect
#define LOCAL_TRIGGER stream_trigger
#define HAS_VOLATILE_LOCKS
#endif
#ifdef UW7 /* UnixWare 7 */
#define SUPPORTED
#include <sys/types.h>
#define _PATH_MAILDIR "/var/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb"
#define MISSING_SETENV
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/mail/aliases"
#define HAS_NIS
#define USE_SYS_SOCKIO_H
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define FIONREAD_IN_SYS_FILIO_H
#define DBM_NO_TRAILING_NULL
#define USE_STATVFS
#define STATVFS_IN_SYS_STATVFS_H
#define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT
#endif
#ifdef UW21 /* UnixWare 2.1.x */
#define SUPPORTED
#include <sys/types.h>
#define _PATH_MAILDIR "/var/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb"
#define MISSING_SETENV
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/mail/aliases"
/* Uncomment the following line if you have NIS package installed
#define HAS_NIS */
#define USE_SYS_SOCKIO_H
#define GETTIMEOFDAY(t) gettimeofday(t,NULL)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define FIONREAD_IN_SYS_FILIO_H
#define DBM_NO_TRAILING_NULL
#define USE_STATVFS
#define STATVFS_IN_SYS_STATVFS_H
#define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT
#endif
#ifdef AIX4
#define SUPPORTED
#include <sys/types.h>
#define MISSING_SETENV
#define _PATH_BSHELL "/bin/sh"
#define _PATH_MAILDIR "/var/spool/mail" /* paths.h lies */
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb"
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define USE_SYS_SELECT_H
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/aliases"
#define HAS_NIS
#define HAS_SA_LEN
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define RESOLVE_H_NEEDS_STDIO_H
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define SOCKADDR_SIZE size_t
#define SOCKOPT_SIZE size_t
#define USE_STATVFS
#define STATVFS_IN_SYS_STATVFS_H
#define STRCASECMP_IN_STRINGS_H
extern time_t time(time_t *);
extern int seteuid(uid_t);
extern int setegid(gid_t);
extern int initgroups(const char *, int);
#endif
#ifdef AIX3
#define SUPPORTED
#include <sys/types.h>
#define MISSING_SETENV
#define _PATH_BSHELL "/bin/sh"
#define _PATH_MAILDIR "/var/spool/mail" /* paths.h lies */
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb"
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define USE_SYS_SELECT_H
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/aliases"
#define HAS_NIS
#define HAS_SA_LEN
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define RESOLVE_H_NEEDS_STDIO_H
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define SOCKADDR_SIZE size_t
#define SOCKOPT_SIZE size_t
#define USE_STATFS
#define STATFS_IN_SYS_STATFS_H
#define STRCASECMP_IN_STRINGS_H
extern time_t time(time_t *);
extern int seteuid(uid_t);
extern int setegid(gid_t);
extern int initgroups(const char *, int);
#endif
#if defined(IRIX5) || defined(IRIX6)
#define SUPPORTED
#include <sys/types.h>
#define MISSING_SETENV
#define _PATH_MAILDIR "/var/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/usr/bin:/usr/bsd"
#define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/bsd"
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/aliases"
#define HAS_NIS
#define USE_SYS_SOCKIO_H /* XXX check */
#define GETTIMEOFDAY(t) gettimeofday(t)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/bsd"
#define FIONREAD_IN_SYS_FILIO_H /* XXX check */
#define DBM_NO_TRAILING_NULL /* XXX check */
#define USE_STATVFS
#define STATVFS_IN_SYS_STATVFS_H
#endif
#if defined(IRIX5)
#define MISSING_USLEEP
#endif
#ifdef LINUX2
#define SUPPORTED
#include <sys/types.h>
#define USE_PATHS_H
#define USE_FLOCK_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define HAS_DB
#define DEF_DB_TYPE "hash"
#define ALIAS_DB_MAP "hash:/etc/aliases"
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin"
#define FIONREAD_IN_TERMIOS_H
#define USE_STATFS
#define STATFS_IN_SYS_VFS_H
#define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT
#define PREPEND_PLUS_TO_OPTSTRING
#define HAS_POSIX_REGEXP
#endif
/*
* HPUX11 was copied from HPUX10, but can perhaps be trimmed down a bit.
*/
#ifdef HPUX11
#define SUPPORTED
#define USE_SIG_RETURN
#include <sys/types.h>
#define HAS_DBM
#define USE_FCNTL_LOCK
#define HAS_FSYNC
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/mail/aliases"
#define ROOT_PATH "/usr/bin:/sbin:/usr/sbin"
#define MISSING_SETENV
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define _PATH_BSHELL "/bin/sh"
#define _PATH_MAILDIR "/var/mail"
#define _PATH_DEFPATH "/usr/bin"
#define _PATH_STDPATH "/usr/bin:/sbin:/usr/sbin"
#define MISSING_SETEUID
#define HAVE_SETRESUID
#define MISSING_SETEGID
#define HAVE_SETRESGID
extern int h_errno; /* <netdb.h> imports too much stuff */
#define USE_STATFS
#define STATFS_IN_SYS_VFS_H
#define HAS_POSIX_REGEXP
#endif
#ifdef HPUX10
#define SUPPORTED
#define USE_SIG_RETURN
#include <sys/types.h>
#define HAS_DBM
#define USE_FCNTL_LOCK
#define HAS_FSYNC
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/etc/mail/aliases"
#define ROOT_PATH "/usr/bin:/sbin:/usr/sbin"
#define MISSING_SETENV
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define _PATH_BSHELL "/bin/sh"
#define _PATH_MAILDIR "/var/mail"
#define _PATH_DEFPATH "/usr/bin"
#define _PATH_STDPATH "/usr/bin:/sbin:/usr/sbin"
#define MISSING_SETEUID
#define HAVE_SETRESUID
#define MISSING_SETEGID
#define HAVE_SETRESGID
extern int h_errno; /* <netdb.h> imports too much stuff */
#define USE_STATFS
#define STATFS_IN_SYS_VFS_H
#define HAS_POSIX_REGEXP
#endif
#ifdef HPUX9
#define SUPPORTED
#define USE_SIG_RETURN
#include <sys/types.h>
#define HAS_DBM
#define USE_FCNTL_LOCK
#define HAS_FSYNC
#define HAS_NIS
#define MISSING_SETENV
#define MISSING_RLIMIT_FSIZE
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/usr/lib/aliases"
#define ROOT_PATH "/bin:/usr/bin:/etc"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_MAILDIR "/usr/mail"
#define _PATH_DEFPATH "/bin:/usr/bin"
#define _PATH_STDPATH "/bin:/usr/bin:/etc"
#define MISSING_SETEUID
#define HAVE_SETRESUID
#define MISSING_SETEGID
#define HAVE_SETRESGID
extern int h_errno;
#define USE_ULIMIT /* no setrlimit() */
#define USE_STATFS
#define STATFS_IN_SYS_VFS_H
#define HAS_POSIX_REGEXP
#endif
/*
* NEXTSTEP3, without -lposix, because its naming service is broken.
*/
#ifdef NEXTSTEP3
#define SUPPORTED
#include <sys/types.h>
#define HAS_DBM
#define USE_FLOCK_LOCK
#define USE_STATFS
#define HAVE_SYS_DIR_H
#define STATFS_IN_SYS_VFS_H
#define HAS_FSYNC
#define HAS_NIS
#define HAS_NETINFO
#define MISSING_SETENV_PUTENV
#define MISSING_MKFIFO
#define MISSING_SIGSET_T
#define MISSING_SIGACTION
#define MISSING_STD_FILENOS
#define MISSING_SETSID
#define MISSING_WAITPID
#define MISSING_UTIMBUF
#define HAS_WAIT4
#define WAIT_STATUS_T union wait
#define NORMAL_EXIT_STATUS(x) (WIFEXITED(x) && !WEXITSTATUS (x))
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define _PATH_MAILDIR "/usr/spool/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/bin:/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/bin:/usr/bin:/usr/ucb"
#define ROOT_PATH "/bin:/usr/bin:/usr/etc:/usr/ucb"
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "netinfo:/aliases"
#include <libc.h>
#define MISSING_POSIX_S_IS
#define MISSING_POSIX_S_MODES
/* It's amazing what is all missing... */
#define isascii(c) ((unsigned)(c)<=0177)
extern int opterr;
#define MISSING_PID_T
#define MISSING_STRFTIME_E
#define FD_CLOEXEC 1
#define O_NONBLOCK O_NDELAY
#define WEXITSTATUS(x) ((x).w_retcode)
#define WTERMSIG(x) ((x).w_termsig)
#endif
/*
* OPENSTEP does not have posix (some fix...)
*/
#ifdef OPENSTEP4
#define SUPPORTED
#include <sys/types.h>
#define HAS_DBM
#define USE_FLOCK_LOCK
#define USE_STATFS
#define HAVE_SYS_DIR_H
#define STATFS_IN_SYS_VFS_H
#define HAS_FSYNC
#define HAS_NIS
#define HAS_NETINFO
#define MISSING_SETENV_PUTENV
#define MISSING_MKFIFO
#define MISSING_SIGSET_T
#define MISSING_SIGACTION
#define MISSING_STD_FILENOS
#define MISSING_SETSID
#define MISSING_WAITPID
#define MISSING_UTIMBUF
#define HAS_WAIT4
#define WAIT_STATUS_T union wait
#define NORMAL_EXIT_STATUS(x) (WIFEXITED(x) && !WEXITSTATUS (x))
#define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0)
#define _PATH_MAILDIR "/usr/spool/mail"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_DEFPATH "/bin:/usr/bin:/usr/ucb"
#define _PATH_STDPATH "/bin:/usr/bin:/usr/ucb"
#define ROOT_PATH "/bin:/usr/bin:/usr/etc:/usr/ucb"
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "netinfo:/aliases"
#include <libc.h>
#define MISSING_POSIX_S_IS
#define MISSING_POSIX_S_MODES
/* It's amazing what is all missing... */
#define isascii(c) ((unsigned)(c)<=0177)
extern int opterr;
#define MISSING_PID_T
#define MISSING_STRFTIME_E
#define FD_CLOEXEC 1
#define O_NONBLOCK O_NDELAY
#define WEXITSTATUS(x) ((x).w_retcode)
#define WTERMSIG(x) ((x).w_termsig)
#define NORETURN /* the native compiler */
#endif
#ifdef ReliantUnix543
#define SUPPORTED
#include <sys/types.h>
#define MISSING_SETENV
#define _PATH_DEFPATH "/usr/bin:/usr/ucb"
#define _PATH_BSHELL "/bin/sh"
#define _PATH_MAILDIR "/var/spool/mail"
#define USE_FCNTL_LOCK
#define USE_DOT_LOCK
#define HAS_FSYNC
#define FIONREAD_IN_SYS_FILIO_H
#define USE_SYS_SOCKIO_H
#define HAS_DBM
#define DEF_DB_TYPE "dbm"
#define ALIAS_DB_MAP "dbm:/var/adm/sendmail/aliases"
extern int optind; /* XXX use <getopt.h> */
extern char *optarg; /* XXX use <getopt.h> */
extern int opterr; /* XXX use <getopt.h> */
#define HAS_NIS
#define GETTIMEOFDAY(t) gettimeofday(t)
#define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"
#define USE_STATVFS
#define STATVFS_IN_SYS_STATVFS_H
#define MISSING_USLEEP
#endif
/*
* We're not going to try to guess like configure does.
*/
#ifndef SUPPORTED
#error "unsupported platform"
#endif
#ifdef DUP2_DUPS_CLOSE_ON_EXEC
/* dup2_pass_on_exec() can be found in util/sys_compat.c */
extern int dup2_pass_on_exec(int oldd, int newd);
#define DUP2 dup2_pass_on_exec
#else
#define DUP2 dup2
#endif
#ifdef PREPEND_PLUS_TO_OPTSTRING
#define GETOPT(argc, argv, str) getopt((argc), (argv), "+" str)
#else
#define GETOPT(argc, argv, str) getopt((argc), (argv), (str))
#endif
#define OPTIND (optind > 0 ? optind : 1)
#if defined(USE_FCNTL_LOCK) && defined(USE_FLOCK_LOCK)
#error "define USE_FCNTL_LOCK or USE_FLOCK_LOCK, not both"
#endif
#if !defined(USE_FCNTL_LOCK) && !defined(USE_FLOCK_LOCK)
#error "define USE_FCNTL_LOCK or USE_FLOCK_LOCK"
#endif
#if defined(USE_STATFS) && defined(USE_STATVFS)
#error "define USE_STATFS or USE_STATVFS, not both"
#endif
#if !defined(USE_STATFS) && !defined(USE_STATVFS)
#error "define USE_STATFS or USE_STATVFS"
#endif
/*
* Defaults for normal systems.
*/
#ifndef SOCKADDR_SIZE
#define SOCKADDR_SIZE int
#endif
#ifndef SOCKOPT_SIZE
#define SOCKOPT_SIZE int
#endif
#ifndef LOCAL_LISTEN
#define LOCAL_LISTEN unix_listen
#define LOCAL_ACCEPT unix_accept
#define LOCAL_CONNECT unix_connect
#define LOCAL_TRIGGER unix_trigger
#endif
#if !defined (HAVE_SYS_NDIR_H) && !defined (HAVE_SYS_DIR_H) \
&& !defined (HAVE_NDIR_H)
#define HAVE_DIRENT_H
#endif
#ifndef WAIT_STATUS_T
typedef int WAIT_STATUS_T;
#define NORMAL_EXIT_STATUS(status) ((status) == 0)
#endif
/*
* Turn on the compatibility stuff.
*/
#ifdef MISSING_UTIMBUF
struct utimbuf {
time_t actime;
time_t modtime;
};
#endif
#ifdef MISSING_STRERROR
extern const char *strerror(int);
#endif
#if defined (MISSING_SETENV) || defined (MISSING_SETENV_PUTENV)
extern int setenv(const char *, const char *, int);
#endif
#ifdef MISSING_SETEUID
extern int seteuid(uid_t euid);
#endif
#ifdef MISSING_SETEGID
extern int setegid(gid_t egid);
#endif
#ifdef MISSING_MKFIFO
extern int mkfifo(char *, int);
#endif
#ifdef MISSING_WAITPID
extern int waitpid(int, WAIT_STATUS_T *status, int options);
#endif
#ifdef MISSING_SETSID
extern int setsid(void);
#endif
#ifdef MISSING_STD_FILENOS
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
#endif
#ifdef MISSING_PID_T
typedef int pid_t;
#endif
#ifdef MISSING_POSIX_S_IS
#define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK))
#define S_ISCHR(mode) (((mode) & (_S_IFMT)) == (_S_IFCHR))
#define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
#define S_ISSOCK(mode) (((mode) & (_S_IFMT)) == (_S_IFSOCK))
#define S_ISFIFO(mode) (((mode) & (_S_IFMT)) == (_S_IFIFO))
#define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG))
#endif
#ifdef MISSING_POSIX_S_MODES
#define S_IRUSR _S_IRUSR
#define S_IRGRP 0000040
#define S_IROTH 0000004
#define S_IWUSR _S_IWUSR
#define S_IWGRP 0000020
#define S_IWOTH 0000002
#define S_IXUSR _S_IXUSR
#define S_IXGRP 0000010
#define S_IXOTH 0000001
#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
#endif
/*
* Need to specify what functions never return, so that the compiler can
* warn for missing initializations and other trouble. However, OPENSTEP4
* gcc 2.7.x cannot handle this so we define this only if NORETURN isn't
* already defined above.
*/
#ifndef NORETURN
#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 || __GNUC__ >= 3
#define NORETURN void __attribute__((__noreturn__))
#endif
#endif
#ifndef NORETURN
#define NORETURN void
#endif
/*
* Making the ctype.h macros not more expensive than necessary. On some
* systems, ctype.h misbehaves badly with signed characters.
*/
#define _UCHAR_(c) ((unsigned char)(c))
#ifdef UNSAFE_CTYPE
#define ISASCII(c) isascii(_UCHAR_(c))
#define ISALNUM(c) (ISASCII(c) && isalnum(c))
#define ISALPHA(c) (ISASCII(c) && isalpha(c))
#define ISCNTRL(c) (ISASCII(c) && iscntrl(c))
#define ISDIGIT(c) (ISASCII(c) && isdigit(c))
#define ISGRAPH(c) (ISASCII(c) && isgraph(c))
#define ISLOWER(c) (ISASCII(c) && islower(c))
#define ISPRINT(c) (ISASCII(c) && isprint(c))
#define ISPUNCT(c) (ISASCII(c) && ispunct(c))
#define ISSPACE(c) (ISASCII(c) && isspace(c))
#define ISUPPER(c) (ISASCII(c) && isupper(c))
#define TOLOWER(c) (ISUPPER(c) ? tolower(c) : (c))
#define TOUPPER(c) (ISLOWER(c) ? toupper(c) : (c))
#else
#define ISASCII(c) isascii(_UCHAR_(c))
#define ISALNUM(c) isalnum(_UCHAR_(c))
#define ISALPHA(c) isalpha(_UCHAR_(c))
#define ISCNTRL(c) iscntrl(_UCHAR_(c))
#define ISDIGIT(c) isdigit(_UCHAR_(c))
#define ISGRAPH(c) isgraph(_UCHAR_(c))
#define ISLOWER(c) islower(_UCHAR_(c))
#define ISPRINT(c) isprint(_UCHAR_(c))
#define ISPUNCT(c) ispunct(_UCHAR_(c))
#define ISSPACE(c) isspace(_UCHAR_(c))
#define ISUPPER(c) isupper(_UCHAR_(c))
#define TOLOWER(c) tolower(_UCHAR_(c))
#define TOUPPER(c) toupper(_UCHAR_(c))
#endif
/*
* Scaffolding. I don't want to lose messages while the program is under
* development.
*/
extern int REMOVE(const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,31 @@
#ifndef _TIMED_CONNECT_H_INCLUDED_
#define _TIMED_CONNECT_H_INCLUDED_
/*++
/* NAME
/* timed_connect 3h
/* SUMMARY
/* connect operation with timeout
/* SYNOPSIS
/* #include <sys/socket.h>
/* #include <timed_connect.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern int timed_connect(int, struct sockaddr *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,30 @@
#ifndef _TIMED_WAIT_H_INCLUDED_
#define _TIMED_WAIT_H_INCLUDED_
/*++
/* NAME
/* timed_wait 3h
/* SUMMARY
/* wait operations with timeout
/* SYNOPSIS
/* #include <timed_wait.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern int timed_waitpid(pid_t, WAIT_STATUS_T *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

33
postfix/include/trigger.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef _TRIGGER_H_INCLUDED_
#define _TRIGGER_H_INCLUDED_
/*++
/* NAME
/* trigger 3h
/* SUMMARY
/* client interface file
/* SYNOPSIS
/* #include <trigger.h>
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
extern int unix_trigger(const char *, const char *, int, int);
extern int inet_trigger(const char *, const char *, int, int);
extern int fifo_trigger(const char *, const char *, int, int);
extern int stream_trigger(const char *, const char *, int, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,29 @@
#ifndef _USERNAME_H_INCLUDED_
#define _USERNAME_H_INCLUDED_
/*++
/* NAME
/* username 3h
/* SUMMARY
/* lookup name of real user
/* SYNOPSIS
/* #include <username.h>
/* DESCRIPTION
/* .nf
/* External interface. */
extern const char *username(void);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,33 @@
#ifndef _VALID_HOSTNAME_H_INCLUDED_
#define _VALID_HOSTNAME_H_INCLUDED_
/*++
/* NAME
/* valid_hostname 3h
/* SUMMARY
/* validate hostname
/* SYNOPSIS
/* #include <valid_hostname.h>
/* DESCRIPTION
/* .nf
/* External interface */
#define VALID_HOSTNAME_LEN 255 /* RFC 1035 */
#define VALID_LABEL_LEN 63 /* RFC 1035 */
extern int valid_hostname(const char *);
extern int valid_hostaddr(const char *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

98
postfix/include/vbuf.h Normal file
View File

@ -0,0 +1,98 @@
#ifndef _VBUF_H_INCLUDED_
#define _VBUF_H_INCLUDED_
/*++
/* NAME
/* vbuf 3h
/* SUMMARY
/* generic buffer
/* SYNOPSIS
/* #include <vbuf.h>
/* DESCRIPTION
/* .nf
/*
* The VBUF buffer is defined by 1) its structure, by 2) the VBUF_GET() and
* 3) VBUF_PUT() operations that automatically handle buffer empty and
* buffer full conditions, and 4) by the VBUF_SPACE() operation that allows
* the user to reserve buffer space ahead of time, to allow for situations
* where calling VBUF_PUT() is not possible or desirable.
*
* The VBUF buffer does not specify primitives for memory allocation or
* deallocation. The purpose is to allow different applications to have
* different strategies: a memory-resident buffer; a memory-mapped file; or
* a stdio-like window to an open file. Each application provides its own
* get(), put() and space() methods that perform the necessary magic.
*
* This interface is pretty normal. With one exception: the number of bytes
* left to read is negated. This is done so that we can change direction
* between reading and writing on the fly.
*/
typedef struct VBUF VBUF;
typedef int (*VBUF_GET_READY_FN) (VBUF *);
typedef int (*VBUF_PUT_READY_FN) (VBUF *);
typedef int (*VBUF_SPACE_FN) (VBUF *, int);
struct VBUF {
int flags; /* status, see below */
unsigned char *data; /* variable-length buffer */
int len; /* buffer length */
int cnt; /* bytes left to read/write */
unsigned char *ptr; /* read/write position */
VBUF_GET_READY_FN get_ready; /* read buffer empty action */
VBUF_PUT_READY_FN put_ready; /* write buffer full action */
VBUF_SPACE_FN space; /* request for buffer space */
};
/*
* Typically, an application will embed a VBUF structure into a larger
* structure that also contains application-specific members. This approach
* gives us the best of both worlds. The application can still use the
* generic VBUF primitives for reading and writing VBUFs. The macro below
* transforms a pointer from VBUF structure to the structure that contains
* it.
*/
#define VBUF_TO_APPL(vbuf_ptr,app_type,vbuf_member) \
((app_type *) (((char *) (vbuf_ptr)) - offsetof(app_type,vbuf_member)))
/*
* Buffer status management.
*/
#define VBUF_FLAG_ERR (1<<0) /* some I/O error */
#define VBUF_FLAG_EOF (1<<1) /* end of data */
#define VBUF_FLAG_BAD (VBUF_FLAG_ERR | VBUF_FLAG_EOF)
#define VBUF_FLAG_FIXED (1<<2) /* fixed-size buffer */
#define vbuf_error(v) ((v)->flags & VBUF_FLAG_ERR)
#define vbuf_eof(v) ((v)->flags & VBUF_FLAG_EOF)
#define vbuf_clearerr(v) ((v)->flags &= ~VBUF_FLAG_BAD)
/*
* Buffer I/O-like operations and results.
*/
#define VBUF_GET(v) ((v)->cnt < 0 ? ++(v)->cnt, \
(int) *(v)->ptr++ : vbuf_get(v))
#define VBUF_PUT(v,c) ((v)->cnt > 0 ? --(v)->cnt, \
(int) (*(v)->ptr++ = (c)) : vbuf_put((v),(c)))
#define VBUF_SPACE(v,n) ((v)->space((v),(n)))
#define VBUF_EOF (-1) /* no more space or data */
extern int vbuf_get(VBUF *);
extern int vbuf_put(VBUF *, int);
extern int vbuf_unget(VBUF *, int);
extern int vbuf_read(VBUF *, char *, int);
extern int vbuf_write(VBUF *, const char *, int);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,40 @@
#ifndef _VBUF_PRINT_H_INCLUDED_
#define _VBUF_PRINT_H_INCLUDED_
/*++
/* NAME
/* vbuf_print 3h
/* SUMMARY
/* formatted print to generic buffer
/* SYNOPSIS
/* #include <vbuf_print.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <stdarg.h>
/*
* Utility library.
*/
#include <vbuf.h>
/*
* External interface.
*/
extern VBUF *vbuf_print(VBUF *, const char *, va_list);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

135
postfix/include/vstream.h Normal file
View File

@ -0,0 +1,135 @@
#ifndef _VSTREAM_H_INCLUDED_
#define _VSTREAM_H_INCLUDED_
/*++
/* NAME
/* vstream 3h
/* SUMMARY
/* simple buffered I/O package
/* SYNOPSIS
/* #include <vstream.h>
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <fcntl.h>
#include <stdarg.h>
/*
* Utility library.
*/
#include <vbuf.h>
/*
* Simple buffered stream. The members of this structure are not part of the
* official interface and can change without prior notice.
*/
typedef int (*VSTREAM_FN) (int, void *, unsigned);
typedef int (*VSTREAM_WAITPID_FN) (pid_t, WAIT_STATUS_T *, int);
typedef struct VSTREAM {
VBUF buf; /* generic intelligent buffer */
int fd; /* file handle, no 256 limit */
VSTREAM_FN read_fn; /* buffer fill action */
VSTREAM_FN write_fn; /* buffer fill action */
long offset; /* cached seek info */
char *path; /* give it at least try */
int read_fd; /* read channel (double-buffered) */
int write_fd; /* write channel (double-buffered) */
VBUF read_buf; /* read buffer (double-buffered) */
VBUF write_buf; /* write buffer (double-buffered) */
pid_t pid; /* vstream_popen/close() */
VSTREAM_WAITPID_FN waitpid_fn; /* vstream_popen/close() */
} VSTREAM;
extern VSTREAM vstream_fstd[]; /* pre-defined streams */
#define VSTREAM_IN (&vstream_fstd[0])
#define VSTREAM_OUT (&vstream_fstd[1])
#define VSTREAM_ERR (&vstream_fstd[2])
#define VSTREAM_FLAG_ERR VBUF_FLAG_ERR /* some I/O error */
#define VSTREAM_FLAG_EOF VBUF_FLAG_EOF /* end of file */
#define VSTREAM_FLAG_FIXED VBUF_FLAG_FIXED /* fixed-size buffer */
#define VSTREAM_FLAG_BAD VBUF_FLAG_BAD
#define VSTREAM_FLAG_READ (1<<8) /* read buffer */
#define VSTREAM_FLAG_WRITE (1<<9) /* write buffer */
#define VSTREAM_FLAG_SEEK (1<<10) /* seek info valid */
#define VSTREAM_FLAG_NSEEK (1<<11) /* can't seek this file */
#define VSTREAM_FLAG_DOUBLE (1<<12) /* double buffer */
#define VSTREAM_BUFSIZE 4096
extern VSTREAM *vstream_fopen(const char *, int, int);
extern int vstream_fclose(VSTREAM *);
extern long vstream_fseek(VSTREAM *, long, int);
extern long vstream_ftell(VSTREAM *);
extern int vstream_fflush(VSTREAM *);
extern int vstream_fputs(const char *, VSTREAM *);
extern VSTREAM *vstream_fdopen(int, int);
#define vstream_fread(v, b, n) vbuf_read(&(v)->buf, (b), (n))
#define vstream_fwrite(v, b, n) vbuf_write(&(v)->buf, (b), (n))
#define VSTREAM_PUTC(ch, vp) VBUF_PUT(&(vp)->buf, (ch))
#define VSTREAM_GETC(vp) VBUF_GET(&(vp)->buf)
#define vstream_ungetc(vp, ch) vbuf_unget(&(vp)->buf, (ch))
#define VSTREAM_EOF VBUF_EOF
#define VSTREAM_PUTCHAR(ch) VSTREAM_PUTC((ch), VSTREAM_OUT)
#define VSTREAM_GETCHAR() VSTREAM_GETC(VSTREAM_IN)
#define vstream_fileno(vp) ((vp)->fd)
#define vstream_ferror(vp) vbuf_error(&(vp)->buf)
#define vstream_feof(vp) vbuf_eof(&(vp)->buf)
#define vstream_clearerr(vp) vbuf_clearerr(&(vp)->buf)
#define VSTREAM_PATH(vp) ((vp)->path ? (vp)->path : "unknown_stream")
extern void vstream_control(VSTREAM *, int,...);
#define VSTREAM_CTL_END 0
#define VSTREAM_CTL_READ_FN 1
#define VSTREAM_CTL_WRITE_FN 2
#define VSTREAM_CTL_PATH 3
#define VSTREAM_CTL_DOUBLE 4
#define VSTREAM_CTL_READ_FD 5
#define VSTREAM_CTL_WRITE_FD 6
#define VSTREAM_CTL_WAITPID_FN 7
extern VSTREAM *vstream_printf(const char *,...);
extern VSTREAM *vstream_fprintf(VSTREAM *, const char *,...);
extern VSTREAM *vstream_popen(const char *, int);
extern VSTREAM *vstream_popen_vargs(int,...);
extern int vstream_pclose(VSTREAM *);
#define vstream_ispipe(vp) ((vp)->pid != 0)
#define VSTREAM_POPEN_END 0 /* terminator */
#define VSTREAM_POPEN_COMMAND 1 /* command is string */
#define VSTREAM_POPEN_ARGV 2 /* command is array */
#define VSTREAM_POPEN_UID 3 /* privileges */
#define VSTREAM_POPEN_GID 4 /* privileges */
#define VSTREAM_POPEN_ENV 5 /* extra environment */
#define VSTREAM_POPEN_SHELL 6 /* alternative shell */
#define VSTREAM_POPEN_WAITPID_FN 7 /* child catcher, waitpid() compat. */
extern VSTREAM *vstream_vfprintf(VSTREAM *, const char *, va_list);
extern int vstream_peek(VSTREAM *);
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

98
postfix/include/vstring.h Normal file
View File

@ -0,0 +1,98 @@
#ifndef _VSTRING_H_INCLUDED_
#define _VSTRING_H_INCLUDED_
/*++
/* NAME
/* vstring 3h
/* SUMMARY
/* arbitrary-length string manager
/* SYNOPSIS
/* #include "vstring.h"
/* DESCRIPTION
/* .nf
/*
* System library.
*/
#include <stdarg.h>
/*
* Utility library.
*/
#include <vbuf.h>
/*
* We can't allow bare VBUFs in the interface, because VSTRINGs have a
* specific initialization and destruction sequence.
*/
typedef struct VSTRING {
VBUF vbuf;
int maxlen;
} VSTRING;
extern void vstring_init(VSTRING *, int);
extern void vstring_wipe(VSTRING *);
extern VSTRING *vstring_alloc(int);
extern void vstring_ctl(VSTRING *,...);
extern VSTRING *vstring_truncate(VSTRING *, int);
extern VSTRING *vstring_free(VSTRING *);
extern VSTRING *vstring_strcpy(VSTRING *, const char *);
extern VSTRING *vstring_strncpy(VSTRING *, const char *, int);
extern VSTRING *vstring_strcat(VSTRING *, const char *);
extern VSTRING *vstring_strncat(VSTRING *, const char *, int);
extern VSTRING *vstring_sprintf(VSTRING *, const char *,...);
extern VSTRING *vstring_sprintf_append(VSTRING *, const char *,...);
extern char *vstring_export(VSTRING *);
extern VSTRING *vstring_import(char *);
#define VSTRING_CTL_MAXLEN 1
#define VSTRING_CTL_END 0
/*
* Macros. Unsafe macros have UPPERCASE names.
*/
#define VSTRING_SPACE(vp, len) ((vp)->vbuf.space(&(vp)->vbuf, len))
#define vstring_str(vp) ((char *) (vp)->vbuf.data)
#define VSTRING_LEN(vp) ((vp)->vbuf.ptr - (vp)->vbuf.data)
#define vstring_end(vp) ((char *) (vp)->vbuf.ptr)
#define VSTRING_TERMINATE(vp) { if ((vp)->vbuf.cnt <= 0) \
VSTRING_SPACE((vp),1); \
*(vp)->vbuf.ptr = 0; }
#define VSTRING_RESET(vp) { (vp)->vbuf.ptr = (vp)->vbuf.data; \
(vp)->vbuf.cnt = (vp)->vbuf.len; }
#define VSTRING_ADDCH(vp, ch) VBUF_PUT(&(vp)->vbuf, ch)
#define VSTRING_SKIP(vp) { while ((vp)->vbuf.cnt > 0 && *(vp)->vbuf.ptr) \
(vp)->vbuf.ptr++, (vp)->vbuf.cnt--; }
#define vstring_avail(vp) ((vp)->vbuf.cnt)
/*
* The following macro is not part of the public interface, because it can
* really screw up a buffer by positioning past allocated memory.
*/
#define VSTRING_AT_OFFSET(vp, offset) { \
(vp)->vbuf.ptr = (vp)->vbuf.data + (offset); \
(vp)->vbuf.cnt = (vp)->vbuf.len - (offset); \
}
extern VSTRING *vstring_vsprintf(VSTRING *, const char *, va_list);
extern VSTRING *vstring_vsprintf_append(VSTRING *, const char *, va_list);
/* BUGS
/* Auto-resizing may change the address of the string data in
/* a vstring structure. Beware of dangling pointers.
/* HISTORY
/* .ad
/* .fi
/* A vstring module appears in the UNPROTO software by Wietse Venema.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

View File

@ -0,0 +1,54 @@
#ifndef _VSTRING_VSTREAM_H_INCLUDED_
#define _VSTRING_VSTREAM_H_INCLUDED_
/*++
/* NAME
/* vstring_vstream 3h
/* SUMMARY
/* auto-resizing string library
/* SYNOPSIS
/* #include <vstring_vstream.h>
/* DESCRIPTION
/*
* Utility library.
*/
#include <vstream.h>
#include <vstring.h>
/*
* External interface.
*/
extern int vstring_get(VSTRING *, VSTREAM *);
extern int vstring_get_nonl(VSTRING *, VSTREAM *);
extern int vstring_get_null(VSTRING *, VSTREAM *);
extern int vstring_get_bound(VSTRING *, VSTREAM *, int);
extern int vstring_get_nonl_bound(VSTRING *, VSTREAM *, int);
/*
* Backwards compatibility for code that still uses the vstring_fgets()
* interface. Unfortunately we can't change the macro name to upper case.
*/
#define vstring_fgets(s, p) \
(vstring_get((s), (p)) == VSTREAM_EOF ? 0 : (s))
#define vstring_fgets_nonl(s, p) \
(vstring_get_nonl((s), (p)) == VSTREAM_EOF ? 0 : (s))
#define vstring_fgets_null(s, p) \
(vstring_get_null((s), (p)) == VSTREAM_EOF ? 0 : (s))
#define vstring_fgets_bound(s, p, l) \
(vstring_get_bound((s), (p), (l)) == VSTREAM_EOF ? 0 : (s))
#define vstring_fgets_nonl_bound(s, p, l) \
(vstring_get_nonl_bound((s), (p), (l)) == VSTREAM_EOF ? 0 : (s))
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
#endif

0
postfix/lib/.pure Normal file
View File

91
postfix/local/feature.c Normal file
View File

@ -0,0 +1,91 @@
/*++
/* NAME
/* feature 3
/* SUMMARY
/* toggle features depending on address
/* SYNOPSIS
/* #include "local.h"
/*
/* int feature_control(state)
/* LOCAL_STATE state;
/* DESCRIPTION
/* feature_control() breaks the localpart of the recipient
/* address up into fields, according to the recipient feature
/* delimiter, and turns on/off the features as encountered.
/*
/* Arguments:
/* .IP state
/* The attributes that specify the message, recipient and more.
/* Attributes describing the alias, include or forward expansion.
/* A table with the results from expanding aliases or lists.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
/* System library. */
#include <sys_defs.h>
#include <string.h>
#ifdef STRCASECMP_IN_STRINGS_H
#include <strings.h>
#endif
/* Utility library. */
#include <msg.h>
#include <stringops.h>
#include <mymalloc.h>
/* Global library. */
#include <mail_params.h>
/* Application-specific. */
#include "local.h"
struct feature_map {
char *name;
int mask;
};
static struct feature_map feature_map[] = {
"nodelivered", FEATURE_NODELIVERED,
0,
};
/* feature_control - extract delivery options from recipient localpart */
int feature_control(const char *localpart)
{
struct feature_map *mp;
char *saved_localpart;
char *ptr;
int mask = 0;
char *cp;
if (*var_rcpt_fdelim) {
ptr = saved_localpart = mystrdup(localpart);
while ((cp = mystrtok(&ptr, var_rcpt_fdelim)) != 0) {
for (mp = feature_map; mp->name; mp++)
if (strcasecmp(mp->name, cp) == 0) {
if (msg_verbose)
msg_info("feature: %s", mp->name);
mask |= mp->mask;
break;
}
}
myfree(saved_localpart);
}
if (msg_verbose)
msg_info("features: 0x%x", mask);
return (mask);
}

View File

@ -43,6 +43,7 @@
/* Characters that may have special meaning to the shell or file system /* Characters that may have special meaning to the shell or file system
/* are replaced by underscores. The list of acceptable characters /* are replaced by underscores. The list of acceptable characters
/* is specified with the \fBforward_expansion_filter\fR configuration /* is specified with the \fBforward_expansion_filter\fR configuration
/* parameter.
/* /*
/* An alias or ~/.\fBforward\fR file may list any combination of external /* An alias or ~/.\fBforward\fR file may list any combination of external
/* commands, destination file names, \fB:include:\fR directives, or /* commands, destination file names, \fB:include:\fR directives, or

View File

@ -231,8 +231,6 @@ static int pickup_copy(VSTREAM *qfile, VSTREAM *cleanup,
* If the segment contains a recipient address, include the optional * If the segment contains a recipient address, include the optional
* always_bcc recipient. * always_bcc recipient.
*/ */
info->sender = 0;
info->rcpt = 0;
if ((status = copy_segment(qfile, cleanup, info, buf, REC_TYPE_ENVELOPE)) != 0) if ((status = copy_segment(qfile, cleanup, info, buf, REC_TYPE_ENVELOPE)) != 0)
return (status); return (status);
if (info->sender == 0) { if (info->sender == 0) {
@ -241,12 +239,10 @@ static int pickup_copy(VSTREAM *qfile, VSTREAM *cleanup,
} }
msg_info("%s: uid=%d from=<%s>", info->id, msg_info("%s: uid=%d from=<%s>", info->id,
(int) info->st.st_uid, info->sender); (int) info->st.st_uid, info->sender);
myfree(info->sender);
if (info->rcpt) { if (info->rcpt) {
if (*var_always_bcc) if (*var_always_bcc)
rec_fputs(cleanup, REC_TYPE_RCPT, var_always_bcc); rec_fputs(cleanup, REC_TYPE_RCPT, var_always_bcc);
myfree(info->rcpt);
} }
/* /*
@ -361,10 +357,31 @@ static int pickup_file(PICKUP_INFO *info)
vstream_fclose(qfile); vstream_fclose(qfile);
vstream_fclose(cleanup); vstream_fclose(cleanup);
vstring_free(buf); vstring_free(buf);
myfree(info->id);
return (status); return (status);
} }
/* pickup_init - init info structure */
static void pickup_init(PICKUP_INFO *info)
{
info->id = 0;
info->path = 0;
info->sender = 0;
info->rcpt = 0;
}
/* pickup_free - wipe info structure */
static void pickup_free(PICKUP_INFO *info)
{
#define SAFE_FREE(x) { if (x) myfree(x); }
SAFE_FREE(info->id);
SAFE_FREE(info->path);
SAFE_FREE(info->sender);
SAFE_FREE(info->rcpt);
}
/* pickup_service - service client */ /* pickup_service - service client */
static void pickup_service(char *unused_buf, int unused_len, static void pickup_service(char *unused_buf, int unused_len,
@ -395,6 +412,7 @@ static void pickup_service(char *unused_buf, int unused_len,
scan = scan_dir_open(queue_name); scan = scan_dir_open(queue_name);
while ((id = scan_dir_next(scan)) != 0) { while ((id = scan_dir_next(scan)) != 0) {
if (mail_open_ok(queue_name, id, &info.st, &path) == MAIL_OPEN_YES) { if (mail_open_ok(queue_name, id, &info.st, &path) == MAIL_OPEN_YES) {
pickup_init(&info);
info.path = mystrdup(path); info.path = mystrdup(path);
if (pickup_file(&info) == REMOVE_MESSAGE_FILE) { if (pickup_file(&info) == REMOVE_MESSAGE_FILE) {
if (REMOVE(info.path)) if (REMOVE(info.path))
@ -402,7 +420,7 @@ static void pickup_service(char *unused_buf, int unused_len,
else else
file_count++; file_count++;
} }
myfree(info.path); pickup_free(&info);
} }
} }
scan_dir_close(scan); scan_dir_close(scan);

View File

@ -276,7 +276,7 @@ static void postalias(char *map_type, char *path_name,
static NORETURN usage(char *myname) static NORETURN usage(char *myname)
{ {
msg_fatal("usage: %s [-c config_directory] [-i] [-v] [-w] [output_type:]file...", msg_fatal("usage: %s [-c config_dir] [-i] [-v] [-w] [output_type:]file...",
myname); myname);
} }

View File

@ -0,0 +1,24 @@
#!/bin/sh
# Extract initialization tables from actual source code.
awk '
/static CONFIG_INT_TABLE/,/};/ {
if ($1 ~ /VAR/) {
print "int " substr($3,2,length($3)-2) ";" > "int_vars.h"
print | "sort -u >int_table.h"
}
}
/static CONFIG_STR_TABLE/,/};/ {
if ($1 ~ /VAR/) {
print "char *" substr($3,2,length($3)-2) ";" > "str_vars.h"
print | "sort -u >str_table.h"
}
}
/static CONFIG_BOOL_TABLE/,/};/ {
if ($1 ~ /VAR/) {
print "int " substr($3,2,length($3)-2) ";" > "bool_vars.h"
print | "sort -u >bool_table.h"
}
}
' $*

View File

@ -18,7 +18,7 @@
/* .IP \fB-d\fR /* .IP \fB-d\fR
/* Print default parameter settings instead of actual settings. /* Print default parameter settings instead of actual settings.
/* .IP \fB-h\fR /* .IP \fB-h\fR
/* Show parameter values only, not the ``name ='' label /* Show parameter values only, not the ``name = '' label
/* that normally precedes the value. /* that normally precedes the value.
/* .IP \fB-n\fR /* .IP \fB-n\fR
/* Print non-default parameter settings only. /* Print non-default parameter settings only.
@ -27,8 +27,6 @@
/* options make the software increasingly verbose. /* options make the software increasingly verbose.
/* DIAGNOSTICS /* DIAGNOSTICS
/* Problems are reported to the standard error stream. /* Problems are reported to the standard error stream.
/* Fatal error: out of memory, file not found, invalid \fBmain.cf\fR
/* parameter syntax.
/* LICENSE /* LICENSE
/* .ad /* .ad
/* .fi /* .fi
@ -293,8 +291,6 @@ static void print_bool(int mode, CONFIG_BOOL_TABLE *cbt)
show_strval(mode, cbt->name, cbt->defval ? "yes" : "no"); show_strval(mode, cbt->name, cbt->defval ? "yes" : "no");
} else { } else {
value = dict_lookup(CONFIG_DICT, cbt->name); value = dict_lookup(CONFIG_DICT, cbt->name);
if (value)
(void) get_mail_conf_bool(cbt->name, cbt->defval);
if ((mode & SHOW_NONDEF) == 0) { if ((mode & SHOW_NONDEF) == 0) {
if (value == 0) { if (value == 0) {
show_strval(mode, cbt->name, cbt->defval ? "yes" : "no"); show_strval(mode, cbt->name, cbt->defval ? "yes" : "no");
@ -318,8 +314,6 @@ static void print_int(int mode, CONFIG_INT_TABLE *cit)
show_intval(mode, cit->name, cit->defval); show_intval(mode, cit->name, cit->defval);
} else { } else {
value = dict_lookup(CONFIG_DICT, cit->name); value = dict_lookup(CONFIG_DICT, cit->name);
if (value)
(void) get_mail_conf_int(cit->name, cit->defval, cit->min, cit->max);
if ((mode & SHOW_NONDEF) == 0) { if ((mode & SHOW_NONDEF) == 0) {
if (value == 0) { if (value == 0) {
show_intval(mode, cit->name, cit->defval); show_intval(mode, cit->name, cit->defval);
@ -343,8 +337,6 @@ static void print_str(int mode, CONFIG_STR_TABLE *cst)
show_strval(mode, cst->name, cst->defval); show_strval(mode, cst->name, cst->defval);
} else { } else {
value = dict_lookup(CONFIG_DICT, cst->name); value = dict_lookup(CONFIG_DICT, cst->name);
if (value)
(void) get_mail_conf_str(cst->name, cst->defval, cst->min, cst->max);
if ((mode & SHOW_NONDEF) == 0) { if ((mode & SHOW_NONDEF) == 0) {
if (value == 0) { if (value == 0) {
show_strval(mode, cst->name, cst->defval); show_strval(mode, cst->name, cst->defval);
@ -520,7 +512,7 @@ int main(int argc, char **argv)
msg_verbose++; msg_verbose++;
break; break;
default: default:
msg_fatal("usage: %s [-c config_directory] [-d (defaults)] [-h (no names)] [-n (non-defaults)] [-v] name...", argv[0]); msg_fatal("usage: %s [-c config_dir] [-d (defaults)] [-h (no names)] [-n (non-defaults)] [-v] name...", argv[0]);
} }
} }

View File

@ -200,21 +200,21 @@ int main(int argc, char **argv)
#ifdef USE_DOT_LOCK #ifdef USE_DOT_LOCK
if (dot_lockfile(folder, why) < 0) { if (dot_lockfile(folder, why) < 0) {
if (errno == EEXIST) { if (errno == EEXIST) {
msg_warn("dotlock file %s: %s", folder, vstring_str(why)); msg_warn("%s", vstring_str(why));
exit(EX_TEMPFAIL); exit(EX_TEMPFAIL);
} }
msg_fatal("dotlock file %s: %s", folder, vstring_str(why)); msg_fatal("%s", vstring_str(why));
} }
#endif #endif
if (deliver_flock(fd, why) < 0) { if (deliver_flock(fd, why) < 0) {
if (errno == EAGAIN) { if (errno == EAGAIN) {
msg_warn("lock %s: %s", folder, vstring_str(why)); msg_warn("file %s: %s", folder, vstring_str(why));
#ifdef USE_DOT_LOCK #ifdef USE_DOT_LOCK
dot_unlockfile(folder); dot_unlockfile(folder);
#endif #endif
exit(EX_TEMPFAIL); exit(EX_TEMPFAIL);
} }
msg_fatal("lock %s: %s", folder, vstring_str(why)); msg_fatal("file %s: %s", folder, vstring_str(why));
} }
/* /*

View File

@ -230,7 +230,7 @@ static void postmap(char *map_type, char *path_name,
static NORETURN usage(char *myname) static NORETURN usage(char *myname)
{ {
msg_fatal("usage: %s [-c config_directory] [-i] [-v] [-w] [output_type:]file...", msg_fatal("usage: %s [-c config_dir] [-i] [-v] [-w] [output_type:]file...",
myname); myname);
} }

View File

@ -127,29 +127,28 @@ static void qmgr_active_corrupt(const char *queue_id)
/* qmgr_active_defer - defer queue file */ /* qmgr_active_defer - defer queue file */
static void qmgr_active_defer(QMGR_MESSAGE *message, time_t delay) static void qmgr_active_defer(const char *queue_name, const char *queue_id,
int delay)
{ {
char *myname = "qmgr_active_defer"; char *myname = "qmgr_active_defer";
const char *path; const char *path;
struct utimbuf tbuf; struct utimbuf tbuf;
if (msg_verbose) if (msg_verbose)
msg_info("wakeup %s after %ld secs", message->queue_id, (long) delay); msg_info("wakeup %s after %ld secs", queue_id, (long) delay);
tbuf.actime = tbuf.modtime = event_time() + delay; tbuf.actime = tbuf.modtime = event_time() + delay;
path = mail_queue_path((VSTRING *) 0, message->queue_name, path = mail_queue_path((VSTRING *) 0, queue_name, queue_id);
message->queue_id);
if (utime(path, &tbuf) < 0) if (utime(path, &tbuf) < 0)
msg_fatal("%s: update %s time stamps: %m", myname, path); msg_fatal("%s: update %s time stamps: %m", myname, path);
if (mail_queue_rename(message->queue_id, message->queue_name, if (mail_queue_rename(queue_id, queue_name, MAIL_QUEUE_DEFERRED)) {
MAIL_QUEUE_DEFERRED)) {
if (errno != ENOENT) if (errno != ENOENT)
msg_fatal("%s: rename %s from %s to %s: %m", myname, msg_fatal("%s: rename %s from %s to %s: %m", myname,
message->queue_id, message->queue_name, MAIL_QUEUE_DEFERRED); queue_id, queue_name, MAIL_QUEUE_DEFERRED);
msg_warn("%s: rename %s from %s to %s: %m", myname, msg_warn("%s: rename %s from %s to %s: %m", myname,
message->queue_id, message->queue_name, MAIL_QUEUE_DEFERRED); queue_id, queue_name, MAIL_QUEUE_DEFERRED);
} else if (msg_verbose) { } else if (msg_verbose) {
msg_info("%s: defer %s", myname, message->queue_id); msg_info("%s: defer %s", myname, queue_id);
} }
} }
@ -218,7 +217,7 @@ void qmgr_active_feed(QMGR_SCAN *scan_info, const char *queue_id)
scan_info->flags)) == 0) { scan_info->flags)) == 0) {
qmgr_active_corrupt(queue_id); qmgr_active_corrupt(queue_id);
} else if (message == QMGR_MESSAGE_LOCKED) { } else if (message == QMGR_MESSAGE_LOCKED) {
qmgr_active_defer(message, (time_t) var_min_backoff_time); qmgr_active_defer(MAIL_QUEUE_ACTIVE, queue_id, var_min_backoff_time);
} else { } else {
/* /*
@ -245,7 +244,7 @@ void qmgr_active_done(QMGR_MESSAGE *message)
char *myname = "qmgr_active_done"; char *myname = "qmgr_active_done";
struct stat st; struct stat st;
const char *path; const char *path;
time_t delay; int delay;
if (msg_verbose) if (msg_verbose)
msg_info("%s: %s", myname, message->queue_id); msg_info("%s: %s", myname, message->queue_id);
@ -359,7 +358,7 @@ void qmgr_active_done(QMGR_MESSAGE *message)
} else { } else {
delay = var_min_backoff_time; delay = var_min_backoff_time;
} }
qmgr_active_defer(message, delay); qmgr_active_defer(message->queue_name, message->queue_id, delay);
} }
/* /*

View File

@ -672,6 +672,7 @@ QMGR_MESSAGE *qmgr_message_alloc(const char *queue_name, const char *queue_id,
return (0); return (0);
} }
if (myflock(vstream_fileno(message->fp), QMGR_LOCK_MODE) < 0) { if (myflock(vstream_fileno(message->fp), QMGR_LOCK_MODE) < 0) {
msg_info("%s: skipped, still being delivered", queue_id);
qmgr_message_close(message); qmgr_message_close(message);
qmgr_message_free(message); qmgr_message_free(message);
return (QMGR_MESSAGE_LOCKED); return (QMGR_MESSAGE_LOCKED);

View File

@ -245,6 +245,7 @@
#include <safe.h> #include <safe.h>
#include <iostuff.h> #include <iostuff.h>
#include <stringops.h> #include <stringops.h>
#include <set_ugid.h>
/* Global library. */ /* Global library. */
@ -596,17 +597,18 @@ int main(int argc, char **argv)
set_mail_conf_str(VAR_PROCNAME, var_procname = mystrdup(argv[0])); set_mail_conf_str(VAR_PROCNAME, var_procname = mystrdup(argv[0]));
/* /*
* Do not set[e]uid(getuid()). This allows the real user to manipulate * Some sites mistakenly install Postfix sendmail as set-uid root. Drop
* the process, which is dangerous, because some systems do not reset the * set-uid privileges only when root, otherwise some systems will not
* saved set-userid unless euid == 0. * reset the saved set-userid, which would be a security vulnerability.
*/ */
#ifdef WARN_SETXID_SENDMAIL if (geteuid() == 0 && getuid() != 0) {
if (geteuid() != getuid()) msg_warn("sendmail is set-uid root, or is run from a set-uid root process");
msg_warn("sendmail is set-uid or is run from a set-uid process"); set_ugid(getuid(), getgid());
if (getegid() != getgid()) }
msg_warn("sendmail is set-gid or is run from a set-gid process");
#endif
/*
* Further initialization...
*/
mail_conf_read(); mail_conf_read();
if (chdir(var_queue_dir)) if (chdir(var_queue_dir))
msg_fatal("chdir %s: %m", var_queue_dir); msg_fatal("chdir %s: %m", var_queue_dir);

View File

@ -215,7 +215,6 @@ int smtp_errno;
static int deliver_message(DELIVER_REQUEST *request) static int deliver_message(DELIVER_REQUEST *request)
{ {
char *myname = "deliver_message";
VSTRING *why; VSTRING *why;
SMTP_STATE *state; SMTP_STATE *state;
int result; int result;

View File

@ -324,8 +324,7 @@ static DNS_RR *smtp_find_self(DNS_RR *addr_list)
/* smtp_truncate_self - truncate address list at self and equivalents */ /* smtp_truncate_self - truncate address list at self and equivalents */
static DNS_RR *smtp_truncate_self(DNS_RR *addr_list, unsigned pref, static DNS_RR *smtp_truncate_self(DNS_RR *addr_list, unsigned pref, char *name)
char *name, VSTRING *why)
{ {
DNS_RR *addr; DNS_RR *addr;
DNS_RR *last; DNS_RR *last;
@ -336,11 +335,6 @@ static DNS_RR *smtp_truncate_self(DNS_RR *addr_list, unsigned pref,
smtp_print_addr("truncated", addr); smtp_print_addr("truncated", addr);
dns_rr_free(addr); dns_rr_free(addr);
if (last == 0) { if (last == 0) {
if (*var_bestmx_transp == 0) {
vstring_sprintf(why, "mail for %s loops back to myself",
name);
smtp_errno = SMTP_FAIL;
}
addr_list = 0; addr_list = 0;
} else { } else {
last->next = 0; last->next = 0;
@ -368,6 +362,11 @@ DNS_RR *smtp_domain_addr(char *name, VSTRING *why)
unsigned best_pref; unsigned best_pref;
unsigned best_found; unsigned best_found;
/*
* Preferences from DNS use 0..32767, fall-backs use 32768+.
*/
#define IMPOSSIBLE_PREFERENCE (~0)
/* /*
* Sanity check. * Sanity check.
*/ */
@ -381,8 +380,19 @@ DNS_RR *smtp_domain_addr(char *name, VSTRING *why)
* preferred than myself. When no MX resource records exist, look up the * preferred than myself. When no MX resource records exist, look up the
* addresses listed for this name. * addresses listed for this name.
* *
* Normally it is OK if an MX host cannot be found in the DNS; we'll just
* use a backup one, and silently ignore the better MX host. However, if
* the best backup that we can find in the DNS is the local machine, then
* we must remember that the local machine is not the primary MX host, or
* else we will claim that mail loops back.
*
* XXX Optionally do A lookups even when the MX lookup didn't complete. * XXX Optionally do A lookups even when the MX lookup didn't complete.
* Unfortunately with some DNS servers this is not a transient problem. * Unfortunately with some DNS servers this is not a transient problem.
*
* XXX Ideally we would perform A lookups only as far as needed. But as long
* as we're looking up all the hosts, it would be better to look up the
* least preferred host first, so that DNS lookup error messages make
* more sense.
*/ */
switch (dns_lookup(name, T_MX, 0, &mx_names, (VSTRING *) 0, why)) { switch (dns_lookup(name, T_MX, 0, &mx_names, (VSTRING *) 0, why)) {
default: default:
@ -397,20 +407,29 @@ DNS_RR *smtp_domain_addr(char *name, VSTRING *why)
break; break;
case DNS_OK: case DNS_OK:
mx_names = dns_rr_sort(mx_names, smtp_compare_mx); mx_names = dns_rr_sort(mx_names, smtp_compare_mx);
best_pref = (mx_names ? mx_names->pref : ~0); best_pref = (mx_names ? mx_names->pref : IMPOSSIBLE_PREFERENCE);
addr_list = smtp_addr_list(mx_names, why); addr_list = smtp_addr_list(mx_names, why);
dns_rr_free(mx_names); dns_rr_free(mx_names);
best_found = (addr_list ? addr_list->pref : ~0); best_found = (addr_list ? addr_list->pref : IMPOSSIBLE_PREFERENCE);
if (*var_fallback_relay) if (*var_fallback_relay)
addr_list = smtp_addr_fallback(addr_list); addr_list = smtp_addr_fallback(addr_list);
if (msg_verbose) if (msg_verbose)
smtp_print_addr(name, addr_list); smtp_print_addr(name, addr_list);
if ((self = smtp_find_self(addr_list)) != 0) if ((self = smtp_find_self(addr_list)) != 0) {
addr_list = smtp_truncate_self(addr_list, self->pref, name, why); addr_list = smtp_truncate_self(addr_list, self->pref, name);
if (addr_list == 0 && best_pref < best_found) { if (addr_list == 0) {
vstring_sprintf(why, "unable to find primary mail relay for %s", if (best_pref != best_found) {
name); vstring_sprintf(why, "unable to find primary relay for %s",
smtp_errno = SMTP_RETRY; name);
smtp_errno = SMTP_RETRY;
} else if (*var_bestmx_transp != 0) { /* we're best MX */
smtp_errno = SMTP_OK;
} else {
vstring_sprintf(why, "mail for %s loops back to myself",
name);
smtp_errno = SMTP_FAIL;
}
}
} }
break; break;
case DNS_NOTFOUND: case DNS_NOTFOUND:

View File

@ -125,9 +125,9 @@
/* The \fIrelay_domains_reject_code\fR configuration parameter specifies /* The \fIrelay_domains_reject_code\fR configuration parameter specifies
/* the reject status code (default: 554). /* the reject status code (default: 554).
/* .IP reject_unauth_destination /* .IP reject_unauth_destination
/* Allow the request when the resolved recipient domain matches the /* Reject the request when the resolved recipient domain does not match
/* \fIrelay_domains\fR configuration parameter. Reject the request /* the \fIrelay_domains\fR configuration parameter. Same error code as
/* otherwise. Same error code as check_relay_domains. /* check_relay_domains.
/* .IP permit_mx_backup /* .IP permit_mx_backup
/* Allow the request when the local mail system is mail exchanger /* Allow the request when the local mail system is mail exchanger
/* for the recipient domain (this includes the case where the local /* for the recipient domain (this includes the case where the local
@ -688,7 +688,7 @@ static int reject_unauth_destination(SMTPD_STATE *state, char *recipient)
resolve_clnt_query(STR(query), &reply); resolve_clnt_query(STR(query), &reply);
/* /*
* Permit if destination is local. XXX This must be generalized for * Pass if destination is local. XXX This must be generalized for
* per-domain user tables and for non-UNIX local delivery agents. * per-domain user tables and for non-UNIX local delivery agents.
*/ */
if (STR(reply.nexthop)[0] == 0 if (STR(reply.nexthop)[0] == 0
@ -697,13 +697,13 @@ static int reject_unauth_destination(SMTPD_STATE *state, char *recipient)
domain += 1; domain += 1;
/* /*
* Permit if the destination matches the relay_domains list. * Pass if the destination matches the relay_domains list.
*/ */
if (domain_list_match(relay_domains, domain)) if (domain_list_match(relay_domains, domain))
return (SMTPD_CHECK_DUNNO); return (SMTPD_CHECK_DUNNO);
/* /*
* Deny relaying between sites that both are not in relay_domains. * Reject relaying to sites that are not listed in relay_domains.
*/ */
return (smtpd_check_reject(state, MAIL_ERROR_POLICY, return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
"%d <%s>: Relay access denied", "%d <%s>: Relay access denied",

0
postfix/util/compat.c Normal file
View File

View File

@ -166,7 +166,7 @@ static void dict_dbm_update(DICT *dict, const char *name, const char *value)
* Do the update. * Do the update.
*/ */
if ((status = dbm_store(dict_dbm->dbm, dbm_key, dbm_value, if ((status = dbm_store(dict_dbm->dbm, dbm_key, dbm_value,
(dict->flags & DICT_FLAG_DUP_REPLACE) ? DBM_REPLACE : DBM_INSERT)) < 0) (dict->flags & DICT_FLAG_DUP_REPLACE) ? DBM_REPLACE : DBM_INSERT)) < 0)
msg_fatal("error writing DBM database %s: %m", dict_dbm->path); msg_fatal("error writing DBM database %s: %m", dict_dbm->path);
if (status) { if (status) {
if (dict->flags & DICT_FLAG_DUP_IGNORE) if (dict->flags & DICT_FLAG_DUP_IGNORE)
@ -385,6 +385,8 @@ DICT *dict_dbm_open(const char *path, int open_flags, int dict_flags)
if (fstat(dict_dbm->dict.fd, &st) < 0) if (fstat(dict_dbm->dict.fd, &st) < 0)
msg_fatal("dict_dbm_open: fstat: %m"); msg_fatal("dict_dbm_open: fstat: %m");
dict_dbm->dict.mtime = st.st_mtime; dict_dbm->dict.mtime = st.st_mtime;
close_on_exec(dbm_pagfno(dbm), CLOSE_ON_EXEC);
close_on_exec(dbm_dirfno(dbm), CLOSE_ON_EXEC);
dict_dbm->dict.flags = dict_flags | DICT_FLAG_FIXED; dict_dbm->dict.flags = dict_flags | DICT_FLAG_FIXED;
if ((dict_flags & (DICT_FLAG_TRY0NULL | DICT_FLAG_TRY1NULL)) == 0) if ((dict_flags & (DICT_FLAG_TRY0NULL | DICT_FLAG_TRY1NULL)) == 0)
dict_dbm->dict.flags |= (DICT_FLAG_TRY0NULL | DICT_FLAG_TRY1NULL); dict_dbm->dict.flags |= (DICT_FLAG_TRY0NULL | DICT_FLAG_TRY1NULL);

View File

@ -339,7 +339,6 @@ extern int initgroups(const char *, int);
#define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT #define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT
#define PREPEND_PLUS_TO_OPTSTRING #define PREPEND_PLUS_TO_OPTSTRING
#define HAS_POSIX_REGEXP #define HAS_POSIX_REGEXP
#define WARN_SETXID_SENDMAIL
#endif #endif
/* /*