Browse Source

libklish: ktp_session. Unfinished

Serj Kalichev 3 years ago
parent
commit
bdd89c9a83
6 changed files with 172 additions and 1 deletions
  1. 3 0
      Makefile.am
  2. 3 1
      klish/ktp/Makefile.am
  3. 113 0
      klish/ktp/ktp_session.c
  4. 0 0
      klish/ktp/ktpd_session.c
  5. 35 0
      klish/ktp/private.h
  6. 18 0
      klish/ktp_session.h

+ 3 - 0
Makefile.am

@@ -22,6 +22,7 @@ lib_LIBRARIES =
 nobase_include_HEADERS =
 
 EXTRA_DIST =
+	klish/Makefile.am
 
 #	bin/module.am \
 #	clish/module.am \
@@ -39,6 +40,8 @@ EXTRA_DIST =
 #	CHANGES \
 #	ISSUES
 
+include $(top_srcdir)/klish/Makefile.am
+
 #include $(top_srcdir)/tinyrl/module.am
 #include $(top_srcdir)/konf/module.am
 #include $(top_srcdir)/clish/module.am

+ 3 - 1
klish/ktp/Makefile.am

@@ -1,2 +1,4 @@
 libklish_la_SOURCES += \
-	klish/ktp/ktp.c
+	klish/ktp/ktp.c \
+	klish/ktp/ktp_session.c \
+	klish/ktp/ktpd_session.c

+ 113 - 0
klish/ktp/ktp_session.c

@@ -0,0 +1,113 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <faux/str.h>
+#include <klish/ktp_session.h>
+
+#include "private.h"
+
+#define USOCK_PATH_MAX sizeof(((struct sockaddr_un *)0)->sun_path)
+
+
+ktp_session_t *ktp_session_new(const char *sun_path)
+{
+	ktp_session_t *session = NULL;
+
+	assert(sun_path);
+	if (!sun_path)
+		return NULL;
+
+	session = faux_zmalloc(sizeof(*session));
+	assert(session);
+	if (!session)
+		return NULL;
+
+	// Init
+	session->state = KTP_SESSION_STATE_DISCONNECTED;
+	session->sun_path = faux_str_dup(sun_path);
+	assert(session->sun_path);
+	session->net = faux_net_new();
+	assert(session->net);
+
+	return session;
+}
+
+
+void ktp_session_free(ktp_session_t *session)
+{
+	if (!session)
+		return;
+
+	ktp_session_disconnect(session);
+	faux_net_free(session->net);
+	faux_str_free(session->sun_path);
+	faux_free(session);
+}
+
+
+int ktp_session_connect(ktp_session_t *session)
+{
+	int sock = -1;
+	int opt = 1;
+	struct sockaddr_un laddr = {};
+
+	assert(session);
+	if (!session)
+		return -1;
+
+	if (session->state != KTP_SESSION_STATE_DISCONNECTED)
+		return faux_net_get_fd(session->net); // Already connected
+
+	// Create socket
+	if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+		return -1;
+	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
+		close(sock);
+		return -1;
+	}
+	laddr.sun_family = AF_UNIX;
+	strncpy(laddr.sun_path, session->sun_path, USOCK_PATH_MAX);
+	laddr.sun_path[USOCK_PATH_MAX - 1] = '\0';
+
+	// Connect to server
+	if (connect(sock, (struct sockaddr *)&laddr, sizeof(laddr))) {
+		close(sock);
+		return -1;
+	}
+
+	// Update session state
+	faux_net_set_fd(session->net, sock);
+	session->state = KTP_SESSION_STATE_IDLE;
+
+	return sock;
+}
+
+
+int ktp_session_disconnect(ktp_session_t *session)
+{
+	int fd = -1;
+
+	assert(session);
+	if (!session)
+		return -1;
+
+	if (KTP_SESSION_STATE_DISCONNECTED == session->state)
+		return -1; // Already disconnected
+	session->state = KTP_SESSION_STATE_DISCONNECTED;
+	fd = faux_net_get_fd(session->net);
+	if (fd < 0)
+		return fd; // Strange - already disconnected
+	close(fd);
+	faux_net_unset_fd(session->net);
+
+	return fd;
+}

+ 0 - 0
klish/ktp/ktpd_session.c


+ 35 - 0
klish/ktp/private.h

@@ -0,0 +1,35 @@
+#ifndef _klish_ktp_private_h
+#define _klish_ktp_private_h
+
+#include <faux/net.h>
+#include <klish/ktp_session.h>
+
+
+typedef enum {
+	KTPD_SESSION_STATE_DISCONNECTED = 'd',
+	KTPD_SESSION_STATE_IDLE = 'i',
+	KTPD_SESSION_STATE_WAIT_FOR_PROCESS = 'p',
+} ktpd_session_state_e;
+
+struct ktpd_session_s {
+	ktpd_session_state_e state;
+	pid_t client_pid;
+	faux_net_t *net;
+};
+
+
+typedef enum {
+	KTP_SESSION_STATE_DISCONNECTED = 'd',
+	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;
+	char *sun_path;
+	faux_net_t *net;
+};
+
+#endif // _klish_ktp_private_h

+ 18 - 0
klish/ktp_session.h

@@ -0,0 +1,18 @@
+#ifndef _klish_ktp_session_h
+#define _klish_ktp_session_h
+
+
+typedef struct ktpd_session_s ktpd_session_t;
+typedef struct ktp_session_s ktp_session_t;
+
+C_DECL_BEGIN
+
+// Client KTP session
+ktp_session_t *ktp_session_new(const char *sun_path);
+void ktp_session_free(ktp_session_t *session);
+int ktp_session_connect(ktp_session_t *session);
+int ktp_session_disconnect(ktp_session_t *session);
+
+C_DECL_END
+
+#endif // _klish_ktp_session_h