Browse Source

ktp_session: A bit reorganize

Serj Kalichev 2 years ago
parent
commit
623b33392c

+ 1 - 3
bin/klishd/klishd.c

@@ -159,7 +159,7 @@ int main(int argc, char **argv)
 
 	retval = 0;
 
-err:
+err: // For listen daemon
 	// Print errors
 	if (faux_error_len(error) > 0)
 		faux_error_show(error);
@@ -208,8 +208,6 @@ err:
 		goto err_client;
 	}
 
-//	ktpd_session_set_stall_cb(ktpd_session, fd_stall_cb, eloop);
-//	faux_eloop_add_fd(eloop, new_conn, POLLIN, client_ev, clients);
 	syslog(LOG_DEBUG, "New connection %d\n", client_fd);
 
 	// Event loop

+ 3 - 0
klish/kcontext.h

@@ -43,6 +43,9 @@ FAUX_HIDDEN bool_t kcontext_set_stderr(kcontext_t *context, int stderr);
 // PID
 pid_t kcontext_pid(const kcontext_t *context);
 FAUX_HIDDEN bool_t kcontext_set_pid(kcontext_t *context, pid_t pid);
+// Done
+bool_t kcontext_done(const kcontext_t *context);
+FAUX_HIDDEN bool_t kcontext_set_done(kcontext_t *context, bool_t done);
 
 C_DECL_END
 

+ 5 - 0
klish/ksession/kcontext.c

@@ -25,6 +25,7 @@ struct kcontext_s {
 	int stdout;
 	int stderr;
 	pid_t pid;
+	bool_t done; // If all actions are done
 };
 
 
@@ -70,6 +71,10 @@ FAUX_HIDDEN KSET(context, int, stderr);
 KGET(context, pid_t, pid);
 FAUX_HIDDEN KSET(context, pid_t, pid);
 
