|
@@ -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;
|
|
|
}
|