struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, struct ip_addr_encap* addr) { struct hub_user* user = NULL; LOG_TRACE("user_create(), hub=%p, con[sd=%d]", hub, net_con_get_sd(con)); user = (struct hub_user*) hub_malloc_zero(sizeof(struct hub_user)); if (user == NULL) return NULL; /* OOM */ user->send_queue = ioq_send_create(); user->recv_queue = ioq_recv_create(); user->connection = con; net_con_reinitialize(user->connection, net_event, user, NET_EVENT_READ); memcpy(&user->id.addr, addr, sizeof(struct ip_addr_encap)); user_set_state(user, state_protocol); flood_control_reset(&user->flood_chat); flood_control_reset(&user->flood_connect); flood_control_reset(&user->flood_search); flood_control_reset(&user->flood_update); flood_control_reset(&user->flood_extras); user->hub = hub; return user; }
static void connect_callback(struct net_connect_handle* handle, enum net_connect_status status, struct net_connection* con, void* ptr) { struct ADC_client* client = (struct ADC_client*) ptr; client->connect_job = NULL; switch (status) { case net_connect_status_ok: client->con = con; net_con_reinitialize(client->con, event_callback, client, 0); ADC_client_on_connected(client); break; case net_connect_status_host_not_found: case net_connect_status_no_address: case net_connect_status_dns_error: case net_connect_status_refused: case net_connect_status_unreachable: case net_connect_status_timeout: case net_connect_status_socket_error: ADC_client_disconnect(client); break; } }