|
@@ -35,6 +35,9 @@ struct ktp_session_s {
|
|
|
ktp_status_e cmd_features;
|
|
|
bool_t cmd_features_available;
|
|
|
bool_t stop_on_answer;
|
|
|
+ bool_t stdout_need_newline;
|
|
|
+ bool_t stderr_need_newline;
|
|
|
+ int last_stream;
|
|
|
};
|
|
|
|
|
|
|
|
@@ -70,6 +73,9 @@ ktp_session_t *ktp_session_new(int sock, faux_eloop_t *eloop)
|
|
|
ktp->request_done = BOOL_FALSE;
|
|
|
ktp->cmd_features = KTP_STATUS_NONE;
|
|
|
ktp->cmd_features_available = BOOL_FALSE;
|
|
|
+ ktp->stdout_need_newline = BOOL_FALSE;
|
|
|
+ ktp->stderr_need_newline = BOOL_FALSE;
|
|
|
+ ktp->last_stream = STDOUT_FILENO;
|
|
|
|
|
|
|
|
|
ktp->async = faux_async_new(sock);
|
|
@@ -299,6 +305,14 @@ static bool_t ktp_session_process_stdout(ktp_session_t *ktp, const faux_msg_t *m
|
|
|
if (!faux_msg_get_param_by_type(msg, KTP_PARAM_LINE, (void **)&line, &len))
|
|
|
return BOOL_TRUE;
|
|
|
|
|
|
+ if (len > 0) {
|
|
|
+ if (line[len - 1] == '\n')
|
|
|
+ ktp->stdout_need_newline = BOOL_FALSE;
|
|
|
+ else
|
|
|
+ ktp->stdout_need_newline = BOOL_TRUE;
|
|
|
+ ktp->last_stream = STDOUT_FILENO;
|
|
|
+ }
|
|
|
+
|
|
|
return ((ktp_session_stdout_cb_fn)ktp->cb[KTP_SESSION_CB_STDOUT].fn)(
|
|
|
ktp, line, len, ktp->cb[KTP_SESSION_CB_STDOUT].udata);
|
|
|
}
|
|
@@ -319,6 +333,14 @@ static bool_t ktp_session_process_stderr(ktp_session_t *ktp, const faux_msg_t *m
|
|
|
(void **)&line, &len))
|
|
|
return BOOL_TRUE;
|
|
|
|
|
|
+ if (len > 0) {
|
|
|
+ if (line[len - 1] == '\n')
|
|
|
+ ktp->stderr_need_newline = BOOL_FALSE;
|
|
|
+ else
|
|
|
+ ktp->stderr_need_newline = BOOL_TRUE;
|
|
|
+ ktp->last_stream = STDERR_FILENO;
|
|
|
+ }
|
|
|
+
|
|
|
return ((ktp_session_stdout_cb_fn)ktp->cb[KTP_SESSION_CB_STDERR].fn)(
|
|
|
ktp, line, len, ktp->cb[KTP_SESSION_CB_STDERR].udata);
|
|
|
}
|
|
@@ -617,6 +639,9 @@ static bool_t ktp_session_drop_state(ktp_session_t *ktp, faux_error_t *error)
|
|
|
ktp->request_done = BOOL_FALSE;
|
|
|
ktp->cmd_features = KTP_STATUS_NONE;
|
|
|
ktp->cmd_features_available = BOOL_FALSE;
|
|
|
+ ktp->stdout_need_newline = BOOL_FALSE;
|
|
|
+ ktp->stderr_need_newline = BOOL_FALSE;
|
|
|
+ ktp->last_stream = STDOUT_FILENO;
|
|
|
|
|
|
return BOOL_TRUE;
|
|
|
}
|
|
@@ -746,3 +771,30 @@ bool_t ktp_session_retcode(ktp_session_t *ktp, int *retcode)
|
|
|
|
|
|
return ktp->cmd_retcode_available;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+bool_t ktp_session_stdout_need_newline(ktp_session_t *ktp)
|
|
|
+{
|
|
|
+ if (!ktp)
|
|
|
+ return BOOL_FALSE;
|
|
|
+
|
|
|
+ return ktp->stdout_need_newline;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+bool_t ktp_session_stderr_need_newline(ktp_session_t *ktp)
|
|
|
+{
|
|
|
+ if (!ktp)
|
|
|
+ return BOOL_FALSE;
|
|
|
+
|
|
|
+ return ktp->stderr_need_newline;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int ktp_session_last_stream(ktp_session_t *ktp)
|
|
|
+{
|
|
|
+ if (!ktp)
|
|
|
+ return BOOL_FALSE;
|
|
|
+
|
|
|
+ return ktp->last_stream;
|
|
|
+}
|