busybox: fix setting the kernel timezone
The settimeofday() syscall wrapper provided by musl filters out the timezone argument, breaking the ability to set the kernel timezone through the function. Adjust busybox patch to issue the syscall directly in order to circumvent the problem. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
81a5f1ac9e
commit
5a7c064bdb
1 changed files with 14 additions and 10 deletions
|
@ -8,15 +8,19 @@
|
||||||
//usage: "\n"
|
//usage: "\n"
|
||||||
//usage: "\nRecognized TIME formats:"
|
//usage: "\nRecognized TIME formats:"
|
||||||
//usage: "\n hh:mm[:ss]"
|
//usage: "\n hh:mm[:ss]"
|
||||||
@@ -138,6 +139,7 @@
|
@@ -138,9 +139,8 @@
|
||||||
//usage: "Wed Apr 12 18:52:41 MDT 2000\n"
|
//usage: "Wed Apr 12 18:52:41 MDT 2000\n"
|
||||||
|
|
||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
|
-#if ENABLE_FEATURE_DATE_NANO
|
||||||
|
-# include <sys/syscall.h>
|
||||||
|
-#endif
|
||||||
+#include <sys/time.h>
|
+#include <sys/time.h>
|
||||||
#if ENABLE_FEATURE_DATE_NANO
|
+#include <sys/syscall.h>
|
||||||
# include <sys/syscall.h>
|
|
||||||
#endif
|
enum {
|
||||||
@@ -148,8 +150,9 @@ enum {
|
OPT_RFC2822 = (1 << 0), /* R */
|
||||||
|
@@ -148,8 +148,9 @@ enum {
|
||||||
OPT_UTC = (1 << 2), /* u */
|
OPT_UTC = (1 << 2), /* u */
|
||||||
OPT_DATE = (1 << 3), /* d */
|
OPT_DATE = (1 << 3), /* d */
|
||||||
OPT_REFERENCE = (1 << 4), /* r */
|
OPT_REFERENCE = (1 << 4), /* r */
|
||||||
|
@ -28,7 +32,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
static void maybe_set_utc(int opt)
|
static void maybe_set_utc(int opt)
|
||||||
@@ -167,12 +170,15 @@ static const char date_longopts[] ALIGN1
|
@@ -167,12 +168,15 @@ static const char date_longopts[] ALIGN1
|
||||||
/* "universal\0" No_argument "u" */
|
/* "universal\0" No_argument "u" */
|
||||||
"date\0" Required_argument "d"
|
"date\0" Required_argument "d"
|
||||||
"reference\0" Required_argument "r"
|
"reference\0" Required_argument "r"
|
||||||
|
@ -44,7 +48,7 @@
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
struct tm tm_time;
|
struct tm tm_time;
|
||||||
char buf_fmt_dt2str[64];
|
char buf_fmt_dt2str[64];
|
||||||
@@ -187,7 +193,7 @@ int date_main(int argc UNUSED_PARAM, cha
|
@@ -187,7 +191,7 @@ int date_main(int argc UNUSED_PARAM, cha
|
||||||
opt_complementary = "d--s:s--d"
|
opt_complementary = "d--s:s--d"
|
||||||
IF_FEATURE_DATE_ISOFMT(":R--I:I--R");
|
IF_FEATURE_DATE_ISOFMT(":R--I:I--R");
|
||||||
IF_LONG_OPTS(applet_long_options = date_longopts;)
|
IF_LONG_OPTS(applet_long_options = date_longopts;)
|
||||||
|
@ -53,7 +57,7 @@
|
||||||
IF_FEATURE_DATE_ISOFMT("I::D:"),
|
IF_FEATURE_DATE_ISOFMT("I::D:"),
|
||||||
&date_str, &date_str, &filename
|
&date_str, &date_str, &filename
|
||||||
IF_FEATURE_DATE_ISOFMT(, &isofmt_arg, &fmt_str2dt));
|
IF_FEATURE_DATE_ISOFMT(, &isofmt_arg, &fmt_str2dt));
|
||||||
@@ -244,6 +250,31 @@ int date_main(int argc UNUSED_PARAM, cha
|
@@ -244,6 +248,31 @@ int date_main(int argc UNUSED_PARAM, cha
|
||||||
if (*argv)
|
if (*argv)
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
|
|
||||||
|
@ -64,7 +68,7 @@
|
||||||
+
|
+
|
||||||
+ /* workaround warp_clock() on first invocation */
|
+ /* workaround warp_clock() on first invocation */
|
||||||
+ memset(&tz, 0, sizeof(tz));
|
+ memset(&tz, 0, sizeof(tz));
|
||||||
+ settimeofday(NULL, &tz);
|
+ syscall(SYS_settimeofday, NULL, &tz);
|
||||||
+
|
+
|
||||||
+ memset(&tz, 0, sizeof(tz));
|
+ memset(&tz, 0, sizeof(tz));
|
||||||
+#ifdef __USE_MISC
|
+#ifdef __USE_MISC
|
||||||
|
@ -73,7 +77,7 @@
|
||||||
+ tz.tz_minuteswest = -(tm_time.__tm_gmtoff / 60);
|
+ tz.tz_minuteswest = -(tm_time.__tm_gmtoff / 60);
|
||||||
+#endif
|
+#endif
|
||||||
+
|
+
|
||||||
+ if (settimeofday(NULL, &tz))
|
+ if (syscall(SYS_settimeofday, NULL, &tz))
|
||||||
+ {
|
+ {
|
||||||
+ bb_perror_msg("can't set kernel time zone");
|
+ bb_perror_msg("can't set kernel time zone");
|
||||||
+ return EXIT_FAILURE;
|
+ return EXIT_FAILURE;
|
||||||
|
|
Loading…
Reference in a new issue