/* recdate.c by Michael Thorpe 2012-12-12 */ #include #include #include #include #include #include #include #define USAGE "usage: recdate [-m] []\n" #define MAX_FORMAT 32 /* Maximum chars to be printed in a custom format */ static int doit(int onlyminutes,char *format) { time_t old=0,new; struct timeval tv; struct tm *tm; char *s=0,*t; /* The s=0 is just to shut gcc up. */ size_t l; if(format) { s=(char *)malloc(MAX_FORMAT+1); if(!s) { perror("malloc"); return(-1); } } if(gettimeofday(&tv,0)) return(-1); while(1) { new=tv.tv_sec; if(old != new) { if(format) { tm=localtime(&new); l=strftime(s,MAX_FORMAT,format,tm)+1; } else { t=ctime(&new); l=strlen(t); if(t[l-1] != '\n') { fputs("Last character of ctime wasn't '\\n'!\n",stderr); return(-1); } #if ITS_NOT_OK_TO_MODIFY_CTIMES_BUFFER s=(char *)malloc(l+1); memcpy(s,t,l-1); #else s=t; #endif } s[l-1]='\r'; if(l != fwrite(s,1,l,stdout) || fflush(stdout)) { perror("write"); return(-1); } #if ITS_NOT_OK_TO_MODIFY_CTIMES_BUFFER free(s); #endif old=new; } if(gettimeofday(&tv,0)) return(-1); if(onlyminutes) tv.tv_sec=59-(tv.tv_sec%60); else tv.tv_sec=0; if(0==tv.tv_usec) tv.tv_sec++; else tv.tv_usec=1000000-tv.tv_usec; if(select(0,0,0,0,&tv)) return(-1); if(gettimeofday(&tv,0)) return(-1); if(5000001 && argv[1][0]=='-' && argv[1][1]=='m' && !argv[1][2]) { onlyminutes=1; argc--; argv++; } if(argc>1 && argv[1][0]=='-' && argv[1][1]=='h' && !argv[1][2]) { fputs(USAGE,stdout); return(0); } if(argc==2) return(doit(onlyminutes,argv[1])); if(argc != 1) { fputs(USAGE,stderr); return(1); } return(doit(onlyminutes,0)); }