4 #include <EvBufferEvent.hpp>
19 struct bufferevent
* bev
;
21 const char * cur_line
;
25 void react_helo(struct cc
* c
)
27 bufferevent
* bev
= c
->bev
;
28 evbuffer
* b
= ::evbuffer_new();
30 const char * line
= c
->cur_line
;
32 ::evbuffer_add_printf(b
, "250 Hello %s\r\n", line
+ 5);
33 ::bufferevent_write_buffer(bev
, b
);
38 void react_250_ok(struct cc
* c
)
40 bufferevent
* bev
= c
->bev
;
41 evbuffer
* b
= ::evbuffer_new();
43 ::evbuffer_add_printf(b
, "250 Ok\r\n");
44 ::bufferevent_write_buffer(bev
, b
);
49 void react_data(struct cc
* c
)
51 bufferevent
* bev
= c
->bev
;
52 evbuffer
* b
= ::evbuffer_new();
54 ::evbuffer_add_printf(b
, "354 End data with <CR><LF>.<CR><LF>\r\n");
55 ::bufferevent_write_buffer(bev
, b
);
57 c
->state
= STATE_DATA
;
62 void react_data_line(struct cc
* c
)
64 bufferevent
* bev
= c
->bev
;
65 evbuffer
* b
= ::evbuffer_new();
67 ::evbuffer_add_printf(b
, "250 Ok\r\n");
68 ::bufferevent_write_buffer(bev
, b
);
70 c
->state
= STATE_INIT
;
75 void react_bye(struct cc
* c
)
77 bufferevent
* bev
= c
->bev
;
78 evbuffer
* b
= ::evbuffer_new();
80 ::evbuffer_add_printf(b
, "221 Bye\r\n");
81 ::bufferevent_write_buffer(bev
, b
);
86 void readcb(struct bufferevent
*bev
, void * v
)
90 struct cc
* c
= (struct cc
*)v
;
92 while (line
= ::evbuffer_readline(bev
->input
))
96 if (c
->state
== STATE_INIT
)
98 if (!strncmp(line
, "HELO ", 5) ||
99 !strncmp(line
, "EHLO ", 5))
104 if (!strncmp(line
, "MAIL", 4))
109 if (!strncmp(line
, "RCPT", 4))
114 if (!strncmp(line
, "DATA", 4))
119 if (!strncmp(line
, "QUIT", 4))
126 if (strcmp(line
, "."))
138 void writecb(struct bufferevent
*, void *)
143 void errorcb(struct bufferevent
*, short, void *)
148 void accept_handler(int s1
, short, void *)
150 struct cc
* c
= new cc
;
151 c
->state
= STATE_INIT
;
153 EvBufferEvent
* be
= new EvBufferEvent(readcb
, writecb
, errorcb
, c
);
158 c
->bev
= be
->_bufferevent
;
162 evbuffer
* b
= ::evbuffer_new();
164 ::bufferevent_enable(be
->_bufferevent
, EV_READ
);
166 be
->write("220 www.example.com ESMTP postfix\r\n", 35);
174 int sock
= ::bind_socket(NULL
, 5525);
176 ::bufev_socket_listen(sock
, 10);
178 ioevent
accept_event(sock
, EV_READ
, &accept_handler
, NULL
);
179 ::event_add(&accept_event
, NULL
);