aboutsummaryrefslogtreecommitdiffstats
path: root/g10/status.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/status.c')
-rw-r--r--g10/status.c143
1 files changed, 108 insertions, 35 deletions
diff --git a/g10/status.c b/g10/status.c
index 6c1388316..1c9b8a36a 100644
--- a/g10/status.c
+++ b/g10/status.c
@@ -72,38 +72,11 @@ progress_cb ( void *ctx, int c )
write_status_text ( STATUS_PROGRESS, buf );
}
-
-void
-set_status_fd ( int newfd )
-{
- fd = newfd;
- if ( fd != -1 ) {
- register_primegen_progress ( progress_cb, "primegen" );
- register_pk_dsa_progress ( progress_cb, "pk_dsa" );
- register_pk_elg_progress ( progress_cb, "pk_elg" );
- }
-}
-
-int
-is_status_enabled()
-{
- return fd != -1;
-}
-
-void
-write_status ( int no )
-{
- write_status_text( no, NULL );
-}
-
-void
-write_status_text ( int no, const char *text)
+static const char *
+get_status_string ( int no )
{
const char *s;
- if( fd == -1 )
- return; /* not enabled */
-
switch( no ) {
case STATUS_ENTER : s = "ENTER\n"; break;
case STATUS_LEAVE : s = "LEAVE\n"; break;
@@ -157,18 +130,118 @@ write_status_text ( int no, const char *text)
case STATUS_PROGRESS : s = "PROGRESS\n"; break;
case STATUS_SIG_CREATED : s = "SIG_CREATED\n"; break;
case STATUS_SESSION_KEY : s = "SESSION_KEY\n"; break;
+ case STATUS_NOTATION_NAME : s = "NOTATION_NAME\n" ; break;
+ case STATUS_NOTATION_DATA : s = "NOTATION_DATA\n" ; break;
+ case STATUS_POLICY_URL : s = "POLICY_URL\n" ; break;
default: s = "?\n"; break;
}
+ return s;
+}
+
+void
+set_status_fd ( int newfd )
+{
+ fd = newfd;
+ if ( fd != -1 ) {
+ register_primegen_progress ( progress_cb, "primegen" );
+ register_pk_dsa_progress ( progress_cb, "pk_dsa" );
+ register_pk_elg_progress ( progress_cb, "pk_elg" );
+ }
+}
+
+int
+is_status_enabled()
+{
+ return fd != -1;
+}
+
+void
+write_status ( int no )
+{
+ write_status_text( no, NULL );
+}
+
+static void
+mywrite ( int fd, const char *buffer, size_t len )
+{
+ int nwritten;
+
+ do {
+ nwritten = write (fd, buffer, len );
+ } while (nwritten == -1 && errno == EINTR );
+}
+
+void
+write_status_text ( int no, const char *text)
+{
+ const char *s;
+
+ if( fd == -1 )
+ return; /* not enabled */
+
+ s = get_status_string (no);
- write( fd, "[GNUPG:] ", 9 );
+ mywrite( fd, "[GNUPG:] ", 9 );
if( text ) {
- write( fd, s, strlen(s)-1 );
- write( fd, " ", 1 );
- write( fd, text, strlen(text) );
- write( fd, "\n", 1 );
+ mywrite( fd, s, strlen(s)-1 );
+ mywrite( fd, " ", 1 );
+ mywrite( fd, text, strlen(text) );
+ mywrite( fd, "\n", 1 );
}
else
- write( fd, s, strlen(s) );
+ mywrite( fd, s, strlen(s) );
+}
+
+
+/*
+ * Write a status line with a buffer using %XX escapes.
+ * If WRAP is > 0 wrap the line after this length.
+ */
+void
+write_status_buffer ( int no, const char *buffer, size_t len, int wrap )
+{
+ const char *s, *text;
+ int esc;
+ size_t n, count, dowrap;
+
+ if( fd == -1 )
+ return; /* not enabled */
+
+ text = get_status_string (no);
+ count = dowrap = 1;
+ do {
+ if (dowrap) {
+ mywrite( fd, "[GNUPG:] ", 9 );
+ mywrite( fd, text, strlen(text)-1 );
+ mywrite( fd, " ", 1 );
+ count = dowrap = 0;
+ }
+ for (esc=0, s=buffer, n=len; n && !esc; s++, n-- ) {
+ if ( *s == '%' || *(const byte*)s <= ' ' )
+ esc = 1;
+ if ( wrap && ++count > wrap ) {
+ dowrap=1;
+ break;
+ }
+ }
+ if (esc) {
+ s--; n++;
+ }
+ if (s != buffer)
+ mywrite ( fd, buffer, s-buffer );
+ if ( esc ) {
+ char buf[5];
+ sprintf (buf, "%%%02X", *(const byte*)s );
+ mywrite (fd, buf, 3 );
+ s++; n--;
+ }
+ buffer = s;
+ len = n;
+ if ( dowrap && len )
+ mywrite( fd, "\n", 1 );
+ } while ( len );
+
+ mywrite( fd, "\n", 1 );
}