* Makefile.am (AM_CFLAGS): Make use of AM_CFLAGS and AM_LDFLAGS.
authorWerner Koch <wk@gnupg.org>
Tue, 15 Apr 2003 15:46:13 +0000 (15:46 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 15 Apr 2003 15:46:13 +0000 (15:46 +0000)
* g10.c, options.h: New option --enable-progress-filter.
* progress.c (handle_progress): Make use of it.

13 files changed:
g10/ChangeLog
g10/Makefile.am
g10/decrypt.c
g10/encode.c
g10/filter.h
g10/g10.c
g10/main.h
g10/openfile.c
g10/options.h
g10/plaintext.c
g10/progress.c [new file with mode: 0644]
g10/sign.c
g10/verify.c

index eb358b1..548b499 100644 (file)
@@ -1,3 +1,31 @@
+2003-04-15  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (AM_CFLAGS): Make use of AM_CFLAGS and AM_LDFLAGS.
+
+       * g10.c, options.h: New option --enable-progress-filter.
+       * progress.c (handle_progress): Make use of it.
+
+2003-04-15  Marcus Brinkmann  <marcus@g10code.de>
+
+       * progress.c: New file.
+       * Makefile.am (common_source): Add progress.c.
+       * filter.h (progress_filter_context_t): New type.
+       (progress_filter, handle_progress): New prototypes.
+       * main.h (open_sigfile): New argument for prototype.
+       * openfile.c (open_sigfile): New argument to install progress
+       filter.
+       * encode.c (encode_simple): New variable PFX.  Register
+       progress filter.  Install text_filter after that.
+       (encode_crypt): Likewise.
+       * sign.c (sign_file): Likewise.
+       (clearsign_file): Likewise.
+       * decrypt.c (decrypt_message): Likewise.
+       (decrypt_messages): Likewise.
+       * verify.c (verify_signatures): Likewise.
+       (verify_one_file): Likewise.
+       * plaintext.c (hash_datafiles): Likewise.
+       (ask_for_detached_datafile): Likewise.
+
 2003-04-10  Werner Koch  <wk@gnupg.org>
 
        * passphrase.c (read_passphrase_from_fd): Do a dummy read if the
index a70a837..c12ff46 100644 (file)
@@ -1,4 +1,5 @@
-# Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1998, 1999, 2000, 2001, 2002,
+#               2003  Free Software Foundation, Inc.
 #
 # This file is part of GnuPG.
 #
@@ -22,9 +23,10 @@ INCLUDES = -I.. -I$(top_srcdir)/include -I$(top_srcdir)/intl
 EXTRA_DIST = options.skel
 # it seems that we can't use this with automake 1.5
 #OMIT_DEPENDENCIES = zlib.h zconf.h
-LDFLAGS = @LDFLAGS@
 libexecdir = @libexecdir@/@PACKAGE@
-CFLAGS = @CFLAGS@ -DGNUPG_LIBEXECDIR="\"$(libexecdir)\""
+if ! HAVE_DOSISH_SYSTEM
+AM_CFLAGS = -DGNUPG_LIBEXECDIR="\"$(libexecdir)\""
+endif
 needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a @CAPLIBS@
 
 #noinst_PROGRAMS = gpgd
@@ -46,6 +48,7 @@ common_source =  \
              armor.c           \
              mdfilter.c        \
              textfilter.c      \
+             progress.c        \
              misc.c            \
              options.h         \
              openfile.c        \
index bea16b7..df778d1 100644 (file)
@@ -51,6 +51,7 @@ decrypt_message( const char *filename )
 {
     IOBUF fp;
     armor_filter_context_t afx;
+    progress_filter_context_t pfx;
     int rc;
     int no_out=0;
 
@@ -61,6 +62,8 @@ decrypt_message( const char *filename )
        return G10ERR_OPEN_FILE;
     }
 
+    handle_progress (&pfx, fp, filename);
+
     if( !opt.no_armor ) {
        if( use_armor_filter( fp ) ) {
            memset( &afx, 0, sizeof afx);
@@ -84,6 +87,7 @@ decrypt_messages(int nfiles, char **files)
 {
   IOBUF fp;
   armor_filter_context_t afx;  
+  progress_filter_context_t pfx;
   char *p, *output = NULL;
   int rc = 0;
   
@@ -106,6 +110,9 @@ decrypt_messages(int nfiles, char **files)
           log_error(_("can't open `%s'\n"), print_fname_stdin(*files));
           goto next_file;
         }
+
+      handle_progress (&pfx, fp, *files);
+
       if (!opt.no_armor)
         {
           if (use_armor_filter(fp))
index d1b0cdb..a7396c9 100644 (file)
@@ -164,6 +164,7 @@ encode_simple( const char *filename, int mode, int compat )
     armor_filter_context_t afx;
     compress_filter_context_t zfx;
     text_filter_context_t tfx;
+    progress_filter_context_t pfx;
     int do_compress = opt.compress && !opt.rfc1991;
 
     memset( &cfx, 0, sizeof cfx);
@@ -179,6 +180,8 @@ encode_simple( const char *filename, int mode, int compat )
        return G10ERR_OPEN_FILE;
     }
 
+    handle_progress (&pfx, inp, filename);
+
     if( opt.textmode )
        iobuf_push_filter( inp, text_filter, &tfx );
 
@@ -386,6 +389,7 @@ encode_crypt( const char *filename, STRLIST remusr )
     armor_filter_context_t afx;
     compress_filter_context_t zfx;
     text_filter_context_t tfx;
+    progress_filter_context_t pfx;
     PK_LIST pk_list,work_list;
     int do_compress = opt.compress && !opt.rfc1991;
 
@@ -422,6 +426,8 @@ encode_crypt( const char *filename, STRLIST remusr )
     else if( opt.verbose )
        log_info(_("reading from `%s'\n"), filename? filename: "[stdin]");
 
+    handle_progress (&pfx, inp, filename);
+
     if( opt.textmode )
        iobuf_push_filter( inp, text_filter, &tfx );
 
index c933d23..ec1c5f7 100644 (file)
@@ -109,6 +109,14 @@ typedef struct {
 } text_filter_context_t;
 
 
+typedef struct {
+    char *what;                        /* description */
+    u32 last_time;             /* last time reported */
+    unsigned long last;                /* last amount reported */
+    unsigned long offset;      /* current amount */
+    unsigned long total;       /* total amount */
+} progress_filter_context_t;
+
 /* encrypt_filter_context_t defined in main.h */
 
 /*-- mdfilter.c --*/
@@ -137,6 +145,10 @@ int text_filter( void *opaque, int control,
 int copy_clearsig_text( IOBUF out, IOBUF inp, MD_HANDLE md,
                          int escape_dash, int escape_from, int pgp2mode );
 
-
+/*-- progress.c --*/
+int progress_filter (void *opaque, int control,
+                    IOBUF a, byte *buf, size_t *ret_len);
+void handle_progress (progress_filter_context_t *pfx,
+                     IOBUF inp, char *name);
 
 #endif /*G10_FILTER_H*/
index 956a7dd..9b609c0 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -1,5 +1,5 @@
 /* g10.c - The GnuPG utility (main for gpg)
- * Copyright (C) 1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -313,6 +313,7 @@ enum cmd_and_opt_values { aNull = 0,
     oNoStrict,
     oMangleDosFilenames,
     oNoMangleDosFilenames,
+    oEnableProgressFilter,                          
 aTest };
 
 
@@ -616,6 +617,7 @@ static ARGPARSE_OPTS opts[] = {
     { oNoStrict,   "no-strict",   0, "@" },
     { oMangleDosFilenames, "mangle-dos-filenames", 0, "@" },
     { oNoMangleDosFilenames, "no-mangle-dos-filenames", 0, "@" },
+    { oEnableProgressFilter, "enable-progress-filter", 0, "@" },
 {0} };
 
 
@@ -1818,6 +1820,8 @@ main( int argc, char **argv )
           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
 
+          case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
+
          default : pargs.err = configfp? 1:2; break;
        }
     }
index 9706ffc..84a2705 100644 (file)
@@ -146,7 +146,7 @@ int overwrite_filep( const char *fname );
 char *make_outfile_name( const char *iname );
 char *ask_outfile_name( const char *name, size_t namelen );
 int   open_outfile( const char *iname, int mode, IOBUF *a );
-IOBUF open_sigfile( const char *iname );
+IOBUF open_sigfile( const char *iname, progress_filter_context_t *pfx );
 void try_make_homedir( const char *fname );
 
 /*-- seskey.c --*/
index 34be71d..81e5d2d 100644 (file)
@@ -264,7 +264,7 @@ open_outfile( const char *iname, int mode, IOBUF *a )
  * Return NULL if such a file is not available.
  */
 IOBUF
-open_sigfile( const char *iname )
+open_sigfile( const char *iname, progress_filter_context_t *pfx )
 {
     IOBUF a = NULL;
     size_t len;
@@ -280,7 +280,10 @@ open_sigfile( const char *iname )
            a = iobuf_open( buf );
            if( a && opt.verbose )
                log_info(_("assuming signed data in `%s'\n"), buf );
-           m_free(buf);
+           if (a && pfx)
+             handle_progress (pfx, a, buf);
+           else
+             m_free(buf);
        }
     }
     return a;
index 12a1e2f..a2868e4 100644 (file)
@@ -1,5 +1,6 @@
 /* options.h
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2003 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -181,6 +182,7 @@ struct {
     struct groupitem *grouplist;
     int strict;
     int mangle_dos_filenames; 
+    int enable_progress_filter;
 } opt;
 
 
index a248598..8932267 100644 (file)
@@ -357,11 +357,16 @@ int
 ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2,
                           const char *inname, int textmode )
 {
+    progress_filter_context_t pfx;
+    int dealloc_pfx_name = 1;
     char *answer = NULL;
     IOBUF fp;
     int rc = 0;
 
-    fp = open_sigfile( inname ); /* open default file */
+    fp = open_sigfile( inname, &pfx ); /* open default file */
+    if (!fp)
+      dealloc_pfx_name = 0;
+
     if( !fp && !opt.batch ) {
        int any=0;
        tty_printf(_("Detached signature.\n"));
@@ -395,7 +400,8 @@ ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2,
     }
     do_hash( md, md2, fp, textmode );
     iobuf_close(fp);
-
+    if (dealloc_pfx_name)
+      m_free (pfx.what);
 
   leave:
     m_free(answer);
@@ -412,15 +418,17 @@ int
 hash_datafiles( MD_HANDLE md, MD_HANDLE md2, STRLIST files,
                const char *sigfilename, int textmode )
 {
+    progress_filter_context_t pfx;
     IOBUF fp;
     STRLIST sl;
 
     if( !files ) {
        /* check whether we can open the signed material */
-       fp = open_sigfile( sigfilename );
+       fp = open_sigfile( sigfilename, &pfx );
        if( fp ) {
            do_hash( md, md2, fp, textmode );
            iobuf_close(fp);
+           m_free (pfx.what);
            return 0;
        }
         log_error (_("no signed data\n"));
@@ -435,6 +443,7 @@ hash_datafiles( MD_HANDLE md, MD_HANDLE md2, STRLIST files,
                                                print_fname_stdin(sl->d));
            return G10ERR_OPEN_FILE;
        }
+        handle_progress (&pfx, fp, sl->d);
        do_hash( md, md2, fp, textmode );
        iobuf_close(fp);
     }
diff --git a/g10/progress.c b/g10/progress.c
new file mode 100644 (file)
index 0000000..7313e29
--- /dev/null
@@ -0,0 +1,104 @@
+/* progress.c
+ * Copyright (C) 2003 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <config.h>
+#include <stdio.h>
+
+#include "iobuf.h"
+#include "filter.h"
+#include "status.h"
+#include "options.h"
+
+/****************
+ * The filter is used to report progress to the user.
+ */
+int
+progress_filter (void *opaque, int control,
+                IOBUF a, byte *buf, size_t *ret_len)
+{
+  int rc = 0;
+  progress_filter_context_t *pfx = opaque;
+
+  if (control == IOBUFCTRL_INIT)
+    {
+      char buffer[50];
+
+      pfx->last = 0;
+      pfx->offset = 0;
+      pfx->last_time = make_timestamp ();
+
+      sprintf (buffer, "%.20s ? %lu %lu", pfx->what, pfx->offset,
+              pfx->total);
+      write_status_text (STATUS_PROGRESS, buffer);
+    }
+  else if (control == IOBUFCTRL_UNDERFLOW)
+    {
+      u32 timestamp = make_timestamp ();
+      int len = iobuf_read (a, buf, *ret_len);
+
+      if (len >= 0)
+       {
+         pfx->offset += len;
+         *ret_len = len;
+       }
+      else
+       {
+         *ret_len = 0;
+         rc = -1;
+       }
+      if ((len == -1 && pfx->offset != pfx->last)
+         || timestamp - pfx->last_time > 0)
+       {
+         char buffer[50];
+         
+         sprintf (buffer, "%.20s ? %lu %lu", pfx->what, pfx->offset,
+                  pfx->total);
+         write_status_text (STATUS_PROGRESS, buffer);
+
+         pfx->last = pfx->offset;
+         pfx->last_time = timestamp;
+       }
+    }
+  else if (control == IOBUFCTRL_DESC)
+    *(char**)buf = "progress_filter";
+  return rc;
+}
+
+void
+handle_progress (progress_filter_context_t *pfx, IOBUF inp, char *name)
+{
+  off_t filesize = 0;
+
+  if (!opt.enable_progress_filter)
+    return;
+
+  if (!is_status_enabled ())
+    return;
+
+  if (name)
+    filesize = iobuf_get_filelength (inp);
+  else if (opt.set_filesize)
+    filesize = opt.set_filesize;
+
+  /* register the progress filter */
+  pfx->what = name ? name : "stdin";
+  pfx->total = filesize;
+  iobuf_push_filter (inp, progress_filter, pfx);
+}
index 9dad9b3..4463f66 100644 (file)
@@ -631,6 +631,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
     compress_filter_context_t zfx;
     md_filter_context_t mfx;
     text_filter_context_t tfx;
+    progress_filter_context_t pfx;
     encrypt_filter_context_t efx;
     IOBUF inp = NULL, out = NULL;
     PACKET pkt;
@@ -677,11 +678,15 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
     /* prepare iobufs */
     if( multifile )  /* have list of filenames */
        inp = NULL; /* we do it later */
-    else if( !(inp = iobuf_open(fname)) ) {
-       log_error("can't open %s: %s\n", fname? fname: "[stdin]",
-                                       strerror(errno) );
-       rc = G10ERR_OPEN_FILE;
-       goto leave;
+    else {
+        if( !(inp = iobuf_open(fname)) ) {
+           log_error("can't open %s: %s\n", fname? fname: "[stdin]",
+                     strerror(errno) );
+           rc = G10ERR_OPEN_FILE;
+           goto leave;
+       }
+
+        handle_progress (&pfx, inp, fname);
     }
 
     if( outfile ) {
@@ -819,6 +824,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
                    rc = G10ERR_OPEN_FILE;
                    goto leave;
                }
+                handle_progress (&pfx, inp, sl->d);
                if( opt.verbose )
                    fprintf(stderr, " `%s'", sl->d );
                if(opt.textmode)
@@ -882,6 +888,7 @@ int
 clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
 {
     armor_filter_context_t afx;
+    progress_filter_context_t pfx;
     MD_HANDLE textmd = NULL;
     IOBUF inp = NULL, out = NULL;
     PACKET pkt;
@@ -919,6 +926,7 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
        rc = G10ERR_OPEN_FILE;
        goto leave;
     }
+    handle_progress (&pfx, inp, fname);
 
     if( outfile ) {
        if( !(out = iobuf_create( outfile )) ) {
@@ -1014,6 +1022,7 @@ int
 sign_symencrypt_file (const char *fname, STRLIST locusr)
 {
     armor_filter_context_t afx;
+    progress_filter_context_t pfx;
     compress_filter_context_t zfx;
     md_filter_context_t mfx;
     text_filter_context_t tfx;
@@ -1049,6 +1058,7 @@ sign_symencrypt_file (const char *fname, STRLIST locusr)
        rc = G10ERR_OPEN_FILE;
        goto leave;
     }
+    handle_progress (&pfx, inp, fname);
 
     /* prepare key */
     s2k = m_alloc_clear( sizeof *s2k );
index 7ab20c1..705a457 100644 (file)
@@ -56,6 +56,7 @@ verify_signatures( int nfiles, char **files )
 {
     IOBUF fp;
     armor_filter_context_t afx;
+    progress_filter_context_t pfx;
     const char *sigfile;
     int i, rc;
     STRLIST sl;
@@ -94,6 +95,7 @@ verify_signatures( int nfiles, char **files )
        log_error(_("can't open `%s'\n"), print_fname_stdin(sigfile));
        return G10ERR_OPEN_FILE;
     }
+    handle_progress (&pfx, fp, sigfile);
 
     if( !opt.no_armor && use_armor_filter( fp ) )
        iobuf_push_filter( fp, armor_filter, &afx );
@@ -130,6 +132,7 @@ verify_one_file( const char *name )
 {
     IOBUF fp;
     armor_filter_context_t afx;
+    progress_filter_context_t pfx;
     int rc;
 
     print_file_status( STATUS_FILE_START, name, 1 );
@@ -139,6 +142,7 @@ verify_one_file( const char *name )
        log_error(_("can't open `%s'\n"), print_fname_stdin(name));
        return G10ERR_OPEN_FILE;
     }
+    handle_progress (&pfx, fp, name);
 
     if( !opt.no_armor ) {
        if( use_armor_filter( fp ) ) {