On Tue, Jul 11, 2023 at 10:43 AM Andrej Picej <[email protected]> wrote:
--- a/include/rtc_.h
+++ b/include/rtc_.h
@@ -22,6 +22,11 @@ int rtc_xopen(const char **default_rtc, int flags) FAST_FUNC;
void rtc_read_tm(struct tm *ptm, int fd) FAST_FUNC;
time_t rtc_tm2time(struct tm *ptm, int utc) FAST_FUNC;
+struct hwclock_param {
+ int id;
+ const char *name;
+ const char *help;
+};
Can be in hwclock.c, its only user
/*
* Everything below this point has been copied from linux/rtc.h
@@ -46,6 +51,17 @@ struct linux_rtc_wkalrm {
struct linux_rtc_time time; /* time the alarm is set to */
};
+struct rtc_param {
+ __u64 param;
+ union {
+ __u64 uvalue;
+ __s64 svalue;
+ __u64 ptr;
+ };
+ __u32 index;
+ __u32 __pad;
+};
Should use uint64_t and such, noit kernel internal typedefs.
+static const struct hwclock_param hwclock_params[] =
+{
+ { RTC_PARAM_FEATURES, "features", "supported features" },
+ { RTC_PARAM_CORRECTION, "correction", "time correction" },
+ { RTC_PARAM_BACKUP_SWITCH_MODE, "bsm", "backup switch mode" },
+ { }
+};
help strings are unused.
+const struct hwclock_param *get_hwclock_params(void)
+{
+ return hwclock_params;
+}
util-linux/hwclock.c:65:29: error: no previous prototype for
‘get_hwclock_params’
- unused function
+static void set_rtc_param(const char **pp_rtcname, const char *rtc_param)
+{
+ int rtc;
+ struct rtc_param param = { .param = 0 };
Why zeroing?
+ char *tok, *opt = xstrdup(rtc_param);
Why strdup? Using the string in-place is more efficient
+
+ /* handle param name */
+ tok = strtok(opt, "=");
+ if (resolve_rtc_param_alias(tok, ¶m.param) != 0) {
+ param.param = bb_strtoull(tok, NULL, 0);
+ if (errno)
+ bb_error_msg_and_die("could not convert parameter name: '%s'
to number",
+ tok);
Duplicated code. Too verbose message. Can just use xstrtoull():
static uint64_t resolve_rtc_param_alias(const char *alias)
{
int n;
BUILD_BUG_ON(RTC_PARAM_FEATURES != 0
|| RTC_PARAM_CORRECTION != 1
|| RTC_PARAM_BACKUP_SWITCH_MODE != 2
);
n = index_in_strings(
"features" "\0"
"correction" "\0"
"bsm" "\0"
, alias);
if (n >= 0)
return n;
return xstrtoull(alias, 0);
}
+ }
+
) pulls in > + /* handle param value */
+ tok = strtok(NULL, "=");
strtok() pulls in a global variable, increasing bss.
const char *param = NULL;
Why zeroing?
After addressing these, the size is twice as small:
function old new delta
hwclock_main 298 756 +458
.rodata 105231 105526 +295
strtok - 148 +148
hwclock_params - 48 +48
packed_usage 34541 34576 +35
static.hwclock_longopts 60 84 +24
static.p - 4 +4
------------------------------------------------------------------------------
(add/remove: 4/0 grow/shrink: 4/0 up/down: 1012/0) Total: 1012 bytes
function old new delta
hwclock_main 298 584 +286
.rodata 105231 105400 +169
packed_usage 34541 34576 +35
static.hwclock_longopts 60 84 +24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/0 up/down: 514/0) Total: 514 bytes