2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-30 13:48:06 +00:00

postfix-2.0.16-20031224

This commit is contained in:
Wietse Venema 2003-12-24 00:00:00 -05:00 committed by Viktor Dukhovni
parent 5380c1c731
commit 468e9bae3d
13 changed files with 116 additions and 98 deletions

View File

@ -8911,6 +8911,15 @@ Apologies for any names omitted.
Fix is to turn off loop detection when a non-default TCP Fix is to turn off loop detection when a non-default TCP
port is specified. File: smtp/smtp_addr.c. port is specified. File: smtp/smtp_addr.c.
Bugfix: restore errno after write failure in SIGCHLD handler.
Leandro Santi. File: master/master_sig.c.
Bugfix: the auto_clnt module disconnected too early, causing
unnecessary work by the anvil server.
Cleanup: eliminated binary hashes from anvil server. Anvil
client information is now stored on top of its VSTREAM.
Open problems: Open problems:
Low: in the SMTP client, pass the session, request and Low: in the SMTP client, pass the session, request and

View File

@ -1,12 +1,12 @@
<html> <head> </head> <body> <pre> <html> <body> <pre>
POSTSUPER(1) POSTSUPER(1) POSTSUPER(1) POSTSUPER(1)
<b>NAME</b> <b>NAME</b>
postsuper - Postfix superintendent postsuper - Postfix superintendent
<b>SYNOPSIS</b> <b>SYNOPSIS</b>
<b>postsuper</b> [<b>-psv</b>] [<b>-c</b> <i>config_dir</i>] [<b>-d</b> <i>queue_id</i>] [<b>-h</b> <b>postsuper</b> [<b>-psv</b>] [<b>-c</b> <i>config</i><b>_</b><i>dir</i>] [<b>-d</b> <i>queue</i><b>_</b><i>id</i>] [<b>-h</b>
<i>queue_id</i>] [<b>-H</b> <i>queue_id</i>] [<b>-r</b> <i>queue_id</i>] [<i>directory</i> <i>...</i>] <i>queue</i><b>_</b><i>id</i>] [<b>-H</b> <i>queue</i><b>_</b><i>id</i>] [<b>-r</b> <i>queue</i><b>_</b><i>id</i>] [<i>directory ...</i>]
<b>DESCRIPTION</b> <b>DESCRIPTION</b>
The <b>postsuper</b> command does maintenance jobs on the Postfix The <b>postsuper</b> command does maintenance jobs on the Postfix
@ -22,16 +22,16 @@ POSTSUPER(1) POSTSUPER(1)
Options: Options:
<b>-c</b> <i>config_dir</i> <b>-c</b> <i>config</i><b>_</b><i>dir</i>
The <b>main.cf</b> configuration file is in the named The <b>main.cf</b> configuration file is in the named
directory instead of the default configuration directory instead of the default configuration
directory. See also the MAIL_CONFIG environment directory. See also the MAIL_CONFIG environment
setting below. setting below.
<b>-d</b> <i>queue_id</i> <b>-d</b> <i>queue</i><b>_</b><i>id</i>
Delete one message with the named queue ID from the Delete one message with the named queue ID from the
named mail queue(s) (default: <b>hold</b>, <b>incoming</b>, named mail queue(s) (default: <b>hold</b>, <b>incoming</b>,
<b>active</b> and <b>deferred</b>). If a <i>queue_id</i> of <b>-</b> is speci- <b>active</b> and <b>deferred</b>). If a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is speci-
fied, the program reads queue IDs from standard fied, the program reads queue IDs from standard
input. For example, to delete all mail from or to input. For example, to delete all mail from or to
<b>user@example.com</b>: <b>user@example.com</b>:
@ -40,15 +40,15 @@ POSTSUPER(1) POSTSUPER(1)
/ user@example\.com$/ { print $1 } \ / user@example\.com$/ { print $1 } \
' | tr -d '*!' | postsuper -d - ' | tr -d '*!' | postsuper -d -
Specify <b>-d</b> <b>ALL</b> to remove all messages; for example, Specify <b>-d ALL</b> to remove all messages; for example,
specify <b>-d</b> <b>ALL</b> <b>deferred</b> to delete mail in the specify <b>-d ALL deferred</b> to delete mail in the
<b>deferred</b> queue. As a safety measure, the word <b>ALL</b> <b>deferred</b> queue. As a safety measure, the word <b>ALL</b>
must be specified in upper case. must be specified in upper case.
<b>Postfix</b> <b>queue</b> <b>IDs</b> <b>are</b> <b>reused.</b> <b>There</b> <b>is</b> <b>a</b> <b>very</b> <b>Postfix queue IDs are reused. There is a very</b>
<b>small</b> <b>possibility</b> <b>that</b> <b>postsuper</b> <b>deletes</b> <b>the</b> <b>wrong</b> <b>small possibility that postsuper deletes the wrong</b>
<b>message</b> <b>file</b> <b>when</b> <b>it</b> <b>is</b> <b>executed</b> <b>while</b> <b>the</b> <b>Postfix</b> <b>message file when it is executed while the Postfix</b>
<b>mail</b> <b>system</b> <b>is</b> <b>running.</b> <b>mail system is running.</b>
The scenario is as follows: The scenario is as follows:
@ -69,46 +69,47 @@ POSTSUPER(1) POSTSUPER(1)
of the old message that it should have of the old message that it should have
deleted. deleted.
<b>-h</b> <i>queue_id</i> <b>-h</b> <i>queue</i><b>_</b><i>id</i>
Put mail "on hold" so that no attempt is made to Put mail "on hold" so that no attempt is made to
deliver it. Move one message with the named queue deliver it. Move one message with the named queue
ID from the named mail queue(s) (default: <b>incoming</b>, ID from the named mail queue(s) (default: <b>incoming</b>,
<b>active</b> and <b>deferred</b>) to the <b>hold</b> queue. If a <b>active</b> and <b>deferred</b>) to the <b>hold</b> queue. If a
<i>queue_id</i> of <b>-</b> is specified, the program reads queue <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the program reads queue
IDs from standard input. IDs from standard input.
Specify <b>-h</b> <b>ALL</b> to hold all messages; for example, Specify <b>-h ALL</b> to hold all messages; for example,
specify <b>-h</b> <b>ALL</b> <b>deferred</b> to hold mail in the specify <b>-h ALL deferred</b> to hold mail in the
<b>deferred</b> queue. As a safety measure, the word <b>ALL</b> <b>deferred</b> queue. As a safety measure, the word <b>ALL</b>
must be specified in upper case. must be specified in upper case.
Note: mail that is put "on hold" will not expire Note: while mail is "on hold" it will not expire
when its time in the queue exceeds the <b>maxi-</b> when its time in the queue exceeds the <b>maxi-</b>
<b>mal</b><i>_</i><b>queue</b><i>_</i><b>lifetime</b> setting. <b>mal_queue_lifetime</b> setting. It becomes subject to
expiration after it is released from "hold".
<b>-H</b> <i>queue_id</i> <b>-H</b> <i>queue</i><b>_</b><i>id</i>
Release mail that was put "on hold". Move one mes- Release mail that was put "on hold". Move one mes-
sage with the named queue ID from the named mail sage with the named queue ID from the named mail
queue(s) (default: <b>hold</b>) to the <b>deferred</b> queue. If queue(s) (default: <b>hold</b>) to the <b>deferred</b> queue. If
a <i>queue_id</i> of <b>-</b> is specified, the program reads a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the program reads
queue IDs from standard input. queue IDs from standard input.
Specify <b>-H</b> <b>ALL</b> to release all mail that is "on Specify <b>-H ALL</b> to release all mail that is "on
hold". As a safety measure, the word <b>ALL</b> must be hold". As a safety measure, the word <b>ALL</b> must be
specified in upper case. specified in upper case.
<b>-p</b> Purge old temporary files that are left over after <b>-p</b> Purge old temporary files that are left over after
system or software crashes. system or software crashes.
<b>-r</b> <i>queue_id</i> <b>-r</b> <i>queue</i><b>_</b><i>id</i>
Requeue the message with the named queue ID from Requeue the message with the named queue ID from
the named mail queue(s) (default: <b>hold</b>, <b>incoming</b>, the named mail queue(s) (default: <b>hold</b>, <b>incoming</b>,
<b>active</b> and <b>deferred</b>). To requeue multiple mes- <b>active</b> and <b>deferred</b>). To requeue multiple mes-
sages, specify multiple <b>-r</b> command-line options. sages, specify multiple <b>-r</b> command-line options.
Alternatively, if a <i>queue_id</i> of <b>-</b> is specified, the Alternatively, if a <i>queue</i><b>_</b><i>id</i> of <b>-</b> is specified, the
program reads queue IDs from standard input. program reads queue IDs from standard input.
Specify <b>-r</b> <b>ALL</b> to requeue all messages. As a safety Specify <b>-r ALL</b> to requeue all messages. As a safety
measure, the word <b>ALL</b> must be specified in upper measure, the word <b>ALL</b> must be specified in upper
case. case.
@ -138,8 +139,8 @@ POSTSUPER(1) POSTSUPER(1)
in the file system hierarchy and remove sub- in the file system hierarchy and remove sub-
directories that are no longer needed. File directories that are no longer needed. File
position rearrangements are necessary after position rearrangements are necessary after
a change in the <b>hash</b><i>_</i><b>queue</b><i>_</i><b>names</b> and/or a change in the <b>hash_queue_names</b> and/or
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>depth</b> configuration parameters. <b>hash_queue_depth</b> configuration parameters.
<b>-v</b> Enable verbose logging for debugging purposes. Mul- <b>-v</b> Enable verbose logging for debugging purposes. Mul-
tiple <b>-v</b> options make the software increasingly tiple <b>-v</b> options make the software increasingly
@ -163,23 +164,23 @@ POSTSUPER(1) POSTSUPER(1)
Mail that is not sanitized by Postfix (i.e. mail in the Mail that is not sanitized by Postfix (i.e. mail in the
<b>maildrop</b> queue) cannot be placed "on hold". <b>maildrop</b> queue) cannot be placed "on hold".
<b>CONFIGURATION</b> <b>PARAMETERS</b> <b>CONFIGURATION PARAMETERS</b>
See the Postfix <b>main.cf</b> file for syntax details and for See the Postfix <b>main.cf</b> file for syntax details and for
default values. default values.
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>depth</b> <b>hash_queue_depth</b>
Number of subdirectory levels for hashed queues. Number of subdirectory levels for hashed queues.
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>names</b> <b>hash_queue_names</b>
The names of queues that are organized into multi- The names of queues that are organized into multi-
ple levels of subdirectories. ple levels of subdirectories.
<b>queue</b><i>_</i><b>directory</b> <b>queue_directory</b>
Top-level directory of the Postfix queue. This is Top-level directory of the Postfix queue. This is
also the root directory of Postfix daemons that run also the root directory of Postfix daemons that run
chrooted. chrooted.
<b>SEE</b> <b>ALSO</b> <b>SEE ALSO</b>
<a href="sendmail.1.html">sendmail(1)</a> sendmail-compatible user interface <a href="sendmail.1.html">sendmail(1)</a> sendmail-compatible user interface
<a href="postqueue.1.html">postqueue(1)</a> unprivileged queue operations <a href="postqueue.1.html">postqueue(1)</a> unprivileged queue operations

