/** * find a client */ p_client next_client_by_message(p_client client, char *message) { static int oldclient = 0; // return to start if client is null if (client == 0) { oldclient =0; } p_client check = get_client_idx(oldclient); // if some unknown client is given, find it. if (client != check) { oldclient = find_client_idx(client); } // check next client oldclient++; if ( oldclient < count_clients()) { // if it matches the message, return it check = get_client_idx(oldclient); if (filter_match(check, message)) { return check; } // else check next client return next_client_by_message(check, message); } return 0; }
/** * return the index of a client.. or -1; */ int find_client_idx(p_client client) { int i; for (i = 0; i < count_clients(); i++) { if (get_client_idx(i) == client) { return i; } } return -1; }
int run_server(int argc, char ** argv) { DEBUG_OUT("---DEBUG MODE---\n"); if (argc < 4) { printf("Usage: %s <port> <adminname> <adminpass>\n", argv[0]); return 0; } server_port = atoi(argv[1]); DEBUG_OUT("Port: %d\n", server_port); strcpy(admin_name, argv[2]); strcpy(admin_pass, argv[3]); /* Create server socket */ server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("socket"); exit(-1); } DEBUG_OUT("Got server socket\n"); /* Reuse address */ socket_flags = 1; if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &socket_flags, sizeof(socket_flags)) < 0) { perror("setsockopt"); exit(-1); } /* Make socket non blocking */ socket_flags = fcntl(server_socket, F_GETFL, 0); if (fcntl(server_socket, F_SETFL, socket_flags | O_NONBLOCK) != 0) { perror("fcntl"); exit(-1); } DEBUG_OUT("Server socket is non blocking\n"); /* Bind to our port */ memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(server_port); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); exit(-1); } DEBUG_OUT("Server socket is bound\n"); /* Allocate queue for 10 sockets */ listen(server_socket, 10); DEBUG_OUT("Server socket has room for 10 incoming connections\n"); /* Add to readset */ FD_ZERO(&readset); FD_SET(server_socket, &readset); /* Initialize client buffer */ memset(client_buffer, 0, sizeof(client_buffer)); for (i = 0; i < MAX_CLIENTS - 1; i++) { client_buffer[i].next = &client_buffer[i + 1]; } free_clients = &client_buffer[0]; /* Run IO loop */ while (1) { reads = readset; DEBUG_OUT("Waiting forever for IO. "); DEBUG_OUT("Active client count: %d", count_clients(active_clients)); DEBUG_OUT(" Free client count: %d\n", count_clients(free_clients)); selected = select(FD_SETSIZE, &reads, NULL, NULL, NULL); if (selected < 0) { perror("select"); exit(-1); } DEBUG_OUT("select() returned %d\n", selected); if (selected > 0) { handle_clients(); handle_server(); } } return 0; }