Mercurial > hg > toybox
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 |
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 } |