--- /dev/null
+#define _LARGEFILE64_SOURCE 1
+
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <unistd.h>
+#include <time.h>
+#include <string.h>
+#include <stdarg.h>
+
+#define DEF_BLOCK 1024
+
+#ifndef LLONG_MAX
+# define LLONG_MAX 9223372036854775807LL
+#endif
+
+char *pname;
+
+static void msg(const char *fmt,...)
+{
+va_list ap;
+time_t tm=time(NULL);
+char *ts=ctime(&tm),*s;
+
+ if ((s=strchr(ts,'\n'))) *s='\0';
+ fprintf(stderr,"%s: %s - ",pname,ts);
+ va_start(ap,fmt);
+ vfprintf(stderr,fmt,ap);
+ va_end(ap);
+ fputc('\n',stderr);
+}
+
+int main(int argc,char **argv)
+{
+int block=DEF_BLOCK,r,fd;
+char *buf;
+long long offs=0,offs2=0,totsize=-1,forcedsize=0;
+
+ pname=argv[0];
+ if (argc>1) {
+ if ((fd=open(argv[1],O_RDONLY
+#ifdef O_BINARY
+ |O_BINARY
+#endif
+ ))==-1) {
+ msg("open(\"%s\") error: %m",argv[1]);
+ return(EXIT_FAILURE);
+ }
+ if (argc>2) {
+ block=atoi(argv[2]);
+ if (block<1||block>=INT_MAX) {
+ block=DEF_BLOCK;
+ msg("Forced block size %d",block);
+ }
+ }
+ if (argc>3) {
+ forcedsize=atoll(argv[3]);
+ if (forcedsize<1||forcedsize>=LLONG_MAX) {
+ forcedsize=0;
+ msg("Total size NOT forced");
+ }
+ }
+ }
+ else fd=STDIN_FILENO;
+ if (!(buf=malloc(block))) {
+ msg("Error allocating buffer, size=%d",block);
+ return(EXIT_FAILURE);
+ }
+ if (!(totsize=forcedsize)) {
+ if ((totsize=lseek64(fd,0,SEEK_END))>0) {
+ if ((offs2=lseek64(fd,0,SEEK_SET)))
+ msg("Error back-lseek64(0,SEEK_SET)=%Ld: %m",offs2);
+ }
+ }
+ if (totsize)
+ msg("Starting, size=%Ld...",totsize);
+ else
+ msg("Starting, size unknown...",totsize);
+
+ while (errno=0,(r=read(fd,buf,block))) {
+ if (r<0) {
+ msg("read %Ld:%Ld(%u): %m",offs,offs+block,block);
+ if (fd==STDIN_FILENO) {
+ msg("Error skipping from stdin not supported!");
+ return(EXIT_FAILURE);
+ }
+ offs+=block;
+ if ((offs2=lseek64(STDIN_FILENO,offs,SEEK_SET))!=offs) { /* FIXME */
+ msg("Error recovery lseek64(%Ld,SEEK_SET)=%Ld: %m",offs,offs2);
+ return(EXIT_FAILURE);
+ }
+ continue;
+ }
+ offs+=r;
+ printf("%Ld",offs);
+ if (totsize>0) printf("/%Ld",totsize);
+ putchar('\r');
+ fflush(stdout);
+ }
+ msg("Finished, total read %Ld.",offs);
+ return(EXIT_SUCCESS);
+}