PREPEND+IGNORE. The result remains in the input stream, and
is subject to address rewriting and other processing where
applicable. File: cleanup/cleanup_message.c.
+
+20050407
+
+ @%^!#& Thanks to inadequate SASL documentation the client
+ could negotiate a security layer where none was desired.
+ Better documentation has become available since Postfix
+ SASL support was implemented, and now Postfix needs to be
+ fixed. Files: */*_sasl_glue.c.
+
+20050402
+
+ Cleanup: updated error messages about MIME processing errors
+ in the SMTP client. These errors are no longer specific to
+ 8bit->7bit conversion; they can also happen with generic
+ address mapping. File: smtp/smtp_proto.c.
+
+20050409
+
+ Safety: the CDB map now logs a warning when the source file
+ is newer than the indexed file, just like the Berkeley DB
+ and DBM maps. Michael Tokarev. File: util/dict_cdb.c.
+
+20050412
+
+ Bugfix: while updating the cleanup_flush() infrastructure
+ in the 2.3 development release, eliminated a portability
+ problem that was introduced when "REJECT text" support was
+ added. File: cleanup/cleanup.c.
+
+20050413
+
+ Portability: don't mix socket message send/receive calls
+ with socket stream read/write calls. The fact that you can
+ get away with it only on some stacks implies that there is
+ no long-term guarantee. Specify -DCAN_WRITE_BEFORE_SENDING_FD
+ if you feel brave. File: util/sys_defs.h.
+
+ Robustness: re-compile all object files after the "make
+ makefiles" options have changed. Files: src/*/Makefile.in.
+
+20050417
+
+ Safety: don't call syslog from a user-triggered signal
+ handler, and other minor fixes back-ported from the 2.3
+ development release. File: postdrop/postdrop.c.
+
+20050422
+
+ Bugfix: postsuper could lose an error message after reporting
+ a fatal error. Fix back-ported from the 2.3 development
+ release. File: postsuper/postsuper.c.
+
+20050427
+
+ Bugfix: don't panic when the fall-back relay can't be used
+ because the local MTA is MX for the destination, or when
+ the fall-back relay can't be used because it was already
+ tried via a cached session. Files: util/argv.c,
+ smtp/smtp_connect.c.
grep "^tlsmgr[ ]*fifo[ ]" \
$config_directory/master.cf >/dev/null && {
- echo Editing $config_directory/master.cf, updating the tlsmgr fifo->unix service
+ echo Editing $config_directory/master.cf, updating the tlsmgr from fifo to unix service
ed $config_directory/master.cf <<EOF || exit 1
/^tlsmgr[ ]*fifo[ ]/
s/fifo/unix/
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
CLEANUP_STATE *state;
int flags;
int type = 0;
+ int status;
/*
* Sanity check. This service takes no command-line arguments.
/*
* Finish this message, and report the result status to the client.
*/
+ status = cleanup_flush(state); /* in case state is modified */
attr_print(src, ATTR_FLAG_NONE,
- ATTR_TYPE_NUM, MAIL_ATTR_STATUS, cleanup_flush(state),
+ ATTR_TYPE_NUM, MAIL_ATTR_STATUS, status,
ATTR_TYPE_STR, MAIL_ATTR_WHY, state->reason ?
state->reason : "",
ATTR_TYPE_END);
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
all: $(LIB)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
all: $(PROG)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
all: $(LIB)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
* Patches change the patchlevel and the release date. Snapshots change the
* release date only.
*/
-#define MAIL_RELEASE_DATE "20050401"
-#define MAIL_VERSION_NUMBER "2.2.2"
+#define MAIL_RELEASE_DATE "20050428"
+#define MAIL_VERSION_NUMBER "2.2.3"
#define VAR_MAIL_VERSION "mail_version"
#ifdef SNAPSHOT
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
*/
memset(&sec_props, 0L, sizeof(sec_props));
sec_props.min_ssf = 0;
- sec_props.max_ssf = 1; /* don't allow real SASL
+ sec_props.max_ssf = 0; /* don't allow real SASL
* security layer */
sec_props.security_flags = name_mask(sasl_opts_name, lmtp_sasl_sec_mask,
sasl_opts_val);
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
all: $(PROG) $(LIB)
+$(OBJS) $(LIB_OBJ): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
echo "#"; \
./$(PROG) -d) |egrep -v '^(myhostname|mydomain|mynetworks) ' >$@
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
*/
static char *postdrop_path;
-/* postdrop_cleanup - callback for the runtime error handler */
-
-static void postdrop_cleanup(void)
-{
-
- /*
- * This is the fatal error handler. Don't try to do anything fancy.
- *
- * msg_xxx() does not allocate memory, so it is safe as long as the signal
- * handler can't be invoked recursively.
- */
- if (postdrop_path) {
- if (remove(postdrop_path))
- msg_warn("uid=%ld: remove %s: %m", (long) getuid(), postdrop_path);
- else if (msg_verbose)
- msg_info("remove %s", postdrop_path);
- postdrop_path = 0;
- }
-}
-
/* postdrop_sig - catch signal and clean up */
static void postdrop_sig(int sig)
{
/*
- * Assume atomic signal() updates, even when emulated with sigaction().
- * We use the in-kernel SIGINT handler address as an atomic variable to
+ * This is the fatal error handler. Don't try to do anything fancy.
+ *
+ * msg_vstream does not allocate memory, but msg_syslog may indirectly in
+ * syslog(), so it should not be called from a user-triggered signal
+ * handler.
+ *
+ * Assume atomic signal() updates, even when emulated with sigaction(). We
+ * use the in-kernel SIGINT handler address as an atomic variable to
* prevent nested postdrop_sig() calls. For this reason, main() must
* configure postdrop_sig() as SIGINT handler before other signal
* handlers are allowed to invoke postdrop_sig().
*/
if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
- (void)signal(SIGQUIT, SIG_IGN);
- (void)signal(SIGTERM, SIG_IGN);
- (void)signal(SIGHUP, SIG_IGN);
- postdrop_cleanup();
+ (void) signal(SIGQUIT, SIG_IGN);
+ (void) signal(SIGTERM, SIG_IGN);
+ (void) signal(SIGHUP, SIG_IGN);
+ if (postdrop_path) {
+ (void) remove(postdrop_path);
+ postdrop_path = 0;
+ }
/* Future proofing. If you need exit() here then you broke Postfix. */
- _exit(sig);
+ if (sig)
+ _exit(sig);
}
}
+/* postdrop_cleanup - callback for the runtime error handler */
+
+static void postdrop_cleanup(void)
+{
+ postdrop_sig(0);
+}
+
/* main - the main program */
int main(int argc, char **argv)
char *attr_name;
char *attr_value;
const char *errstr;
+ char *junk;
/*
* Be consistent with file permissions.
* will not be deleted after we have taken responsibility for delivery.
*/
if (postdrop_path) {
- myfree(postdrop_path);
+ junk = postdrop_path;
postdrop_path = 0;
+ myfree(junk);
}
/*
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
argv_free(hash_queue_names);
}
-/* fatal_exit - print warning if queue fix is incomplete */
+/* interrupted - signal handler */
-static void fatal_exit(void)
+static void interrupted(int sig)
{
- if (inode_mismatch > 0 || inode_fixed > 0 || position_mismatch > 0)
- msg_fatal("OPERATION INCOMPLETE -- RERUN COMMAND TO FIX THE QUEUE FIRST");
+
+ /*
+ * This commands requires root privileges. We therefore do not worry
+ * about hostile signals, and report problems via msg_warn().
+ */
+ if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
+ (void) signal(SIGINT, SIG_IGN);
+ (void) signal(SIGQUIT, SIG_IGN);
+ (void) signal(SIGTERM, SIG_IGN);
+ if (inode_mismatch > 0 || inode_fixed > 0 || position_mismatch > 0)
+ msg_warn("OPERATION INCOMPLETE -- RERUN COMMAND TO FIX THE QUEUE FIRST");
+ if (sig)
+ _exit(sig);
+ }
}
-/* interrupted - signal handler */
+/* fatal_warning - print warning if queue fix is incomplete */
-static void interrupted(int unused_sig)
+static void fatal_warning(void)
{
- fatal_exit();
+ interrupted(0);
}
int main(int argc, char **argv)
signal(SIGINT, interrupted);
signal(SIGQUIT, interrupted);
signal(SIGTERM, interrupted);
- msg_cleanup(fatal_exit);
+ msg_cleanup(fatal_warning);
/*
* Sanity checks.
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
(*(cpp) && (cpp) >= (sites)->argv + (non_fallback_sites))
for (cpp = sites->argv; SMTP_RCPT_LEFT(state) > 0 && (dest = *cpp) != 0; cpp++) {
- if (i_am_mx && IS_FALLBACK_RELAY(cpp, sites, non_fallback_sites))
- break;
- state->final_server = (cpp[1] == 0);
/*
* Parse the destination. Default is to use the SMTP port. Look up
/* XXX We could be an MX host for this destination... */
} else {
addr_list = smtp_domain_addr(domain, misc_flags, why, &i_am_mx);
+ /* If we're MX host, don't connect to non-MX backups. */
+ if (i_am_mx)
+ argv_truncate(sites, cpp - sites->argv + 1);
}
+ state->final_server = (cpp[1] == 0);
/*
* When session caching is enabled, store the first good session for
*
* Pay attention to what could be configuration problems, and pretend that
* these are recoverable rather than bouncing the mail.
+ *
+ * In case of a "no error" indication we make up an excuse; this can happen
+ * when the fall-back relay was already tried via a cached connection, so
+ * that the address list scrubber left behind an empty list.
*/
if (SMTP_RCPT_LEFT(state) > 0) {
+ if (smtp_errno == SMTP_ERR_NONE) {
+ vstring_sprintf(why, "server unavailable or unable to receive mail");
+ smtp_errno = SMTP_ERR_RETRY;
+ }
switch (smtp_errno) {
default:
vstring_str(session->scratch),
VSTRING_LEN(session->scratch));
if (mime_errs) {
- smtp_mesg_fail(state, 554,
- "MIME 7-bit conversion failed: %s",
+ smtp_mesg_fail(state, 554, "%s",
mime_state_error(mime_errs));
RETURN(0);
}
* ending in newline via /usr/sbin/sendmail while MIME input
* processing is turned off, and MIME 8bit->7bit conversion
* is requested upon delivery.
+ *
+ * Or some error while doing generic address mapping.
*/
mime_errs =
mime_state_update(session->mime_state, rec_type, "", 0);
if (mime_errs) {
- smtp_mesg_fail(state, 554,
- "MIME 7-bit conversion failed: %s",
+ smtp_mesg_fail(state, 554, "%s",
mime_state_error(mime_errs));
RETURN(0);
}
*/
memset(&sec_props, 0L, sizeof(sec_props));
sec_props.min_ssf = 0;
- sec_props.max_ssf = 1; /* don't allow real SASL
+ sec_props.max_ssf = 0; /* don't allow real SASL
* security layer */
sec_props.security_flags = name_mask(sasl_opts_name, smtp_sasl_sec_mask,
sasl_opts_val);
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
*/
memset(&sec_props, 0, sizeof(sec_props));
sec_props.min_ssf = 0;
- sec_props.max_ssf = 1; /* don't allow real SASL
+ sec_props.max_ssf = 0; /* don't allow real SASL
* security layer */
sec_props.security_flags = name_mask(sasl_opts_name, smtpd_sasl_mask,
sasl_opts_val);
all: $(PROG)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
all: $(LIB)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(set -e; echo "# DO NOT EDIT"; $(OPTS) $(SHELL) ../../makedefs && cat $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
all: $(LIB)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
/*
/* void argv_terminate(argvp);
/* ARGV *argvp;
+/*
+/* void argv_truncate(argvp, len);
+/* ARGV *argvp;
+/* int len;
/* DESCRIPTION
/* The functions in this module manipulate arrays of string
/* pointers. An ARGV structure contains the following members:
/* returns a null pointer.
/*
/* argv_terminate() null-terminates its string array argument.
+/*
+/* argv_truncate() trucates its argument to the specified
+/* number of entries, but does not reallocate memory. The
+/* result is null-terminated.
/* SEE ALSO
/* msg(3) diagnostics interface
/* DIAGNOSTICS
*/
argvp->argv[argvp->argc] = 0;
}
+
+/* argv_truncate - truncate string array */
+
+void argv_truncate(ARGV *argvp, int len)
+{
+ char **cpp;
+
+ /*
+ * Sanity check.
+ */
+ if (len < 0)
+ msg_panic("argv_truncate: bad length %d", len);
+
+ if (len < argvp->argc) {
+ for (cpp = argvp->argv + len; cpp < argvp->argv + argvp->argc; cpp++)
+ myfree(*cpp);
+ argvp->argc = len;
+ argvp->argv[argvp->argc] = 0;
+ }
+}
extern void argv_add(ARGV *,...);
extern void argv_addn(ARGV *,...);
extern void argv_terminate(ARGV *);
+extern void argv_truncate(ARGV *, int);
extern ARGV *argv_free(ARGV *);
extern ARGV *argv_split(const char *, const char *);
dict_cdbq->dict.mtime = st.st_mtime;
close_on_exec(fd, CLOSE_ON_EXEC);
+ /*
+ * Warn if the source file is newer than the indexed file, except when
+ * the source file changed only seconds ago.
+ */
+ if (stat(path, &st) == 0
+ && st.st_mtime > dict_cdbq->dict.mtime
+ && st.st_mtime < time((time_t *)0) - 100)
+ msg_warn("database %s is older than source file %s", cdb_path, path);
+
/*
* If undecided about appending a null byte to key and value, choose to
* try both in query mode.
*/
#ifndef SET_H_ERRNO
#define SET_H_ERRNO(err) (h_errno = (err))
+#endif
+
+ /*
+ * Don't mix socket message calls with socket read/write calls. The fact
+ * that you can get away with it only on some stacks implies that there is
+ * no long-term guarantee.
+ */
+#ifndef CAN_WRITE_BEFORE_SENDING_FD
+#define CANT_WRITE_BEFORE_SENDING_FD
#endif
/*
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@
$(PROG): $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+$(OBJS): ../../conf/makedefs.out
+
Makefile: Makefile.in
(cat ../../conf/makedefs.out $?) >$@