/** * 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; }
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; } } }