Explorar o código

klishd: Get line from client

Serj Kalichev %!s(int64=2) %!d(string=hai) anos
pai
achega
8a9c355ee6
Modificáronse 2 ficheiros con 72 adicións e 66 borrados
  1. 0 42
      bin/klishd/klishd.c
  2. 72 24
      klish/ktp/ktpd_session.c

+ 0 - 42
bin/klishd/klishd.c

@@ -83,7 +83,6 @@ int main(int argc, char **argv)
 	int listen_unix_sock = -1;
 	ktpd_session_t *ktpd_session = NULL;
 	kscheme_t *scheme = NULL;
-	ksession_t *session = NULL;
 	faux_error_t *error = faux_error_new();
 	faux_ini_t *config = NULL;
 	int client_fd = -1;
@@ -154,47 +153,6 @@ int main(int argc, char **argv)
 		goto err;
 	}
 
-	// Parsing
-	{
-//	const char *line = "cmd o4 m7 o2 e1";
-	const char *line = "cmd o4 o4 o4 m3 o2";
-	kpargv_t *pargv = NULL;
-	kpargv_pargs_node_t *p_iter = NULL;
-	
-	session = ksession_new(scheme, "/lowview");
-	kpath_push(ksession_path(session), klevel_new(kscheme_find_entry_by_path(scheme, "/main")));
-	pargv = ksession_parse_line(session, line, KPURPOSE_COMPLETION);
-	if (pargv) {
-		printf("Level: %lu, Command: %s, Line '%s': %s\n",
-			kpargv_level(pargv),
-			kpargv_command(pargv) ? kentry_name(kpargv_command(pargv)) : "<none>",
-			line,
-			kpargv_status_str(pargv));
-
-		kparg_t *parg = NULL;
-		p_iter = kpargv_pargs_iter(pargv);
-		if (kpargv_pargs_len(pargv) > 0) {
-			while ((parg = kpargv_pargs_each(&p_iter))) {
-				printf("%s(%s) ", kparg_value(parg), kentry_name(kparg_entry(parg)));
-			}
-			printf("\n");
-		}
-
-		// Completions
-		if (!kpargv_completions_is_empty(pargv)) {
-			kentry_t *completion = NULL;
-			kpargv_completions_node_t *citer = kpargv_completions_iter(pargv);
-			printf("Completions (%s):\n", kpargv_last_arg(pargv));
-			while ((completion = kpargv_completions_each(&citer)))
-				printf("* %s\n", kentry_name(completion));
-		}
-	}
-
-	kpargv_free(pargv);
-	ksession_free(session);
-	
-	}
-
 	// Listen socket
 	syslog(LOG_DEBUG, "Create listen UNIX socket: %s\n", opts->unix_socket_path);
 	listen_unix_sock = create_listen_unix_sock(opts->unix_socket_path);

+ 72 - 24
klish/ktp/ktpd_session.c

@@ -39,9 +39,36 @@ static bool_t check_ktp_header(faux_hdr_t *hdr)
 }
 
 
+static bool_t ktpd_session_send_error(ktpd_session_t *session,
+	ktp_cmd_e cmd, const char *error)
+{
+	faux_msg_t *msg = NULL;
+
+	assert(session);
+	if (!session)
+		return BOOL_FALSE;
+
+	msg = faux_msg_new(KTP_MAGIC, KTP_MAJOR, KTP_MINOR);
+	faux_msg_set_cmd(msg, cmd);
+	if (error)
+		faux_msg_add_param(msg, KTP_PARAM_ERROR, error, strlen(error));
+	faux_msg_send_async(msg, session->async);
+	faux_msg_free(msg);
+
+	return BOOL_TRUE;
+}
+
+
 static bool_t ktpd_session_process_cmd(ktpd_session_t *session, faux_msg_t *msg)
 {
 	bool_t rc = BOOL_FALSE;
+	char *line_raw = NULL;
+	uint32_t line_raw_len = 0;
+	const char *error = "Can't process line";
+	char *line = NULL;
+	faux_msg_t *emsg = NULL;
+	kpargv_t *pargv = NULL;
+	kpargv_pargs_node_t *p_iter = NULL;
 
 	assert(session);
 	if (!session)
@@ -50,33 +77,54 @@ static bool_t ktpd_session_process_cmd(ktpd_session_t *session, faux_msg_t *msg)
 	if (!msg)
 		goto err;
 
-	goto err;
+	if (!faux_msg_get_param_by_type(msg, KTP_PARAM_LINE,
+		(void **)&line_raw, &line_raw_len)) {
+		error = "The line is not specified";
+		goto err;
+	}
+	line = faux_str_dupn(line_raw, line_raw_len);
+printf("LINE: %s\n", line);
+
+	// Parsing
+//	session = ksession_new(scheme, "/lowview");
+//	kpath_push(ksession_path(session), klevel_new(kscheme_find_entry_by_path(scheme, "/main")));
+	pargv = ksession_parse_line(session->ksession, line, KPURPOSE_COMPLETION);
+	if (pargv) {
+		printf("Level: %lu, Command: %s, Line '%s': %s\n",
+			kpargv_level(pargv),
+			kpargv_command(pargv) ? kentry_name(kpargv_command(pargv)) : "<none>",
+			line,
+			kpargv_status_str(pargv));
+
+		kparg_t *parg = NULL;
+		p_iter = kpargv_pargs_iter(pargv);
+		if (kpargv_pargs_len(pargv) > 0) {
+			while ((parg = kpargv_pargs_each(&p_iter))) {
+				printf("%s(%s) ", kparg_value(parg), kentry_name(kparg_entry(parg)));
+			}
+			printf("\n");
+		}
+
+		// Completions
+		if (!kpargv_completions_is_empty(pargv)) {
+			kentry_t *completion = NULL;
+			kpargv_completions_node_t *citer = kpargv_completions_iter(pargv);
+			printf("Completions (%s):\n", kpargv_last_arg(pargv));
+			while ((completion = kpargv_completions_each(&citer)))
+				printf("* %s\n", kentry_name(completion));
+		}
+	}
+	kpargv_free(pargv);
+
+	emsg = faux_msg_new(KTP_MAGIC, KTP_MAJOR, KTP_MINOR);
+	faux_msg_set_cmd(emsg, KTP_CMD_ACK);
+	faux_msg_send_async(emsg, session->async);
+	faux_msg_free(emsg);
 
 	rc = BOOL_TRUE;
 err:
-	if (!rc) {
-		char *buf = NULL;
-		size_t buf_len = 0;
-		faux_msg_t *emsg = faux_msg_new(KTP_MAGIC, KTP_MAJOR, KTP_MINOR);
-		const char *error = "Can't process line";
-		faux_msg_set_cmd(emsg, KTP_CMD_ACK);
-		faux_msg_add_param(emsg, KTP_PARAM_ERROR, error, strlen(error));
-	
-//	faux_net_t *net = faux_net_new();
-//	faux_net_set_fd(net, ktpd_session_fd(session));
-faux_msg_debug(emsg);
-//	printf("Send len: %ld\n", faux_msg_send(emsg, net));
-//	faux_net_free(net);
-
-	
-	
-//	buf = buf;
-//	buf_len = buf_len;
-		faux_msg_serialize(emsg, &buf, &buf_len);
-		faux_async_write(session->async, buf, buf_len);
-		faux_free(buf);
-		faux_msg_free(emsg);
-	}
+	if (!rc)
+		ktpd_session_send_error(session, KTP_CMD_ACK, error);
 
 	return rc;
 }