Browse Source

ktpd_session: Class now contain eloop object

Serj Kalichev 2 years ago
parent
commit
0a57d879a4
3 changed files with 67 additions and 83 deletions
  1. 7 19
      bin/klishd/klishd.c
  2. 58 61
      klish/ktp/ktpd_session.c
  3. 2 3
      klish/ktp_session.h

+ 7 - 19
bin/klishd/klishd.c

@@ -70,8 +70,6 @@ static bool_t wait_for_child_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
 //static bool_t sched_periodic(faux_eloop_t *eloop, faux_eloop_type_e type,
 //	void *associated_data, void *user_data);
 
-static bool_t fd_stall_cb(ktpd_session_t *session, void *user_data);
-
 
 /** @brief Main function
  */
@@ -200,24 +198,27 @@ err: // For listen daemon
 	if (!opts->verbose)
 		setlogmask(LOG_UPTO(LOG_INFO));
 
-	ktpd_session = ktpd_session_new(client_fd, scheme, NULL);
+	// Create event loop
+	eloop = faux_eloop_new(NULL);
+
+	// Create KTP session
+	// Function ktpd_session_new() will add new events to eloop itself.
+	ktpd_session = ktpd_session_new(client_fd, scheme, NULL, eloop);
 	assert(ktpd_session);
 	if (!ktpd_session) {
 		syslog(LOG_ERR, "Can't create KTPd session\n");
+		faux_eloop_free(eloop);
 		close(client_fd);
 		goto err_client;
 	}
 
 	syslog(LOG_DEBUG, "New connection %d\n", client_fd);
 
-	// Event loop
-	eloop = faux_eloop_new(NULL);
 	// Signals
 	faux_eloop_add_signal(eloop, SIGINT, stop_loop_ev, NULL);
 	faux_eloop_add_signal(eloop, SIGTERM, stop_loop_ev, NULL);
 	faux_eloop_add_signal(eloop, SIGQUIT, stop_loop_ev, NULL);
 	// FDs
-	ktpd_session_set_stall_cb(ktpd_session, fd_stall_cb, eloop);
 	faux_eloop_add_fd(eloop, client_fd, POLLIN, client_ev, ktpd_session);
 	// Main service loop
 	faux_eloop_loop(eloop);
@@ -573,19 +574,6 @@ static bool_t refresh_config_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
 }
 
 
