2021-07-22 15:32:53

by Giulio Benetti

[permalink] [raw]
Subject: [PATCH] nfs-utils: fix time_t build error on 64-bits platforms

When passing time_t type to "%ld" on 64-bits platforms where time_t is a
'long long' we encouter this build failure:
error: format ‘%ld’ expects argument of type ‘long int’, but argument 4 has type ‘time_t’ {aka ‘long long int’} [-Werror=format=]

So let's change "%ld" markers to "%lld" assuming it to be a 64-bits and
cast variables to '(long long)' if the type is a time_t.

Signed-off-by: Giulio Benetti <[email protected]>
---
utils/nfsdcltrack/nfsdcltrack.c | 2 +-
utils/nfsdcltrack/sqlite.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/utils/nfsdcltrack/nfsdcltrack.c b/utils/nfsdcltrack/nfsdcltrack.c
index e926f1c0..437477bb 100644
--- a/utils/nfsdcltrack/nfsdcltrack.c
+++ b/utils/nfsdcltrack/nfsdcltrack.c
@@ -525,7 +525,7 @@ cltrack_gracedone(const char *timestr)
if (*tail)
return -EINVAL;

- xlog(D_GENERAL, "%s: grace done. gracetime=%ld", __func__, gracetime);
+ xlog(D_GENERAL, "%s: grace done. gracetime=%lld", __func__, (long long)gracetime);

ret = sqlite_remove_unreclaimed(gracetime);

diff --git a/utils/nfsdcltrack/sqlite.c b/utils/nfsdcltrack/sqlite.c
index f79aebb3..6e603087 100644
--- a/utils/nfsdcltrack/sqlite.c
+++ b/utils/nfsdcltrack/sqlite.c
@@ -544,8 +544,8 @@ sqlite_remove_unreclaimed(time_t grace_start)
int ret;
char *err = NULL;

- ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %ld",
- grace_start);
+ ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %lld",
+ (long long)grace_start);
if (ret < 0) {
return ret;
} else if ((size_t)ret >= sizeof(buf)) {
--
2.25.1


2021-07-25 17:06:06

by Steve Dickson

[permalink] [raw]
Subject: Re: [PATCH] nfs-utils: fix time_t build error on 64-bits platforms

Hello,

On 7/22/21 11:24 AM, Giulio Benetti wrote:
> When passing time_t type to "%ld" on 64-bits platforms where time_t is a
> 'long long' we encouter this build failure:
> error: format ‘%ld’ expects argument of type ‘long int’, but argument 4 has type ‘time_t’ {aka ‘long long int’} [-Werror=format=]
>
> So let's change "%ld" markers to "%lld" assuming it to be a 64-bits and
> cast variables to '(long long)' if the type is a time_t.
Just an FYI... I will be using Petr's patches [1] and [2]
since they used the inittypes defines which seem a
bit more portable and they do the same thing.

steved.

[1] https://marc.info/?l=linux-nfs&m=162697054816925&w=2
[2] https://marc.info/?l=linux-nfs&m=162697054816926&w=2
>
> Signed-off-by: Giulio Benetti <[email protected]>
> ---
> utils/nfsdcltrack/nfsdcltrack.c | 2 +-
> utils/nfsdcltrack/sqlite.c | 4 ++--
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/utils/nfsdcltrack/nfsdcltrack.c b/utils/nfsdcltrack/nfsdcltrack.c
> index e926f1c0..437477bb 100644
> --- a/utils/nfsdcltrack/nfsdcltrack.c
> +++ b/utils/nfsdcltrack/nfsdcltrack.c
> @@ -525,7 +525,7 @@ cltrack_gracedone(const char *timestr)
> if (*tail)
> return -EINVAL;
>
> - xlog(D_GENERAL, "%s: grace done. gracetime=%ld", __func__, gracetime);
> + xlog(D_GENERAL, "%s: grace done. gracetime=%lld", __func__, (long long)gracetime);
>
> ret = sqlite_remove_unreclaimed(gracetime);
>
> diff --git a/utils/nfsdcltrack/sqlite.c b/utils/nfsdcltrack/sqlite.c
> index f79aebb3..6e603087 100644
> --- a/utils/nfsdcltrack/sqlite.c
> +++ b/utils/nfsdcltrack/sqlite.c
> @@ -544,8 +544,8 @@ sqlite_remove_unreclaimed(time_t grace_start)
> int ret;
> char *err = NULL;
>
> - ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %ld",
> - grace_start);
> + ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %lld",
> + (long long)grace_start);
> if (ret < 0) {
> return ret;
> } else if ((size_t)ret >= sizeof(buf)) {
>

2021-07-25 17:16:56

by Giulio Benetti

[permalink] [raw]
Subject: Re: [PATCH] nfs-utils: fix time_t build error on 64-bits platforms

Hello Steve,

> Il giorno 25 lug 2021, alle ore 19:05, Steve Dickson <[email protected]> ha scritto:
>
> Hello,
>
>> On 7/22/21 11:24 AM, Giulio Benetti wrote:
>> When passing time_t type to "%ld" on 64-bits platforms where time_t is a
>> 'long long' we encouter this build failure:
>> error: format ‘%ld’ expects argument of type ‘long int’, but argument 4 has type ‘time_t’ {aka ‘long long int’} [-Werror=format=]
>> So let's change "%ld" markers to "%lld" assuming it to be a 64-bits and
>> cast variables to '(long long)' if the type is a time_t.
> Just an FYI... I will be using Petr's patches [1] and [2]
> since they used the inittypes defines which seem a
> bit more portable and they do the same thing.

Sure, I’ve missed those patches, thank you for pointing so I can use them in Buildroot instead of this one.

Best regards
Giulio Benetti

>
> steved.
>
> [1] https://marc.info/?l=linux-nfs&m=162697054816925&w=2
> [2] https://marc.info/?l=linux-nfs&m=162697054816926&w=2
>> Signed-off-by: Giulio Benetti <[email protected]>
>> ---
>> utils/nfsdcltrack/nfsdcltrack.c | 2 +-
>> utils/nfsdcltrack/sqlite.c | 4 ++--
>> 2 files changed, 3 insertions(+), 3 deletions(-)
>> diff --git a/utils/nfsdcltrack/nfsdcltrack.c b/utils/nfsdcltrack/nfsdcltrack.c
>> index e926f1c0..437477bb 100644
>> --- a/utils/nfsdcltrack/nfsdcltrack.c
>> +++ b/utils/nfsdcltrack/nfsdcltrack.c
>> @@ -525,7 +525,7 @@ cltrack_gracedone(const char *timestr)
>> if (*tail)
>> return -EINVAL;
>> - xlog(D_GENERAL, "%s: grace done. gracetime=%ld", __func__, gracetime);
>> + xlog(D_GENERAL, "%s: grace done. gracetime=%lld", __func__, (long long)gracetime);
>> ret = sqlite_remove_unreclaimed(gracetime);
>> diff --git a/utils/nfsdcltrack/sqlite.c b/utils/nfsdcltrack/sqlite.c
>> index f79aebb3..6e603087 100644
>> --- a/utils/nfsdcltrack/sqlite.c
>> +++ b/utils/nfsdcltrack/sqlite.c
>> @@ -544,8 +544,8 @@ sqlite_remove_unreclaimed(time_t grace_start)
>> int ret;
>> char *err = NULL;
>> - ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %ld",
>> - grace_start);
>> + ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %lld",
>> + (long long)grace_start);
>> if (ret < 0) {
>> return ret;
>> } else if ((size_t)ret >= sizeof(buf)) {
>