Ejemplo n.º 1
0
int request_worker(worker_t *worker, GError **error) {
	request_t *request = NULL;


	EXTRA_ASSERT(worker != NULL);
	EXTRA_ASSERT(worker->data.session != NULL);

	request = g_malloc0(sizeof(request_t));

	if (!read_request_from_message((message_t*)worker->data.session, request, error)) {
		GSETERROR(error, "Failed to parse message to build request");
		request_clean(request);
		return 0;
	}

	/* Free the message and put the request in session */
	message_cleanup(worker);
	worker->data.session = request;
	worker->clean = request_cleanup;
	worker->func = g_hash_table_lookup(requests, request->cmd);

	if (!worker->func) {
		GSETERROR(error, "No handler found for request [%s]", request->cmd);
		return 0;
	}

	if (!change_fd_events_in_io_scheduler(worker, EPOLLOUT, error)) {
		GSETERROR(error, "Failed to change polling event on fd %d", worker->data.fd);
		return 0;
	}

	return 1;
}
Ejemplo n.º 2
0
void read_handler(aeEventLoop *el, int fd, void *privdata, int mask)
{
	int err;
	int nread;
	(void) mask;
	char buf[BUF_SIZE]={0};
	struct request *req = (struct request*)privdata;

	nread = read(fd, buf, BUF_SIZE);

	if (nread < 1) {
		request_free(req);
		aeDeleteFileEvent(el, fd, AE_WRITABLE);
		aeDeleteFileEvent(el, fd, AE_READABLE);
		close(fd);
		_clicount--;
		return;
	} else {
		request_append(req, buf, nread);
		err = request_parse(req);
		if (err == -1) {
			request_free(req);
			aeDeleteFileEvent(el, fd, AE_WRITABLE);
			aeDeleteFileEvent(el, fd, AE_READABLE);
			close(fd);
			_clicount--;
			return;
		}

		if (err == 1) {
			_process_cmd(fd, req);
			request_clean(req);
		}
	}
}