busybox: add a "date -k" to set the kernel timezone from the current localtime utc offset
SVN-Revision: 29203
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								package/busybox/patches/911-date-k-flag.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								package/busybox/patches/911-date-k-flag.patch
									
									
									
									
									
										Normal file
									
								
							@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user