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