-static bool_t fd_stall_cb(ktpd_session_t *session, void *user_data)
-{
-	faux_eloop_t *eloop = (faux_eloop_t *)user_data;
-
-	assert(session);
-	assert(eloop);
-
-	faux_eloop_include_fd_event(eloop, ktpd_session_fd(session), POLLOUT);
-
-	return BOOL_TRUE;
-}
-
-
 /** @brief Event on listen socket. New remote client.
  */
 static bool_t listen_socket_ev(faux_eloop_t *eloop, faux_eloop_type_e type,

+ 58 - 61
klish/ktp/ktpd_session.c

@@ -10,10 +10,12 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <syslog.h>
+#include <poll.h>
 
 #include <faux/str.h>
 #include <faux/async.h>
 #include <faux/msg.h>
+#include <faux/eloop.h>
 #include <klish/ksession.h>
 #include <klish/ktp.h>
 #include <klish/ktp_session.h>
@@ -34,12 +36,64 @@ struct ktpd_session_s {
 	gid_t gid;
 	char *user;
 	faux_async_t *async;
-	ktpd_session_stall_cb_fn stall_cb; // Stall callback
-	void *stall_udata;
 	faux_hdr_t *hdr; // Engine will receive header and then msg
+	faux_eloop_t *eloop;
 };
 
 
+// Static declarations
+static bool_t ktpd_session_read_cb(faux_async_t *async,
+	void *data, size_t len, void *user_data);
+static bool_t ktpd_session_stall_cb(faux_async_t *async,
+	size_t len, void *user_data);
+
+
+ktpd_session_t *ktpd_session_new(int sock, const kscheme_t *scheme,
+	const char *start_entry, faux_eloop_t *eloop)
+{
+	ktpd_session_t *session = NULL;
+
+	if (sock < 0)
+		return NULL;
+	if (!eloop)
+		return NULL;
+
+	session = faux_zmalloc(sizeof(*session));
+	assert(session);
+	if (!session)
+		return NULL;
+
+	// Init
+	session->state = KTPD_SESSION_STATE_NOT_AUTHORIZED;
+	session->ksession = ksession_new(scheme, start_entry);
+	assert(session->ksession);
+	session->async = faux_async_new(sock);
+	assert(session->async);
+	// Receive message header first
+	faux_async_set_read_limits(session->async,
+		sizeof(faux_hdr_t), sizeof(faux_hdr_t));
+	faux_async_set_read_cb(session->async, ktpd_session_read_cb, session);
+	session->hdr = NULL;
+
+	faux_async_set_stall_cb(session->async, ktpd_session_stall_cb, session);
+
+	return session;
+}
+
+
+void ktpd_session_free(ktpd_session_t *session)
+{
+	if (!session)
+		return;
+
+	ksession_free(session->ksession);
+	faux_free(session->hdr);
+	close(ktpd_session_fd(session));
+	faux_async_free(session->async);
+	faux_free(session);
+}
+
+
 static bool_t check_ktp_header(faux_hdr_t *hdr)
 {
 	assert(hdr);
@@ -303,11 +357,9 @@ static bool_t ktpd_session_stall_cb(faux_async_t *async,
 
 	assert(async);
 	assert(session);
+	assert(session->eloop);
 
-	if (!session->stall_cb)
-		return BOOL_TRUE;
-
-	session->stall_cb(session, session->stall_udata);
+	faux_eloop_include_fd_event(session->eloop, ktpd_session_fd(session), POLLOUT);
 
 	async = async; // Happy compiler
 	len = len; // Happy compiler
@@ -316,48 +368,6 @@ static bool_t ktpd_session_stall_cb(faux_async_t *async,
 }
 
 
-ktpd_session_t *ktpd_session_new(int sock, const kscheme_t *scheme,
-	const char *start_entry)
-{
-	ktpd_session_t *session = NULL;
-
-	if (sock < 0)
-		return NULL;
-
-	session = faux_zmalloc(sizeof(*session));
-	assert(session);
-	if (!session)
-		return NULL;
-
-	// Init
-	session->state = KTPD_SESSION_STATE_NOT_AUTHORIZED;
-	session->ksession = ksession_new(scheme, start_entry);
-	assert(session->ksession);
-	session->async = faux_async_new(sock);
-	assert(session->async);
-	// Receive message header first
-	faux_async_set_read_limits(session->async,
-		sizeof(faux_hdr_t), sizeof(faux_hdr_t));
-	faux_async_set_read_cb(session->async, ktpd_session_read_cb, session);
-	session->hdr = NULL;
-
-	return session;
-}
-
-
-void ktpd_session_free(ktpd_session_t *session)
-{
-	if (!session)
-		return;
-
-	ksession_free(session->ksession);
-	faux_free(session->hdr);
-	close(ktpd_session_fd(session));
-	faux_async_free(session->async);
-	faux_free(session);
-}
-
-
 bool_t ktpd_session_connected(ktpd_session_t *session)
 {
 	assert(session);
@@ -410,19 +420,6 @@ bool_t ktpd_session_async_out(ktpd_session_t *session)
 }
 
 
-void ktpd_session_set_stall_cb(ktpd_session_t *session,
-	ktpd_session_stall_cb_fn stall_cb, void *user_data)
-{
-	assert(session);
-	if (!session)
-		return;
-
-	session->stall_cb = stall_cb;
-	session->stall_udata = user_data;
-	faux_async_set_stall_cb(session->async, ktpd_session_stall_cb, session);
-}
-
-
 #if 0
 static void ktpd_session_bad_socket(ktpd_session_t *session)
 {

+ 2 - 3
klish/ktp_session.h

@@ -3,6 +3,7 @@
 
 #include <faux/faux.h>
 #include <faux/list.h>
+#include <faux/eloop.h>
 #include <klish/ksession.h>
 #include <klish/ktp.h>
 
@@ -34,14 +35,12 @@ int ktp_session_fd(const ktp_session_t *session);
 
 // Server KTP session
 ktpd_session_t *ktpd_session_new(int sock, const kscheme_t *scheme,
-	const char *start_entry);
+	const char *start_entry, faux_eloop_t *eloop);
 void ktpd_session_free(ktpd_session_t *session);
 bool_t ktpd_session_connected(ktpd_session_t *session);
 int ktpd_session_fd(const ktpd_session_t *session);
 bool_t ktpd_session_async_in(ktpd_session_t *session);
 bool_t ktpd_session_async_out(ktpd_session_t *session);
-void ktpd_session_set_stall_cb(ktpd_session_t *session,
-	ktpd_session_stall_cb_fn stall_cb, void *user_data);
 
 C_DECL_END