char *pack_tmp_name = NULL;
 
                if (pack_to_stdout) {
-                       f = sha1fd(1, "<stdout>");
+                       f = sha1fd_throughput(1, "<stdout>", progress_state);
                } else {
                        char tmpname[PATH_MAX];
                        int fd;
 
  * able to verify hasn't been messed with afterwards.
  */
 #include "cache.h"
+#include "progress.h"
 #include "csum-file.h"
 
 static void sha1flush(struct sha1file *f, unsigned int count)
        for (;;) {
                int ret = xwrite(f->fd, buf, count);
                if (ret > 0) {
+                       display_throughput(f->tp, ret);
                        buf = (char *) buf + ret;
                        count -= ret;
                        if (count)
 }
 
 struct sha1file *sha1fd(int fd, const char *name)
+{
+       return sha1fd_throughput(fd, name, NULL);
+}
+
+struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp)
 {
        struct sha1file *f;
        unsigned len;
        f->fd = fd;
        f->error = 0;
        f->offset = 0;
+       f->tp = tp;
        f->do_crc = 0;
        SHA1_Init(&f->ctx);
        return f;
 
 #ifndef CSUM_FILE_H
 #define CSUM_FILE_H
 
+struct progress;
+
 /* A SHA1-protected file */
 struct sha1file {
        int fd, error;
        unsigned int offset, namelen;
        SHA_CTX ctx;
+       struct progress *tp;
        char name[PATH_MAX];
        int do_crc;
        uint32_t crc32;
 };
 
 extern struct sha1file *sha1fd(int fd, const char *name);
+extern struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp);
 extern int sha1close(struct sha1file *, unsigned char *, int);
 extern int sha1write(struct sha1file *, void *, unsigned int);
 extern void crc32_begin(struct sha1file *);