Browse Source

Client can connect to server

Serj Kalichev 3 years ago
parent
commit
5f1b80c3b7
6 changed files with 44 additions and 10 deletions
  1. 21 1
      bin/klish/klish.c
  2. 4 4
      bin/klish/opts.c
  3. 1 1
      bin/klish/private.h
  4. 16 2
      bin/klishd/klishd.c
  5. 1 1
      klish/ktp.h
  6. 1 1
      klish/ktp/ktp.c

+ 21 - 1
bin/klish/klish.c

@@ -25,15 +25,35 @@ int main(int argc, char **argv)
 {
 	int retval = -1;
 	struct options *opts = NULL;
+	int unix_sock = -1;
+	ktp_session_t *session = NULL;
 
 	// Parse command line options
 	opts = opts_init();
-	if (opts_parse(argc, argv, opts))
+	if (opts_parse(argc, argv, opts)) {
+		fprintf(stderr, "Error: Can't parse command line options\n");
 		goto err;
+	}
+
+	// Connect to server
+	unix_sock = ktp_connect_unix(opts->unix_socket_path);
+	if (unix_sock < 0) {
+		fprintf(stderr, "Error: Can't connect to server\n");
+		goto err;
+	}
+	session = ktp_session_new(unix_sock);
+	assert(session);
+	if (!session) {
+		fprintf(stderr, "Error: Can't create klish session\n");
+		goto err;
+	}
+	
 
 	retval = 0;
 
 err:
+	ktp_session_free(session);
+	ktp_disconnect(unix_sock);
 	opts_free(opts);
 
 	return retval;

+ 4 - 4
bin/klish/opts.c

@@ -29,7 +29,7 @@ struct options *opts_init(void)
 
 	// Initialize
 	opts->verbose = BOOL_FALSE;
-	opts->socket = faux_str_dup(KLISH_DEFAULT_UNIX_SOCKET_PATH);
+	opts->unix_socket_path = faux_str_dup(KLISH_DEFAULT_UNIX_SOCKET_PATH);
 
 	return opts;
 }
@@ -41,7 +41,7 @@ void opts_free(struct options *opts)
 {
 	if (!opts)
 		return;
-	faux_str_free(opts->socket);
+	faux_str_free(opts->unix_socket_path);
 	faux_free(opts);
 }
 
@@ -67,8 +67,8 @@ int opts_parse(int argc, char *argv[], struct options *opts)
 			break;
 		switch (opt) {
 		case 'S':
-			faux_str_free(opts->socket);
-			opts->socket = faux_str_dup(optarg);
+			faux_str_free(opts->unix_socket_path);
+			opts->unix_socket_path = faux_str_dup(optarg);
 			break;
 		case 'v':
 			opts->verbose = BOOL_TRUE;

+ 1 - 1
bin/klish/private.h

@@ -8,7 +8,7 @@
  */
 struct options {
 	bool_t verbose;
-	char *socket;
+	char *unix_socket_path;
 };
 
 // Options

+ 16 - 2
bin/klishd/klishd.c

@@ -178,6 +178,7 @@ int main(int argc, char **argv)
 	// Add listen UNIX socket to pollfds vector
 	faux_pollfd_add(fds, listen_unix_sock, POLLIN);
 
+syslog(LOG_DEBUG, "Listen socket %d", listen_unix_sock);
 	// Block signals to prevent race conditions while loop and ppoll()
 	// Catch signals while ppoll() only
 	sigemptyset(&sig_set);
@@ -250,7 +251,6 @@ syslog(LOG_DEBUG, "Timeout\n");
 		while ((pollfd = faux_pollfd_each_active(fds, &pollfd_iter))) {
 			int fd = pollfd->fd;
 
-syslog(LOG_DEBUG, "Listen\n");
 			// Listen socket
 			if (fd == listen_unix_sock) {
 				int new_conn = -1;
@@ -264,7 +264,21 @@ syslog(LOG_DEBUG, "Listen\n");
 
 			// If it's not a listen socket then we have received
 			// a message from client.
-syslog(LOG_DEBUG, "Client\n");
+syslog(LOG_DEBUG, "Client %d\n", fd);
+
+			// Receive message
+			
+			
+
+			// Check for closed connection. Do it after reading from
+			// socket because buffer of disconnected socket can
+			// still contain data.
+			if (pollfd->revents & POLLHUP) {
+syslog(LOG_DEBUG, "Close connection %d\n", fd);
+				ktp_disconnect(fd);
+				faux_pollfd_del_by_fd(fds, fd);
+			}
+
 		}
 
 	} // Main loop end

+ 1 - 1
klish/ktp.h

@@ -29,7 +29,7 @@ typedef enum {
 
 C_DECL_BEGIN
 
-int ktp_connect(const char *sun_path);
+int ktp_connect_unix(const char *sun_path);
 void ktp_disconnect(int fd);
 int ktp_accept(int listen_sock);
 

+ 1 - 1
klish/ktp/ktp.c

@@ -16,7 +16,7 @@
 #include "private.h"
 
 
-int ktp_connect(const char *sun_path)
+int ktp_connect_unix(const char *sun_path)
 {
 	int sock = -1;
 	int opt = 1;