Browse Source

Use async engine for ktpd session

Serj Kalichev 3 years ago
parent
commit
5368a82712
5 changed files with 83 additions and 7 deletions
  1. 2 1
      bin/klish/klish.c
  2. 7 6
      bin/klishd/klishd.c
  3. 68 0
      klish/ktp/ktpd_session.c
  4. 2 0
      klish/ktp/private.h
  5. 4 0
      klish/ktp_session.h

+ 2 - 1
bin/klish/klish.c

@@ -47,7 +47,8 @@ int main(int argc, char **argv)
 		fprintf(stderr, "Error: Can't create klish session\n");
 		goto err;
 	}
-	
+
+	write(ktp_session_fd(session), "hello", 5);
 
 	retval = 0;
 

+ 7 - 6
bin/klishd/klishd.c

@@ -334,13 +334,14 @@ static bool_t client_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
 		return BOOL_TRUE;
 	}
 
+	// Read data
 	if (info->revents & POLLIN) {
-		char buf[1000];
-		ssize_t s = 0;
-
-		s = read(info->fd, buf, 1000);
-printf("Received %ld bytes on fd %d\n", s, info->fd);
-//faux_eloop_add_signal(eloop, SIGINT, stop_loop_ev, NULL);
+		if (!ktpd_session_async_in(session)) {
+			// Someting went wrong
+			faux_eloop_del_fd(eloop, info->fd);
+			ktpd_clients_del(clients, info->fd);
+			syslog(LOG_ERR, "Problem with async input");
+		}
 	}
 
 	// EOF

+ 68 - 0
klish/ktp/ktpd_session.c

@@ -17,6 +17,44 @@
 #include "private.h"
 
 
+static bool_t ktpd_session_read_cb(faux_async_t *async,
+	void *data, size_t len, void *user_data)
+{
+	ktpd_session_t *session = (ktpd_session_t *)user_data;
+
+	assert(async);
+	assert(data);
+	assert(session);
+
+	printf("Read cb %lu\n", len);
+	faux_free(data);
+
+	async = async; // Happy compiler
+
+	return BOOL_TRUE;
+}
+
+
+static bool_t ktpd_session_stall_cb(faux_async_t *async,
+	size_t len, void *user_data)
+{
+	ktpd_session_t *session = (ktpd_session_t *)user_data;
+
+	assert(async);
+	assert(session);
+
+	if (!session->stall_cb)
+		return BOOL_TRUE;
+
+	session->stall_cb(session, session->stall_udata);
+
+	async = async; // Happy compiler
+	len = len; // Happy compiler
+
+	return BOOL_TRUE;
+}
+
+
 ktpd_session_t *ktpd_session_new(int sock)
 {
 	ktpd_session_t *session = NULL;
@@ -33,6 +71,7 @@ ktpd_session_t *ktpd_session_new(int sock)
 	session->state = KTPD_SESSION_STATE_NOT_AUTHORIZED;
 	session->async = faux_async_new(sock);
 	assert(session->async);
+	faux_async_set_read_cb(session->async, ktpd_session_read_cb, session);
 
 	return session;
 }
@@ -70,6 +109,35 @@ int ktpd_session_fd(const ktpd_session_t *session)
 	return faux_async_fd(session->async);
 }
 
+
+bool_t ktpd_session_async_in(ktpd_session_t *session)
+{
+	assert(session);
+	if (!session)
+		return BOOL_FALSE;
+	if (!ktpd_session_connected(session))
+		return BOOL_FALSE;
+
+	if (faux_async_in(session->async) < 0)
+		return BOOL_FALSE;
+
+	return BOOL_TRUE;
+}
+
+
+void faux_session_set_stall_cb(ktpd_session_t *session,
+	faux_session_stall_cb_f 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 - 0
klish/ktp/private.h

@@ -19,6 +19,8 @@ struct ktpd_session_s {
 	gid_t gid;
 	char *user;
 	faux_async_t *async;
+	faux_session_stall_cb_f stall_cb; // Stall callback
+	void *stall_udata;
 };
 
 

+ 4 - 0
klish/ktp_session.h

@@ -12,6 +12,9 @@ typedef struct ktpd_session_s ktpd_session_t;
 typedef struct ktp_session_s ktp_session_t;
 typedef struct ktpd_clients_s ktpd_clients_t;
 
+typedef bool_t (*faux_session_stall_cb_f)(ktpd_session_t *session,
+	void *user_data);
+
 C_DECL_BEGIN
 
 // Client KTP session
@@ -25,6 +28,7 @@ ktpd_session_t *ktpd_session_new(int sock);
 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);
 
 // Server's KTP clients database
 ktpd_clients_t *ktpd_clients_new(void);