コード例 #1
0
ファイル: conn_handler.c プロジェクト: ailove-lab/bloomd
/**
 * Invoked by the networking layer when there is new
 * data to be handled. The connection handler should
 * consume all the input possible, and generate responses
 * to all requests.
 * @arg handle The connection related information
 * @return 0 on success.
 */
int handle_client_connect(bloom_conn_handler *handle) {
    
    // Look for the next command line
    char *buf, *arg_buf;
    int buf_len, arg_buf_len, should_free;
    int status;

    while (1) {

        status = extract_to_terminator(handle->conn, '\n', &buf, &buf_len, &should_free);
        if (status == -1) break; // Return if no command is available

        // Determine the command type
        conn_cmd_type type = determine_client_command(buf, buf_len, &arg_buf, &arg_buf_len);

        // Handle an error or unknown response
        switch(type) {
            
            case CHECK:       handle_check_cmd       (handle, arg_buf, arg_buf_len); break;
            case CHECK_MULTI: handle_check_multi_cmd (handle, arg_buf, arg_buf_len); break;
            case GET:         handle_get_cmd         (handle, arg_buf, arg_buf_len); break;
            case SET:         handle_set_cmd         (handle, arg_buf, arg_buf_len); break;
            case SET_MULTI:   handle_set_multi_cmd   (handle, arg_buf, arg_buf_len); break;
            case CREATE:      handle_create_cmd      (handle, arg_buf, arg_buf_len); break;
            case DROP:        handle_drop_cmd        (handle, arg_buf, arg_buf_len); break;
            case CLOSE:       handle_close_cmd       (handle, arg_buf, arg_buf_len); break;
            case CLEAR:       handle_clear_cmd       (handle, arg_buf, arg_buf_len); break;
            case LIST:        handle_list_cmd        (handle, arg_buf, arg_buf_len); break;
            case INFO:        handle_info_cmd        (handle, arg_buf, arg_buf_len); break;
            case FLUSH:       handle_flush_cmd       (handle, arg_buf, arg_buf_len); break;
            
            default:          
                handle_client_err(handle->conn, (char*)&CMD_NOT_SUP, CMD_NOT_SUP_LEN); 
                break;
        }

        // Make sure to free the command buffer if we need to
        if (should_free) free(buf);
    }

    return 0;
}
コード例 #2
0
ファイル: main.c プロジェクト: Anjali05/linux
static void loop(void)
{
	while (1) {
		struct mbox_request req;
		struct mbox_reply reply;
		int n;

		n = read(0, &req, sizeof(req));
		if (n != sizeof(req)) {
			dprintf(debug_fd, "invalid request %d\n", n);
			return;
		}

		reply.status = req.is_set ?
			handle_set_cmd(&req) :
			handle_get_cmd(&req);

		n = write(1, &reply, sizeof(reply));
		if (n != sizeof(reply)) {
			dprintf(debug_fd, "reply failed %d\n", n);
			return;
		}
	}
}