#include #include #include #include #include #include extern const char *__progname; extern void doit(unsigned int *); static unsigned int block[34]; #define BLOBSIZE ((32*4)+1) static volatile sig_atomic_t ticked; static unsigned long long int count; static unsigned long long int pcount; static void handle_alrm(int sig __attribute__((__unused__))) { ticked = 1; } static void check_ticks(void) { if (ticked && (count != pcount)) { ticked = 0; pcount = count; fprintf(stderr,"\r%llu",count); fflush(0); } } static void setup_ticks(void) { struct itimerval itv; struct sigaction sa; itv.it_value.tv_sec = 1; itv.it_value.tv_usec = 0; itv.it_interval = itv.it_value; sa.sa_handler = &handle_alrm; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sigaction(SIGALRM,&sa,0); setitimer(ITIMER_REAL,&itv,0); } int main(void); int main(void) { int n; int o; setup_ticks(); fprintf(stderr,"reald startup\n"); pcount = 0; count = 0; while (1) { o = 0; while (o < 4+BLOBSIZE) { n = read(0,&((char *)&block[0])[o],4+BLOBSIZE-o); if (n < 0) { if (errno == EINTR) { check_ticks(); continue; } fprintf(stderr,"\n%s: read: %s\n",__progname,strerror(errno)); exit(1); } if (n == 0) { if (o == 0) { fprintf(stderr,"\nreald normal exit, count %llu\n",count); exit(0); } fprintf(stderr,"\n%s: read unexpected EOF\n",__progname); exit(1); } o += n; } block[33] = ((unsigned char *)&block[0])[132] & 15; doit(&block[0]); ((unsigned char *)&block[0])[132] = block[33] & 15; write(1,&block[1],BLOBSIZE); count ++; check_ticks(); } }