+// Done
+KGET_BOOL(context, done);
+FAUX_HIDDEN KSET_BOOL(context, done);
+
 
 kcontext_t *kcontext_new(kcontext_type_e type)
 {

+ 1 - 1
klish/ksession/kexec.c

@@ -170,7 +170,7 @@ static bool_t kexec_prepare(kexec_t *exec)
 	// STDERR write end will be set to all list members as stderr
 	global_stderr = pipefd[1]; // Write end
 
-	// Iterate all context_t elements
+	// Iterate all context_t elements to fill all stdin, stdout, stderr
 	for (iter = faux_list_head(exec->contexts); iter;
 		iter = faux_list_next_node(iter)) {
 		faux_list_node_t *next = faux_list_next_node(iter);

+ 0 - 10
klish/ktp.h

@@ -45,14 +45,4 @@ typedef enum {
 #define KTP_STATUS_IS_ERROR(status) (status & KTP_STATUS_ERROR)
 
 
-C_DECL_BEGIN
-
-int ktp_connect_unix(const char *sun_path);
-void ktp_disconnect(int fd);
-int ktp_accept(int listen_sock);
-
-faux_msg_t *ktp_msg_preform(ktp_cmd_e cmd, uint32_t status);
-
-C_DECL_END
-
 #endif // _klish_ktp_h

+ 1 - 3
klish/ktp/ktp.c

@@ -12,9 +12,7 @@
 
 #include <faux/str.h>
 #include <faux/msg.h>
-#include <klish/ktp.h>
-
-#include "private.h"
+#include <klish/ktp_session.h>
 
 
 int ktp_connect_unix(const char *sun_path)

+ 14 - 1
klish/ktp/ktp_session.c

@@ -13,7 +13,20 @@
 #include <faux/str.h>
 #include <klish/ktp_session.h>
 
-#include "private.h"
+
+typedef enum {
+	KTP_SESSION_STATE_DISCONNECTED = 'd',
+	KTP_SESSION_STATE_NOT_AUTHORIZED = 'a',
+	KTP_SESSION_STATE_IDLE = 'i',
+	KTP_SESSION_STATE_WAIT_FOR_COMPLETION = 'v',
+	KTP_SESSION_STATE_WAIT_FOR_HELP = 'h',
+	KTP_SESSION_STATE_WAIT_FOR_CMD = 'c',
+} ktp_session_state_e;
+
+struct ktp_session_s {
+	ktp_session_state_e state;
+	faux_net_t *net;
+};
 
 
 ktp_session_t *ktp_session_new(int sock)

+ 0 - 152
klish/ktp/ktpd_clients.c

@@ -1,152 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-
-#include <faux/faux.h>
-#include <faux/str.h>
-#include <faux/list.h>
-
-#include <klish/ktp_session.h>
-
-#include "private.h"
-
-
-static int ktpd_session_compare(const void *first, const void *second)
-{
-	const ktpd_session_t *f = (const ktpd_session_t *)first;
-	const ktpd_session_t *s = (const ktpd_session_t *)second;
-
-	return (ktpd_session_fd(f) - ktpd_session_fd(s));
-}
-
-
-static int ktpd_session_kcompare(const void *key, const void *list_item)
-{
-	const int *f = (const int *)key;
-	const ktpd_session_t *s = (const ktpd_session_t *)list_item;
-
-	return (*f - ktpd_session_fd(s));
-}
-
-
-ktpd_clients_t *ktpd_clients_new(void)
-{
-	ktpd_clients_t *db = NULL;
-
-	db = faux_zmalloc(sizeof(*db));
-	assert(db);
-	if (!db)
-		return NULL;
-
-	// Init
-	db->list = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
-		ktpd_session_compare, ktpd_session_kcompare,
-		(void (*)(void *))ktpd_session_free);
-
-	return db;
-}
-
-
-/** @brief Frees.
- */
-void ktpd_clients_free(ktpd_clients_t *db)
-{
-	if (!db)
-		return;
-
-	faux_list_free(db->list);
-	faux_free(db);
-}
-
-
-ktpd_session_t *ktpd_clients_find(const ktpd_clients_t *db, int fd)
-{
-	assert(db);
-	if (!db)
-		return NULL;
-	assert(fd >= 0);
-	if (fd < 0)
-		return NULL;
-
-	return (ktpd_session_t *)faux_list_kfind(db->list, &fd);
-}
-
-
-ktpd_session_t *ktpd_clients_add(ktpd_clients_t *db, int fd)
-{
-	ktpd_session_t *session = NULL;
-
-	assert(db);
-	if (!db)
-		return NULL;
-	assert(fd >= 0);
-	if (fd < 0)
-		return NULL;
-
-	// Already exists
-	if (ktpd_clients_find(db, fd))
-		return NULL;
-
-	session = ktpd_session_new(fd);
-	if (!session)
-		return NULL;
-
-	if (!faux_list_add(db->list, session)) {
-		ktpd_session_free(session);
-		return NULL;
-	}
-
-	return session;
-}
-
-
-int ktpd_clients_del(ktpd_clients_t *db, int fd)
-{
-	assert(db);
-	if (!db)
-		return -1;
-	assert(fd >= 0);
-	if (fd < 0)
-		return -1;
-
-	if (!faux_list_kdel(db->list, &fd))
-		return -1;
-
-	return 0;
-}
-
-
-faux_list_node_t *ktpd_clients_init_iter(const ktpd_clients_t *db)
-{
-	assert(db);
-	if (!db || !db->list)
-		return NULL;
-
-	return faux_list_head(db->list);
-}
-
-
-ktpd_session_t *ktpd_clients_each(faux_list_node_t **iter)
-{
-	return (ktpd_session_t *)faux_list_each(iter);
-}
-
-
-void ktpd_clients_debug(ktpd_clients_t *db)
-{
-	faux_list_node_t *iter = NULL;
-	ktpd_session_t *session = NULL;
-
-	assert(db);
-	if (!db)
-		return;
-
-	iter = faux_list_head(db->list);
-	if (!iter)
-		return;
-
-	while ((session = (ktpd_session_t *)faux_list_each(&iter))) {
-		printf("clients: %d\n", ktpd_session_fd(session));
-	}
-
-}

+ 20 - 1
klish/ktp/ktpd_session.c

@@ -18,7 +18,26 @@
 #include <klish/ktp.h>
 #include <klish/ktp_session.h>
 
-#include "private.h"
+
+typedef enum {
+	KTPD_SESSION_STATE_DISCONNECTED = 'd',
+	KTPD_SESSION_STATE_NOT_AUTHORIZED = 'a',
+	KTPD_SESSION_STATE_IDLE = 'i',
+	KTPD_SESSION_STATE_WAIT_FOR_PROCESS = 'p',
+} ktpd_session_state_e;
+
+
+struct ktpd_session_s {
+	ksession_t *ksession;
+	ktpd_session_state_e state;
+	uid_t uid;
+	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
+};
 
 
 static bool_t check_ktp_header(faux_hdr_t *hdr)

+ 0 - 51
klish/ktp/private.h

@@ -1,51 +0,0 @@
-#ifndef _klish_ktp_private_h
-#define _klish_ktp_private_h
-
-#include <faux/net.h>
-#include <faux/async.h>
-#include <faux/msg.h>
-#include <klish/ktp_session.h>
-
-
-typedef enum {
-	KTPD_SESSION_STATE_DISCONNECTED = 'd',
-	KTPD_SESSION_STATE_NOT_AUTHORIZED = 'a',
-	KTPD_SESSION_STATE_IDLE = 'i',
-	KTPD_SESSION_STATE_WAIT_FOR_PROCESS = 'p',
-} ktpd_session_state_e;
-
-
-struct ktpd_session_s {
-	ksession_t *ksession;
-	ktpd_session_state_e state;
-	uid_t uid;
-	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
-};
-
-
-typedef enum {
-	KTP_SESSION_STATE_DISCONNECTED = 'd',
-	KTP_SESSION_STATE_NOT_AUTHORIZED = 'a',
-	KTP_SESSION_STATE_IDLE = 'i',
-	KTP_SESSION_STATE_WAIT_FOR_COMPLETION = 'v',
-	KTP_SESSION_STATE_WAIT_FOR_HELP = 'h',
-	KTP_SESSION_STATE_WAIT_FOR_CMD = 'c',
-} ktp_session_state_e;
-
-struct ktp_session_s {
-	ktp_session_state_e state;
-	faux_net_t *net;
-};
-
-/*
-struct ktpd_clients_s {
-	faux_list_t *list;
-};
-*/
-
-#endif // _klish_ktp_private_h

+ 9 - 13
klish/ktp_session.h

@@ -4,6 +4,7 @@
 #include <faux/faux.h>
 #include <faux/list.h>
 #include <klish/ksession.h>
+#include <klish/ktp.h>
 
 #define USOCK_PATH_MAX sizeof(((struct sockaddr_un *)0)->sun_path)
 
@@ -11,19 +12,26 @@
 
 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 (*ktpd_session_stall_cb_fn)(ktpd_session_t *session,
 	void *user_data);
 
 C_DECL_BEGIN
 
+// Common KTP functions
+int ktp_connect_unix(const char *sun_path);
+void ktp_disconnect(int fd);
+int ktp_accept(int listen_sock);
+faux_msg_t *ktp_msg_preform(ktp_cmd_e cmd, uint32_t status);
+
+
 // Client KTP session
 ktp_session_t *ktp_session_new(int sock);
 void ktp_session_free(ktp_session_t *session);
 bool_t ktp_session_connected(ktp_session_t *session);
 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);
@@ -35,18 +43,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);
 
-/*
-// Server's KTP clients database
-ktpd_clients_t *ktpd_clients_new(void);
-void ktpd_clients_free(ktpd_clients_t *db);
-ktpd_session_t *ktpd_clients_find(const ktpd_clients_t *db, int fd);
-ktpd_session_t *ktpd_clients_add(ktpd_clients_t *db, int fd);
-int ktpd_clients_del(ktpd_clients_t *db, int fd);
-faux_list_node_t *ktpd_clients_init_iter(const ktpd_clients_t *db);
-ktpd_session_t *ktpd_clients_each(faux_list_node_t **iter);
-void ktpd_clients_debug(ktpd_clients_t *db);
-*/
-
 C_DECL_END
 
 #endif // _klish_ktp_session_h