[repost] Patch to make cpdup's stdout unbuffered

Chris Pressey cpressey at catseye.mine.nu
Tue Jun 8 14:03:30 PDT 2004


[reposting this, as I sent it 2.5 hours ago but nothing's come through,
whereas my post to bugs@ came back to me in minutes - apologies for any
duplicates]

Hey again,

The attached patch adds a new option to cpdup, -u, which causes cpdup's
logging output to be unbuffered.

Since this could rightly be perceived as a bit of feature creep, I'll
try to explain why it's useful in the installer:

The installer popen()'s "cpdup -vvv src dest" and it reads from this
pipe to monitor cpdup's progress.  Unfortunately, since cpdup's output
is fully buffered, cpdup's progress can't be usefully measured this way.
This patch simply gives us a way to make cpdup's output unbuffered, so
we can get it through the pipe as cpdup generates it.

If there are no objections, I'll commit this in two days.

-Chris

Index: bin/cpdup/cpdup.1
===================================================================
RCS file: /home/dcvs/src/bin/cpdup/cpdup.1,v
retrieving revision 1.3
diff -u -r1.3 cpdup.1
--- bin/cpdup/cpdup.1	19 Mar 2004 07:46:46 -0000	1.3
+++ bin/cpdup/cpdup.1	8 Jun 2004 18:29:43 -0000
@@ -13,6 +13,7 @@
 .Sh SYNOPSIS
 .Nm cpdup
 .Op Fl v[vv..]
+.Op Fl u
 .Op Fl I
 .Op Fl f
 .Op Fl s0
@@ -62,6 +63,11 @@
 .Fl vvv
 will cause all files and directories to be reported whether or not
 modifications are made.
+.It Fl u
+Causes the ouptut generated by
+.Fl v[vv]
+to be unbuffered.
+This can be useful for obtaining prompt progress updates through a pipe.
 .It Fl I
 will cause cpdup to print a summary at the end with performance counter.
 .It Fl f
Index: bin/cpdup/cpdup.c
===================================================================
RCS file: /home/dcvs/src/bin/cpdup/cpdup.c,v
retrieving revision 1.3
diff -u -r1.3 cpdup.c
--- bin/cpdup/cpdup.c	19 Mar 2004 17:30:59 -0000	1.3
+++ bin/cpdup/cpdup.c	8 Jun 2004 18:23:19 -0000
@@ -204,6 +204,9 @@
 	    UseMD5Opt = v;
 	    MD5CacheFile = ".MD5.CHECKSUMS";
 	    break;
+	case 'u':
+	    setvbuf(stdout, NULL, _IONBF, 0);
+	    break;
 	default:
 	    fatal("illegal option: %s\n", ptr - 2);
 	    /* not reached */
Index: bin/cpdup/misc.c
===================================================================
RCS file: /home/dcvs/src/bin/cpdup/misc.c,v
retrieving revision 1.3
diff -u -r1.3 misc.c
--- bin/cpdup/misc.c	19 Mar 2004 17:30:59 -0000	1.3
+++ bin/cpdup/misc.c	8 Jun 2004 18:25:05 -0000
@@ -48,6 +48,7 @@
     if (ctl == NULL) {
 	puts("cpdup [<options>] src [dest]");
 	puts("    -v[vv]      verbose level (-vv is typical)\n"
+	     "    -u          use unbuffered output for -v[vv]\n"
 	     "    -I          display performance summary\n"
 	     "    -f          force update even if files look the same\n"
 	     "    -i0         do NOT confirm when removing something\n"




More information about the Submit mailing list