summaryrefslogtreecommitdiffstats
path: root/libnvme-wrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnvme-wrap.c')
-rw-r--r--libnvme-wrap.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/libnvme-wrap.c b/libnvme-wrap.c
new file mode 100644
index 0000000..b5b4838
--- /dev/null
+++ b/libnvme-wrap.c
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * This file is part of nvme-cli
+ *
+ * Copyright (c) 2022 Daniel Wagner, SUSE
+ */
+
+#include <dlfcn.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <libnvme.h>
+#include "nvme-print.h"
+
+#define PROTO(args...) args
+#define ARGS(args...) args
+
+#define VOID_FN(name, proto, args) \
+void __attribute__((weak)) name(proto) \
+{ \
+ void (*fn)(proto); \
+ fn = dlsym(RTLD_NEXT, #name); \
+ if (!fn) { \
+ nvme_show_error("libnvme function " #name " not found");\
+ exit(EXIT_FAILURE); \
+ } \
+ fn(args); \
+}
+
+#define FN(name, rtype, proto, args, defret) \
+rtype __attribute__((weak)) name(proto) \
+{ \
+ rtype (*fn)(proto); \
+ fn = dlsym(RTLD_NEXT, #name); \
+ if (fn) \
+ return fn(args); \
+ return defret; \
+}
+
+FN(nvme_get_version,
+ const char *, PROTO(enum nvme_version type),
+ ARGS(type), "n/a")
+
+VOID_FN(nvme_init_copy_range_f1,
+ PROTO(struct nvme_copy_range_f1 *copy, __u16 *nlbs,
+ __u64 *slbas, __u64 *eilbrts, __u32 *elbatms,
+ __u32 *elbats, __u16 nr),
+ ARGS(copy, nlbs, slbas, eilbrts, elbatms, elbats, nr))
+
+VOID_FN(nvme_init_copy_range_f2,
+ PROTO(struct nvme_copy_range_f2 *copy, __u32 *snsids,
+ __u16 *nlbs, __u64 *slbas, __u16 *sopts, __u32 *eilbrts,
+ __u32 *elbatms, __u32 *elbats, __u16 nr),
+ ARGS(copy, snsids, nlbs, slbas, sopts, eilbrts, elbatms, elbats, nr))
+
+VOID_FN(nvme_init_copy_range_f3,
+ PROTO(struct nvme_copy_range_f3 *copy, __u32 *snsids,
+ __u16 *nlbs, __u64 *slbas, __u16 *sopts, __u64 *eilbrts,
+ __u32 *elbatms, __u32 *elbats, __u16 nr),
+ ARGS(copy, snsids, nlbs, slbas, sopts, eilbrts, elbatms, elbats, nr))
+
+FN(nvme_get_feature_length2,
+ int,
+ PROTO(int fid, __u32 cdw11, enum nvme_data_tfr dir,
+ __u32 *len),
+ ARGS(fid, cdw11, dir, len),
+ -EEXIST)
+
+FN(nvme_ctrl_is_persistent,
+ bool,
+ PROTO(nvme_ctrl_t c),
+ ARGS(c),
+ false)