View File

@ -244,8 +244,8 @@ SMTP(8) SMTP(8)
<b>smtp_mx_address_limit</b> <b>smtp_mx_address_limit</b>
An upper bound on the total number of MX (mail An upper bound on the total number of MX (mail
exchanger) IP addresses that that can result from exchanger) IP addresses that can result from mail
mail exchanger lookups. exchanger lookups.
Specify zero to disable the limit. Specify zero to disable the limit.

View File

@ -87,9 +87,10 @@ Specify \fB-h ALL\fR to hold all messages; for example, specify
As a safety measure, the word \fBALL\fR must be specified in upper As a safety measure, the word \fBALL\fR must be specified in upper
case. case.
.sp .sp
Note: mail that is put "on hold" will not expire when its Note: while mail is "on hold" it will not expire when its
time in the queue exceeds the \fBmaximal_queue_lifetime\fR time in the queue exceeds the \fBmaximal_queue_lifetime\fR
setting. setting. It becomes subject to expiration after it is
released from "hold".
.IP "\fB-H \fIqueue_id\fR" .IP "\fB-H \fIqueue_id\fR"
Release mail that was put "on hold". Release mail that was put "on hold".
Move one message with the named queue ID from the named Move one message with the named queue ID from the named

View File

@ -205,7 +205,7 @@ The default limit is taken from the
\fBdefault_destination_recipient_limit\fR parameter. \fBdefault_destination_recipient_limit\fR parameter.
.IP \fBsmtp_mx_address_limit\fR .IP \fBsmtp_mx_address_limit\fR
An upper bound on the total number of MX (mail exchanger) IP An upper bound on the total number of MX (mail exchanger) IP
addresses that that can result from mail exchanger lookups. addresses that can result from mail exchanger lookups.
.sp .sp
Specify zero to disable the limit. Specify zero to disable the limit.
.sp .sp

