Exemple #1
0
/**
 * 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;
}
Exemple #2
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;
}
Exemple #3
0
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;
}