[package] busybox: add a "date -k" to set the kernel timezone from the current localtime utc offset
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@29203 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
86bee92665
commit
681ec3b21e
|
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=busybox
|
||||
PKG_VERSION:=1.19.3
|
||||
PKG_RELEASE:=7
|
||||
PKG_RELEASE:=8
|
||||
PKG_FLAGS:=essential
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
--- a/coreutils/date.c
|
||||
+++ b/coreutils/date.c
|
||||
@@ -123,6 +123,7 @@
|
||||
//usage: IF_FEATURE_DATE_ISOFMT(
|
||||
//usage: "\n -D FMT Use FMT for -d TIME conversion"
|
||||
//usage: )
|
||||
+//usage: "\n -k Set Kernel timezone from localtime and exit"
|
||||
//usage: "\n"
|
||||
//usage: "\nRecognized TIME formats:"
|
||||
//usage: "\n hh:mm[:ss]"
|
||||
@@ -135,6 +136,7 @@
|
||||
//usage: "Wed Apr 12 18:52:41 MDT 2000\n"
|
||||
|
||||
#include "libbb.h"
|
||||
+#include <sys/time.h>
|
||||
#if ENABLE_FEATURE_DATE_NANO
|
||||
# include <sys/syscall.h>
|
||||
#endif
|
||||
@@ -145,8 +147,9 @@ enum {
|
||||
OPT_UTC = (1 << 2), /* u */
|
||||
OPT_DATE = (1 << 3), /* d */
|
||||
OPT_REFERENCE = (1 << 4), /* r */
|
||||
- OPT_TIMESPEC = (1 << 5) * ENABLE_FEATURE_DATE_ISOFMT, /* I */
|
||||
- OPT_HINT = (1 << 6) * ENABLE_FEATURE_DATE_ISOFMT, /* D */
|
||||
+ OPT_KERNELTZ = (1 << 5), /* k */
|
||||
+ OPT_TIMESPEC = (1 << 6) * ENABLE_FEATURE_DATE_ISOFMT, /* I */
|
||||
+ OPT_HINT = (1 << 7) * ENABLE_FEATURE_DATE_ISOFMT, /* D */
|
||||
};
|
||||
|
||||
static void maybe_set_utc(int opt)
|
||||
@@ -164,12 +167,15 @@ static const char date_longopts[] ALIGN1
|
||||
/* "universal\0" No_argument "u" */
|
||||
"date\0" Required_argument "d"
|
||||
"reference\0" Required_argument "r"
|
||||
+ "set-kernel-tz\0" No_argument "k"
|
||||
;
|
||||
#endif
|
||||
|
||||
int date_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||
int date_main(int argc UNUSED_PARAM, char **argv)
|
||||
{
|
||||
+ time_t tt;
|
||||
+ struct timezone tz;
|
||||
struct timespec ts;
|
||||
struct tm tm_time;
|
||||
char buf_fmt_dt2str[64];
|
||||
@@ -184,7 +190,7 @@ int date_main(int argc UNUSED_PARAM, cha
|
||||
opt_complementary = "d--s:s--d"
|
||||
IF_FEATURE_DATE_ISOFMT(":R--I:I--R");
|
||||
IF_LONG_OPTS(applet_long_options = date_longopts;)
|
||||
- opt = getopt32(argv, "Rs:ud:r:"
|
||||
+ opt = getopt32(argv, "Rs:ud:r:k"
|
||||
IF_FEATURE_DATE_ISOFMT("I::D:"),
|
||||
&date_str, &date_str, &filename
|
||||
IF_FEATURE_DATE_ISOFMT(, &isofmt_arg, &fmt_str2dt));
|
||||
@@ -241,6 +247,27 @@ int date_main(int argc UNUSED_PARAM, cha
|
||||
if (*argv)
|
||||
bb_show_usage();
|
||||
|
||||
+ /* Setting of kernel timezone was requested */
|
||||
+ if (opt & OPT_KERNELTZ) {
|
||||
+ tt = time(NULL);
|
||||
+ localtime_r(&tt, &tm_time);
|
||||
+
|
||||
+ /* workaround warp_clock() on first invocation */
|
||||
+ memset(&tz, 0, sizeof(tz));
|
||||
+ settimeofday(NULL, &tz);
|
||||
+
|
||||
+ memset(&tz, 0, sizeof(tz));
|
||||
+ tz.tz_minuteswest = -(tm_time.tm_gmtoff / 60);
|
||||
+
|
||||
+ if (settimeofday(NULL, &tz))
|
||||
+ {
|
||||
+ bb_perror_msg("can't set kernel time zone");
|
||||
+ return EXIT_FAILURE;
|
||||
+ }
|
||||
+
|
||||
+ return EXIT_SUCCESS;
|
||||
+ }
|
||||
+
|
||||
/* Now we have parsed all the information except the date format
|
||||
* which depends on whether the clock is being set or read */
|
||||
|
Loading…
Reference in New Issue