aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2025-08-29 05:49:42 +0000
committerNIIBE Yutaka <[email protected]>2025-08-29 05:49:42 +0000
commitcff9df67d34fa21fc8f3ba47300e1671c4526629 (patch)
tree126936441db439aaa43e422ea706b78cbf2c7d99
parentgpgsm: Introduce two phase interactions to consume diag output. (diff)
downloadgpgme-gniibe/t7759.tar.gz
gpgme-gniibe/t7759.zip
gpgsm: Extend gpgsm_assuan_simple_command to consule diag output.gniibe/t7759
* src/engine-gpgsm.c (gpgsm_assuan_simple_command): Take care about diag output. -- GnuPG-bug-id: 7759 Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--src/engine-gpgsm.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index 37236bc2..b482918c 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -691,6 +691,23 @@ gpgsm_assuan_simple_command (engine_gpgsm_t gpgsm, const char *cmd,
gpg_error_t err, cb_err;
char *line;
size_t linelen;
+ struct io_select_fd_s fds[2];
+ struct io_cb_data iocb_data;
+ int nfds = 0;
+
+ iocb_data.handler_value = gpgsm->diag_cb.data;
+ iocb_data.op_err = 0;
+
+ memset (fds, 0, sizeof (struct io_select_fd_s)*2);
+ fds[nfds].fd = gpgsm->status_cb.fd;
+ fds[nfds].for_read = 1;
+ nfds++;
+ if (gpgsm->diag_cb.fd != -1)
+ {
+ fds[nfds].fd = gpgsm->diag_cb.fd;
+ fds[nfds].for_read = 1;
+ nfds++;
+ }
err = assuan_write_line (ctx, cmd);
if (err)
@@ -699,6 +716,24 @@ gpgsm_assuan_simple_command (engine_gpgsm_t gpgsm, const char *cmd,
cb_err = 0;
do
{
+ fds[0].signaled = fds[1].signaled = 0;
+ if (gpgsm->status_cb.fd != -1
+ && _gpgme_io_select (fds, nfds, 0) < 0)
+ {
+ err = gpg_error_from_syserror ();
+ break;
+ }
+
+ if (gpgsm->diag_cb.fd != -1 && fds[1].signaled)
+ {
+ err = _gpgme_data_inbound_handler (&iocb_data, gpgsm->diag_cb.fd);
+ if (err)
+ break;
+ }
+
+ if (gpgsm->status_cb.fd != -1 && !fds[0].signaled)
+ continue;
+
err = assuan_read_line (ctx, &line, &linelen);
if (err)
break;