Postfix3.3.1
stream_trigger.c
[詳解]
1 /*++
2 /* NAME
3 /* stream_trigger 3
4 /* SUMMARY
5 /* wakeup stream server
6 /* SYNOPSIS
7 /* #include <trigger.h>
8 /*
9 /* int stream_trigger(service, buf, len, timeout)
10 /* const char *service;
11 /* const char *buf;
12 /* ssize_t len;
13 /* int timeout;
14 /* DESCRIPTION
15 /* stream_trigger() wakes up the named stream server by making
16 /* a brief connection to it and writing the named buffer.
17 /*
18 /* The connection is closed by a background thread. Some kernels
19 /* cannot handle client-side disconnect before the server has
20 /* received the message.
21 /*
22 /* Arguments:
23 /* .IP service
24 /* Name of the communication endpoint.
25 /* .IP buf
26 /* Address of data to be written.
27 /* .IP len
28 /* Amount of data to be written.
29 /* .IP timeout
30 /* Deadline in seconds. Specify a value <= 0 to disable
31 /* the time limit.
32 /* DIAGNOSTICS
33 /* The result is zero in case of success, -1 in case of problems.
34 /* SEE ALSO
35 /* stream_connect(3), stream client
36 /* LICENSE
37 /* .ad
38 /* .fi
39 /* The Secure Mailer license must be distributed with this software.
40 /* AUTHOR(S)
41 /* Wietse Venema
42 /* IBM T.J. Watson Research
43 /* P.O. Box 704
44 /* Yorktown Heights, NY 10598, USA
45 /*--*/
46 
47 /* System library. */
48 
49 #include <sys_defs.h>
50 #include <unistd.h>
51 #include <string.h>
52 
53 /* Utility library. */
54 
55 #include <msg.h>
56 #include <connect.h>
57 #include <iostuff.h>
58 #include <mymalloc.h>
59 #include <events.h>
60 #include <trigger.h>
61 
63  int fd;
64  char *service;
65 };
66 
67 /* stream_trigger_event - disconnect from peer */
68 
69 static void stream_trigger_event(int event, void *context)
70 {
71  struct stream_trigger *sp = (struct stream_trigger *) context;
72  static const char *myname = "stream_trigger_event";
73 
74  /*
75  * Disconnect.
76  */
77  if (event == EVENT_TIME)
78  msg_warn("%s: read timeout for service %s", myname, sp->service);
80  event_cancel_timer(stream_trigger_event, context);
81  if (close(sp->fd) < 0)
82  msg_warn("%s: close %s: %m", myname, sp->service);
83  myfree(sp->service);
84  myfree((void *) sp);
85 }
86 
87 /* stream_trigger - wakeup stream server */
88 
89 int stream_trigger(const char *service, const char *buf, ssize_t len, int timeout)
90 {
91  const char *myname = "stream_trigger";
92  struct stream_trigger *sp;
93  int fd;
94 
95  if (msg_verbose > 1)
96  msg_info("%s: service %s", myname, service);
97 
98  /*
99  * Connect...
100  */
101  if ((fd = stream_connect(service, BLOCKING, timeout)) < 0) {
102  if (msg_verbose)
103  msg_warn("%s: connect to %s: %m", myname, service);
104  return (-1);
105  }
107 
108  /*
109  * Stash away context.
110  */
111  sp = (struct stream_trigger *) mymalloc(sizeof(*sp));
112  sp->fd = fd;
113  sp->service = mystrdup(service);
114 
115  /*
116  * Write the request...
117  */
118  if (write_buf(fd, buf, len, timeout) < 0
119  || write_buf(fd, "", 1, timeout) < 0)
120  if (msg_verbose)
121  msg_warn("%s: write to %s: %m", myname, service);
122 
123  /*
124  * Wakeup when the peer disconnects, or when we lose patience.
125  */
126  if (timeout > 0)
127  event_request_timer(stream_trigger_event, (void *) sp, timeout + 100);
128  event_enable_read(fd, stream_trigger_event, (void *) sp);
129  return (0);
130 }
int msg_verbose
Definition: msg.c:177
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
Definition: events.c:729
void myfree(void *ptr)
Definition: mymalloc.c:207
char * mystrdup(const char *str)
Definition: mymalloc.c:225
void msg_warn(const char *fmt,...)
Definition: msg.c:215
int stream_connect(const char *, int, int)
#define EVENT_TIME
Definition: events.h:43
int stream_trigger(const char *service, const char *buf, ssize_t len, int timeout)
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
Definition: events.c:894
#define CLOSE_ON_EXEC
Definition: iostuff.h:51
void event_disable_readwrite(int fd)
Definition: events.c:839
#define BLOCKING
Definition: iostuff.h:48
int event_cancel_timer(EVENT_NOTIFY_TIME_FN callback, void *context)
Definition: events.c:965
int close_on_exec(int fd, int on)
Definition: close_on_exec.c:49
ssize_t write_buf(int, const char *, ssize_t, int)
Definition: write_buf.c:58
void * mymalloc(ssize_t len)
Definition: mymalloc.c:150
void msg_info(const char *fmt,...)
Definition: msg.c:199