63 #include <sys/socket.h>
99 static int count_deliveries;
109 if (count_deliveries) {
119 static void read_data(
int unused_event,
void *context)
138 state->
count -= count;
139 if (state->
count <= 0) {
155 static void read_length(
int event,
void *context)
162 msg_panic(
"unknown error reading input");
165 msg_panic(
"attempt to read non-readable socket");
189 read_data(event, context);
205 static void connect_event(
int unused_event,
void *context)
208 struct sockaddr_storage ss;
210 struct sockaddr *sa = (
struct sockaddr *) &ss;
214 if ((fd = accept(sock, sa, &len)) >= 0) {
218 sa->sa_family == AF_LOCAL ?
"AF_LOCAL" :
220 sa->sa_family == AF_UNIX ?
"AF_UNIX" :
222 sa->sa_family == AF_INET ?
"AF_INET" :
224 sa->sa_family == AF_INET6 ?
"AF_INET6" :
226 "unknown protocol family");
238 static void terminate(
int unused_event,
void *unused_context)
245 static void usage(
char *myname)
247 msg_fatal(
"usage: %s [-cv] [-x time] [host]:port backlog", myname);
252 int main(
int argc,
char **argv)
268 signal(SIGPIPE, SIG_IGN);
278 while ((ch =
GETOPT(argc, argv,
"46cvx:")) > 0) {
293 if ((ttl = atoi(optarg)) <= 0)
301 if (argc - optind != 2)
303 if ((backlog = atoi(argv[optind + 1])) <= 0)
311 if (strncmp(argv[optind],
"unix:", 5) == 0) {
314 if (strncmp(argv[optind],
"inet:", 5) == 0)
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
MAIL_VERSION_STAMP_DECLARE
void netstring_except(VSTREAM *stream, int exception)
void netstring_fflush(VSTREAM *stream)
int inet_listen(const char *addr, int backlog, int block_mode)
struct SINK_STATE SINK_STATE
#define NETSTRING_ERR_FORMAT
#define CAST_ANY_PTR_TO_INT(cptr)
NORETURN msg_panic(const char *fmt,...)
ssize_t netstring_get_length(VSTREAM *stream)
INET_PROTO_INFO * inet_proto_init(const char *context, const char *protocols)
void netstring_setup(VSTREAM *stream, int timeout)
#define INET_PROTO_NAME_ALL
int main(int argc, char **argv)
#define vstream_setjmp(stream)
#define NETSTRING_ERR_SIZE
#define vstream_ftimeout(vp)
#define CAST_INT_TO_VOID_PTR(ival)
int vstream_fclose(VSTREAM *stream)
void event_loop(int delay)
VSTREAM * vstream_printf(const char *fmt,...)
#define VSTREAM_PURGE_BOTH
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define MAIL_VERSION_STAMP_ALLOCATE
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define INET_PROTO_NAME_IPV6
NORETURN msg_fatal(const char *fmt,...)
int vstream_fflush(VSTREAM *stream)
#define GETOPT(argc, argv, str)
#define NETSTRING_ERR_EOF
#define NETSTRING_ERR_TIME
int non_blocking(int, int)
int vstream_tweak_sock(VSTREAM *)
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
int unix_listen(const char *, int, int)
#define vstream_fileno(vp)
void msg_vstream_init(const char *name, VSTREAM *vp)
void event_disable_readwrite(int fd)
int vstream_fpurge(VSTREAM *stream, int direction)
#define INET_PROTO_NAME_IPV4
VSTREAM * vstream_fdopen(int fd, int flags)
#define NETSTRING_PUT_BUF(str, buf)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)