annotate toys/date.c @ 628:3041521db5d0

Largely cosmetic code cleanups.
author Rob Landley <rob@landley.net>
date Tue, 17 Jul 2012 23:11:06 -0500
parents 12eddd9a1fe4
children 42ae383499c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* vi: set sw=4 ts=4:
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * date.c - set/get the date
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * Copyright 2012 Andre Renaud <andre@bluewatersys.com>
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 *
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
9 USE_DATE(NEWTOY(date, "r:u", TOYFLAG_BIN))
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
10
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 config DATE
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 bool "date"
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 default y
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 help
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 usage: date [-u] [+format] | mmddhhmm[[cc]yy]
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 Set/get the current date/time
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 */
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
19
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 #include "toys.h"
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
21
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 /* Convert a string of decimal numbers to their integer equivalent */
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 static int fromdec(const char *buf, int len)
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 int result = 0;
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
26 while (len--) result=result * 10 + (*buf++ - '0');
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 return result;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 }
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
29
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 void date_main(void)
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 const char *format_string = "%a %b %e %H:%M:%S %Z %Y";
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
33
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 /* Check if we should be displaying the date */
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 if (!toys.optargs[0] || toys.optargs[0][0] == '+') {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 time_t now = time(NULL);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 struct tm *tm;
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
38
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
39 if (toys.optargs[0]) format_string = toys.optargs[0]+1;
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
40 if (toys.optflags) tm = gmtime(&now);
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
41 else tm = localtime(&now);
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
42 if (!tm) perror_msg("Unable to retrieve current time");
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 if (!strftime(toybuf, sizeof(toybuf), format_string, tm))
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
44 perror_msg("bad format `%s'", format_string);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 puts(toybuf);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 } else {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 int len = strlen(toys.optargs[0]);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 struct tm tm;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 struct timeval tv;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
50
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 if (len < 8 || len > 12 || len & 1)
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
52 error_msg("bad date `%s'", toys.optargs[0]);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 memset(&tm, 0, sizeof(tm));
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 /* Date format: mmddhhmm[[cc]yy] */
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 tm.tm_mon = fromdec(toys.optargs[0], 2) - 1;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 tm.tm_mday = fromdec(&toys.optargs[0][2], 2);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 tm.tm_hour = fromdec(&toys.optargs[0][4], 2);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 tm.tm_min = fromdec(&toys.optargs[0][6], 2);
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
59 if (len == 12) tm.tm_year = fromdec(&toys.optargs[0][8], 4) - 1900;
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 else if (len == 10) {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 tm.tm_year = fromdec(&toys.optargs[0][8], 2);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 /* 69-99 = 1969-1999, 0 - 68 = 2000-2068 */
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
63 if (tm.tm_year < 69) tm.tm_year += 100;
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 } else {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 /* Year not specified, so retrieve current year */
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 time_t now = time(NULL);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 struct tm *now_tm = localtime(&now);
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
68 if (!now_tm) perror_msg("Unable to retrieve current time");
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 tm.tm_year = now_tm->tm_year;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 }
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
71 if (!toys.optflags) tv.tv_sec = mktime(&tm);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 else {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 /* Get the UTC version of a struct tm */
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 char *tz = NULL;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 tz = getenv("TZ");
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 setenv("TZ", "", 1);
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 tzset();
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 tv.tv_sec = mktime(&tm);
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
79 if (tz) setenv("TZ", tz, 1);
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
80 else unsetenv("TZ");
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 tzset();
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 }
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
83
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 if (tv.tv_sec == (time_t)-1)
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
85 error_msg("bad `%s'", toys.optargs[0]);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 tv.tv_usec = 0;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 if (!strftime(toybuf, sizeof(toybuf), format_string, &tm))
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
88 perror_msg("bad format `%s'", format_string);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 puts(toybuf);
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
90 if (settimeofday(&tv, NULL) < 0) perror_msg("cannot set date");
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 }
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 }