annotate toys/posix/date.c @ 656:6df4ccc0acbe

Regularize command headers, update links to standards documents.
author Rob Landley <rob@landley.net>
date Sat, 25 Aug 2012 18:08:51 -0500
parents 2986aa63a021
children 7e846e281e38
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 *
656
6df4ccc0acbe Regularize command headers, update links to standards documents.
Rob Landley <rob@landley.net>
parents: 653
diff changeset
7 * See http://opengroup.org/onlinepubs/9699919799/utilities/date.html
602
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
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
15 usage: date [-u] [-r file] [+format] | mmddhhmm[[cc]yy]
602
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
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
22 DEFINE_GLOBALS(
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
23 char *file;
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
24 )
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
25
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
26 #define TT this.date
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
27
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
28 #define FLAG_u 1
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
29 #define FLAG_r 2
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
30
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 void date_main(void)
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 const char *format_string = "%a %b %e %H:%M:%S %Z %Y";
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
34 time_t now = time(NULL);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
35 struct tm tm;
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
36
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
37 if (TT.file) {
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
38 struct stat st;
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
39
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
40 xstat(TT.file, &st);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
41 now = st.st_mtim.tv_sec;
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
42 }
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
43 ((toys.optflags & FLAG_u) ? gmtime_r : localtime_r)(&now, &tm);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
44
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
45 // Display the date?
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 if (!toys.optargs[0] || toys.optargs[0][0] == '+') {
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
47 if (toys.optargs[0]) format_string = toys.optargs[0]+1;
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
48 if (!strftime(toybuf, sizeof(toybuf), format_string, &tm))
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
49 perror_msg("bad format `%s'", format_string);
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
50
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 puts(toybuf);
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
52
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
53 // Set the date
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 } else {
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 struct timeval tv;
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
56 char *s = *toys.optargs;
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
57 int len = strlen(s);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
58
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
59 if (len < 8 || len > 12 || (len & 1)) error_msg("bad date `%s'", s);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
60
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
61 // Date format: mmddhhmm[[cc]yy]
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 memset(&tm, 0, sizeof(tm));
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
63 len = sscanf(s, "%2u%2u%2u%2u", &tm.tm_mon, &tm.tm_mday, &tm.tm_hour,
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
64 &tm.tm_min);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
65 tm.tm_mon--;
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
66
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
67 // If year specified, overwrite one we fetched earlier
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
68 if (len > 8) {
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
69 sscanf(s, "%u", &tm.tm_year);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
70 if (len == 12) tm.tm_year -= 1900;
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 /* 69-99 = 1969-1999, 0 - 68 = 2000-2068 */
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
72 else 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
73 }
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
74
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
75 if (toys.optflags & FLAG_u) {
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
76 // Get the UTC version of a struct tm
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
77 char *tz = CFG_TOYBOX_FREE ? getenv("TZ") : 0;
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
78 setenv("TZ", "UTC", 1);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 tzset();
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 tv.tv_sec = mktime(&tm);
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
81 if (CFG_TOYBOX_FREE) {
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
82 if (tz) setenv("TZ", tz, 1);
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
83 else unsetenv("TZ");
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
84 tzset();
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
85 }
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
86 } else tv.tv_sec = mktime(&tm);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
87
636
42ae383499c5 Add date -r, make -u work even when /etc/localtime set, and lots of cleanup/refactoring.
Rob Landley <rob@landley.net>
parents: 628
diff changeset
88 if (tv.tv_sec == (time_t)-1) error_msg("bad `%s'", toys.optargs[0]);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 tv.tv_usec = 0;
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 if (!strftime(toybuf, sizeof(toybuf), format_string, &tm))
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
91 perror_msg("bad format `%s'", format_string);
602
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 puts(toybuf);
628
3041521db5d0 Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents: 602
diff changeset
93 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
94 }
12eddd9a1fe4 Add date command by Andre Renaud.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 }