From fe401d258f7dcb91f905f8becd1f36960db9af8b Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sat, 21 Jun 2025 15:10:28 -0400 Subject: usr.bin: date: Print month and day of the week Signed-off-by: Ian Moffett --- usr.bin/date/date.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'usr.bin/date') diff --git a/usr.bin/date/date.c b/usr.bin/date/date.c index 2f3b11f..a47e3eb 100644 --- a/usr.bin/date/date.c +++ b/usr.bin/date/date.c @@ -28,14 +28,34 @@ */ #include +#include #include #include #include +#define MONTHS_PER_YEAR 12 +#define DAYS_PER_WEEK 7 + +/* Months of the year */ +static const char *montab[] = { + "Jan", "Feb", "Mar", + "Apr", "May", "Jun", + "Jul", "Aug", "Sep", + "Oct", "Nov", "Dec" +}; + +/* Days of the week */ +static const char *daytab[] = { + "Sat", "Sun", "Mon", + "Tue", "Wed", "Thu", + "Fri" +}; + int main(void) { - char date_str[16]; + const char *day, *month; + char date_str[32]; struct date d; int rtc_fd; @@ -46,8 +66,21 @@ main(void) read(rtc_fd, &d, sizeof(d)); close(rtc_fd); - snprintf(date_str, sizeof(date_str), "%02d:%02d:%02d\n", - d.hour, d.min, d.sec); + /* This should not happen */ + if (__unlikely(d.month > MONTHS_PER_YEAR)) { + printf("got bad month %d from RTC\n", d.month); + return -1; + } + if (__unlikely(d.month == 0 || d.day == 0)) { + printf("got zero month/day from RTC\n"); + return -1; + } + + day = daytab[d.day % DAYS_PER_WEEK]; + month = montab[d.month - 1]; + + snprintf(date_str, sizeof(date_str), "%s %s %d %02d:%02d:%02d\n", + day, month, d.day, d.hour, d.min, d.sec); fputs(date_str, stdout); return 0; } -- cgit v1.2.3