22,23d21
< 
< 
29,30c27,28
<     #define _REENTRANT
<     #include <thread.h>
---
> #  define _REENTRANT
> #  include <thread.h>
34,35c32,33
< /* #define _POSIX_C_SOURCE 199506L */
<     #include <pthread.h>
---
> /* #  define _POSIX_C_SOURCE 199506L */
> #  include <pthread.h>
39d36
< 
41d37
< #include <string.h>
46d41
< #include <sys/stat.h>
53,58c48,51
< 
< char *srcdev  = NULL;
< char *dstdev  = NULL;
< int freq      = 5;
< time_t last   = 0;
< 
---
> char *srcdev=NULL;
> char *dstdev=NULL;
> int freq = 5;
> time_t last = 0;
62c55
< #ifdef  HAVE_LIBTHREAD
---
> #ifdef HAVE_LIBTHREAD
65,73c58,66
< #define pthread_t                       thread_t
< #define pthread_mutex_t                 mutex_t
< #define pthread_cond_t                  cond_t
< 
< #define pthread_create(tp,at,st,arg)    thr_create(NULL,0,st,arg,0,tp)
< #define pthread_join(tid,sp)            thr_join(tid,NULL,sp)
< 
< #define pthread_mutex_init(mtx,ma)      mutex_init(mtx, USYNC_THREAD, NULL)
< #define pthread_cond_init(cv,ca)        cond_init(cv, USYNC_THREAD, NULL)
---
> #define pthread_t	thread_t
> #define pthread_mutex_t	mutex_t
> #define pthread_cond_t	cond_t
> 
> #define pthread_create(tp,at,st,arg) 	thr_create(NULL,0,st,arg,0,tp)
> #define pthread_join(tid,sp) 		thr_join(tid,NULL,sp)
> 				       
> #define pthread_mutex_init(mtx,ma)	mutex_init(mtx, USYNC_THREAD, NULL)
> #define pthread_cond_init(cv,ca)	cond_init(cv, USYNC_THREAD, NULL)
75,76c68,69
< #define pthread_mutex_lock(mtx)         mutex_lock(mtx)
< #define pthread_mutex_unlock(mtx)       mutex_unlock(mtx)
---
> #define pthread_mutex_lock(mtx)		mutex_lock(mtx)
> #define pthread_mutex_unlock(mtx)	mutex_unlock(mtx)
78,79c71,72
< #define pthread_cond_wait(cv,mtx)       cond_wait(cv,mtx)
< #define pthread_cond_signal(cv)         cond_signal(cv)
---
> #define pthread_cond_wait(cv,mtx)	cond_wait(cv,mtx)
> #define pthread_cond_signal(cv)		cond_signal(cv)
89,90c82,83
<     #define lseek64 lseek
<     #define off64_t unsigned long
---
> #  define lseek64 lseek
> #  define off64_t unsigned long
92,96c85,89
<     #ifndef HAVE_LSEEK64
<         #ifdef HAVE_LLSEEK
<             #define lseek64 llseek
<             #define off64_t offset_t
<         #else
---
> #  ifndef HAVE_LSEEK64
> #    ifdef HAVE_LLSEEK
> #      define lseek64 llseek
> #      define off64_t offset_t
> #    else
98,101c91,94
<             #define lseek64 lseek
<             #define off64_t unsigned long
<         #endif
<     #endif
---
> #      define lseek64 lseek
> #      define off64_t unsigned long
> #    endif
> #  endif
105d97
< 
107,108c99,100
< int queue_size  = 8;
< int dot_mode    = 0;
---
> int queue_size = 8;
> int dot_mode = 0;
110,111c102
< int silent      = 0;
< 
---
> int silent = 0;
123d113
< 
129c119
< 
---
>     
139d128
< 
145,146d133
< struct stat read_sb;
< 
151d137
< 
159a146
>     
164,172c151,155
<         if (read_pos != pos)
<         {
<             if (lseek64(read_fd, read_pos = pos, SEEK_SET) < 0)
<             {
<                 return -1;
<             }
<         }
< 
<         res = read(read_fd, buf, len);
---
> 	if (read_pos != pos)
> 	    if (lseek64(read_fd, read_pos = pos, SEEK_SET) < 0)
> 		return -1;
> 	
> 	res = read(read_fd, buf, len);
176,179c159,160
<     {
<         read_pos += res;
<     }
< 
---
> 	read_pos += res;
>     
183,184d163
< 
< 
188a168
> 
191,192c171,172
<         res = len;
<         write_pos = pos + len;
---
> 	res = len;
> 	write_pos = pos + len;
196,208c176,182
<         if (write_pos != pos)
<         {
<             if (lseek64(write_fd, write_pos = pos, SEEK_SET) < 0)
<             {
<                 return -1;
<             }
<         }
< 
<         res = write(write_fd, buf, len);
<         if (res > 0)
<         {
<             write_pos += res;
<         }
---
> 	if (write_pos =! pos)
> 	    if (lseek64(write_fd, write_pos = pos, SEEK_SET) < 0)
> 		return -1;
> 	
> 	res = write(write_fd, buf, len);
> 	if (res > 0)
> 	    write_pos += res;
210c184
< 
---
>     
215d188
< 
226,229c199,202
<     qp->bsize     = size;
<     qp->occupied  = 0;
<     qp->nextin    = 0;
<     qp->nextout   = 0;
---
>     qp->bsize = size;
>     qp->occupied = 0;
>     qp->nextin = 0;
>     qp->nextout = 0;
236d208
< 
242c214
<     pthread_cond_wait(&qp->less, &qp->mutex);
---
> 	pthread_cond_wait(&qp->less, &qp->mutex);
255d226
< 
259a231
> 
262c234
<     pthread_cond_wait(&qp->more, &qp->mutex);
---
> 	pthread_cond_wait(&qp->more, &qp->mutex);
265c237
< 
---
>   
277d248
< 
282,286c253,258
<     bp        = (buffer_t *) malloc(sizeof(*bp));
<     bp->pos   = 0;
<     bp->len   = 0;
<     bp->size  = size;
<     bp->buf   = malloc(size);
---
> 
>     bp = (buffer_t *) malloc(sizeof(*bp));
>     bp->pos = 0;
>     bp->len = 0;
>     bp->size = size;
>     bp->buf = malloc(size);
291,293c263,264
< 
< 
< void spin(time_t now)
---
> void
> spin(time_t now)
297a269
>     
300,302c272
<     {
<         return;
<     }
---
> 	return;
310a281
>     
312,313c283
< 
< void *writer()
---
> void *writer(void *foo)
316c286
<     long long written      = 0;
---
>     long long written = 0;
320c290,291
<     while ((bp = q_pop(write_q)))
---
>     
>     while (bp = q_pop(write_q))
322,330c293,299
<         if (x_pwrite64(bp->pos, bp->buf, bp->len) != bp->len)
<         {
<             if (!silent)
<             {
<                 putc('\n', stderr);
<             }
< 
<             fprintf(stderr,
<                 "pcopy: %s: Error: Write of %d bytes failed at "
---
> 	if (x_pwrite64(bp->pos, bp->buf, bp->len) != bp->len)
> 	{
> 	    if (!silent)
> 		putc('\n', stderr);
> 	    
> 	    fprintf(stderr,
> 		    "pcopy: %s: Error: Write of %d bytes failed at "
332c301
<                 "%ld"
---
> 		    "%ld"
334c303
<                 "%lld"
---
> 		    "%lld"
336,371c305,337
<                 ": %s\n",
<                 dstdev, bp->len, bp->pos,
<                 strerror(errno));
<             exit(1);
<         }
< 
<         written += bp->len;
< 
<         bp->pos = 0;
<         bp->len = 0;
<         q_push(free_q, bp);
< 
<         if (!silent)
<         {
<             if (dot_mode)
<             {
<                 putchar('.');
<                 fflush(stdout);
<             }
<             else
<             {
<                 time_t now;
<                 long long mbs;
< 
<                 time(&now);
<                 len = now - start;
<                 if (len <= 0)
<                 {
<                     len = 1;
<                 }
< 
<                 if (now > last+freq)
<                 {
<                     mbs = (written-last_written)/freq/1024/1024;
< 
<                     last_written = written;
---
> 		    ": %s\n",
> 		    dstdev, bp->len, bp->pos,
> 		    strerror(errno));
> 	    exit(1);
> 	}
> 
> 	written += bp->len;
> 	
> 	bp->pos = 0;
> 	bp->len = 0;
> 	q_push(free_q, bp);
> 
> 	if (!silent)
> 	{
> 	    if (dot_mode)
> 	    {
> 		putchar('.');
> 		fflush(stdout);
> 	    }
> 	    else
> 	    {
> 		time_t now;
> 		long long mbs;
> 		
> 		
> 		time(&now);
> 		len = now - start;
> 		if (len <= 0)
> 		    len = 1;
> 		
> 		if (now > last+freq)
> 		{
> 		    mbs = (written-last_written)/freq/1024/1024;
372a339,340
> 		    last_written = written;
> 			
374,376c342,344
<                     printf("\rCopied: %ld MB (%ld MB/sec) ",
<                         written/1024/1024,
<                         mbs);
---
> 		    printf("\rCopied: %ld MB (%ld MB/sec)     ",
> 			   written/1024/1024,
> 			   mbs);
378,388c346,356
<                     printf("\rCopied: %lld MB (%lld MB/sec) ",
<                         written/1024/1024,
<                         mbs);
< #endif
<                     fflush(stdout);
<                     last = now;
<                 }
< 
<                 spin(now);
<             }
<         }
---
> 		    printf("\rCopied: %lld MB (%lld MB/sec)     ",
> 			   written/1024/1024,
> 			   mbs);
> #endif
> 		    fflush(stdout);
> 		    last = now;
> 		}
> 
> 		spin(now);
> 	    }
> 	}
395d362
< 
398,405c365,371
<     fprintf(stderr,
<         "Usage: pcopy [options] <source> <destination>\n"
<         "Options:\n"
<         "-s\tSilent mode\n"
<         "-q<num>\tQueue size\n"
<         "-u<num>\tUpdate frequency (in seconds)\n"
<         "-b<num>\tBuffer size (in KBytes)\n"
<         "-d\tShow progress as a series of dots\n");
---
>     fprintf(stderr, "Usage: pcopy [options] <source> <destination>\n");
>     fprintf(stderr, "Options:\n");
>     fprintf(stderr, "-s\tSilent mode\n");
>     fprintf(stderr, "-q<num>\tQueue size\n");
>     fprintf(stderr, "-u<num>\tUpdate frequency (in seconds)\n");
>     fprintf(stderr, "-b<num>\tBuffer size (in KBytes)\n");
>     fprintf(stderr, "-d\tShow progress as a series of dots\n");
409d374
< 
420c385,386
< 
---
>     
>     
422,454c388,419
<     switch (argv[i][1])
<     {
<         case 's':
<             silent = 1;
<             break;
< 
<         case 'n':
<             no_write = 1;
<             break;
< 
<         case 'd':
<             dot_mode = 1;
<             break;
< 
<         case 'q':
<             queue_size = atoi(argv[i]+2);
<             break;
< 
<         case 'u':
<             freq = atoi(argv[i]+2);
<             break;
< 
<         case 'b':
<             buffer_size = atoi(argv[i]+2)*1024;
<             break;
< 
<         case 'h':
< 
<         default:
<             usage();
<             exit(0);
<     }
< 
---
> 	switch (argv[i][1])
> 	{
> 	  case 's':
> 	    silent = 1;
> 	    break;
> 	    
> 	  case 'n':
> 	    no_write = 1;
> 	    break;
> 	    
> 	  case 'd':
> 	    dot_mode = 1;
> 	    break;
> 	    
> 	  case 'q':
> 	    queue_size = atoi(argv[i]+2);
> 	    break;
> 
> 	  case 'u':
> 	    freq = atoi(argv[i]+2);
> 	    break;
> 
> 	  case 'b':
> 	    buffer_size = atoi(argv[i]+2)*1024;
> 	    break;
> 
> 	  case 'h':
> 	  default:
> 	    usage();
> 	    exit(0);
> 	}
>     
457,458c422,423
<         usage();
<         exit(1);
---
> 	usage();
> 	exit(1);
463c428
< 
---
>     
466,477c431,442
<         printf("Copying from %s to %s (start in 3 seconds)", srcdev, dstdev);
<         fflush(stdout);
<         sleep(1);
<         putchar('.');
<         fflush(stdout);
<         sleep(1);
<         putchar('.');
<         fflush(stdout);
<         sleep(1);
<         putchar('.');
<         putchar('\n');
<         fflush(stdout);
---
> 	printf("Copying from %s to %s (start in 3 seconds)", srcdev, dstdev);
> 	fflush(stdout);
> 	sleep(1);
> 	putchar('.');
> 	fflush(stdout);
> 	sleep(1);
> 	putchar('.');
> 	fflush(stdout);
> 	sleep(1);
> 	putchar('.');
> 	putchar('\n');
> 	fflush(stdout);
483c448
< 
---
>     
487,489c452,454
<         fprintf(stderr, "pcopy: %s: Source device open failed: %s\n",
<             srcdev, strerror(errno));
<         exit(1);
---
> 	fprintf(stderr, "pcopy: %s: Source device open failed: %s\n",
> 		srcdev, strerror(errno));
> 	exit(1);
491,499c456,457
< 
<     if (fstat(read_fd, &read_sb) == -1)
<     {
<         fprintf(stderr, "pcopy: %s: Source device fstat failed: %s\n",
<             srcdev, strerror(errno));
<         exit(1);
<     }
< 
<     write_fd = creat(dstdev, read_sb.st_mode);
---
>   
>     write_fd = open(dstdev, O_WRONLY+O_SYNC);
502,507c460,466
<         fprintf(stderr, "pcopy: %s: Destination device open failed: %s\n",
<             dstdev, strerror(errno));
<         exit(1);
<     }
< 
<     free_q  = q_create(queue_size);
---
> 	fprintf(stderr, "pcopy: %s: Destination device open failed: %s\n",
> 		dstdev, strerror(errno));
> 	exit(1);
>     }
>     
>     
>     free_q = q_create(queue_size);
511,513c470
<     {
<         q_push(free_q, b_create(buffer_size));
<     }
---
> 	q_push(free_q, b_create(buffer_size));
516c473
<     pos   = 0;
---
>     pos = 0;
521,524c478,479
< 
< Loop:
< 
<     bp   = q_pop(free_q);
---
>   Loop:
>     bp = q_pop(free_q);
529,538c484,493
<         /* XXX: This code more or less assumes that buffer_size is
<            an even multiple of 2 */
< 
<         if (size > 512)
<         {
<             if (!silent)
<             putc('\n', stderr);
< 
<             fprintf(stderr,
<                 "pcopy: %s: Warning: Problems reading %d bytes at "
---
> 	/* XXX: This code more or less assumes that buffer_size is
> 	   an even multiple of 2 */
> 	
> 	if (size > 512)
> 	{
> 	    if (!silent)
> 		putc('\n', stderr);
> 	    
> 	    fprintf(stderr,
> 		    "pcopy: %s: Warning: Problems reading %d bytes at "
540c495
<                 "%ld"
---
> 		    "%ld"
542c497
<                 "%lld"
---
> 		    "%lld"
544,553c499,508
<                 ": %s\n",
<                 srcdev, size, pos, strerror(errno));
< 
<             size >>= 2; /* Try with a smaller size */
<         }
<         else
<         {
<             /* Give up, and return a zero-filled sector */
<             fprintf(stderr,
<                 "pcopy: %s: Error: Read of %d bytes at "
---
> 		    ": %s\n",
> 		    srcdev, size, pos, strerror(errno));
> 	    
> 	    size >>= 2; /* Try with a smaller size */
> 	}
> 	else
> 	{
> 	    /* Give up, and return a zero-filled sector */
> 	    fprintf(stderr,
> 		    "pcopy: %s: Error: Read of %d bytes at "
555c510
<                 "%ld"
---
> 		    "%ld"
557c512
<                 "%lld"
---
> 		    "%lld"
559,565c514,520
<                 " failed: %s\n",
<                 srcdev, size, pos, strerror(errno));
< 
<             len = size;
<             memset(bp->buf, 0, len);
<             break;
<         }
---
> 		    " failed: %s\n",
> 		    srcdev, size, pos, strerror(errno));
> 	    
> 	    len = size;
> 	    memset(bp->buf, 0, len);
> 	    break;
> 	}
569,572c524,525
<     {
<         goto End;
<     }
< 
---
> 	goto End;
>   
575,576c528,529
< 
<     pos   += len;
---
>   
>     pos += len;
579c532
< 
---
>     
581d533
< 
584,585c536
< End:
< 
---
>   End:
588c539
< 
---
>     
592,595c543,544
<     {
<         len = 1;
<     }
< 
---
> 	len = 1;
>     
599,602c548,549
<     {
<         putchar('\n');
<     }
< 
---
> 	putchar('\n');
>     
605c552
<        srcdev, mbytes, len, mbytes/len);
---
> 	   srcdev, mbytes, len, mbytes/len);
608c555
<        srcdev, mbytes, len, mbytes/len);
---
> 	   srcdev, mbytes, len, mbytes/len);
611d557
< 
