From b9afde64d176a93950a2cda9aed118c50c4a19a8 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 4 Sep 2020 22:18:26 +0200 Subject: Add posix time support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- README | 11 ++++ mongoclock.1 | 13 +++++ mongoclock.c | 169 ++++++++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 146 insertions(+), 47 deletions(-) diff --git a/README b/README index 7f23ec1..c9d800d 100644 --- a/README +++ b/README @@ -20,6 +20,17 @@ DESCRIPTION right colour for you, simply change the font colour on your terminal. ☺ +OPTIONS + The mongoclock utility shall conform to the Base + Definitions volume of POSIX.1‐2008, Section 12.2, + Utility Syntax Guidelines. + + The following options shall be supported: + + -s Display the posix time (seconds since + 1970-01-01 00:00:00 UTC, ignoring inserted + and removed leap seconds). + RATIONALE It is really nice to have a large clock on your computer, instead of a small clock somewhere in diff --git a/mongoclock.1 b/mongoclock.1 index 02d9d12..46131ff 100644 --- a/mongoclock.1 +++ b/mongoclock.1 @@ -21,6 +21,19 @@ your (or if it is too large,) just change the font size on your terminal. If it is not the right colour for you, simply change the font colour on your terminal +.SH OPTIONS +The +.B cp +utility shall conform to the Base Definitions +volume of POSIX.1-2008, +.IR "Section 12.2, Utility Syntax Guidelines" . +.PP +The following options shall be supported: +.TP +.B -s +Display the posix time (seconds since 1970-01-01 +00:00:00 UTC, ignoring inserted and removed leap +seconds). .SH RATIONALE It is really nice to have a large clock on your computer, instead of a small clock somewhere in diff --git a/mongoclock.c b/mongoclock.c index 769e9d9..b98cc67 100644 --- a/mongoclock.c +++ b/mongoclock.c @@ -80,18 +80,15 @@ print_time(const char ***str, size_t y, size_t x) fflush(stdout); } -int -main(int argc, char *argv[]) +static int +display_time(int timerfd) { - struct tm *now; const char **digits[9]; - size_t x = 0, y = 0; - struct winsize winsize; int small = 0; - int fd = -1; - struct itimerspec itimerspec; uint64_t _overrun; - struct sigaction sigact; + struct winsize winsize; + size_t x = 0, y = 0; + struct tm *now; #ifdef USE_ADJTIMEX struct timex timex; int r; @@ -99,42 +96,12 @@ main(int argc, char *argv[]) time_t now_; #endif - ARGBEGIN { - default: - usage(); - } ARGEND; - - if (argc) - usage(); - - fprintf(stdout, "\033[?1049h\033[?25l"); - - if (clock_gettime(CLOCK_REALTIME, &itimerspec.it_value)) - goto fail; - itimerspec.it_interval.tv_sec = 1; - itimerspec.it_interval.tv_nsec = 0; - itimerspec.it_value.tv_sec += 1; - itimerspec.it_value.tv_nsec = 0; - fd = timerfd_create(CLOCK_REALTIME, 0); - if (fd < 0) - goto fail; - if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &itimerspec, NULL)) - goto fail; - - memset(&sigact, 0, sizeof(sigact)); - - sigact.sa_handler = sigterm; - sigaction(SIGTERM, &sigact, NULL); - sigaction(SIGQUIT, &sigact, NULL); - sigaction(SIGINT, &sigact, NULL); - - sigact.sa_handler = sigwinch; - sigaction(SIGWINCH, &sigact, NULL); - #ifdef USE_ADJTIMEX memset(&timex, 0, sizeof(timex)); #endif + digits[8] = NULL; + while (!caught_sigterm) { if (caught_sigwinch) { if (ioctl(STDOUT_FILENO, (unsigned long)TIOCGWINSZ, &winsize) < 0) { @@ -190,26 +157,134 @@ main(int argc, char *argv[]) digits[5] = small ? NULL : mongo_c; digits[6] = mongo_ds[now->tm_sec / 10]; digits[7] = mongo_ds[now->tm_sec % 10]; - digits[8] = NULL; print_time(digits, y, x); - if (read(fd, &_overrun, sizeof(_overrun)) < 0) + if (read(timerfd, &_overrun, sizeof(_overrun)) < 0) + if (errno != EINTR) + goto fail; + } + + return 0; + +fail: + return -1; +} + +static int +display_posixtime(int timerfd) +{ + const char **digits[21]; + uint64_t _overrun; + struct winsize winsize; + size_t w = 0, h = 0, x, y; + time_t now; + size_t first_digit, ndigits; + + digits[20] = NULL; + + while (!caught_sigterm) { + if (caught_sigwinch) { + if (ioctl(STDOUT_FILENO, (unsigned long)TIOCGWINSZ, &winsize) < 0) { + if (errno == EINTR) + continue; + goto fail; + } + caught_sigwinch = 0; + h = winsize.ws_row; + w = winsize.ws_col; + } + + now = time(NULL); + if (now < 0) + goto fail; + + first_digit = 20; + do { + if (!first_digit) + abort(); + digits[--first_digit] = mongo_ds[now % 10]; + } while (now /= 10); + ndigits = 20 - first_digit; + + if (h < DY || w < ndigits * DX) { + fprintf(stdout, "\033[H\033[2J%s\n", "Screen is too small"); + fflush(stdout); + pause(); + continue; + } + + y = (h - DY) / 2; + x = (w - ndigits * DX) / 2; + print_time(&digits[first_digit], y, x); + + if (read(timerfd, &_overrun, sizeof(_overrun)) < 0) if (errno != EINTR) goto fail; } + return 0; + +fail: + return -1; +} + +int +main(int argc, char *argv[]) +{ + int timerfd = -1; + int posixtime = 0; + struct itimerspec itimerspec; + struct sigaction sigact; + + ARGBEGIN { + case 's': + posixtime = 1; + break; + default: + usage(); + } ARGEND; + + if (argc) + usage(); + + fprintf(stdout, "\033[?1049h\033[?25l"); + + if (clock_gettime(CLOCK_REALTIME, &itimerspec.it_value)) + goto fail; + itimerspec.it_interval.tv_sec = 1; + itimerspec.it_interval.tv_nsec = 0; + itimerspec.it_value.tv_sec += 1; + itimerspec.it_value.tv_nsec = 0; + timerfd = timerfd_create(CLOCK_REALTIME, 0); + if (timerfd < 0) + goto fail; + if (timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &itimerspec, NULL)) + goto fail; + + memset(&sigact, 0, sizeof(sigact)); + + sigact.sa_handler = sigterm; + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGINT, &sigact, NULL); + + sigact.sa_handler = sigwinch; + sigaction(SIGWINCH, &sigact, NULL); + + if (posixtime ? display_posixtime(timerfd) : display_time(timerfd)) + goto fail; + fprintf(stdout, "\033[?25h\n\033[?1049l"); fflush(stdout); - close(fd); + close(timerfd); return 0; - + fail: perror(argv0 ? argv0 : "mongoclock"); fprintf(stdout, "\033[?25h\n\033[?1049l"); fflush(stdout); - if (fd >= 0) - close(fd); + if (timerfd >= 0) + close(timerfd); return 1; } - -- cgit v1.2.3-70-g09d2