1 #define _LARGEFILE64_SOURCE 1
13 #define DEF_BLOCK 1024
16 # define LLONG_MAX 9223372036854775807LL
21 static void msg(const char *fmt,...)
25 char *ts=ctime(&tm),*s;
27 if ((s=strchr(ts,'\n'))) *s='\0';
28 fprintf(stderr,"%s: %s - ",pname,ts);
30 vfprintf(stderr,fmt,ap);
35 int main(int argc,char **argv)
37 int block=DEF_BLOCK,r,fd;
39 long long offs=0,offs2=0,totsize=-1,forcedsize=0;
43 if ((fd=open(argv[1],O_RDONLY
48 msg("open(\"%s\") error: %m",argv[1]);
53 if (block<1||block>=INT_MAX) {
55 msg("Forced block size %d",block);
59 forcedsize=atoll(argv[3]);
60 if (forcedsize<1||forcedsize>=LLONG_MAX) {
62 msg("Total size NOT forced");
67 if (!(buf=malloc(block))) {
68 msg("Error allocating buffer, size=%d",block);
71 if (!(totsize=forcedsize)) {
72 if ((totsize=lseek64(fd,0,SEEK_END))>0) {
73 if ((offs2=lseek64(fd,0,SEEK_SET)))
74 msg("Error back-lseek64(0,SEEK_SET)=%Ld: %m",offs2);
78 msg("Starting, size=%Ld...",totsize);
80 msg("Starting, size unknown...",totsize);
82 while (errno=0,(r=read(fd,buf,block))) {
84 msg("read %Ld:%Ld(%u): %m",offs,offs+block,block);
85 if (fd==STDIN_FILENO) {
86 msg("Error skipping from stdin not supported!");
90 if ((offs2=lseek64(STDIN_FILENO,offs,SEEK_SET))!=offs) { /* FIXME */
91 msg("Error recovery lseek64(%Ld,SEEK_SET)=%Ld: %m",offs,offs2);
98 if (totsize>0) printf("/%Ld",totsize);
102 msg("Finished, total read %Ld.",offs);
103 return(EXIT_SUCCESS);