void accept_cb(EV_P_ struct ev_io *w, int revent) { client_t *client = (client_t *) w->data; drizzle_con_st *dc = (drizzle_con_st *) malloc(sizeof(drizzle_con_st)); drizzle_return_t ret; int fd; connection_t *con; dbgin(); /* Manually set connection to ready */ drizzle_con_add_options(client->dc, DRIZZLE_CON_IO_READY); drizzle_con_accept(client->drizzle, dc, &ret); if (ret != DRIZZLE_RETURN_OK) { if (ret == DRIZZLE_RETURN_IO_WAIT) { printf("io_wait\n"); return; } printf("drizzle_con_accpet error:%s\n", drizzle_error(client->drizzle)); return; } fd = drizzle_con_fd(dc); printf("Accepted. fd:%d\n", fd); con = (connection_t *) calloc(1, sizeof(connection_t)); con->fd = fd; con->client = client; con->dc = dc; add_connection(client, con); }
int main(void) { close(STDOUT_FILENO); drizzle_st drizzle; drizzle_con_st listen_con; drizzle_con_st client; drizzle_con_st server; drizzle_return_t ret; bool server_accepted = false; server_state_st server_state; client_state_st client_state; drizzle_test("drizzle_create"); if (drizzle_create(&drizzle) == NULL) { drizzle_test_error("returned NULL"); } drizzle_test("drizzle_con_add_tcp_listen"); if (drizzle_con_add_tcp_listen(&drizzle, &listen_con, DRIZZLE_TEST_HOST, DRIZZLE_TEST_PORT, 1, DRIZZLE_CON_NONE) == NULL) { drizzle_test_error("returned NULL"); } drizzle_test("drizzle_con_listen"); ret= drizzle_con_listen(&listen_con); if (ret != DRIZZLE_RETURN_OK) { drizzle_test_error("returned %s (%d)", drizzle_error(&drizzle), ret); } drizzle_test("drizzle_con_add_tcp"); if (drizzle_con_add_tcp(&drizzle, &client, DRIZZLE_TEST_HOST, DRIZZLE_TEST_PORT, NULL, NULL, NULL, DRIZZLE_CON_NONE) == NULL) { drizzle_test_error("returned NULL"); } drizzle_test("drizzle_add_options"); drizzle_add_options(&drizzle, DRIZZLE_NON_BLOCKING); server_state.state= SERVER_STATE_START; client_state.state= CLIENT_STATE_START; while (true) { if (server_accepted == false) { drizzle_test("drizzle_con_accept"); (void)drizzle_con_accept(&drizzle, &server, &ret); if (ret == DRIZZLE_RETURN_OK) { server_accepted = true; } else if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT || ret == DRIZZLE_RETURN_NO_ACTIVE_CONNECTIONS) { break; } else if (ret != DRIZZLE_RETURN_IO_WAIT) { drizzle_test_error("returned %s (%s)", drizzle_error(&drizzle), drizzle_strerror(ret)); } } if (server_accepted) { _server(&server, &server_state); } _client(&client, &client_state); if (server_state.state == SERVER_STATE_DONE && client_state.state == CLIENT_STATE_DONE) { break; } drizzle_test("drizzle_con_wait"); ret= drizzle_con_wait(&drizzle); if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT || ret == DRIZZLE_RETURN_NO_ACTIVE_CONNECTIONS) { break; } else if (ret != DRIZZLE_RETURN_OK) { drizzle_test_error("returned %s (%d)", drizzle_error(&drizzle), ret); } } if (server_accepted) { drizzle_test("drizzle_con_free"); drizzle_con_free(&server); } drizzle_test("drizzle_con_free"); drizzle_con_free(&client); drizzle_test("drizzle_con_free"); drizzle_con_free(&listen_con); drizzle_test("drizzle_free"); drizzle_free(&drizzle); return 0; }
int main(int argc, char *argv[]) { int c; uint32_t count= 0; const char *host= NULL; bool mysql= false; in_port_t port= 0; drizzle_verbose_t verbose= DRIZZLE_VERBOSE_NEVER; drizzle_return_t ret; drizzle_st drizzle; drizzle_con_st con_listen; drizzle_con_st con; drizzle_result_st result; drizzle_column_st column; while((c = getopt(argc, argv, "c:h:mp:v")) != -1) { switch(c) { case 'c': count= (uint32_t)atoi(optarg); break; case 'h': host= optarg; break; case 'm': mysql= true; break; case 'p': port= (in_port_t)atoi(optarg); break; case 'v': verbose++; break; default: printf("\nusage: %s [-c <count>] [-h <host>] [-m] [-p <port>] [-v]\n", argv[0]); printf("\t-c <count> - Number of connections to accept before exiting\n"); printf("\t-h <host> - Host to listen on\n"); printf("\t-m - Use the MySQL protocol\n"); printf("\t-p <port> - Port to listen on\n"); printf("\t-v - Increase verbosity level\n"); return 1; } } if (drizzle_create(&drizzle) == NULL) { printf("drizzle_create:NULL\n"); return 1; } drizzle_add_options(&drizzle, DRIZZLE_FREE_OBJECTS); drizzle_set_verbose(&drizzle, verbose); if (drizzle_con_create(&drizzle, &con_listen) == NULL) { printf("drizzle_con_create:NULL\n"); return 1; } drizzle_con_add_options(&con_listen, DRIZZLE_CON_LISTEN); drizzle_con_set_tcp(&con_listen, host, port); if (mysql) drizzle_con_add_options(&con_listen, DRIZZLE_CON_MYSQL); if (drizzle_con_listen(&con_listen) != DRIZZLE_RETURN_OK) { printf("drizzle_con_listen:%s\n", drizzle_error(&drizzle)); return 1; } while (1) { (void)drizzle_con_accept(&drizzle, &con, &ret); if (ret != DRIZZLE_RETURN_OK) { printf("drizzle_con_accept:%s\n", drizzle_error(&drizzle)); return 1; } server(&drizzle, &con, &result, &column); drizzle_con_free(&con); if (count > 0) { count--; if (count == 0) break; } } drizzle_con_free(&con_listen); drizzle_free(&drizzle); return 0; }