Compat with zfs 2.2+'s nvlist_lookup_string() taking const char **

This commit is contained in:
наб 2024-02-28 19:30:59 +01:00
parent fcd89b3a93
commit a0246cb48e
No known key found for this signature in database
GPG Key ID: BCFD0B018D2658F1

View File

@ -59,6 +59,18 @@ nvlist_t * clear_rewrap_args() {
TRY_NVL(what, _try_retl); \
})
namespace {
// nvlist_lookup_nvlist takes nvlist_t *, char ** on bookworm and an const nvlist_t *, const char ** on sid!
template <class>
struct third_arg;
template <class F, class A, class B, class C>
struct third_arg<F(A, B, C)> {
using third = C;
};
}
int lookup_userprop(zfs_handle_t * in, const char * name, char *& out) {
// xyz.nabijaczleweli:tzpfms.key:
// value: '76B0286BEB3FAF57536C47D9A2BAD38157FD522A75A59E72867BBFD6AF167395'
@ -68,11 +80,11 @@ int lookup_userprop(zfs_handle_t * in, const char * name, char *& out) {
TRY_LOOKUP("look up user property", nvlist_lookup_nvlist(zfs_get_user_props(in), name, &vs));
char * source{};
TRY_LOOKUP("look up user property source", nvlist_lookup_string(vs, "source", &source));
TRY_LOOKUP("look up user property source", nvlist_lookup_string(vs, "source", const_cast<third_arg<decltype(nvlist_lookup_string)>::third>(&source)));
if(!source || strcmp(source, zfs_get_name(in)))
return 0;
TRY_LOOKUP("look up user property value", nvlist_lookup_string(vs, "value", &out));
TRY_LOOKUP("look up user property value", nvlist_lookup_string(vs, "value", const_cast<third_arg<decltype(nvlist_lookup_string)>::third>(&out)));
return 0;
}