aboutsummaryrefslogtreecommitdiffstats
path: root/sm
diff options
context:
space:
mode:
Diffstat (limited to 'sm')
-rw-r--r--sm/decrypt.c2
-rw-r--r--sm/encrypt.c4
-rw-r--r--sm/gpgsm.h1
-rw-r--r--sm/server.c56
-rw-r--r--sm/sign.c4
-rw-r--r--sm/verify.c2
6 files changed, 66 insertions, 3 deletions
diff --git a/sm/decrypt.c b/sm/decrypt.c
index 68b362b45..abc1f2602 100644
--- a/sm/decrypt.c
+++ b/sm/decrypt.c
@@ -1107,6 +1107,8 @@ gpgsm_decrypt (ctrl_t ctrl, int in_fd, estream_t out_fp)
goto leave;
}
+ gnupg_ksba_set_progress_cb (b64writer, gpgsm_progress_cb, ctrl);
+
rc = ksba_cms_new (&cms);
if (rc)
goto leave;
diff --git a/sm/encrypt.c b/sm/encrypt.c
index 4fd4f93b9..b0e59f73e 100644
--- a/sm/encrypt.c
+++ b/sm/encrypt.c
@@ -653,6 +653,8 @@ gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, estream_t out_fp)
goto leave;
}
+ gnupg_ksba_set_progress_cb (b64writer, gpgsm_progress_cb, ctrl);
+
err = ksba_cms_new (&cms);
if (err)
{
@@ -828,7 +830,7 @@ gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, estream_t out_fp)
err = ksba_cms_build (cms, &stopreason);
if (err)
{
- log_debug ("ksba_cms_build failed: %s\n", gpg_strerror (err));
+ log_error ("creating CMS object failed: %s\n", gpg_strerror (err));
rc = err;
goto leave;
}
diff --git a/sm/gpgsm.h b/sm/gpgsm.h
index cef39ff2a..46c77803d 100644
--- a/sm/gpgsm.h
+++ b/sm/gpgsm.h
@@ -316,6 +316,7 @@ gpg_error_t gpgsm_status_with_err_code (ctrl_t ctrl, int no, const char *text,
gpg_err_code_t ec);
gpg_error_t gpgsm_status_with_error (ctrl_t ctrl, int no, const char *text,
gpg_error_t err);
+gpg_error_t gpgsm_progress_cb (ctrl_t ctrl, uint64_t current, uint64_t total);
gpg_error_t gpgsm_proxy_pinentry_notify (ctrl_t ctrl,
const unsigned char *line);
diff --git a/sm/server.c b/sm/server.c
index 3ec1c0c4b..455f5707a 100644
--- a/sm/server.c
+++ b/sm/server.c
@@ -1506,7 +1506,14 @@ gpgsm_status2 (ctrl_t ctrl, int no, ...)
}
}
putc ('\n', statusfp);
- fflush (statusfp);
+ if (ferror (statusfp))
+ err = gpg_error_from_syserror ();
+ else
+ {
+ fflush (statusfp);
+ if (ferror (statusfp))
+ err = gpg_error_from_syserror ();
+ }
}
else
{
@@ -1551,6 +1558,53 @@ gpgsm_status_with_error (ctrl_t ctrl, int no, const char *text,
}
+/* This callback is used to emit progress status lines. */
+gpg_error_t
+gpgsm_progress_cb (ctrl_t ctrl, uint64_t current, uint64_t total)
+{
+ char buffer[60];
+ char units[] = "BKMGTPEZY?";
+ int unitidx = 0;
+
+ if (current > 1024*1024*20)
+ {
+ static int closed;
+ if (closed)
+ close (5);
+ closed = 1;
+ }
+
+ if (total)
+ {
+ if (total > current)
+ current = total;
+
+ while (total > 1024*1024)
+ {
+ total /= 1024;
+ current /= 1024;
+ unitidx++;
+ }
+ }
+ else
+ {
+ while (current > 1024*1024)
+ {
+ current /= 1024;
+ unitidx++;
+ }
+ }
+
+ if (unitidx > 9)
+ unitidx = 9;
+
+ snprintf (buffer, sizeof buffer, "? %lu %lu %c%s",
+ (unsigned long)current, (unsigned long)total,
+ units[unitidx], unitidx? "iB" : "");
+ return gpgsm_status2 (ctrl, STATUS_PROGRESS, "?", buffer, NULL);
+}
+
+
/* Helper to notify the client about Pinentry events. Because that
might disturb some older clients, this is only done when enabled
via an option. Returns an gpg error code. */
diff --git a/sm/sign.c b/sm/sign.c
index b3b7e1883..4f5e8e3a0 100644
--- a/sm/sign.c
+++ b/sm/sign.c
@@ -687,6 +687,8 @@ gpgsm_sign (ctrl_t ctrl, certlist_t signerlist,
goto leave;
}
+ gnupg_ksba_set_progress_cb (b64writer, gpgsm_progress_cb, ctrl);
+
err = ksba_cms_new (&cms);
if (err)
{
@@ -1027,7 +1029,7 @@ gpgsm_sign (ctrl_t ctrl, certlist_t signerlist,
err = ksba_cms_build (cms, &stopreason);
if (err)
{
- log_debug ("ksba_cms_build failed: %s\n", gpg_strerror (err));
+ log_error ("creating CMS object failed: %s\n", gpg_strerror (err));
rc = err;
goto leave;
}
diff --git a/sm/verify.c b/sm/verify.c
index a07d1c9c7..9125b2b06 100644
--- a/sm/verify.c
+++ b/sm/verify.c
@@ -158,6 +158,8 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, estream_t out_fp)
}
}
+ gnupg_ksba_set_progress_cb (b64writer, gpgsm_progress_cb, ctrl);
+
rc = ksba_cms_new (&cms);
if (rc)
goto leave;