diff options
author | NIIBE Yutaka <[email protected]> | 2025-08-29 05:49:42 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2025-08-29 05:49:42 +0000 |
commit | cff9df67d34fa21fc8f3ba47300e1671c4526629 (patch) | |
tree | 126936441db439aaa43e422ea706b78cbf2c7d99 | |
parent | gpgsm: Introduce two phase interactions to consume diag output. (diff) | |
download | gpgme-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.c | 35 |
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; |