driver_listener_t *driver_listener_create(select_group_t *group, char *host, int port, char *name) { driver_listener_t *driver = (driver_listener_t*) safe_malloc(sizeof(driver_listener_t)); driver->group = group; driver->host = host; driver->port = port; /* Subscribe to the messages we care about. */ message_subscribe(MESSAGE_SESSION_CLOSED, handle_message, driver); message_subscribe(MESSAGE_DATA_IN, handle_message, driver); message_subscribe(MESSAGE_SHUTDOWN, handle_message, driver); driver->s = tcp_listen(driver->host, driver->port); if(!driver->s) { LOG_FATAL("Failed to listen on %s:%d", driver->host, driver->port); exit(1); } /* On Linux, the stdin_handle is easy. */ select_group_add_socket(driver->group, driver->s, SOCKET_TYPE_LISTEN, driver); select_set_listen(driver->group, driver->s, listener_accept); select_set_closed(driver->group, driver->s, listener_closed); return driver; }
int main(int argc, char *argv[]) { int s = tcp_listen("0.0.0.0", 445); select_group_t *sg = select_group_create(); if(s < 0) return 0; select_group_add_socket(sg, s, SOCKET_TYPE_LISTEN, NULL); select_set_listen(sg, s, listener); /* We start by receiving a header. */ state = RECV_STATE_HEADER; while(1) { select_group_do_select(sg, 3, 0); } #if 0 /* Do 'session setup' */ length = smb_get_length(smb); data = safe_malloc(length); smb_get(smb, data, length); tcp_send(s, data, length); while(1) { select_group_do_select(sg, -1, -1); } select_group_destroy(sg); #endif return 0; }