7 #include <stdlib.h> /* exit, system */
10 #include <sys/socket.h>
15 #include <sys/resource.h>
17 #include <assert.h> /* assert */
19 #include "connect_request.h"
22 #include "data_item.h"
25 void pump_data(output_item
*item
) {
26 while(output_remaining(item
)) {
27 int ret
= output_send(item
, 1, FDT_PIPE
);
29 perror("Failed to send output...");
33 output_on_complete(item
);
36 output_on_error(item
, errno
);
42 output_item
*mem
= new_memory_output_item("TEST VALUE\n", strlen("TEST VALUE\n"), 0);
46 output_item
*new_file_output_item_byname(const char *name
) {
47 int fd
= open(name
, O_RDONLY
);
49 perror("Failed to open file");
52 return new_file_output_item(fd
);
56 output_item
*file
= new_file_output_item_byname("premake.lua");
61 struct ev_loop
*loop
= ev_default_loop(0);
62 output_hook
*hook
= new_output_hook();
64 /* SET STDOUT to be non-blocking */
67 output_item
*mem
= new_memory_output_item("TEST VALUE\n", strlen("TEST VALUE\n"), 0);
68 output_hook_queue(hook
, mem
);
69 mem
= new_file_output_item_byname("core/src/output_hook.c");
70 output_hook_queue(hook
, mem
);
72 if(-1 == (flags
= fcntl(1, F_GETFL
, 0)))
74 fcntl(1, F_SETFL
, flags
| O_NONBLOCK
);
75 ev_io_init(&watcher
, output_hook_callback
, /* STDOUT */ 1, EV_WRITE
);
77 ev_io_start(loop
, &watcher
);
80 release_output_hook(hook
);
85 static int bad_count
= 0;
86 int connect_err_cb(void *req
, int err
, void *data
) {
90 printf("ERROR: %i %i %s\n", err
, error
, strerror(error
));
91 fd
= ConnectRequest_getFd(req
);
94 free_ConnectRequest(req
);
98 static int success_count
= 0;
100 void connect_cb(void *req
, void *data
) {
101 int fd
= ConnectRequest_getFd(req
);
104 free_ConnectRequest(req
);
107 int socket_error_cb(void *req
, int err
, void *data
) {
111 printf("ERROR: %i %i %s\n", err
, error
, strerror(error
));
112 fd
= SocketRequest_getFd(req
);
113 if(fd
> 0 && error
!= EMFILE
&& error
!= ENFILE
)
116 free_SocketRequest(req
);
120 struct addrContainer
{
121 struct sockaddr
*addr
;
125 void socket_cb(void *req
, void *data
) {
126 HandlerCallback callback
= {
131 core_t
*c
= SocketRequest_getCore(req
);
132 int fd
= SocketRequest_getFd(req
);
133 struct addrContainer
*addr
= data
;
134 ConnectRequest
*cr
= new_ConnectRequest(c
, callback
, fd
, addr
->addr
, addr
->addr_len
);
135 ConnectRequest_queue(cr
, 10);
137 free_SocketRequest(req
);
140 void connect_handler_test() {
141 core_t
*c
= new_core();
142 struct addrinfo ai
, *aitop
= NULL
;
144 HandlerCallback callback
= {
149 memset(&ai
, 0, sizeof(ai
));
150 ai
.ai_family
= AF_INET
;
151 ai
.ai_socktype
= SOCK_STREAM
;
152 if(0 != getaddrinfo("localhost", "80", &ai
, &aitop
)) {
153 perror("getaddrinfo"); exit(-1);
157 getrlimit(RLIMIT_NOFILE
, &lim
);
159 setrlimit(RLIMIT_NOFILE
, &lim
);
162 for(i
= 0; i
< 1024; i
++) {
164 struct addrContainer
*cont
= calloc(1, sizeof(struct addrContainer
));
165 cont
->addr
= aitop
->ai_addr
;
166 cont
->addr_len
= aitop
->ai_addrlen
;
167 callback
.data
= cont
;
168 sr
= new_SocketRequest(c
, callback
, PF_INET
, SOCK_STREAM
, 0);
169 SocketRequest_queue(sr
, 0, 0);
174 printf("BAD COUNT: %i\nGOOD COUNT: %i\nTOTAL:%i\n", bad_count
, success_count
, bad_count
+ success_count
);
176 void data_item_test() {
177 data_item_t
*mem
= new_memory_item("HELLO", 6);
178 printf("MEMORY_TYPE: %i\n", mem
->typeID
);
182 int main(int argc
, const char **argv
) {
188 if(argc
> 1 && !strcmp(argv
[1], "--sock")) {
189 struct addrinfo ai
, *aitop
;
191 system("nc -l -p 9876 &");
193 memset(&ai
, 0, sizeof(ai
));
194 ai
.ai_family
= AF_INET
;
195 ai
.ai_socktype
= SOCK_STREAM
;
196 if(0 != getaddrinfo("localhost", "9876", &ai
, &aitop
)) {
197 perror("getaddrinfo"); return -1;
199 sock
= socket(PF_INET
, SOCK_STREAM
, 0);
200 if(sock
< 0) { perror("Failed to create socket"); return -1; }
201 if(0 > connect(sock
, aitop
->ai_addr
, aitop
->ai_addrlen
)) {
207 /* Replace stdout w/ the socket */
208 if(0 > dup2(sock
, 1)) {
209 perror("dup2"); return -1;
215 connect_handler_test();