View File

@ -57,7 +57,6 @@ anvil.o: ../../include/sys_defs.h
anvil.o: ../../include/msg.h anvil.o: ../../include/msg.h
anvil.o: ../../include/mymalloc.h anvil.o: ../../include/mymalloc.h
anvil.o: ../../include/htable.h anvil.o: ../../include/htable.h
anvil.o: ../../include/binhash.h
anvil.o: ../../include/stringops.h anvil.o: ../../include/stringops.h
anvil.o: ../../include/vstring.h anvil.o: ../../include/vstring.h
anvil.o: ../../include/vbuf.h anvil.o: ../../include/vbuf.h

View File

@ -122,7 +122,6 @@
#include <msg.h> #include <msg.h>
#include <mymalloc.h> #include <mymalloc.h>
#include <htable.h> #include <htable.h>
#include <binhash.h>
#include <stringops.h> #include <stringops.h>
#include <events.h> #include <events.h>
@ -146,7 +145,6 @@ int var_anvil_stat_time;
* State. * State.
*/ */
static HTABLE *anvil_remote_map; /* indexed by service+ remote client */ static HTABLE *anvil_remote_map; /* indexed by service+ remote client */
static BINHASH *anvil_local_map; /* indexed by local client handle */
/* /*
* Absent a real-time query interface, these are logged at process exit time * Absent a real-time query interface, these are logged at process exit time
@ -375,14 +373,12 @@ static void anvil_remote_connect(VSTREAM *client_stream, const char *ident)
* Record this connection under the local client information, so that we * Record this connection under the local client information, so that we
* can clean up all its connection state when the local client goes away. * can clean up all its connection state when the local client goes away.
*/ */
if ((anvil_local = if ((anvil_local = (ANVIL_LOCAL *) vstream_context(client_stream)) == 0) {
(ANVIL_LOCAL *) binhash_find(anvil_local_map,
(char *) &client_stream,
sizeof(client_stream))) == 0) {
anvil_local = (ANVIL_LOCAL *) mymalloc(sizeof(*anvil_local)); anvil_local = (ANVIL_LOCAL *) mymalloc(sizeof(*anvil_local));
ANVIL_LOCAL_INIT(anvil_local); ANVIL_LOCAL_INIT(anvil_local);
binhash_enter(anvil_local_map, (char *) &client_stream, vstream_control(client_stream,
sizeof(client_stream), (char *) anvil_local); VSTREAM_CTL_CONTEXT, (void *) anvil_local,
VSTREAM_CTL_END);
} }
ANVIL_LOCAL_ADD_ONE(anvil_local, anvil_remote); ANVIL_LOCAL_ADD_ONE(anvil_local, anvil_remote);
if (msg_verbose) if (msg_verbose)
@ -446,10 +442,7 @@ static void anvil_remote_disconnect(VSTREAM *client_stream, const char *ident)
/* /*
* Update the local client information. * Update the local client information.
*/ */
if ((anvil_local = if ((anvil_local = (ANVIL_LOCAL *) vstream_context(client_stream)) != 0)
(ANVIL_LOCAL *) binhash_find(anvil_local_map,
(char *) &client_stream,
sizeof(client_stream))) != 0)
ANVIL_LOCAL_DROP_ONE(anvil_local, anvil_remote); ANVIL_LOCAL_DROP_ONE(anvil_local, anvil_remote);
if (msg_verbose) if (msg_verbose)
msg_info("%s: anvil_local 0x%lx", msg_info("%s: anvil_local 0x%lx",
@ -481,24 +474,15 @@ static void anvil_service_done(VSTREAM *client_stream, char *unused_service,
* that we still have for this local client. Do not destroy remote client * that we still have for this local client. Do not destroy remote client
* status information before it expires. * status information before it expires.
*/ */
if ((anvil_local = if ((anvil_local = (ANVIL_LOCAL *) vstream_context(client_stream)) != 0) {
(ANVIL_LOCAL *) binhash_find(anvil_local_map,
(char *) &client_stream,
sizeof(client_stream))) != 0) {
if (msg_verbose) if (msg_verbose)
msg_info("%s: anvil_local 0x%lx", msg_info("%s: anvil_local 0x%lx",
myname, (unsigned long) anvil_local); myname, (unsigned long) anvil_local);
ANVIL_LOCAL_DROP_ALL(client_stream, anvil_local); ANVIL_LOCAL_DROP_ALL(client_stream, anvil_local);
binhash_delete(anvil_local_map, myfree((char *) anvil_local);
(char *) &client_stream,
sizeof(client_stream), myfree);
} else if (msg_verbose) } else if (msg_verbose)
msg_info("client socket not found for fd=%d", msg_info("client socket not found for fd=%d",
vstream_fileno(client_stream)); vstream_fileno(client_stream));
if (msg_verbose)
msg_info("%s: anvil_local_map used=%d",
myname, anvil_local_map->used);
} }
/* anvil_service - perform service for client */ /* anvil_service - perform service for client */
@ -520,6 +504,8 @@ static void anvil_service(VSTREAM *client_stream, char *unused_service, char **a
* connection-management stuff is handled by the common code in * connection-management stuff is handled by the common code in
* multi_server.c. * multi_server.c.
*/ */
if (msg_verbose)
msg_info("--- start request ---");
if (attr_scan_plain(client_stream, if (attr_scan_plain(client_stream,
ATTR_FLAG_MISSING | ATTR_FLAG_STRICT, ATTR_FLAG_MISSING | ATTR_FLAG_STRICT,
ATTR_TYPE_STR, ANVIL_ATTR_REQ, request, ATTR_TYPE_STR, ANVIL_ATTR_REQ, request,
@ -542,6 +528,8 @@ static void anvil_service(VSTREAM *client_stream, char *unused_service, char **a
/* Note: invokes anvil_service_done() */ /* Note: invokes anvil_service_done() */
multi_server_disconnect(client_stream); multi_server_disconnect(client_stream);
} }
if (msg_verbose)
msg_info("--- end request ---");
vstring_free(ident); vstring_free(ident);
vstring_free(request); vstring_free(request);
} }
@ -561,7 +549,6 @@ static void post_jail_init(char *unused_name, char **unused_argv)
* Initial client state tables. * Initial client state tables.
*/ */
anvil_remote_map = htable_create(1000); anvil_remote_map = htable_create(1000);
anvil_local_map = binhash_create(100);
/* /*
* Do not limit the number of client requests. * Do not limit the number of client requests.

View File

@ -114,7 +114,13 @@ static VSTRING *id_buf;
void mail_stream_cleanup(MAIL_STREAM *info) void mail_stream_cleanup(MAIL_STREAM *info)
{ {
FREE_AND_WIPE(info->close, info->stream); int status;
if (info->stream) {
if ((status = info->close(info->stream)) != 0)
msg_warn("bad mail stream close status %d", status);
info->stream = 0;
}
FREE_AND_WIPE(myfree, info->queue); FREE_AND_WIPE(myfree, info->queue);
FREE_AND_WIPE(myfree, info->id); FREE_AND_WIPE(myfree, info->id);
FREE_AND_WIPE(myfree, info->class); FREE_AND_WIPE(myfree, info->class);
@ -318,6 +324,7 @@ MAIL_STREAM *mail_stream_command(const char *command)
VSTREAM *stream; VSTREAM *stream;
MAIL_STREAM *info; MAIL_STREAM *info;
ARGV *export_env; ARGV *export_env;
int status;
if (id_buf == 0) if (id_buf == 0)
id_buf = vstring_alloc(10); id_buf = vstring_alloc(10);
@ -347,7 +354,8 @@ MAIL_STREAM *mail_stream_command(const char *command)
if (attr_scan(stream, ATTR_FLAG_MISSING, if (attr_scan(stream, ATTR_FLAG_MISSING,
ATTR_TYPE_STR, MAIL_ATTR_QUEUEID, id_buf, 0) != 1) { ATTR_TYPE_STR, MAIL_ATTR_QUEUEID, id_buf, 0) != 1) {
vstream_pclose(stream); if ((status = vstream_pclose(stream)) != 0)
msg_warn("command \"%s\" exited with status %d", command, status);
return (0); return (0);
} else { } else {
info = (MAIL_STREAM *) mymalloc(sizeof(*info)); info = (MAIL_STREAM *) mymalloc(sizeof(*info));

View File

@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the * Patches change the patchlevel and the release date. Snapshots change the
* release date only, unless they include the same bugfix as a patch release. * release date only, unless they include the same bugfix as a patch release.
*/ */
#define MAIL_RELEASE_DATE "20031223" #define MAIL_RELEASE_DATE "20031224"
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "2.0.16-" MAIL_RELEASE_DATE #define DEF_MAIL_VERSION "2.0.16-" MAIL_RELEASE_DATE

View File

@ -121,8 +121,19 @@ static void master_sigchld(int sig, int code, struct sigcontext * scp)
static void master_sigchld(int unused_sig) static void master_sigchld(int unused_sig)
{ {
int saved_errno = errno;
/*
* WARNING WARNING WARNING.
*
* This code runs at unpredictable moments, as a signal handler. Don't put
* any code here other than for setting a global flag, or code that is
* intended to be run within a signal handler. Restore errno in case we
* are interrupting the epilog of a failed system call.
*/
if (write(SIG_PIPE_WRITE_FD, "", 1) != 1) if (write(SIG_PIPE_WRITE_FD, "", 1) != 1)
msg_warn("write to SIG_PIPE_WRITE_FD failed: %m"); msg_warn("write to SIG_PIPE_WRITE_FD failed: %m");
errno = saved_errno;
} }
/* master_sig_event - called upon return from select() */ /* master_sig_event - called upon return from select() */

View File

@ -81,9 +81,10 @@
/* As a safety measure, the word \fBALL\fR must be specified in upper /* As a safety measure, the word \fBALL\fR must be specified in upper
/* case. /* case.
/* .sp /* .sp
/* Note: mail that is put "on hold" will not expire when its /* Note: while mail is "on hold" it will not expire when its
/* time in the queue exceeds the \fBmaximal_queue_lifetime\fR /* time in the queue exceeds the \fBmaximal_queue_lifetime\fR
/* setting. /* setting. It becomes subject to expiration after it is
/* released from "hold".
/* .IP "\fB-H \fIqueue_id\fR" /* .IP "\fB-H \fIqueue_id\fR"
/* Release mail that was put "on hold". /* Release mail that was put "on hold".
/* Move one message with the named queue ID from the named /* Move one message with the named queue ID from the named

View File

@ -189,7 +189,7 @@
/* \fBdefault_destination_recipient_limit\fR parameter. /* \fBdefault_destination_recipient_limit\fR parameter.
/* .IP \fBsmtp_mx_address_limit\fR /* .IP \fBsmtp_mx_address_limit\fR
/* An upper bound on the total number of MX (mail exchanger) IP /* An upper bound on the total number of MX (mail exchanger) IP
/* addresses that that can result from mail exchanger lookups. /* addresses that can result from mail exchanger lookups.
/* .sp /* .sp
/* Specify zero to disable the limit. /* Specify zero to disable the limit.
/* .sp /* .sp

View File

@ -212,6 +212,7 @@ VSTREAM *auto_clnt_access(AUTO_CLNT *auto_clnt)
if (auto_clnt->vstream == 0) { if (auto_clnt->vstream == 0) {
auto_clnt_open(auto_clnt); auto_clnt_open(auto_clnt);
} else { } else {
if (auto_clnt->max_idle > 0)
event_request_timer(auto_clnt_event, (char *) auto_clnt, event_request_timer(auto_clnt_event, (char *) auto_clnt,
auto_clnt->max_idle); auto_clnt->max_idle);
} }