35 changed files with 2994 additions and 35 deletions
@ -0,0 +1,3 @@ |
|||||
|
version https://git-lfs.github.com/spec/v1 |
||||
|
oid sha256:0b431f69d7225a4ead96ffa1a87e8d9c42a8cbedfd6ef7a334b8b4fd050539bc |
||||
|
size 33853472 |
||||
@ -0,0 +1,3 @@ |
|||||
|
version https://git-lfs.github.com/spec/v1 |
||||
|
oid sha256:104f70ee591e72989d4f8c6caa79ed9dacd5dc84efdb0125b848afe544ad0c2d |
||||
|
size 10145112 |
||||
@ -0,0 +1,3 @@ |
|||||
|
version https://git-lfs.github.com/spec/v1 |
||||
|
oid sha256:eda609af606983ad2103029edf32b8ccf0cf2b041abcb16e9c25801b2800c546 |
||||
|
size 33855583 |
||||
@ -0,0 +1,3 @@ |
|||||
|
version https://git-lfs.github.com/spec/v1 |
||||
|
oid sha256:931b78933e365c66ec4695cd0899b31fbe0f4f837fb1bb4144ff2ab19dbada8b |
||||
|
size 34379058 |
||||
@ -0,0 +1,36 @@ |
|||||
|
From b825bb556bd3967bf5422c243b77bd4038e317e2 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Mon, 13 Oct 2025 10:34:51 +0200 |
||||
|
Subject: [PATCH 1/8] wireshark: Drop needless declaration of |
||||
|
proto_register_libvirt() and proto_reg_handoff_libvirt() |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Both proto_register_libvirt() and proto_reg_handoff_libvirt() are |
||||
|
declared in packet-libvirt.h which is included from plugin.c. |
||||
|
There's no need to provide another declaration in plugin.c. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/plugin.c | 3 --- |
||||
|
1 file changed, 3 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c
|
||||
|
index 9a83f2ca07..19b25e7b1a 100644
|
||||
|
--- a/tools/wireshark/src/plugin.c
|
||||
|
+++ b/tools/wireshark/src/plugin.c
|
||||
|
@@ -72,9 +72,6 @@ void plugin_register(void)
|
||||
|
|
||||
|
#else /* WIRESHARK_VERSION >= 2009000 */ |
||||
|
|
||||
|
-void proto_register_libvirt(void);
|
||||
|
-void proto_reg_handoff_libvirt(void);
|
||||
|
-
|
||||
|
WS_DLL_PUBLIC_DEF const gchar plugin_version[] = PLUGIN_VERSION; |
||||
|
WS_DLL_PUBLIC_DEF const int plugin_want_major = WIRESHARK_VERSION_MAJOR; |
||||
|
WS_DLL_PUBLIC_DEF const int plugin_want_minor = WIRESHARK_VERSION_MINOR; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,47 @@ |
|||||
|
From 41d3b457972bde85991fa7ed6f282370aca4b2af Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <41d3b457972bde85991fa7ed6f282370aca4b2af.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 15:20:05 +0200 |
||||
|
Subject: [PATCH 2/8] wireshark: Switch header files to #pragma once |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
The genxdrstub.pl script generates some header files. But they |
||||
|
use the old pattern to guard against multiple inclusion: |
||||
|
|
||||
|
#ifndef SOMETHING_H |
||||
|
#define SOMETHING_H |
||||
|
... |
||||
|
#endif |
||||
|
|
||||
|
Change the script to generate just '#pragma once' used everywhere |
||||
|
else in our code. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/util/genxdrstub.pl | 5 +---- |
||||
|
1 file changed, 1 insertion(+), 4 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl
|
||||
|
index 8cfda25a27..01b663a88c 100755
|
||||
|
--- a/tools/wireshark/util/genxdrstub.pl
|
||||
|
+++ b/tools/wireshark/util/genxdrstub.pl
|
||||
|
@@ -563,11 +563,8 @@ sub add_header_file {
|
||||
|
local $self->{header_contents} = []; |
||||
|
$self->print("/* *DO NOT MODIFY* this file directly.\n"); |
||||
|
$self->print(" * This file was generated by $0 from libvirt version $libvirt_version */\n"); |
||||
|
- my $ucname = uc $name;
|
||||
|
- $self->print("#ifndef _$ucname\_H_\n");
|
||||
|
- $self->print("#define _$ucname\_H_\n");
|
||||
|
+ $self->print("#pragma once\n");
|
||||
|
$block->(); |
||||
|
- $self->print("#endif /* _$ucname\_H_ */");
|
||||
|
push @{ $self->{headers} }, [ $name, delete $self->{header_contents} ]; |
||||
|
} |
||||
|
|
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,81 @@ |
|||||
|
From 02a0e78bf54c903da8922c56bade9b3298ade351 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <02a0e78bf54c903da8922c56bade9b3298ade351.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Mon, 13 Oct 2025 09:04:17 +0200 |
||||
|
Subject: [PATCH 3/8] wireshark: Move WIRESHARK_VERSION macro definition |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Soon, other parts of the wireshark code will need to |
||||
|
differentiate wrt wireshark version. Therefore, move the
|
||||
|
WIRESHARK_VERSION macro definition among with its deps into |
||||
|
packet-libvirt.h. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.h | 14 ++++++++++++++ |
||||
|
tools/wireshark/src/plugin.c | 14 -------------- |
||||
|
2 files changed, 14 insertions(+), 14 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.h b/tools/wireshark/src/packet-libvirt.h
|
||||
|
index 14e6e13696..15cfcb0534 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.h
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.h
|
||||
|
@@ -19,5 +19,19 @@
|
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
+#ifdef WITH_WS_VERSION
|
||||
|
+# include <wireshark/ws_version.h>
|
||||
|
+#else
|
||||
|
+# include <wireshark/config.h>
|
||||
|
+# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR
|
||||
|
+# define WIRESHARK_VERSION_MINOR VERSION_MINOR
|
||||
|
+# define WIRESHARK_VERSION_MICRO VERSION_MICRO
|
||||
|
+#endif
|
||||
|
+
|
||||
|
+#define WIRESHARK_VERSION \
|
||||
|
+ ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \
|
||||
|
+ (WIRESHARK_VERSION_MINOR * 1000) + \
|
||||
|
+ (WIRESHARK_VERSION_MICRO))
|
||||
|
+
|
||||
|
void proto_register_libvirt(void); |
||||
|
void proto_reg_handoff_libvirt(void); |
||||
|
diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c
|
||||
|
index 19b25e7b1a..64317b5280 100644
|
||||
|
--- a/tools/wireshark/src/plugin.c
|
||||
|
+++ b/tools/wireshark/src/plugin.c
|
||||
|
@@ -12,15 +12,6 @@
|
||||
|
|
||||
|
#include <config.h> |
||||
|
|
||||
|
-#ifdef WITH_WS_VERSION
|
||||
|
-# include <wireshark/ws_version.h>
|
||||
|
-#else
|
||||
|
-# include <wireshark/config.h>
|
||||
|
-# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR
|
||||
|
-# define WIRESHARK_VERSION_MINOR VERSION_MINOR
|
||||
|
-# define WIRESHARK_VERSION_MICRO VERSION_MICRO
|
||||
|
-#endif
|
||||
|
-
|
||||
|
#define HAVE_PLUGINS 1 |
||||
|
#include <wireshark/epan/proto.h> |
||||
|
/* plugins are DLLs */ |
||||
|
@@ -32,11 +23,6 @@
|
||||
|
/* Let the plugin version be the version of libvirt */ |
||||
|
#define PLUGIN_VERSION VERSION |
||||
|
|
||||
|
-#define WIRESHARK_VERSION \
|
||||
|
- ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \
|
||||
|
- (WIRESHARK_VERSION_MINOR * 1000) + \
|
||||
|
- (WIRESHARK_VERSION_MICRO))
|
||||
|
-
|
||||
|
#if WIRESHARK_VERSION < 2005000 |
||||
|
|
||||
|
WS_DLL_PUBLIC_DEF const gchar version[] = VERSION; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,133 @@ |
|||||
|
From 7374c4ecbd591b02f7be4b2918addc6d5852aafb Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <7374c4ecbd591b02f7be4b2918addc6d5852aafb.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Mon, 13 Oct 2025 09:21:30 +0200 |
||||
|
Subject: [PATCH 4/8] wireshark: Fix int type of some virNetMessageHeader |
||||
|
members |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Our virNetMessageHeader is a struct that's declared as follows: |
||||
|
|
||||
|
struct virNetMessageHeader { |
||||
|
unsigned prog; |
||||
|
unsigned vers; |
||||
|
int proc; |
||||
|
virNetMessageType type; |
||||
|
unsigned serial; |
||||
|
virNetMessageStatus status; |
||||
|
}; |
||||
|
|
||||
|
Now, per RFC 4506 enums are also encoded as signed integers. This |
||||
|
means, that only 'prog', 'vers' and 'serial' are really unsigned |
||||
|
integers. The others ('proc', 'type' and 'status') are encoded as |
||||
|
signed integers. Fix their type when dissecting. |
||||
|
|
||||
|
While at it, also follow latest trend in wireshark and switch |
||||
|
from guint32 to uint32_t. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 34 +++++++++++++++++++--------- |
||||
|
1 file changed, 23 insertions(+), 11 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index da2aabd98a..af14c6bed7 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -92,7 +92,7 @@ typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xd
|
||||
|
|
||||
|
typedef struct vir_dissector_index vir_dissector_index_t; |
||||
|
struct vir_dissector_index { |
||||
|
- guint32 proc;
|
||||
|
+ int32_t proc;
|
||||
|
vir_xdr_dissector_t args; |
||||
|
vir_xdr_dissector_t ret; |
||||
|
vir_xdr_dissector_t msg; |
||||
|
@@ -275,8 +275,10 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
} |
||||
|
|
||||
|
static vir_xdr_dissector_t |
||||
|
-find_payload_dissector(guint32 proc, guint32 type,
|
||||
|
- const vir_dissector_index_t *pds, gsize length)
|
||||
|
+find_payload_dissector(int32_t proc,
|
||||
|
+ enum vir_net_message_type type,
|
||||
|
+ const vir_dissector_index_t *pds,
|
||||
|
+ gsize length)
|
||||
|
{ |
||||
|
const vir_dissector_index_t *pd; |
||||
|
guint32 first, last, direction; |
||||
|
@@ -309,6 +311,10 @@ find_payload_dissector(guint32 proc, guint32 type,
|
||||
|
return pd->ret; |
||||
|
case VIR_NET_MESSAGE: |
||||
|
return pd->msg; |
||||
|
+ case VIR_NET_STREAM:
|
||||
|
+ case VIR_NET_STREAM_HOLE:
|
||||
|
+ /* Handled elsewhere */
|
||||
|
+ return NULL;
|
||||
|
} |
||||
|
return NULL; |
||||
|
} |
||||
|
@@ -397,8 +403,12 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
#include "libvirt/protocol.h" |
||||
|
|
||||
|
static void |
||||
|
-dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree,
|
||||
|
- guint32 prog, guint32 proc, guint32 type, guint32 status)
|
||||
|
+dissect_libvirt_payload(tvbuff_t *tvb,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ uint32_t prog,
|
||||
|
+ int32_t proc,
|
||||
|
+ int32_t type,
|
||||
|
+ int32_t status)
|
||||
|
{ |
||||
|
gssize payload_length; |
||||
|
|
||||
|
@@ -430,7 +440,8 @@ dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree,
|
||||
|
return; |
||||
|
|
||||
|
unknown: |
||||
|
- dbg("Cannot determine payload: Prog=%u, Proc=%u, Type=%u, Status=%u", prog, proc, type, status);
|
||||
|
+ dbg("Cannot determine payload: Prog=%u, Proc=%d, Type=%d, Status=%d",
|
||||
|
+ prog, proc, type, status);
|
||||
|
proto_tree_add_item(tree, hf_libvirt_unknown, tvb, VIR_HEADER_LEN, -1, ENC_NA); |
||||
|
} |
||||
|
|
||||
|
@@ -439,7 +450,8 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
void *opaque G_GNUC_UNUSED) |
||||
|
{ |
||||
|
goffset offset; |
||||
|
- guint32 prog, proc, type, serial, status;
|
||||
|
+ uint32_t prog, serial;
|
||||
|
+ int32_t proc, type, status;
|
||||
|
const value_string *vs; |
||||
|
|
||||
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); |
||||
|
@@ -448,17 +460,17 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
offset = 4; /* End of length field */ |
||||
|
prog = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
offset += 4; /* Ignore version header field */ |
||||
|
- proc = tvb_get_ntohl(tvb, offset); offset += 4;
|
||||
|
- type = tvb_get_ntohl(tvb, offset); offset += 4;
|
||||
|
+ proc = tvb_get_ntohil(tvb, offset); offset += 4;
|
||||
|
+ type = tvb_get_ntohil(tvb, offset); offset += 4;
|
||||
|
serial = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
- status = tvb_get_ntohl(tvb, offset); offset += 4;
|
||||
|
+ status = tvb_get_ntohil(tvb, offset); offset += 4;
|
||||
|
|
||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", |
||||
|
val_to_str(prog, program_strings, "%x")); |
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
if (vs == NULL) { |
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%u", proc);
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc);
|
||||
|
} else { |
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); |
||||
|
} |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,46 @@ |
|||||
|
From 1086888f95a322101f8cf53b63c96600ccbeb882 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <1086888f95a322101f8cf53b63c96600ccbeb882.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 19:16:54 +0200 |
||||
|
Subject: [PATCH 5/8] wireshark: Don't special case retval of |
||||
|
get_program_data() in dissect_libvirt_message() |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
The get_program_data() function returns a pointer (in this |
||||
|
specific case to an array of procedure strings) which, if |
||||
|
non-NULL is then passed val_to_str(). Well, if val_to_str() sees |
||||
|
NULL it is treated gracefully, i.e. like if the numeric value |
||||
|
'proc' wasn't found in the array. |
||||
|
|
||||
|
Therefore, there's no need to special case call to |
||||
|
col_append_fstr(). Both result into the same behaviour. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 6 +----- |
||||
|
1 file changed, 1 insertion(+), 5 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index af14c6bed7..6c729801d4 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -469,11 +469,7 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
val_to_str(prog, program_strings, "%x")); |
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- if (vs == NULL) {
|
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc);
|
||||
|
- } else {
|
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d"));
|
||||
|
- }
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d"));
|
||||
|
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
val_to_str(type, type_strings, "%d"), serial, |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,68 @@ |
|||||
|
From ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 18:23:18 +0200 |
||||
|
Subject: [PATCH 6/8] wireshark: Introduce and use vir_val_to_str() |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Wireshark offers val_to_str() function which converts numeric |
||||
|
value to string by looking up value ('val') in an array ('vs') of |
||||
|
<val, string> pairs. If no corresponding string is found, then |
||||
|
the value is formatted using given 'fmt' string. |
||||
|
|
||||
|
Starting from wireshark-4.6.0 not only this function gained |
||||
|
another argument but also returns a strdup()-ed string. To keep |
||||
|
our code simple, let's introduce a wrapper so which can be then |
||||
|
adjusted as needed. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 17 +++++++++++++---- |
||||
|
1 file changed, 13 insertions(+), 4 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index 6c729801d4..f6ad2c4578 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -140,6 +140,15 @@ static const value_string status_strings[] = {
|
||||
|
{ -1, NULL } |
||||
|
}; |
||||
|
|
||||
|
+static const char *
|
||||
|
+G_GNUC_PRINTF(3, 0)
|
||||
|
+vir_val_to_str(const uint32_t val,
|
||||
|
+ const value_string *vs,
|
||||
|
+ const char *fmt)
|
||||
|
+{
|
||||
|
+ return val_to_str(val, vs, fmt);
|
||||
|
+}
|
||||
|
+
|
||||
|
static gboolean |
||||
|
dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, |
||||
|
guint32 maxlen) |
||||
|
@@ -466,14 +475,14 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
status = tvb_get_ntohil(tvb, offset); offset += 4; |
||||
|
|
||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", |
||||
|
- val_to_str(prog, program_strings, "%x"));
|
||||
|
+ vir_val_to_str(prog, program_strings, "%x"));
|
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d"));
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d"));
|
||||
|
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
- val_to_str(type, type_strings, "%d"), serial,
|
||||
|
- val_to_str(status, status_strings, "%d"));
|
||||
|
+ vir_val_to_str(type, type_strings, "%d"), serial,
|
||||
|
+ vir_val_to_str(status, status_strings, "%d"));
|
||||
|
|
||||
|
if (tree) { |
||||
|
gint *hf_proc; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,165 @@ |
|||||
|
From 002b9f559d69b92e77ab2d234df6966fecdaf0ec Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <002b9f559d69b92e77ab2d234df6966fecdaf0ec.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 19:13:48 +0200 |
||||
|
Subject: [PATCH 7/8] wireshark: Don't leak column strings |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
One of the problems of using val_to_str() is that it may return a |
||||
|
const string from given table ('vs'), OR return an allocated one. |
||||
|
Since the caller has no idea which case it is, it resides to safe |
||||
|
option and don't free returned string. But that might lead to a |
||||
|
memleak. This behaviour is fixed with wireshark-4.6.0 and support |
||||
|
for it will be introduced soon. But first, make vir_val_to_str() |
||||
|
behave like fixed val_to_str() from newer wireshark: just always |
||||
|
allocate the string. |
||||
|
|
||||
|
Now, if val_to_str() needs to allocate new memory it obtains |
||||
|
allocator by calling wmem_packet_scope() which is what we may do |
||||
|
too. |
||||
|
|
||||
|
Hand in hand with that, we need to free the memory using the |
||||
|
correct allocator, hence wmem_free(). But let's put it into a |
||||
|
wrapper vir_wmem_free() because just like val_to_str(), it'll |
||||
|
need additional argument when adapting to new wireshark. |
||||
|
|
||||
|
Oh, and freeing the memory right after col_add_fstr() is safe as |
||||
|
it uses vsnprintf() under the hood to format passed args. |
||||
|
|
||||
|
One last thing, the wmem.h file used to live under epan/wmem/ but |
||||
|
then in v3.5.0~240 [1] was moved to wsutil/wmem/. |
||||
|
|
||||
|
1: https://gitlab.com/wireshark/wireshark/-/commit/7f9c1f5f92c131354fc8b2b88d473706786064c0 |
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
meson.build | 20 ++++++++++++++++ |
||||
|
tools/wireshark/src/meson.build | 1 + |
||||
|
tools/wireshark/src/packet-libvirt.c | 35 ++++++++++++++++++++++------ |
||||
|
3 files changed, 49 insertions(+), 7 deletions(-) |
||||
|
|
||||
|
diff --git a/meson.build b/meson.build
|
||||
|
index bcc18b20e5..a1e0e5ecd5 100644
|
||||
|
--- a/meson.build
|
||||
|
+++ b/meson.build
|
||||
|
@@ -1365,6 +1365,26 @@ if wireshark_dep.found()
|
||||
|
if cc.check_header('wireshark/ws_version.h') |
||||
|
conf.set('WITH_WS_VERSION', 1) |
||||
|
endif |
||||
|
+
|
||||
|
+ # Find wmem.h
|
||||
|
+ # But it's not as easy as you'd think. Ubuntu 20.04 has split parts of
|
||||
|
+ # libwireshark.so into libwsutil.so but:
|
||||
|
+ # a) wireshark.pc never mentions it,
|
||||
|
+ # b) libwsutil-dev package doesn't install pkg-config file.
|
||||
|
+ # Fortunately, it's fixed in 24.04.
|
||||
|
+ if cc.check_header('wireshark/epan/wmem/wmem.h', dependencies: wireshark_dep)
|
||||
|
+ conf.set('WITH_WS_EPAN_WMEM', 1)
|
||||
|
+ elif cc.check_header('wireshark/wsutil/wmem/wmem.h', dependencies: wireshark_dep)
|
||||
|
+ conf.set('WITH_WS_WSUTIL_WMEM', 1)
|
||||
|
+ else
|
||||
|
+ error('Unable to locate wmem.h file')
|
||||
|
+ endif
|
||||
|
+
|
||||
|
+ # TODO: drop wsutil dep once support for Ubuntu 20.04 is dropped
|
||||
|
+ wsutil_dep = dependency('', required: false)
|
||||
|
+ if not cc.has_function('wmem_free', dependencies: wireshark_dep)
|
||||
|
+ wsutil_dep = cc.find_library('wsutil', required: true)
|
||||
|
+ endif
|
||||
|
endif |
||||
|
|
||||
|
# generic build dependencies checks |
||||
|
diff --git a/tools/wireshark/src/meson.build b/tools/wireshark/src/meson.build
|
||||
|
index 9b452dc5ca..ba0df913e0 100644
|
||||
|
--- a/tools/wireshark/src/meson.build
|
||||
|
+++ b/tools/wireshark/src/meson.build
|
||||
|
@@ -9,6 +9,7 @@ shared_library(
|
||||
|
], |
||||
|
dependencies: [ |
||||
|
wireshark_dep, |
||||
|
+ wsutil_dep,
|
||||
|
xdr_dep, |
||||
|
tools_dep, |
||||
|
], |
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index f6ad2c4578..3178ac6f27 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -21,6 +21,11 @@
|
||||
|
#include <wireshark/epan/proto.h> |
||||
|
#include <wireshark/epan/packet.h> |
||||
|
#include <wireshark/epan/dissectors/packet-tcp.h> |
||||
|
+#ifdef WITH_WS_EPAN_WMEM
|
||||
|
+# include <wireshark/epan/wmem/wmem.h>
|
||||
|
+#elif WITH_WS_WSUTIL_WMEM
|
||||
|
+# include <wireshark/wsutil/wmem/wmem.h>
|
||||
|
+#endif
|
||||
|
#include <rpc/types.h> |
||||
|
#include <rpc/xdr.h> |
||||
|
#include "packet-libvirt.h" |
||||
|
@@ -140,13 +145,19 @@ static const value_string status_strings[] = {
|
||||
|
{ -1, NULL } |
||||
|
}; |
||||
|
|
||||
|
-static const char *
|
||||
|
+static char *
|
||||
|
G_GNUC_PRINTF(3, 0) |
||||
|
vir_val_to_str(const uint32_t val, |
||||
|
const value_string *vs, |
||||
|
const char *fmt) |
||||
|
{ |
||||
|
- return val_to_str(val, vs, fmt);
|
||||
|
+ return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt);
|
||||
|
+}
|
||||
|
+
|
||||
|
+static void
|
||||
|
+vir_wmem_free(void *ptr)
|
||||
|
+{
|
||||
|
+ wmem_free(wmem_packet_scope(), ptr);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
@@ -462,6 +473,10 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
uint32_t prog, serial; |
||||
|
int32_t proc, type, status; |
||||
|
const value_string *vs; |
||||
|
+ char *prog_str = NULL;
|
||||
|
+ char *proc_str = NULL;
|
||||
|
+ char *type_str = NULL;
|
||||
|
+ char *status_str = NULL;
|
||||
|
|
||||
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); |
||||
|
col_clear(pinfo->cinfo, COL_INFO); |
||||
|
@@ -474,15 +489,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
serial = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
status = tvb_get_ntohil(tvb, offset); offset += 4; |
||||
|
|
||||
|
- col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s",
|
||||
|
- vir_val_to_str(prog, program_strings, "%x"));
|
||||
|
+ prog_str = vir_val_to_str(prog, program_strings, "%x");
|
||||
|
+ col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str);
|
||||
|
+ vir_wmem_free(prog_str);
|
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d"));
|
||||
|
+ proc_str = vir_val_to_str(proc, vs, "%d");
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str);
|
||||
|
+ vir_wmem_free(proc_str);
|
||||
|
|
||||
|
+ type_str = vir_val_to_str(type, type_strings, "%d");
|
||||
|
+ status_str = vir_val_to_str(status, status_strings, "%d");
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
- vir_val_to_str(type, type_strings, "%d"), serial,
|
||||
|
- vir_val_to_str(status, status_strings, "%d"));
|
||||
|
+ type_str, serial, status_str);
|
||||
|
+ vir_wmem_free(status_str);
|
||||
|
+ vir_wmem_free(type_str);
|
||||
|
|
||||
|
if (tree) { |
||||
|
gint *hf_proc; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,493 @@ |
|||||
|
From b42a12174c787b99cd6fcb29b44e4b13bd64ee58 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <b42a12174c787b99cd6fcb29b44e4b13bd64ee58.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 15:22:34 +0200 |
||||
|
Subject: [PATCH 8/8] wireshark: Adapt to wireshark-4.6.0 |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
The main difference is that wmem_packet_scope() is gone [1] but |
||||
|
the packet_info struct has 'pool` member which points to the |
||||
|
allocator used for given packet. |
||||
|
|
||||
|
Unfortunately, while we were given pointer to packet_info at the |
||||
|
entry level to our dissector (dissect_libvirt() -> |
||||
|
tcp_dissect_pdus() -> dissect_libvirt_message()) it was never |
||||
|
propagated to generated/primitive dissectors. |
||||
|
|
||||
|
But not all dissectors need to allocate memory, so mark the new |
||||
|
argument as unused. And while our generator could be rewritten so |
||||
|
that the argument is annotated as unused iff it's really unused, |
||||
|
I couldn't bother rewriting it. It's generated code after all. |
||||
|
Too much work for little gain. |
||||
|
|
||||
|
Another significant change is that val_to_str() now requires new |
||||
|
argument: pointer to allocator to use because it always allocates |
||||
|
new memory [2][3]. |
||||
|
|
||||
|
1: https://gitlab.com/wireshark/wireshark/-/commit/5ca5c9ca372e06881b23ba9f4fdcb6b479886444 |
||||
|
2: https://gitlab.com/wireshark/wireshark/-/commit/b63599762468e4cf1783419a5556377604d344bb |
||||
|
3: https://gitlab.com/wireshark/wireshark/-/commit/84799be215313e61b83a3eaf074f89d6ee349b8c |
||||
|
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/823 |
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 157 +++++++++++++++++++-------- |
||||
|
tools/wireshark/util/genxdrstub.pl | 18 +-- |
||||
|
2 files changed, 119 insertions(+), 56 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index 3178ac6f27..c5c8fb4756 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -63,7 +63,7 @@ static gint ett_libvirt_stream_hole = -1;
|
||||
|
|
||||
|
#define XDR_PRIMITIVE_DISSECTOR(xtype, ctype, ftype) \ |
||||
|
static gboolean \ |
||||
|
- dissect_xdr_##xtype(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) \
|
||||
|
+ dissect_xdr_##xtype(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) \
|
||||
|
{ \ |
||||
|
goffset start; \ |
||||
|
ctype val; \ |
||||
|
@@ -93,7 +93,7 @@ XDR_PRIMITIVE_DISSECTOR(bool, bool_t, boolean)
|
||||
|
|
||||
|
VIR_WARNINGS_RESET |
||||
|
|
||||
|
-typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf);
|
||||
|
+typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, XDR *xdrs, int hf);
|
||||
|
|
||||
|
typedef struct vir_dissector_index vir_dissector_index_t; |
||||
|
struct vir_dissector_index { |
||||
|
@@ -146,22 +146,32 @@ static const value_string status_strings[] = {
|
||||
|
}; |
||||
|
|
||||
|
static char * |
||||
|
-G_GNUC_PRINTF(3, 0)
|
||||
|
-vir_val_to_str(const uint32_t val,
|
||||
|
+G_GNUC_PRINTF(4, 0)
|
||||
|
+vir_val_to_str(packet_info *pinfo,
|
||||
|
+ const uint32_t val,
|
||||
|
const value_string *vs, |
||||
|
const char *fmt) |
||||
|
{ |
||||
|
- return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt);
|
||||
|
+#if WIRESHARK_VERSION < 4006000
|
||||
|
+ return val_to_str_wmem(pinfo->pool, val, vs, fmt);
|
||||
|
+#else
|
||||
|
+ return val_to_str(pinfo->pool, val, vs, fmt);
|
||||
|
+#endif
|
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
-vir_wmem_free(void *ptr)
|
||||
|
+vir_wmem_free(packet_info *pinfo,
|
||||
|
+ void *ptr)
|
||||
|
{ |
||||
|
- wmem_free(wmem_packet_scope(), ptr);
|
||||
|
+ wmem_free(pinfo->pool, ptr);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_string(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
guint32 maxlen) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -179,7 +189,11 @@ dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_opaque(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
guint32 size) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -190,7 +204,7 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
start = xdr_getpos(xdrs); |
||||
|
if ((rc = xdr_opaque(xdrs, (caddr_t)val, size))) { |
||||
|
gint len = xdr_getpos(xdrs) - start; |
||||
|
- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
|
+ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len);
|
||||
|
|
||||
|
proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); |
||||
|
} else { |
||||
|
@@ -202,7 +216,11 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_bytes(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
guint32 maxlen) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -212,7 +230,7 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
start = xdr_getpos(xdrs); |
||||
|
if (xdr_bytes(xdrs, (char **)&val, &length, maxlen)) { |
||||
|
gint len = xdr_getpos(xdrs) - start; |
||||
|
- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
|
+ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len);
|
||||
|
|
||||
|
proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); |
||||
|
free(val); |
||||
|
@@ -224,7 +242,11 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_pointer(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
vir_xdr_dissector_t dissect) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -236,7 +258,7 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
return FALSE; |
||||
|
} |
||||
|
if (not_null) { |
||||
|
- return dissect(tvb, tree, xdrs, hf);
|
||||
|
+ return dissect(tvb, pinfo, tree, xdrs, hf);
|
||||
|
} else { |
||||
|
proto_item *ti; |
||||
|
ti = proto_tree_add_item(tree, hf, tvb, start, xdr_getpos(xdrs) - start, ENC_NA); |
||||
|
@@ -246,15 +268,22 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf,
|
||||
|
- guint32 length, vir_xdr_dissector_t dissect, goffset start)
|
||||
|
+dissect_xdr_iterable(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_item *ti,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ gint ett,
|
||||
|
+ int rhf,
|
||||
|
+ guint32 length,
|
||||
|
+ vir_xdr_dissector_t dissect,
|
||||
|
+ goffset start)
|
||||
|
{ |
||||
|
proto_tree *tree; |
||||
|
guint32 i; |
||||
|
|
||||
|
tree = proto_item_add_subtree(ti, ett); |
||||
|
for (i = 0; i < length; i++) { |
||||
|
- if (!dissect(tvb, tree, xdrs, rhf))
|
||||
|
+ if (!dissect(tvb, pinfo, tree, xdrs, rhf))
|
||||
|
return FALSE; |
||||
|
} |
||||
|
proto_item_set_len(ti, xdr_getpos(xdrs) - start); |
||||
|
@@ -262,8 +291,16 @@ dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
- int rhf, const gchar *rtype, guint32 size, vir_xdr_dissector_t dissect)
|
||||
|
+dissect_xdr_vector(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
+ gint ett,
|
||||
|
+ int rhf,
|
||||
|
+ const gchar *rtype,
|
||||
|
+ guint32 size,
|
||||
|
+ vir_xdr_dissector_t dissect)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -271,12 +308,20 @@ dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
start = xdr_getpos(xdrs); |
||||
|
ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); |
||||
|
proto_item_append_text(ti, " :: %s[%u]", rtype, size); |
||||
|
- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, size, dissect, start);
|
||||
|
+ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, size, dissect, start);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
- int rhf, const gchar *rtype, guint32 maxlen, vir_xdr_dissector_t dissect)
|
||||
|
+dissect_xdr_array(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
+ gint ett,
|
||||
|
+ int rhf,
|
||||
|
+ const gchar *rtype,
|
||||
|
+ guint32 maxlen,
|
||||
|
+ vir_xdr_dissector_t dissect)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -291,7 +336,7 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
|
||||
|
ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); |
||||
|
proto_item_append_text(ti, " :: %s<%u>", rtype, length); |
||||
|
- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, length, dissect, start);
|
||||
|
+ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, length, dissect, start);
|
||||
|
} |
||||
|
|
||||
|
static vir_xdr_dissector_t |
||||
|
@@ -340,7 +385,10 @@ find_payload_dissector(int32_t proc,
|
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
-dissect_libvirt_stream(tvbuff_t *tvb, proto_tree *tree, gint payload_length)
|
||||
|
+dissect_libvirt_stream(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ gint payload_length)
|
||||
|
{ |
||||
|
proto_tree_add_item(tree, hf_libvirt_stream, tvb, VIR_HEADER_LEN, |
||||
|
payload_length - VIR_HEADER_LEN, ENC_NA); |
||||
|
@@ -357,6 +405,7 @@ dissect_libvirt_num_of_fds(tvbuff_t *tvb, proto_tree *tree)
|
||||
|
|
||||
|
static void |
||||
|
dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, |
||||
|
+ packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
gint start G_GNUC_UNUSED, |
||||
|
gint32 nfds G_GNUC_UNUSED) |
||||
|
{ |
||||
|
@@ -364,8 +413,12 @@ dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED,
|
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
-dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_length,
|
||||
|
- gint32 status, vir_xdr_dissector_t dissect)
|
||||
|
+dissect_libvirt_payload_xdr_data(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ gint payload_length,
|
||||
|
+ gint32 status,
|
||||
|
+ vir_xdr_dissector_t dissect)
|
||||
|
{ |
||||
|
gint32 nfds = 0; |
||||
|
gint start = VIR_HEADER_LEN; |
||||
|
@@ -384,17 +437,21 @@ dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_l
|
||||
|
payload_data = (caddr_t)tvb_memdup(NULL, payload_tvb, 0, payload_length); |
||||
|
xdrmem_create(&xdrs, payload_data, payload_length, XDR_DECODE); |
||||
|
|
||||
|
- dissect(payload_tvb, tree, &xdrs, -1);
|
||||
|
+ dissect(payload_tvb, pinfo, tree, &xdrs, -1);
|
||||
|
|
||||
|
xdr_destroy(&xdrs); |
||||
|
g_free(payload_data); |
||||
|
|
||||
|
if (nfds != 0) |
||||
|
- dissect_libvirt_fds(tvb, start + payload_length, nfds);
|
||||
|
+ dissect_libvirt_fds(tvb, pinfo, start + payload_length, nfds);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+dissect_xdr_stream_hole(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -411,10 +468,10 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
tree = proto_item_add_subtree(ti, ett_libvirt_stream_hole); |
||||
|
|
||||
|
hf = hf_libvirt_stream_hole_length; |
||||
|
- if (!dissect_xdr_hyper(tvb, tree, xdrs, hf)) return FALSE;
|
||||
|
+ if (!dissect_xdr_hyper(tvb, pinfo, tree, xdrs, hf)) return FALSE;
|
||||
|
|
||||
|
hf = hf_libvirt_stream_hole_flags; |
||||
|
- if (!dissect_xdr_u_int(tvb, tree, xdrs, hf)) return FALSE;
|
||||
|
+ if (!dissect_xdr_u_int(tvb, pinfo, tree, xdrs, hf)) return FALSE;
|
||||
|
|
||||
|
proto_item_set_len(ti, xdr_getpos(xdrs) - start); |
||||
|
return TRUE; |
||||
|
@@ -424,6 +481,7 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
|
||||
|
static void |
||||
|
dissect_libvirt_payload(tvbuff_t *tvb, |
||||
|
+ packet_info *pinfo,
|
||||
|
proto_tree *tree, |
||||
|
uint32_t prog, |
||||
|
int32_t proc, |
||||
|
@@ -447,13 +505,13 @@ dissect_libvirt_payload(tvbuff_t *tvb,
|
||||
|
xd = find_payload_dissector(proc, type, pds, *len); |
||||
|
if (xd == NULL) |
||||
|
goto unknown; |
||||
|
- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, xd);
|
||||
|
+ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, xd);
|
||||
|
} else if (status == VIR_NET_ERROR) { |
||||
|
- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_remote_error);
|
||||
|
+ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_remote_error);
|
||||
|
} else if (type == VIR_NET_STREAM) { /* implicitly, status == VIR_NET_CONTINUE */ |
||||
|
- dissect_libvirt_stream(tvb, tree, payload_length);
|
||||
|
+ dissect_libvirt_stream(tvb, pinfo, tree, payload_length);
|
||||
|
} else if (type == VIR_NET_STREAM_HOLE) { |
||||
|
- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_stream_hole);
|
||||
|
+ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_stream_hole);
|
||||
|
} else { |
||||
|
goto unknown; |
||||
|
} |
||||
|
@@ -489,21 +547,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
serial = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
status = tvb_get_ntohil(tvb, offset); offset += 4; |
||||
|
|
||||
|
- prog_str = vir_val_to_str(prog, program_strings, "%x");
|
||||
|
+ prog_str = vir_val_to_str(pinfo, prog, program_strings, "%x");
|
||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); |
||||
|
- vir_wmem_free(prog_str);
|
||||
|
+ vir_wmem_free(pinfo, prog_str);
|
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- proc_str = vir_val_to_str(proc, vs, "%d");
|
||||
|
+ proc_str = vir_val_to_str(pinfo, proc, vs, "%d");
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); |
||||
|
- vir_wmem_free(proc_str);
|
||||
|
+ vir_wmem_free(pinfo, proc_str);
|
||||
|
|
||||
|
- type_str = vir_val_to_str(type, type_strings, "%d");
|
||||
|
- status_str = vir_val_to_str(status, status_strings, "%d");
|
||||
|
+ type_str = vir_val_to_str(pinfo, type, type_strings, "%d");
|
||||
|
+ status_str = vir_val_to_str(pinfo, status, status_strings, "%d");
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
type_str, serial, status_str); |
||||
|
- vir_wmem_free(status_str);
|
||||
|
- vir_wmem_free(type_str);
|
||||
|
+ vir_wmem_free(pinfo, status_str);
|
||||
|
+ vir_wmem_free(pinfo, type_str);
|
||||
|
|
||||
|
if (tree) { |
||||
|
gint *hf_proc; |
||||
|
@@ -532,21 +590,26 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
proto_tree_add_item(libvirt_tree, hf_libvirt_status, tvb, offset, 4, ENC_NA); offset += 4; |
||||
|
|
||||
|
/* Dissect payload remaining */ |
||||
|
- dissect_libvirt_payload(tvb, libvirt_tree, prog, proc, type, status);
|
||||
|
+ dissect_libvirt_payload(tvb, pinfo, libvirt_tree, prog, proc, type, status);
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
static guint |
||||
|
-get_message_len(packet_info *pinfo G_GNUC_UNUSED, tvbuff_t *tvb, int offset, void *data G_GNUC_UNUSED)
|
||||
|
+get_message_len(packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
+ tvbuff_t *tvb,
|
||||
|
+ int offset,
|
||||
|
+ void *data G_GNUC_UNUSED)
|
||||
|
{ |
||||
|
return tvb_get_ntohl(tvb, offset); |
||||
|
} |
||||
|
|
||||
|
static int |
||||
|
-dissect_libvirt(tvbuff_t *tvb, packet_info *pinfo,
|
||||
|
- proto_tree *tree, void *data G_GNUC_UNUSED)
|
||||
|
+dissect_libvirt(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ void *data G_GNUC_UNUSED)
|
||||
|
{ |
||||
|
/* Another magic const - 4; simply, how much bytes |
||||
|
* is needed to tell the length of libvirt packet. */ |
||||
|
diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl
|
||||
|
index 01b663a88c..f69695c091 100755
|
||||
|
--- a/tools/wireshark/util/genxdrstub.pl
|
||||
|
+++ b/tools/wireshark/util/genxdrstub.pl
|
||||
|
@@ -250,7 +250,7 @@ sub xdr_type {
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my $name = $c->rinc( 'dissect_xdr_'.($self->idstrip || lc($self->xdr_type)) ); |
||||
|
- "$name(tvb, tree, xdrs, hf)";
|
||||
|
+ "$name(tvb, pinfo, tree, xdrs, hf)";
|
||||
|
} |
||||
|
|
||||
|
sub ft_type { |
||||
|
@@ -345,7 +345,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self) = @_; |
||||
|
my ($klass) = ref($self) =~ /([^:]+)$/; |
||||
|
- sprintf '%s(tvb, tree, xdrs, hf, %s)',
|
||||
|
+ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)',
|
||||
|
$c->rinc('dissect_xdr_'.lc($klass)), |
||||
|
$c->rinc('dissect_xdr_'.$self->reftype->idstrip); |
||||
|
} |
||||
|
@@ -359,7 +359,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my ($klass) = ref($self) =~ /([^:]+)$/; |
||||
|
- sprintf '%s(tvb, tree, xdrs, hf, %s)',
|
||||
|
+ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)',
|
||||
|
$c->rinc('dissect_xdr_'.lc($klass)), $self->length || '~0'; |
||||
|
} |
||||
|
|
||||
|
@@ -447,7 +447,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my ($pname) = reverse split /__/, $hfid; |
||||
|
- sprintf 'dissect_xdr_array(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
+ sprintf 'dissect_xdr_array(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
$c->rinc('ett_'.$self->idstrip), |
||||
|
$c->rinc("hf_$hfid\__$pname"), |
||||
|
$self->reftype->idstrip, |
||||
|
@@ -476,7 +476,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my ($pname) = reverse split /__/, $hfid; |
||||
|
- sprintf 'dissect_xdr_vector(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
+ sprintf 'dissect_xdr_vector(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
$c->rinc('ett_'.$self->idstrip), |
||||
|
$c->rinc("hf_$hfid\__$pname"), |
||||
|
$self->reftype->idstrip, |
||||
|
@@ -857,7 +857,7 @@ __END__<<DUMMY # Dummy heredoc to disable perl syntax highlighting
|
||||
|
my ($self, $ident) = @_; |
||||
|
return if $self->is_primitive; |
||||
|
%> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
return <%= $self->dealias->render_caller($self->ident eq $ident ? undef : $ident) %>; |
||||
|
} |
||||
|
@@ -865,7 +865,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *
|
||||
|
<% my ($self, $ident) = @_; |
||||
|
my $hfvar = $c->rinc('hf_'.$self->idstrip); |
||||
|
%> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -890,7 +890,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *
|
||||
|
} |
||||
|
@@ Sym::Type::Enum#render_dissector |
||||
|
<% my ($self, $ident) = @_; %> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
enum { DUMMY } es; |
||||
|
@@ -914,7 +914,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *
|
||||
|
my ($self, $ident) = @_; |
||||
|
my $decl_type = $self->decl->type->idstrip; |
||||
|
%> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
gboolean rc = TRUE; |
||||
|
goffset start; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,3 @@ |
|||||
|
version https://git-lfs.github.com/spec/v1 |
||||
|
oid sha256:3b8f64583d114decb8ca5efecffaf233b22827c10ff27c84d79e93b7d363bbf6 |
||||
|
size 34392768 |
||||
@ -0,0 +1,36 @@ |
|||||
|
From b825bb556bd3967bf5422c243b77bd4038e317e2 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Mon, 13 Oct 2025 10:34:51 +0200 |
||||
|
Subject: [PATCH 1/8] wireshark: Drop needless declaration of |
||||
|
proto_register_libvirt() and proto_reg_handoff_libvirt() |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Both proto_register_libvirt() and proto_reg_handoff_libvirt() are |
||||
|
declared in packet-libvirt.h which is included from plugin.c. |
||||
|
There's no need to provide another declaration in plugin.c. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/plugin.c | 3 --- |
||||
|
1 file changed, 3 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c
|
||||
|
index 9a83f2ca07..19b25e7b1a 100644
|
||||
|
--- a/tools/wireshark/src/plugin.c
|
||||
|
+++ b/tools/wireshark/src/plugin.c
|
||||
|
@@ -72,9 +72,6 @@ void plugin_register(void)
|
||||
|
|
||||
|
#else /* WIRESHARK_VERSION >= 2009000 */ |
||||
|
|
||||
|
-void proto_register_libvirt(void);
|
||||
|
-void proto_reg_handoff_libvirt(void);
|
||||
|
-
|
||||
|
WS_DLL_PUBLIC_DEF const gchar plugin_version[] = PLUGIN_VERSION; |
||||
|
WS_DLL_PUBLIC_DEF const int plugin_want_major = WIRESHARK_VERSION_MAJOR; |
||||
|
WS_DLL_PUBLIC_DEF const int plugin_want_minor = WIRESHARK_VERSION_MINOR; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,47 @@ |
|||||
|
From 41d3b457972bde85991fa7ed6f282370aca4b2af Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <41d3b457972bde85991fa7ed6f282370aca4b2af.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 15:20:05 +0200 |
||||
|
Subject: [PATCH 2/8] wireshark: Switch header files to #pragma once |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
The genxdrstub.pl script generates some header files. But they |
||||
|
use the old pattern to guard against multiple inclusion: |
||||
|
|
||||
|
#ifndef SOMETHING_H |
||||
|
#define SOMETHING_H |
||||
|
... |
||||
|
#endif |
||||
|
|
||||
|
Change the script to generate just '#pragma once' used everywhere |
||||
|
else in our code. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/util/genxdrstub.pl | 5 +---- |
||||
|
1 file changed, 1 insertion(+), 4 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl
|
||||
|
index 8cfda25a27..01b663a88c 100755
|
||||
|
--- a/tools/wireshark/util/genxdrstub.pl
|
||||
|
+++ b/tools/wireshark/util/genxdrstub.pl
|
||||
|
@@ -563,11 +563,8 @@ sub add_header_file {
|
||||
|
local $self->{header_contents} = []; |
||||
|
$self->print("/* *DO NOT MODIFY* this file directly.\n"); |
||||
|
$self->print(" * This file was generated by $0 from libvirt version $libvirt_version */\n"); |
||||
|
- my $ucname = uc $name;
|
||||
|
- $self->print("#ifndef _$ucname\_H_\n");
|
||||
|
- $self->print("#define _$ucname\_H_\n");
|
||||
|
+ $self->print("#pragma once\n");
|
||||
|
$block->(); |
||||
|
- $self->print("#endif /* _$ucname\_H_ */");
|
||||
|
push @{ $self->{headers} }, [ $name, delete $self->{header_contents} ]; |
||||
|
} |
||||
|
|
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,81 @@ |
|||||
|
From 02a0e78bf54c903da8922c56bade9b3298ade351 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <02a0e78bf54c903da8922c56bade9b3298ade351.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Mon, 13 Oct 2025 09:04:17 +0200 |
||||
|
Subject: [PATCH 3/8] wireshark: Move WIRESHARK_VERSION macro definition |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Soon, other parts of the wireshark code will need to |
||||
|
differentiate wrt wireshark version. Therefore, move the
|
||||
|
WIRESHARK_VERSION macro definition among with its deps into |
||||
|
packet-libvirt.h. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.h | 14 ++++++++++++++ |
||||
|
tools/wireshark/src/plugin.c | 14 -------------- |
||||
|
2 files changed, 14 insertions(+), 14 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.h b/tools/wireshark/src/packet-libvirt.h
|
||||
|
index 14e6e13696..15cfcb0534 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.h
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.h
|
||||
|
@@ -19,5 +19,19 @@
|
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
+#ifdef WITH_WS_VERSION
|
||||
|
+# include <wireshark/ws_version.h>
|
||||
|
+#else
|
||||
|
+# include <wireshark/config.h>
|
||||
|
+# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR
|
||||
|
+# define WIRESHARK_VERSION_MINOR VERSION_MINOR
|
||||
|
+# define WIRESHARK_VERSION_MICRO VERSION_MICRO
|
||||
|
+#endif
|
||||
|
+
|
||||
|
+#define WIRESHARK_VERSION \
|
||||
|
+ ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \
|
||||
|
+ (WIRESHARK_VERSION_MINOR * 1000) + \
|
||||
|
+ (WIRESHARK_VERSION_MICRO))
|
||||
|
+
|
||||
|
void proto_register_libvirt(void); |
||||
|
void proto_reg_handoff_libvirt(void); |
||||
|
diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c
|
||||
|
index 19b25e7b1a..64317b5280 100644
|
||||
|
--- a/tools/wireshark/src/plugin.c
|
||||
|
+++ b/tools/wireshark/src/plugin.c
|
||||
|
@@ -12,15 +12,6 @@
|
||||
|
|
||||
|
#include <config.h> |
||||
|
|
||||
|
-#ifdef WITH_WS_VERSION
|
||||
|
-# include <wireshark/ws_version.h>
|
||||
|
-#else
|
||||
|
-# include <wireshark/config.h>
|
||||
|
-# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR
|
||||
|
-# define WIRESHARK_VERSION_MINOR VERSION_MINOR
|
||||
|
-# define WIRESHARK_VERSION_MICRO VERSION_MICRO
|
||||
|
-#endif
|
||||
|
-
|
||||
|
#define HAVE_PLUGINS 1 |
||||
|
#include <wireshark/epan/proto.h> |
||||
|
/* plugins are DLLs */ |
||||
|
@@ -32,11 +23,6 @@
|
||||
|
/* Let the plugin version be the version of libvirt */ |
||||
|
#define PLUGIN_VERSION VERSION |
||||
|
|
||||
|
-#define WIRESHARK_VERSION \
|
||||
|
- ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \
|
||||
|
- (WIRESHARK_VERSION_MINOR * 1000) + \
|
||||
|
- (WIRESHARK_VERSION_MICRO))
|
||||
|
-
|
||||
|
#if WIRESHARK_VERSION < 2005000 |
||||
|
|
||||
|
WS_DLL_PUBLIC_DEF const gchar version[] = VERSION; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,133 @@ |
|||||
|
From 7374c4ecbd591b02f7be4b2918addc6d5852aafb Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <7374c4ecbd591b02f7be4b2918addc6d5852aafb.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Mon, 13 Oct 2025 09:21:30 +0200 |
||||
|
Subject: [PATCH 4/8] wireshark: Fix int type of some virNetMessageHeader |
||||
|
members |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Our virNetMessageHeader is a struct that's declared as follows: |
||||
|
|
||||
|
struct virNetMessageHeader { |
||||
|
unsigned prog; |
||||
|
unsigned vers; |
||||
|
int proc; |
||||
|
virNetMessageType type; |
||||
|
unsigned serial; |
||||
|
virNetMessageStatus status; |
||||
|
}; |
||||
|
|
||||
|
Now, per RFC 4506 enums are also encoded as signed integers. This |
||||
|
means, that only 'prog', 'vers' and 'serial' are really unsigned |
||||
|
integers. The others ('proc', 'type' and 'status') are encoded as |
||||
|
signed integers. Fix their type when dissecting. |
||||
|
|
||||
|
While at it, also follow latest trend in wireshark and switch |
||||
|
from guint32 to uint32_t. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 34 +++++++++++++++++++--------- |
||||
|
1 file changed, 23 insertions(+), 11 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index da2aabd98a..af14c6bed7 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -92,7 +92,7 @@ typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xd
|
||||
|
|
||||
|
typedef struct vir_dissector_index vir_dissector_index_t; |
||||
|
struct vir_dissector_index { |
||||
|
- guint32 proc;
|
||||
|
+ int32_t proc;
|
||||
|
vir_xdr_dissector_t args; |
||||
|
vir_xdr_dissector_t ret; |
||||
|
vir_xdr_dissector_t msg; |
||||
|
@@ -275,8 +275,10 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
} |
||||
|
|
||||
|
static vir_xdr_dissector_t |
||||
|
-find_payload_dissector(guint32 proc, guint32 type,
|
||||
|
- const vir_dissector_index_t *pds, gsize length)
|
||||
|
+find_payload_dissector(int32_t proc,
|
||||
|
+ enum vir_net_message_type type,
|
||||
|
+ const vir_dissector_index_t *pds,
|
||||
|
+ gsize length)
|
||||
|
{ |
||||
|
const vir_dissector_index_t *pd; |
||||
|
guint32 first, last, direction; |
||||
|
@@ -309,6 +311,10 @@ find_payload_dissector(guint32 proc, guint32 type,
|
||||
|
return pd->ret; |
||||
|
case VIR_NET_MESSAGE: |
||||
|
return pd->msg; |
||||
|
+ case VIR_NET_STREAM:
|
||||
|
+ case VIR_NET_STREAM_HOLE:
|
||||
|
+ /* Handled elsewhere */
|
||||
|
+ return NULL;
|
||||
|
} |
||||
|
return NULL; |
||||
|
} |
||||
|
@@ -397,8 +403,12 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
#include "libvirt/protocol.h" |
||||
|
|
||||
|
static void |
||||
|
-dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree,
|
||||
|
- guint32 prog, guint32 proc, guint32 type, guint32 status)
|
||||
|
+dissect_libvirt_payload(tvbuff_t *tvb,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ uint32_t prog,
|
||||
|
+ int32_t proc,
|
||||
|
+ int32_t type,
|
||||
|
+ int32_t status)
|
||||
|
{ |
||||
|
gssize payload_length; |
||||
|
|
||||
|
@@ -430,7 +440,8 @@ dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree,
|
||||
|
return; |
||||
|
|
||||
|
unknown: |
||||
|
- dbg("Cannot determine payload: Prog=%u, Proc=%u, Type=%u, Status=%u", prog, proc, type, status);
|
||||
|
+ dbg("Cannot determine payload: Prog=%u, Proc=%d, Type=%d, Status=%d",
|
||||
|
+ prog, proc, type, status);
|
||||
|
proto_tree_add_item(tree, hf_libvirt_unknown, tvb, VIR_HEADER_LEN, -1, ENC_NA); |
||||
|
} |
||||
|
|
||||
|
@@ -439,7 +450,8 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
void *opaque G_GNUC_UNUSED) |
||||
|
{ |
||||
|
goffset offset; |
||||
|
- guint32 prog, proc, type, serial, status;
|
||||
|
+ uint32_t prog, serial;
|
||||
|
+ int32_t proc, type, status;
|
||||
|
const value_string *vs; |
||||
|
|
||||
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); |
||||
|
@@ -448,17 +460,17 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
offset = 4; /* End of length field */ |
||||
|
prog = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
offset += 4; /* Ignore version header field */ |
||||
|
- proc = tvb_get_ntohl(tvb, offset); offset += 4;
|
||||
|
- type = tvb_get_ntohl(tvb, offset); offset += 4;
|
||||
|
+ proc = tvb_get_ntohil(tvb, offset); offset += 4;
|
||||
|
+ type = tvb_get_ntohil(tvb, offset); offset += 4;
|
||||
|
serial = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
- status = tvb_get_ntohl(tvb, offset); offset += 4;
|
||||
|
+ status = tvb_get_ntohil(tvb, offset); offset += 4;
|
||||
|
|
||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", |
||||
|
val_to_str(prog, program_strings, "%x")); |
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
if (vs == NULL) { |
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%u", proc);
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc);
|
||||
|
} else { |
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); |
||||
|
} |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,46 @@ |
|||||
|
From 1086888f95a322101f8cf53b63c96600ccbeb882 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <1086888f95a322101f8cf53b63c96600ccbeb882.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 19:16:54 +0200 |
||||
|
Subject: [PATCH 5/8] wireshark: Don't special case retval of |
||||
|
get_program_data() in dissect_libvirt_message() |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
The get_program_data() function returns a pointer (in this |
||||
|
specific case to an array of procedure strings) which, if |
||||
|
non-NULL is then passed val_to_str(). Well, if val_to_str() sees |
||||
|
NULL it is treated gracefully, i.e. like if the numeric value |
||||
|
'proc' wasn't found in the array. |
||||
|
|
||||
|
Therefore, there's no need to special case call to |
||||
|
col_append_fstr(). Both result into the same behaviour. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 6 +----- |
||||
|
1 file changed, 1 insertion(+), 5 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index af14c6bed7..6c729801d4 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -469,11 +469,7 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
val_to_str(prog, program_strings, "%x")); |
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- if (vs == NULL) {
|
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc);
|
||||
|
- } else {
|
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d"));
|
||||
|
- }
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d"));
|
||||
|
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
val_to_str(type, type_strings, "%d"), serial, |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,68 @@ |
|||||
|
From ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 18:23:18 +0200 |
||||
|
Subject: [PATCH 6/8] wireshark: Introduce and use vir_val_to_str() |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
Wireshark offers val_to_str() function which converts numeric |
||||
|
value to string by looking up value ('val') in an array ('vs') of |
||||
|
<val, string> pairs. If no corresponding string is found, then |
||||
|
the value is formatted using given 'fmt' string. |
||||
|
|
||||
|
Starting from wireshark-4.6.0 not only this function gained |
||||
|
another argument but also returns a strdup()-ed string. To keep |
||||
|
our code simple, let's introduce a wrapper so which can be then |
||||
|
adjusted as needed. |
||||
|
|
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 17 +++++++++++++---- |
||||
|
1 file changed, 13 insertions(+), 4 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index 6c729801d4..f6ad2c4578 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -140,6 +140,15 @@ static const value_string status_strings[] = {
|
||||
|
{ -1, NULL } |
||||
|
}; |
||||
|
|
||||
|
+static const char *
|
||||
|
+G_GNUC_PRINTF(3, 0)
|
||||
|
+vir_val_to_str(const uint32_t val,
|
||||
|
+ const value_string *vs,
|
||||
|
+ const char *fmt)
|
||||
|
+{
|
||||
|
+ return val_to_str(val, vs, fmt);
|
||||
|
+}
|
||||
|
+
|
||||
|
static gboolean |
||||
|
dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, |
||||
|
guint32 maxlen) |
||||
|
@@ -466,14 +475,14 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
status = tvb_get_ntohil(tvb, offset); offset += 4; |
||||
|
|
||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", |
||||
|
- val_to_str(prog, program_strings, "%x"));
|
||||
|
+ vir_val_to_str(prog, program_strings, "%x"));
|
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d"));
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d"));
|
||||
|
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
- val_to_str(type, type_strings, "%d"), serial,
|
||||
|
- val_to_str(status, status_strings, "%d"));
|
||||
|
+ vir_val_to_str(type, type_strings, "%d"), serial,
|
||||
|
+ vir_val_to_str(status, status_strings, "%d"));
|
||||
|
|
||||
|
if (tree) { |
||||
|
gint *hf_proc; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,165 @@ |
|||||
|
From 002b9f559d69b92e77ab2d234df6966fecdaf0ec Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <002b9f559d69b92e77ab2d234df6966fecdaf0ec.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 19:13:48 +0200 |
||||
|
Subject: [PATCH 7/8] wireshark: Don't leak column strings |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
One of the problems of using val_to_str() is that it may return a |
||||
|
const string from given table ('vs'), OR return an allocated one. |
||||
|
Since the caller has no idea which case it is, it resides to safe |
||||
|
option and don't free returned string. But that might lead to a |
||||
|
memleak. This behaviour is fixed with wireshark-4.6.0 and support |
||||
|
for it will be introduced soon. But first, make vir_val_to_str() |
||||
|
behave like fixed val_to_str() from newer wireshark: just always |
||||
|
allocate the string. |
||||
|
|
||||
|
Now, if val_to_str() needs to allocate new memory it obtains |
||||
|
allocator by calling wmem_packet_scope() which is what we may do |
||||
|
too. |
||||
|
|
||||
|
Hand in hand with that, we need to free the memory using the |
||||
|
correct allocator, hence wmem_free(). But let's put it into a |
||||
|
wrapper vir_wmem_free() because just like val_to_str(), it'll |
||||
|
need additional argument when adapting to new wireshark. |
||||
|
|
||||
|
Oh, and freeing the memory right after col_add_fstr() is safe as |
||||
|
it uses vsnprintf() under the hood to format passed args. |
||||
|
|
||||
|
One last thing, the wmem.h file used to live under epan/wmem/ but |
||||
|
then in v3.5.0~240 [1] was moved to wsutil/wmem/. |
||||
|
|
||||
|
1: https://gitlab.com/wireshark/wireshark/-/commit/7f9c1f5f92c131354fc8b2b88d473706786064c0 |
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
meson.build | 20 ++++++++++++++++ |
||||
|
tools/wireshark/src/meson.build | 1 + |
||||
|
tools/wireshark/src/packet-libvirt.c | 35 ++++++++++++++++++++++------ |
||||
|
3 files changed, 49 insertions(+), 7 deletions(-) |
||||
|
|
||||
|
diff --git a/meson.build b/meson.build
|
||||
|
index bcc18b20e5..a1e0e5ecd5 100644
|
||||
|
--- a/meson.build
|
||||
|
+++ b/meson.build
|
||||
|
@@ -1365,6 +1365,26 @@ if wireshark_dep.found()
|
||||
|
if cc.check_header('wireshark/ws_version.h') |
||||
|
conf.set('WITH_WS_VERSION', 1) |
||||
|
endif |
||||
|
+
|
||||
|
+ # Find wmem.h
|
||||
|
+ # But it's not as easy as you'd think. Ubuntu 20.04 has split parts of
|
||||
|
+ # libwireshark.so into libwsutil.so but:
|
||||
|
+ # a) wireshark.pc never mentions it,
|
||||
|
+ # b) libwsutil-dev package doesn't install pkg-config file.
|
||||
|
+ # Fortunately, it's fixed in 24.04.
|
||||
|
+ if cc.check_header('wireshark/epan/wmem/wmem.h', dependencies: wireshark_dep)
|
||||
|
+ conf.set('WITH_WS_EPAN_WMEM', 1)
|
||||
|
+ elif cc.check_header('wireshark/wsutil/wmem/wmem.h', dependencies: wireshark_dep)
|
||||
|
+ conf.set('WITH_WS_WSUTIL_WMEM', 1)
|
||||
|
+ else
|
||||
|
+ error('Unable to locate wmem.h file')
|
||||
|
+ endif
|
||||
|
+
|
||||
|
+ # TODO: drop wsutil dep once support for Ubuntu 20.04 is dropped
|
||||
|
+ wsutil_dep = dependency('', required: false)
|
||||
|
+ if not cc.has_function('wmem_free', dependencies: wireshark_dep)
|
||||
|
+ wsutil_dep = cc.find_library('wsutil', required: true)
|
||||
|
+ endif
|
||||
|
endif |
||||
|
|
||||
|
# generic build dependencies checks |
||||
|
diff --git a/tools/wireshark/src/meson.build b/tools/wireshark/src/meson.build
|
||||
|
index 9b452dc5ca..ba0df913e0 100644
|
||||
|
--- a/tools/wireshark/src/meson.build
|
||||
|
+++ b/tools/wireshark/src/meson.build
|
||||
|
@@ -9,6 +9,7 @@ shared_library(
|
||||
|
], |
||||
|
dependencies: [ |
||||
|
wireshark_dep, |
||||
|
+ wsutil_dep,
|
||||
|
xdr_dep, |
||||
|
tools_dep, |
||||
|
], |
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index f6ad2c4578..3178ac6f27 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -21,6 +21,11 @@
|
||||
|
#include <wireshark/epan/proto.h> |
||||
|
#include <wireshark/epan/packet.h> |
||||
|
#include <wireshark/epan/dissectors/packet-tcp.h> |
||||
|
+#ifdef WITH_WS_EPAN_WMEM
|
||||
|
+# include <wireshark/epan/wmem/wmem.h>
|
||||
|
+#elif WITH_WS_WSUTIL_WMEM
|
||||
|
+# include <wireshark/wsutil/wmem/wmem.h>
|
||||
|
+#endif
|
||||
|
#include <rpc/types.h> |
||||
|
#include <rpc/xdr.h> |
||||
|
#include "packet-libvirt.h" |
||||
|
@@ -140,13 +145,19 @@ static const value_string status_strings[] = {
|
||||
|
{ -1, NULL } |
||||
|
}; |
||||
|
|
||||
|
-static const char *
|
||||
|
+static char *
|
||||
|
G_GNUC_PRINTF(3, 0) |
||||
|
vir_val_to_str(const uint32_t val, |
||||
|
const value_string *vs, |
||||
|
const char *fmt) |
||||
|
{ |
||||
|
- return val_to_str(val, vs, fmt);
|
||||
|
+ return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt);
|
||||
|
+}
|
||||
|
+
|
||||
|
+static void
|
||||
|
+vir_wmem_free(void *ptr)
|
||||
|
+{
|
||||
|
+ wmem_free(wmem_packet_scope(), ptr);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
@@ -462,6 +473,10 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
uint32_t prog, serial; |
||||
|
int32_t proc, type, status; |
||||
|
const value_string *vs; |
||||
|
+ char *prog_str = NULL;
|
||||
|
+ char *proc_str = NULL;
|
||||
|
+ char *type_str = NULL;
|
||||
|
+ char *status_str = NULL;
|
||||
|
|
||||
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); |
||||
|
col_clear(pinfo->cinfo, COL_INFO); |
||||
|
@@ -474,15 +489,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
serial = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
status = tvb_get_ntohil(tvb, offset); offset += 4; |
||||
|
|
||||
|
- col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s",
|
||||
|
- vir_val_to_str(prog, program_strings, "%x"));
|
||||
|
+ prog_str = vir_val_to_str(prog, program_strings, "%x");
|
||||
|
+ col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str);
|
||||
|
+ vir_wmem_free(prog_str);
|
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d"));
|
||||
|
+ proc_str = vir_val_to_str(proc, vs, "%d");
|
||||
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str);
|
||||
|
+ vir_wmem_free(proc_str);
|
||||
|
|
||||
|
+ type_str = vir_val_to_str(type, type_strings, "%d");
|
||||
|
+ status_str = vir_val_to_str(status, status_strings, "%d");
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
- vir_val_to_str(type, type_strings, "%d"), serial,
|
||||
|
- vir_val_to_str(status, status_strings, "%d"));
|
||||
|
+ type_str, serial, status_str);
|
||||
|
+ vir_wmem_free(status_str);
|
||||
|
+ vir_wmem_free(type_str);
|
||||
|
|
||||
|
if (tree) { |
||||
|
gint *hf_proc; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,493 @@ |
|||||
|
From b42a12174c787b99cd6fcb29b44e4b13bd64ee58 Mon Sep 17 00:00:00 2001 |
||||
|
Message-ID: <b42a12174c787b99cd6fcb29b44e4b13bd64ee58.1760476767.git.crobinso@redhat.com> |
||||
|
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com> |
||||
|
From: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Date: Fri, 10 Oct 2025 15:22:34 +0200 |
||||
|
Subject: [PATCH 8/8] wireshark: Adapt to wireshark-4.6.0 |
||||
|
Content-type: text/plain |
||||
|
|
||||
|
The main difference is that wmem_packet_scope() is gone [1] but |
||||
|
the packet_info struct has 'pool` member which points to the |
||||
|
allocator used for given packet. |
||||
|
|
||||
|
Unfortunately, while we were given pointer to packet_info at the |
||||
|
entry level to our dissector (dissect_libvirt() -> |
||||
|
tcp_dissect_pdus() -> dissect_libvirt_message()) it was never |
||||
|
propagated to generated/primitive dissectors. |
||||
|
|
||||
|
But not all dissectors need to allocate memory, so mark the new |
||||
|
argument as unused. And while our generator could be rewritten so |
||||
|
that the argument is annotated as unused iff it's really unused, |
||||
|
I couldn't bother rewriting it. It's generated code after all. |
||||
|
Too much work for little gain. |
||||
|
|
||||
|
Another significant change is that val_to_str() now requires new |
||||
|
argument: pointer to allocator to use because it always allocates |
||||
|
new memory [2][3]. |
||||
|
|
||||
|
1: https://gitlab.com/wireshark/wireshark/-/commit/5ca5c9ca372e06881b23ba9f4fdcb6b479886444 |
||||
|
2: https://gitlab.com/wireshark/wireshark/-/commit/b63599762468e4cf1783419a5556377604d344bb |
||||
|
3: https://gitlab.com/wireshark/wireshark/-/commit/84799be215313e61b83a3eaf074f89d6ee349b8c |
||||
|
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/823 |
||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> |
||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com> |
||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com> |
||||
|
---
|
||||
|
tools/wireshark/src/packet-libvirt.c | 157 +++++++++++++++++++-------- |
||||
|
tools/wireshark/util/genxdrstub.pl | 18 +-- |
||||
|
2 files changed, 119 insertions(+), 56 deletions(-) |
||||
|
|
||||
|
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
|
index 3178ac6f27..c5c8fb4756 100644
|
||||
|
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
|
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
|
@@ -63,7 +63,7 @@ static gint ett_libvirt_stream_hole = -1;
|
||||
|
|
||||
|
#define XDR_PRIMITIVE_DISSECTOR(xtype, ctype, ftype) \ |
||||
|
static gboolean \ |
||||
|
- dissect_xdr_##xtype(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) \
|
||||
|
+ dissect_xdr_##xtype(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) \
|
||||
|
{ \ |
||||
|
goffset start; \ |
||||
|
ctype val; \ |
||||
|
@@ -93,7 +93,7 @@ XDR_PRIMITIVE_DISSECTOR(bool, bool_t, boolean)
|
||||
|
|
||||
|
VIR_WARNINGS_RESET |
||||
|
|
||||
|
-typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf);
|
||||
|
+typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, XDR *xdrs, int hf);
|
||||
|
|
||||
|
typedef struct vir_dissector_index vir_dissector_index_t; |
||||
|
struct vir_dissector_index { |
||||
|
@@ -146,22 +146,32 @@ static const value_string status_strings[] = {
|
||||
|
}; |
||||
|
|
||||
|
static char * |
||||
|
-G_GNUC_PRINTF(3, 0)
|
||||
|
-vir_val_to_str(const uint32_t val,
|
||||
|
+G_GNUC_PRINTF(4, 0)
|
||||
|
+vir_val_to_str(packet_info *pinfo,
|
||||
|
+ const uint32_t val,
|
||||
|
const value_string *vs, |
||||
|
const char *fmt) |
||||
|
{ |
||||
|
- return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt);
|
||||
|
+#if WIRESHARK_VERSION < 4006000
|
||||
|
+ return val_to_str_wmem(pinfo->pool, val, vs, fmt);
|
||||
|
+#else
|
||||
|
+ return val_to_str(pinfo->pool, val, vs, fmt);
|
||||
|
+#endif
|
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
-vir_wmem_free(void *ptr)
|
||||
|
+vir_wmem_free(packet_info *pinfo,
|
||||
|
+ void *ptr)
|
||||
|
{ |
||||
|
- wmem_free(wmem_packet_scope(), ptr);
|
||||
|
+ wmem_free(pinfo->pool, ptr);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_string(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
guint32 maxlen) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -179,7 +189,11 @@ dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_opaque(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
guint32 size) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -190,7 +204,7 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
start = xdr_getpos(xdrs); |
||||
|
if ((rc = xdr_opaque(xdrs, (caddr_t)val, size))) { |
||||
|
gint len = xdr_getpos(xdrs) - start; |
||||
|
- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
|
+ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len);
|
||||
|
|
||||
|
proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); |
||||
|
} else { |
||||
|
@@ -202,7 +216,11 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_bytes(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
guint32 maxlen) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -212,7 +230,7 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
start = xdr_getpos(xdrs); |
||||
|
if (xdr_bytes(xdrs, (char **)&val, &length, maxlen)) { |
||||
|
gint len = xdr_getpos(xdrs) - start; |
||||
|
- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
|
+ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len);
|
||||
|
|
||||
|
proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); |
||||
|
free(val); |
||||
|
@@ -224,7 +242,11 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
+dissect_xdr_pointer(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
vir_xdr_dissector_t dissect) |
||||
|
{ |
||||
|
goffset start; |
||||
|
@@ -236,7 +258,7 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
return FALSE; |
||||
|
} |
||||
|
if (not_null) { |
||||
|
- return dissect(tvb, tree, xdrs, hf);
|
||||
|
+ return dissect(tvb, pinfo, tree, xdrs, hf);
|
||||
|
} else { |
||||
|
proto_item *ti; |
||||
|
ti = proto_tree_add_item(tree, hf, tvb, start, xdr_getpos(xdrs) - start, ENC_NA); |
||||
|
@@ -246,15 +268,22 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf,
|
||||
|
- guint32 length, vir_xdr_dissector_t dissect, goffset start)
|
||||
|
+dissect_xdr_iterable(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_item *ti,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ gint ett,
|
||||
|
+ int rhf,
|
||||
|
+ guint32 length,
|
||||
|
+ vir_xdr_dissector_t dissect,
|
||||
|
+ goffset start)
|
||||
|
{ |
||||
|
proto_tree *tree; |
||||
|
guint32 i; |
||||
|
|
||||
|
tree = proto_item_add_subtree(ti, ett); |
||||
|
for (i = 0; i < length; i++) { |
||||
|
- if (!dissect(tvb, tree, xdrs, rhf))
|
||||
|
+ if (!dissect(tvb, pinfo, tree, xdrs, rhf))
|
||||
|
return FALSE; |
||||
|
} |
||||
|
proto_item_set_len(ti, xdr_getpos(xdrs) - start); |
||||
|
@@ -262,8 +291,16 @@ dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
- int rhf, const gchar *rtype, guint32 size, vir_xdr_dissector_t dissect)
|
||||
|
+dissect_xdr_vector(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
+ gint ett,
|
||||
|
+ int rhf,
|
||||
|
+ const gchar *rtype,
|
||||
|
+ guint32 size,
|
||||
|
+ vir_xdr_dissector_t dissect)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -271,12 +308,20 @@ dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
start = xdr_getpos(xdrs); |
||||
|
ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); |
||||
|
proto_item_append_text(ti, " :: %s[%u]", rtype, size); |
||||
|
- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, size, dissect, start);
|
||||
|
+ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, size, dissect, start);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
- int rhf, const gchar *rtype, guint32 maxlen, vir_xdr_dissector_t dissect)
|
||||
|
+dissect_xdr_array(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf,
|
||||
|
+ gint ett,
|
||||
|
+ int rhf,
|
||||
|
+ const gchar *rtype,
|
||||
|
+ guint32 maxlen,
|
||||
|
+ vir_xdr_dissector_t dissect)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -291,7 +336,7 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett,
|
||||
|
|
||||
|
ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); |
||||
|
proto_item_append_text(ti, " :: %s<%u>", rtype, length); |
||||
|
- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, length, dissect, start);
|
||||
|
+ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, length, dissect, start);
|
||||
|
} |
||||
|
|
||||
|
static vir_xdr_dissector_t |
||||
|
@@ -340,7 +385,10 @@ find_payload_dissector(int32_t proc,
|
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
-dissect_libvirt_stream(tvbuff_t *tvb, proto_tree *tree, gint payload_length)
|
||||
|
+dissect_libvirt_stream(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ gint payload_length)
|
||||
|
{ |
||||
|
proto_tree_add_item(tree, hf_libvirt_stream, tvb, VIR_HEADER_LEN, |
||||
|
payload_length - VIR_HEADER_LEN, ENC_NA); |
||||
|
@@ -357,6 +405,7 @@ dissect_libvirt_num_of_fds(tvbuff_t *tvb, proto_tree *tree)
|
||||
|
|
||||
|
static void |
||||
|
dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, |
||||
|
+ packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
gint start G_GNUC_UNUSED, |
||||
|
gint32 nfds G_GNUC_UNUSED) |
||||
|
{ |
||||
|
@@ -364,8 +413,12 @@ dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED,
|
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
-dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_length,
|
||||
|
- gint32 status, vir_xdr_dissector_t dissect)
|
||||
|
+dissect_libvirt_payload_xdr_data(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ gint payload_length,
|
||||
|
+ gint32 status,
|
||||
|
+ vir_xdr_dissector_t dissect)
|
||||
|
{ |
||||
|
gint32 nfds = 0; |
||||
|
gint start = VIR_HEADER_LEN; |
||||
|
@@ -384,17 +437,21 @@ dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_l
|
||||
|
payload_data = (caddr_t)tvb_memdup(NULL, payload_tvb, 0, payload_length); |
||||
|
xdrmem_create(&xdrs, payload_data, payload_length, XDR_DECODE); |
||||
|
|
||||
|
- dissect(payload_tvb, tree, &xdrs, -1);
|
||||
|
+ dissect(payload_tvb, pinfo, tree, &xdrs, -1);
|
||||
|
|
||||
|
xdr_destroy(&xdrs); |
||||
|
g_free(payload_data); |
||||
|
|
||||
|
if (nfds != 0) |
||||
|
- dissect_libvirt_fds(tvb, start + payload_length, nfds);
|
||||
|
+ dissect_libvirt_fds(tvb, pinfo, start + payload_length, nfds);
|
||||
|
} |
||||
|
|
||||
|
static gboolean |
||||
|
-dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+dissect_xdr_stream_hole(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ XDR *xdrs,
|
||||
|
+ int hf)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -411,10 +468,10 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
tree = proto_item_add_subtree(ti, ett_libvirt_stream_hole); |
||||
|
|
||||
|
hf = hf_libvirt_stream_hole_length; |
||||
|
- if (!dissect_xdr_hyper(tvb, tree, xdrs, hf)) return FALSE;
|
||||
|
+ if (!dissect_xdr_hyper(tvb, pinfo, tree, xdrs, hf)) return FALSE;
|
||||
|
|
||||
|
hf = hf_libvirt_stream_hole_flags; |
||||
|
- if (!dissect_xdr_u_int(tvb, tree, xdrs, hf)) return FALSE;
|
||||
|
+ if (!dissect_xdr_u_int(tvb, pinfo, tree, xdrs, hf)) return FALSE;
|
||||
|
|
||||
|
proto_item_set_len(ti, xdr_getpos(xdrs) - start); |
||||
|
return TRUE; |
||||
|
@@ -424,6 +481,7 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
|
||||
|
static void |
||||
|
dissect_libvirt_payload(tvbuff_t *tvb, |
||||
|
+ packet_info *pinfo,
|
||||
|
proto_tree *tree, |
||||
|
uint32_t prog, |
||||
|
int32_t proc, |
||||
|
@@ -447,13 +505,13 @@ dissect_libvirt_payload(tvbuff_t *tvb,
|
||||
|
xd = find_payload_dissector(proc, type, pds, *len); |
||||
|
if (xd == NULL) |
||||
|
goto unknown; |
||||
|
- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, xd);
|
||||
|
+ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, xd);
|
||||
|
} else if (status == VIR_NET_ERROR) { |
||||
|
- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_remote_error);
|
||||
|
+ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_remote_error);
|
||||
|
} else if (type == VIR_NET_STREAM) { /* implicitly, status == VIR_NET_CONTINUE */ |
||||
|
- dissect_libvirt_stream(tvb, tree, payload_length);
|
||||
|
+ dissect_libvirt_stream(tvb, pinfo, tree, payload_length);
|
||||
|
} else if (type == VIR_NET_STREAM_HOLE) { |
||||
|
- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_stream_hole);
|
||||
|
+ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_stream_hole);
|
||||
|
} else { |
||||
|
goto unknown; |
||||
|
} |
||||
|
@@ -489,21 +547,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
serial = tvb_get_ntohl(tvb, offset); offset += 4; |
||||
|
status = tvb_get_ntohil(tvb, offset); offset += 4; |
||||
|
|
||||
|
- prog_str = vir_val_to_str(prog, program_strings, "%x");
|
||||
|
+ prog_str = vir_val_to_str(pinfo, prog, program_strings, "%x");
|
||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); |
||||
|
- vir_wmem_free(prog_str);
|
||||
|
+ vir_wmem_free(pinfo, prog_str);
|
||||
|
|
||||
|
vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); |
||||
|
- proc_str = vir_val_to_str(proc, vs, "%d");
|
||||
|
+ proc_str = vir_val_to_str(pinfo, proc, vs, "%d");
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); |
||||
|
- vir_wmem_free(proc_str);
|
||||
|
+ vir_wmem_free(pinfo, proc_str);
|
||||
|
|
||||
|
- type_str = vir_val_to_str(type, type_strings, "%d");
|
||||
|
- status_str = vir_val_to_str(status, status_strings, "%d");
|
||||
|
+ type_str = vir_val_to_str(pinfo, type, type_strings, "%d");
|
||||
|
+ status_str = vir_val_to_str(pinfo, status, status_strings, "%d");
|
||||
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", |
||||
|
type_str, serial, status_str); |
||||
|
- vir_wmem_free(status_str);
|
||||
|
- vir_wmem_free(type_str);
|
||||
|
+ vir_wmem_free(pinfo, status_str);
|
||||
|
+ vir_wmem_free(pinfo, type_str);
|
||||
|
|
||||
|
if (tree) { |
||||
|
gint *hf_proc; |
||||
|
@@ -532,21 +590,26 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||
|
proto_tree_add_item(libvirt_tree, hf_libvirt_status, tvb, offset, 4, ENC_NA); offset += 4; |
||||
|
|
||||
|
/* Dissect payload remaining */ |
||||
|
- dissect_libvirt_payload(tvb, libvirt_tree, prog, proc, type, status);
|
||||
|
+ dissect_libvirt_payload(tvb, pinfo, libvirt_tree, prog, proc, type, status);
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
static guint |
||||
|
-get_message_len(packet_info *pinfo G_GNUC_UNUSED, tvbuff_t *tvb, int offset, void *data G_GNUC_UNUSED)
|
||||
|
+get_message_len(packet_info *pinfo G_GNUC_UNUSED,
|
||||
|
+ tvbuff_t *tvb,
|
||||
|
+ int offset,
|
||||
|
+ void *data G_GNUC_UNUSED)
|
||||
|
{ |
||||
|
return tvb_get_ntohl(tvb, offset); |
||||
|
} |
||||
|
|
||||
|
static int |
||||
|
-dissect_libvirt(tvbuff_t *tvb, packet_info *pinfo,
|
||||
|
- proto_tree *tree, void *data G_GNUC_UNUSED)
|
||||
|
+dissect_libvirt(tvbuff_t *tvb,
|
||||
|
+ packet_info *pinfo,
|
||||
|
+ proto_tree *tree,
|
||||
|
+ void *data G_GNUC_UNUSED)
|
||||
|
{ |
||||
|
/* Another magic const - 4; simply, how much bytes |
||||
|
* is needed to tell the length of libvirt packet. */ |
||||
|
diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl
|
||||
|
index 01b663a88c..f69695c091 100755
|
||||
|
--- a/tools/wireshark/util/genxdrstub.pl
|
||||
|
+++ b/tools/wireshark/util/genxdrstub.pl
|
||||
|
@@ -250,7 +250,7 @@ sub xdr_type {
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my $name = $c->rinc( 'dissect_xdr_'.($self->idstrip || lc($self->xdr_type)) ); |
||||
|
- "$name(tvb, tree, xdrs, hf)";
|
||||
|
+ "$name(tvb, pinfo, tree, xdrs, hf)";
|
||||
|
} |
||||
|
|
||||
|
sub ft_type { |
||||
|
@@ -345,7 +345,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self) = @_; |
||||
|
my ($klass) = ref($self) =~ /([^:]+)$/; |
||||
|
- sprintf '%s(tvb, tree, xdrs, hf, %s)',
|
||||
|
+ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)',
|
||||
|
$c->rinc('dissect_xdr_'.lc($klass)), |
||||
|
$c->rinc('dissect_xdr_'.$self->reftype->idstrip); |
||||
|
} |
||||
|
@@ -359,7 +359,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my ($klass) = ref($self) =~ /([^:]+)$/; |
||||
|
- sprintf '%s(tvb, tree, xdrs, hf, %s)',
|
||||
|
+ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)',
|
||||
|
$c->rinc('dissect_xdr_'.lc($klass)), $self->length || '~0'; |
||||
|
} |
||||
|
|
||||
|
@@ -447,7 +447,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my ($pname) = reverse split /__/, $hfid; |
||||
|
- sprintf 'dissect_xdr_array(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
+ sprintf 'dissect_xdr_array(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
$c->rinc('ett_'.$self->idstrip), |
||||
|
$c->rinc("hf_$hfid\__$pname"), |
||||
|
$self->reftype->idstrip, |
||||
|
@@ -476,7 +476,7 @@ BEGIN{::register_profile(
|
||||
|
sub render_caller { |
||||
|
my ($self, $hfid) = @_; |
||||
|
my ($pname) = reverse split /__/, $hfid; |
||||
|
- sprintf 'dissect_xdr_vector(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
+ sprintf 'dissect_xdr_vector(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)',
|
||||
|
$c->rinc('ett_'.$self->idstrip), |
||||
|
$c->rinc("hf_$hfid\__$pname"), |
||||
|
$self->reftype->idstrip, |
||||
|
@@ -857,7 +857,7 @@ __END__<<DUMMY # Dummy heredoc to disable perl syntax highlighting
|
||||
|
my ($self, $ident) = @_; |
||||
|
return if $self->is_primitive; |
||||
|
%> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
return <%= $self->dealias->render_caller($self->ident eq $ident ? undef : $ident) %>; |
||||
|
} |
||||
|
@@ -865,7 +865,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *
|
||||
|
<% my ($self, $ident) = @_; |
||||
|
my $hfvar = $c->rinc('hf_'.$self->idstrip); |
||||
|
%> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
proto_item *ti; |
||||
|
@@ -890,7 +890,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *
|
||||
|
} |
||||
|
@@ Sym::Type::Enum#render_dissector |
||||
|
<% my ($self, $ident) = @_; %> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
goffset start; |
||||
|
enum { DUMMY } es; |
||||
|
@@ -914,7 +914,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *
|
||||
|
my ($self, $ident) = @_; |
||||
|
my $decl_type = $self->decl->type->idstrip; |
||||
|
%> |
||||
|
-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
+static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf)
|
||||
|
{ |
||||
|
gboolean rc = TRUE; |
||||
|
goffset start; |
||||
|
--
|
||||
|
2.51.0 |
||||
|
|
||||
@ -0,0 +1,3 @@ |
|||||
|
version https://git-lfs.github.com/spec/v1 |
||||
|
oid sha256:89f9dec9a5c25a08bd11e738bdf75e24f81e99d4419551917593d49f4d483e8e |
||||
|
size 34404729 |
||||
@ -0,0 +1,168 @@ |
|||||
|
%{?!packager: %define packager Brian Behlendorf <behlendorf1@llnl.gov>} |
||||
|
|
||||
|
%if ! 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} |
||||
|
%define not_rpm 1 |
||||
|
%endif |
||||
|
|
||||
|
# Exclude input files from mangling |
||||
|
%global __brp_mangle_shebangs_exclude_from ^/usr/src/.*$ |
||||
|
|
||||
|
%define module zfs |
||||
|
%define mkconf scripts/dkms.mkconf |
||||
|
|
||||
|
Name: %{module}-dkms |
||||
|
|
||||
|
Version: 2.3.5 |
||||
|
Release: 1%{?dist} |
||||
|
Summary: Kernel module(s) (dkms) |
||||
|
|
||||
|
Group: System Environment/Kernel |
||||
|
License: CDDL |
||||
|
URL: https://github.com/openzfs/zfs |
||||
|
Source0: %{module}-%{version}.tar.gz |
||||
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) |
||||
|
BuildArch: noarch |
||||
|
|
||||
|
Requires: dkms >= 2.2.0.3 |
||||
|
Requires(pre): dkms >= 2.2.0.3 |
||||
|
Requires(post): dkms >= 2.2.0.3 |
||||
|
Requires(preun): dkms >= 2.2.0.3 |
||||
|
Requires: gcc, make, perl, diffutils |
||||
|
Requires(post): gcc, make, perl, diffutils |
||||
|
|
||||
|
# Hold back kernel upgrades if kernel is not supported by ZFS |
||||
|
%if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} |
||||
|
Requires: kernel-devel >= 4.18, kernel-devel <= 6.17.999 |
||||
|
Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.17.999 |
||||
|
Conflicts: kernel-devel < 4.18, kernel-devel > 6.17.999 |
||||
|
Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 |
||||
|
Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 |
||||
|
Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.17.999 |
||||
|
|
||||
|
Obsoletes: spl-dkms <= %{version} |
||||
|
%endif |
||||
|
Provides: %{module}-kmod = %{version} |
||||
|
AutoReqProv: no |
||||
|
|
||||
|
%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) |
||||
|
# We don't directly use it, but if this isn't installed, rpmbuild as root can |
||||
|
# crash+corrupt rpmdb |
||||
|
# See issue #12071 |
||||
|
BuildRequires: ncompress |
||||
|
%endif |
||||
|
|
||||
|
%description |
||||
|
This package contains the dkms ZFS kernel modules. |
||||
|
|
||||
|
%prep |
||||
|
%setup -q -n %{module}-%{version} |
||||
|
|
||||
|
%build |
||||
|
%{mkconf} -n %{module} -v %{version} -f dkms.conf |
||||
|
|
||||
|
%install |
||||
|
if [ "$RPM_BUILD_ROOT" != "/" ]; then |
||||
|
rm -rf $RPM_BUILD_ROOT |
||||
|
fi |
||||
|
mkdir -p $RPM_BUILD_ROOT/usr/src/ |
||||
|
cp -rf ${RPM_BUILD_DIR}/%{module}-%{version} $RPM_BUILD_ROOT/usr/src/ |
||||
|
|
||||
|
%clean |
||||
|
if [ "$RPM_BUILD_ROOT" != "/" ]; then |
||||
|
rm -rf $RPM_BUILD_ROOT |
||||
|
fi |
||||
|
|
||||
|
%files |
||||
|
%defattr(-,root,root) |
||||
|
/usr/src/%{module}-%{version} |
||||
|
|
||||
|
%pre |
||||
|
echo "Running pre installation script: $0. Parameters: $*" |
||||
|
# We don't want any other versions lingering around in dkms. |
||||
|
# Tests with 'dnf' showed that in case of reinstall, or upgrade |
||||
|
# the preun scriptlet removed the version we are trying to install. |
||||
|
# Because of this, find all zfs dkms sources in /var/lib/dkms and |
||||
|
# remove them, if we find a matching version in dkms. |
||||
|
|
||||
|
dkms_root=/var/lib/dkms |
||||
|
if [ -d ${dkms_root}/%{module} ]; then |
||||
|
cd ${dkms_root}/%{module} |
||||
|
for x in [[:digit:]]*; do |
||||
|
[ -d "$x" ] || continue |
||||
|
otherver="$x" |
||||
|
opath="${dkms_root}/%{module}/${otherver}" |
||||
|
if [ "$otherver" != %{version} ]; then |
||||
|
# This is a workaround for a broken 'dkms status', we caused in a previous version. |
||||
|
# One day it might be not needed anymore, but it does not hurt to keep it. |
||||
|
if dkms status -m %{module} -v "$otherver" 2>&1 | grep "${opath}/source/dkms.conf does not exist" |
||||
|
then |
||||
|
echo "ERROR: dkms status is broken!" >&2 |
||||
|
if [ -L "${opath}/source" -a ! -d "${opath}/source" ] |
||||
|
then |
||||
|
echo "Trying to fix it by removing the symlink: ${opath}/source" >&2 |
||||
|
echo "You should manually remove ${opath}" >&2 |
||||
|
rm -f "${opath}/source" || echo "Removal failed!" >&2 |
||||
|
fi |
||||
|
fi |
||||
|
if [ `dkms status -m %{module} -v "$otherver" | grep -c %{module}` -gt 0 ]; then |
||||
|
echo "Removing old %{module} dkms modules version $otherver from all kernels." |
||||
|
dkms remove -m %{module} -v "$otherver" --all ||: |
||||
|
fi |
||||
|
fi |
||||
|
done |
||||
|
cd ${dkms_root} |
||||
|
fi |
||||
|
|
||||
|
# Uninstall this version of zfs dkms modules before installation of the package. |
||||
|
if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then |
||||
|
echo "Removing %{module} dkms modules version %{version} from all kernels." |
||||
|
dkms remove -m %{module} -v %{version} --all ||: |
||||
|
fi |
||||
|
|
||||
|
%post |
||||
|
echo "Running post installation script: $0. Parameters: $*" |
||||
|
# Add the module to dkms, as reccommended in the dkms man page. |
||||
|
# This is generally rpm specfic. |
||||
|
# But this also may help, if we have a broken 'dkms status'. |
||||
|
# Because, if the sources are available and only the symlink pointing |
||||
|
# to them is missing, this will resolve the situation |
||||
|
echo "Adding %{module} dkms modules version %{version} to dkms." |
||||
|
dkms add -m %{module} -v %{version} %{!?not_rpm:--rpm_safe_upgrade} ||: |
||||
|
|
||||
|
# After installing the package, dkms install this zfs version for the current kernel. |
||||
|
# Force the overwriting of old modules to avoid diff warnings in dkms status. |
||||
|
# Or in case of a downgrade to overwrite newer versions. |
||||
|
# Or if some other backed up versions have been restored before. |
||||
|
echo "Installing %{module} dkms modules version %{version} for the current kernel." |
||||
|
dkms install --force -m %{module} -v %{version} ||: |
||||
|
|
||||
|
%preun |
||||
|
dkms_root="/var/lib/dkms/%{module}/%{version}" |
||||
|
echo "Running pre uninstall script: $0. Parameters: $*" |
||||
|
# In case of upgrade we do nothing. See above comment in pre hook. |
||||
|
if [ "$1" = "1" -o "$1" = "upgrade" ] ; then |
||||
|
echo "This is an upgrade. Skipping pre uninstall action." |
||||
|
exit 0 |
||||
|
fi |
||||
|
|
||||
|
# Check if we uninstall the package. In that case remove the dkms modules. |
||||
|
# '0' is the value for the first parameter for rpm packages. |
||||
|
# 'remove' or 'purge' are the possible names for deb packages. |
||||
|
if [ "$1" = "0" -o "$1" = "remove" -o "$1" = "purge" ] ; then |
||||
|
if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then |
||||
|
echo "Removing %{module} dkms modules version %{version} from all kernels." |
||||
|
dkms remove -m %{module} -v %{version} --all %{!?not_rpm:--rpm_safe_upgrade} && exit 0 |
||||
|
fi |
||||
|
# If removing the modules failed, it might be because of the broken 'dkms status'. |
||||
|
if dkms status -m %{module} -v %{version} 2>&1 | grep "${dkms_root}/source/dkms.conf does not exist" |
||||
|
then |
||||
|
echo "ERROR: dkms status is broken!" >&2 |
||||
|
echo "You should manually remove ${dkms_root}" >&2 |
||||
|
echo "WARNING: installed modules in /lib/modules/`uname -r`/extra could not be removed automatically!" >&2 |
||||
|
fi |
||||
|
else |
||||
|
echo "Script parameter $1 did not match any removal condition." |
||||
|
fi |
||||
|
|
||||
|
exit 0 |
||||
|
|
||||
@ -0,0 +1,604 @@ |
|||||
|
%global _sbindir /sbin |
||||
|
%global _libdir /%{_lib} |
||||
|
|
||||
|
# Set the default udev directory based on distribution. |
||||
|
%if %{undefined _udevdir} |
||||
|
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} |
||||
|
%global _udevdir %{_prefix}/lib/udev |
||||
|
%else |
||||
|
%global _udevdir /lib/udev |
||||
|
%endif |
||||
|
%endif |
||||
|
|
||||
|
# Set the default udevrule directory based on distribution. |
||||
|
%if %{undefined _udevruledir} |
||||
|
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} |
||||
|
%global _udevruledir %{_prefix}/lib/udev/rules.d |
||||
|
%else |
||||
|
%global _udevruledir /lib/udev/rules.d |
||||
|
%endif |
||||
|
%endif |
||||
|
|
||||
|
# Set the default _bashcompletiondir directory based on distribution. |
||||
|
%if %{undefined _bashcompletiondir} |
||||
|
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} |
||||
|
%global _bashcompletiondir /etc/bash_completion.d |
||||
|
%else |
||||
|
%global _bashcompletiondir /usr/share/bash-completion |
||||
|
%endif |
||||
|
%endif |
||||
|
|
||||
|
# Set the default dracut directory based on distribution. |
||||
|
%if %{undefined _dracutdir} |
||||
|
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} |
||||
|
%global _dracutdir %{_prefix}/lib/dracut |
||||
|
%else |
||||
|
%global _dracutdir %{_prefix}/share/dracut |
||||
|
%endif |
||||
|
%endif |
||||
|
|
||||
|
%if %{undefined _initconfdir} |
||||
|
%global _initconfdir /etc/sysconfig |
||||
|
%endif |
||||
|
|
||||
|
%if %{undefined _unitdir} |
||||
|
%global _unitdir %{_prefix}/lib/systemd/system |
||||
|
%endif |
||||
|
|
||||
|
%if %{undefined _presetdir} |
||||
|
%global _presetdir %{_prefix}/lib/systemd/system-preset |
||||
|
%endif |
||||
|
|
||||
|
%if %{undefined _modulesloaddir} |
||||
|
%global _modulesloaddir %{_prefix}/lib/modules-load.d |
||||
|
%endif |
||||
|
|
||||
|
%if %{undefined _systemdgeneratordir} |
||||
|
%global _systemdgeneratordir %{_prefix}/lib/systemd/system-generators |
||||
|
%endif |
||||
|
|
||||
|
%if %{undefined _pkgconfigdir} |
||||
|
%global _pkgconfigdir %{_prefix}/%{_lib}/pkgconfig |
||||
|
%endif |
||||
|
|
||||
|
%bcond_with debug |
||||
|
%bcond_with debuginfo |
||||
|
%bcond_with asan |
||||
|
%bcond_with ubsan |
||||
|
%bcond_with systemd |
||||
|
%bcond_with pam |
||||
|
%bcond_without pyzfs |
||||
|
|
||||
|
# Generic enable switch for systemd |
||||
|
%if %{with systemd} |
||||
|
%define _systemd 1 |
||||
|
%endif |
||||
|
|
||||
|
# Distros below support systemd |
||||
|
%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} |
||||
|
%define _systemd 1 |
||||
|
%endif |
||||
|
|
||||
|
# When not specified default to distribution provided version. |
||||
|
%if %{undefined __use_python} |
||||
|
%define __python /usr/bin/python3 |
||||
|
%define __python_pkg_version 3 |
||||
|
%else |
||||
|
%define __python %{__use_python} |
||||
|
%define __python_pkg_version %{__use_python_pkg_version} |
||||
|
%endif |
||||
|
%define __python_sitelib %(%{__python} -Esc " |
||||
|
import sysconfig; |
||||
|
if hasattr(sysconfig, 'get_default_scheme'): |
||||
|
scheme = sysconfig.get_default_scheme() |
||||
|
else: |
||||
|
scheme = sysconfig._get_default_scheme() |
||||
|
if scheme == 'posix_local': |
||||
|
scheme = 'posix_prefix' |
||||
|
prefix = '%{_prefix}' |
||||
|
if prefix == 'NONE': |
||||
|
prefix = '%{ac_default_prefix}' |
||||
|
sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix}) |
||||
|
print(sitedir);" 2>/dev/null || %{__python} -Esc "from distutils import sysconfig; print(sysconfig.get_python_lib(0,0))") |
||||
|
|
||||
|
Name: zfs |
||||
|
Version: 2.3.5 |
||||
|
Release: 1%{?dist} |
||||
|
Summary: Commands to control the kernel modules and libraries |
||||
|
|
||||
|
Group: System Environment/Kernel |
||||
|
License: CDDL |
||||
|
URL: https://github.com/openzfs/zfs |
||||
|
Source0: %{name}-%{version}.tar.gz |
||||
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) |
||||
|
Requires: libzpool6%{?_isa} = %{version}-%{release} |
||||
|
Requires: libnvpair3%{?_isa} = %{version}-%{release} |
||||
|
Requires: libuutil3%{?_isa} = %{version}-%{release} |
||||
|
Requires: libzfs6%{?_isa} = %{version}-%{release} |
||||
|
Requires: %{name}-kmod = %{version} |
||||
|
Provides: %{name}-kmod-common = %{version}-%{release} |
||||
|
Obsoletes: spl <= %{version} |
||||
|
|
||||
|
# zfs-fuse provides the same commands and man pages that OpenZFS does. |
||||
|
# Renaming those on either side would conflict with all available documentation. |
||||
|
Conflicts: zfs-fuse |
||||
|
|
||||
|
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} |
||||
|
BuildRequires: gcc, make |
||||
|
BuildRequires: zlib-devel |
||||
|
BuildRequires: libuuid-devel |
||||
|
BuildRequires: libblkid-devel |
||||
|
BuildRequires: libudev-devel |
||||
|
BuildRequires: libattr-devel |
||||
|
BuildRequires: openssl-devel |
||||
|
%if 0%{?fedora}%{?suse_version}%{?openEuler} || 0%{?rhel} >= 8 || 0%{?centos} >= 8 |
||||
|
BuildRequires: libtirpc-devel |
||||
|
%endif |
||||
|
|
||||
|
%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) |
||||
|
# We don't directly use it, but if this isn't installed, rpmbuild as root can |
||||
|
# crash+corrupt rpmdb |
||||
|
# See issue #12071 |
||||
|
BuildRequires: ncompress |
||||
|
%endif |
||||
|
|
||||
|
Requires: openssl |
||||
|
%if 0%{?_systemd} |
||||
|
BuildRequires: systemd |
||||
|
%endif |
||||
|
|
||||
|
%endif |
||||
|
|
||||
|
%if 0%{?_systemd} |
||||
|
Requires(post): systemd |
||||
|
Requires(preun): systemd |
||||
|
Requires(postun): systemd |
||||
|
%endif |
||||
|
|
||||
|
# The zpool iostat/status -c scripts call some utilities like lsblk and iostat |
||||
|
Requires: util-linux |
||||
|
Requires: sysstat |
||||
|
|
||||
|
%description |
||||
|
This package contains the core ZFS command line utilities. |
||||
|
|
||||
|
%package -n libzpool6 |
||||
|
Summary: Native ZFS pool library for Linux |
||||
|
Group: System Environment/Kernel |
||||
|
Obsoletes: libzpool2 <= %{version} |
||||
|
Obsoletes: libzpool4 <= %{version} |
||||
|
Obsoletes: libzpool5 <= %{version} |
||||
|
|
||||
|
%description -n libzpool6 |
||||
|
This package contains the zpool library, which provides support |
||||
|
for managing zpools |
||||
|
|
||||
|
%if %{defined ldconfig_scriptlets} |
||||
|
%ldconfig_scriptlets -n libzpool6 |
||||
|
%else |
||||
|
%post -n libzpool6 -p /sbin/ldconfig |
||||
|
%postun -n libzpool6 -p /sbin/ldconfig |
||||
|
%endif |
||||
|
|
||||
|
%package -n libnvpair3 |
||||
|
Summary: Solaris name-value library for Linux |
||||
|
Group: System Environment/Kernel |
||||
|
Obsoletes: libnvpair1 <= %{version} |
||||
|
|
||||
|
%description -n libnvpair3 |
||||
|
This package contains routines for packing and unpacking name-value |
||||
|
pairs. This functionality is used to portably transport data across |
||||
|
process boundaries, between kernel and user space, and can be used |
||||
|
to write self describing data structures on disk. |
||||
|
|
||||
|
%if %{defined ldconfig_scriptlets} |
||||
|
%ldconfig_scriptlets -n libnvpair3 |
||||
|
%else |
||||
|
%post -n libnvpair3 -p /sbin/ldconfig |
||||
|
%postun -n libnvpair3 -p /sbin/ldconfig |
||||
|
%endif |
||||
|
|
||||
|
%package -n libuutil3 |
||||
|
Summary: Solaris userland utility library for Linux |
||||
|
Group: System Environment/Kernel |
||||
|
Obsoletes: libuutil1 <= %{version} |
||||
|
|
||||
|
%description -n libuutil3 |
||||
|
This library provides a variety of compatibility functions for OpenZFS: |
||||
|
* libspl: The Solaris Porting Layer userland library, which provides APIs |
||||
|
that make it possible to run Solaris user code in a Linux environment |
||||
|
with relatively minimal modification. |
||||
|
* libavl: The Adelson-Velskii Landis balanced binary tree manipulation |
||||
|
library. |
||||
|
* libefi: The Extensible Firmware Interface library for GUID disk |
||||
|
partitioning. |
||||
|
* libshare: NFS, SMB, and iSCSI service integration for ZFS. |
||||
|
|
||||
|
%if %{defined ldconfig_scriptlets} |
||||
|
%ldconfig_scriptlets -n libuutil3 |
||||
|
%else |
||||
|
%post -n libuutil3 -p /sbin/ldconfig |
||||
|
%postun -n libuutil3 -p /sbin/ldconfig |
||||
|
%endif |
||||
|
|
||||
|
# The library version is encoded in the package name. When updating the |
||||
|
# version information it is important to add an obsoletes line below for |
||||
|
# the previous version of the package. |
||||
|
%package -n libzfs6 |
||||
|
Summary: Native ZFS filesystem library for Linux |
||||
|
Group: System Environment/Kernel |
||||
|
Obsoletes: libzfs2 <= %{version} |
||||
|
Obsoletes: libzfs4 <= %{version} |
||||
|
Obsoletes: libzfs5 <= %{version} |
||||
|
|
||||
|
%description -n libzfs6 |
||||
|
This package provides support for managing ZFS filesystems |
||||
|
|
||||
|
%if %{defined ldconfig_scriptlets} |
||||
|
%ldconfig_scriptlets -n libzfs6 |
||||
|
%else |
||||
|
%post -n libzfs6 -p /sbin/ldconfig |
||||
|
%postun -n libzfs6 -p /sbin/ldconfig |
||||
|
%endif |
||||
|
|
||||
|
%package -n libzfs6-devel |
||||
|
Summary: Development headers |
||||
|
Group: System Environment/Kernel |
||||
|
Requires: libzfs6%{?_isa} = %{version}-%{release} |
||||
|
Requires: libzpool6%{?_isa} = %{version}-%{release} |
||||
|
Requires: libnvpair3%{?_isa} = %{version}-%{release} |
||||
|
Requires: libuutil3%{?_isa} = %{version}-%{release} |
||||
|
Provides: libzpool6-devel = %{version}-%{release} |
||||
|
Provides: libnvpair3-devel = %{version}-%{release} |
||||
|
Provides: libuutil3-devel = %{version}-%{release} |
||||
|
Obsoletes: zfs-devel <= %{version} |
||||
|
Obsoletes: libzfs2-devel <= %{version} |
||||
|
Obsoletes: libzfs4-devel <= %{version} |
||||
|
Obsoletes: libzfs5-devel <= %{version} |
||||
|
|
||||
|
%description -n libzfs6-devel |
||||
|
This package contains the header files needed for building additional |
||||
|
applications against the ZFS libraries. |
||||
|
|
||||
|
%package test |
||||
|
Summary: Test infrastructure |
||||
|
Group: System Environment/Kernel |
||||
|
Requires: %{name}%{?_isa} = %{version}-%{release} |
||||
|
Requires: parted |
||||
|
Requires: lsscsi |
||||
|
Requires: mdadm |
||||
|
Requires: bc |
||||
|
Requires: ksh |
||||
|
Requires: fio |
||||
|
Requires: acl |
||||
|
Requires: sudo |
||||
|
Requires: sysstat |
||||
|
Requires: libaio |
||||
|
Requires: python%{__python_pkg_version} |
||||
|
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} |
||||
|
BuildRequires: libaio-devel |
||||
|
%endif |
||||
|
AutoReqProv: no |
||||
|
|
||||
|
%description test |
||||
|
This package contains test infrastructure and support scripts for |
||||
|
validating the file system. |
||||
|
|
||||
|
%package dracut |
||||
|
Summary: Dracut module |
||||
|
Group: System Environment/Kernel |
||||
|
BuildArch: noarch |
||||
|
Requires: %{name} >= %{version} |
||||
|
Requires: dracut |
||||
|
Requires: /usr/bin/awk |
||||
|
Requires: grep |
||||
|
|
||||
|
%description dracut |
||||
|
This package contains a dracut module used to construct an initramfs |
||||
|
image which is ZFS aware. |
||||
|
|
||||
|
%if %{with pyzfs} |
||||
|
# Enforce `python36-` package prefix for CentOS 7 |
||||
|
# since dependencies come from EPEL and are named this way |
||||
|
%package -n python%{__python_pkg_version}-pyzfs |
||||
|
Summary: Python %{python_version} wrapper for libzfs_core |
||||
|
Group: Development/Languages/Python |
||||
|
License: Apache-2.0 |
||||
|
BuildArch: noarch |
||||
|
Requires: libzfs6 = %{version}-%{release} |
||||
|
Requires: libnvpair3 = %{version}-%{release} |
||||
|
Requires: libffi |
||||
|
Requires: python%{__python_pkg_version} |
||||
|
|
||||
|
%if 0%{?centos} == 7 |
||||
|
Requires: python36-cffi |
||||
|
%else |
||||
|
Requires: python%{__python_pkg_version}-cffi |
||||
|
%endif |
||||
|
|
||||
|
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} |
||||
|
%if 0%{?centos} == 7 |
||||
|
BuildRequires: python36-packaging |
||||
|
BuildRequires: python36-devel |
||||
|
BuildRequires: python36-cffi |
||||
|
BuildRequires: python36-setuptools |
||||
|
%else |
||||
|
BuildRequires: python%{__python_pkg_version}-packaging |
||||
|
BuildRequires: python%{__python_pkg_version}-devel |
||||
|
BuildRequires: python%{__python_pkg_version}-cffi |
||||
|
BuildRequires: python%{__python_pkg_version}-setuptools |
||||
|
%endif |
||||
|
|
||||
|
BuildRequires: libffi-devel |
||||
|
%endif |
||||
|
|
||||
|
%description -n python%{__python_pkg_version}-pyzfs |
||||
|
This package provides a python wrapper for the libzfs_core C library. |
||||
|
%endif |
||||
|
|
||||
|
%if 0%{?_initramfs} |
||||
|
%package initramfs |
||||
|
Summary: Initramfs module |
||||
|
Group: System Environment/Kernel |
||||
|
Requires: %{name}%{?_isa} = %{version}-%{release} |
||||
|
Requires: initramfs-tools |
||||
|
|
||||
|
%description initramfs |
||||
|
This package contains a initramfs module used to construct an initramfs |
||||
|
image which is ZFS aware. |
||||
|
%endif |
||||
|
|
||||
|
%if %{with pam} |
||||
|
%package -n pam_zfs_key |
||||
|
Summary: PAM module for encrypted ZFS datasets |
||||
|
|
||||
|
%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} |
||||
|
BuildRequires: pam-devel |
||||
|
%endif |
||||
|
|
||||
|
%description -n pam_zfs_key |
||||
|
This package contains the pam_zfs_key PAM module, which provides |
||||
|
support for unlocking datasets on user login. |
||||
|
%endif |
||||
|
|
||||
|
%prep |
||||
|
%if %{with debug} |
||||
|
%define debug --enable-debug |
||||
|
%else |
||||
|
%define debug --disable-debug |
||||
|
%endif |
||||
|
|
||||
|
%if %{with debuginfo} |
||||
|
%define debuginfo --enable-debuginfo |
||||
|
%else |
||||
|
%define debuginfo --disable-debuginfo |
||||
|
%endif |
||||
|
|
||||
|
%if %{with asan} |
||||
|
%define asan --enable-asan |
||||
|
%else |
||||
|
%define asan --disable-asan |
||||
|
%endif |
||||
|
|
||||
|
%if %{with ubsan} |
||||
|
%define ubsan --enable-ubsan |
||||
|
%else |
||||
|
%define ubsan --disable-ubsan |
||||
|
%endif |
||||
|
|
||||
|
%if 0%{?_systemd} |
||||
|
%define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --with-systemdmodulesloaddir=%{_modulesloaddir} --with-systemdgeneratordir=%{_systemdgeneratordir} --disable-sysvinit |
||||
|
%define systemd_svcs zfs-import-cache.service zfs-import-scan.service zfs-mount.service zfs-mount@.service zfs-share.service zfs-zed.service zfs.target zfs-import.target zfs-volume-wait.service zfs-volumes.target |
||||
|
%else |
||||
|
%define systemd --enable-sysvinit --disable-systemd |
||||
|
%endif |
||||
|
|
||||
|
%if %{with pyzfs} |
||||
|
%define pyzfs --enable-pyzfs |
||||
|
%else |
||||
|
%define pyzfs --disable-pyzfs |
||||
|
%endif |
||||
|
|
||||
|
%if %{with pam} |
||||
|
%define pam --enable-pam |
||||
|
%else |
||||
|
%define pam --disable-pam |
||||
|
%endif |
||||
|
|
||||
|
%setup -q |
||||
|
|
||||
|
%build |
||||
|
%configure \ |
||||
|
--with-config=user \ |
||||
|
--with-udevdir=%{_udevdir} \ |
||||
|
--with-udevruledir=%{_udevruledir} \ |
||||
|
--with-dracutdir=%{_dracutdir} \ |
||||
|
--with-pamconfigsdir=%{_datadir}/pam-configs \ |
||||
|
--with-pammoduledir=%{_libdir}/security \ |
||||
|
--with-python=%{__python} \ |
||||
|
--with-pkgconfigdir=%{_pkgconfigdir} \ |
||||
|
--disable-static \ |
||||
|
%{debug} \ |
||||
|
%{debuginfo} \ |
||||
|
%{asan} \ |
||||
|
%{ubsan} \ |
||||
|
%{systemd} \ |
||||
|
%{pam} \ |
||||
|
%{pyzfs} |
||||
|
make %{?_smp_mflags} |
||||
|
|
||||
|
%install |
||||
|
%{__rm} -rf $RPM_BUILD_ROOT |
||||
|
make install DESTDIR=%{?buildroot} |
||||
|
find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \; |
||||
|
%if 0%{!?__brp_mangle_shebangs:1} |
||||
|
find %{?buildroot}%{_bindir} \ |
||||
|
\( -name arc_summary -or -name arcstat -or -name dbufstat \ |
||||
|
-or -name zilstat \) \ |
||||
|
-exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; |
||||
|
find %{?buildroot}%{_datadir} \ |
||||
|
\( -name test-runner.py -or -name zts-report.py \) \ |
||||
|
-exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; |
||||
|
%endif |
||||
|
|
||||
|
%post |
||||
|
%if 0%{?_systemd} |
||||
|
%if 0%{?systemd_post:1} |
||||
|
%systemd_post %{systemd_svcs} |
||||
|
%else |
||||
|
if [ "$1" = "1" -o "$1" = "install" ] ; then |
||||
|
# Initial installation |
||||
|
systemctl preset %{systemd_svcs} >/dev/null || true |
||||
|
fi |
||||
|
%endif |
||||
|
%else |
||||
|
if [ -x /sbin/chkconfig ]; then |
||||
|
/sbin/chkconfig --add zfs-import |
||||
|
/sbin/chkconfig --add zfs-load-key |
||||
|
/sbin/chkconfig --add zfs-mount |
||||
|
/sbin/chkconfig --add zfs-share |
||||
|
/sbin/chkconfig --add zfs-zed |
||||
|
fi |
||||
|
%endif |
||||
|
exit 0 |
||||
|
|
||||
|
# On RHEL/CentOS 7 the static nodes aren't refreshed by default after |
||||
|
# installing a package. This is the default behavior for Fedora. |
||||
|
%posttrans |
||||
|
%if 0%{?rhel} == 7 || 0%{?centos} == 7 |
||||
|
systemctl restart kmod-static-nodes |
||||
|
systemctl restart systemd-tmpfiles-setup-dev |
||||
|
udevadm trigger |
||||
|
%endif |
||||
|
|
||||
|
%preun |
||||
|
%if 0%{?_systemd} |
||||
|
%if 0%{?systemd_preun:1} |
||||
|
%systemd_preun %{systemd_svcs} |
||||
|
%else |
||||
|
if [ "$1" = "0" -o "$1" = "remove" ] ; then |
||||
|
# Package removal, not upgrade |
||||
|
systemctl --no-reload disable %{systemd_svcs} >/dev/null || true |
||||
|
systemctl stop %{systemd_svcs} >/dev/null || true |
||||
|
fi |
||||
|
%endif |
||||
|
%else |
||||
|
if [ "$1" = "0" -o "$1" = "remove" ] && [ -x /sbin/chkconfig ]; then |
||||
|
/sbin/chkconfig --del zfs-import |
||||
|
/sbin/chkconfig --del zfs-load-key |
||||
|
/sbin/chkconfig --del zfs-mount |
||||
|
/sbin/chkconfig --del zfs-share |
||||
|
/sbin/chkconfig --del zfs-zed |
||||
|
fi |
||||
|
%endif |
||||
|
exit 0 |
||||
|
|
||||
|
%postun |
||||
|
%if 0%{?_systemd} |
||||
|
%if 0%{?systemd_postun:1} |
||||
|
%systemd_postun %{systemd_svcs} |
||||
|
%else |
||||
|
systemctl --system daemon-reload >/dev/null || true |
||||
|
%endif |
||||
|
%endif |
||||
|
|
||||
|
%files |
||||
|
# Core utilities |
||||
|
%{_sbindir}/* |
||||
|
%{_bindir}/raidz_test |
||||
|
%{_bindir}/zvol_wait |
||||
|
# Optional Python 3 scripts |
||||
|
%{_bindir}/arc_summary |
||||
|
%{_bindir}/arcstat |
||||
|
%{_bindir}/dbufstat |
||||
|
%{_bindir}/zilstat |
||||
|
# Man pages |
||||
|
%{_mandir}/man1/* |
||||
|
%{_mandir}/man4/* |
||||
|
%{_mandir}/man5/* |
||||
|
%{_mandir}/man7/* |
||||
|
%{_mandir}/man8/* |
||||
|
# Configuration files and scripts |
||||
|
%{_libexecdir}/%{name} |
||||
|
%{_udevdir}/vdev_id |
||||
|
%{_udevdir}/zvol_id |
||||
|
%{_udevdir}/rules.d/* |
||||
|
%{_datadir}/%{name}/compatibility.d |
||||
|
%if ! 0%{?_systemd} || 0%{?_initramfs} |
||||
|
# Files needed for sysvinit and initramfs-tools |
||||
|
%{_sysconfdir}/%{name}/zfs-functions |
||||
|
%config(noreplace) %{_initconfdir}/zfs |
||||
|
%else |
||||
|
%exclude %{_sysconfdir}/%{name}/zfs-functions |
||||
|
%exclude %{_initconfdir}/zfs |
||||
|
%endif |
||||
|
%if 0%{?_systemd} |
||||
|
%{_unitdir}/* |
||||
|
%{_presetdir}/* |
||||
|
%{_modulesloaddir}/* |
||||
|
%{_systemdgeneratordir}/* |
||||
|
%else |
||||
|
%config(noreplace) %{_sysconfdir}/init.d/* |
||||
|
%endif |
||||
|
%config(noreplace) %{_sysconfdir}/%{name}/zed.d/* |
||||
|
%config(noreplace) %{_sysconfdir}/%{name}/zpool.d/* |
||||
|
%config(noreplace) %{_sysconfdir}/%{name}/vdev_id.conf.*.example |
||||
|
%attr(440, root, root) %config(noreplace) %{_sysconfdir}/sudoers.d/* |
||||
|
|
||||
|
%config(noreplace) %{_bashcompletiondir}/zfs |
||||
|
%config(noreplace) %{_bashcompletiondir}/zpool |
||||
|
|
||||
|
%files -n libzpool6 |
||||
|
%{_libdir}/libzpool.so.* |
||||
|
|
||||
|
%files -n libnvpair3 |
||||
|
%{_libdir}/libnvpair.so.* |
||||
|
|
||||
|
%files -n libuutil3 |
||||
|
%{_libdir}/libuutil.so.* |
||||
|
|
||||
|
%files -n libzfs6 |
||||
|
%{_libdir}/libzfs*.so.* |
||||
|
|
||||
|
%files -n libzfs6-devel |
||||
|
%{_pkgconfigdir}/libzfs.pc |
||||
|
%{_pkgconfigdir}/libzfsbootenv.pc |
||||
|
%{_pkgconfigdir}/libzfs_core.pc |
||||
|
%{_libdir}/*.so |
||||
|
%{_includedir}/* |
||||
|
%doc AUTHORS COPYRIGHT LICENSE NOTICE README.md |
||||
|
|
||||
|
%files test |
||||
|
%{_datadir}/%{name}/zfs-tests |
||||
|
%{_datadir}/%{name}/test-runner |
||||
|
%{_datadir}/%{name}/runfiles |
||||
|
%{_datadir}/%{name}/*.sh |
||||
|
|
||||
|
%files dracut |
||||
|
%doc contrib/dracut/README.md |
||||
|
%{_dracutdir}/modules.d/* |
||||
|
|
||||
|
%if %{with pyzfs} |
||||
|
%files -n python%{__python_pkg_version}-pyzfs |
||||
|
%doc contrib/pyzfs/README |
||||
|
%doc contrib/pyzfs/LICENSE |
||||
|
%defattr(-,root,root,-) |
||||
|
%{__python_sitelib}/libzfs_core/* |
||||
|
%{__python_sitelib}/pyzfs* |
||||
|
%endif |
||||
|
|
||||
|
%if 0%{?_initramfs} |
||||
|
%files initramfs |
||||
|
%doc contrib/initramfs/README.md |
||||
|
/usr/share/initramfs-tools/* |
||||
|
%else |
||||
|
# Since we're not building the initramfs package, |
||||
|
# ignore those files. |
||||
|
%exclude /usr/share/initramfs-tools |
||||
|
%endif |
||||
|
|
||||
|
%if %{with pam} |
||||
|
%files -n pam_zfs_key |
||||
|
%{_libdir}/security/* |
||||
|
%{_datadir}/pam-configs/* |
||||
|
%endif |
||||
Loading…
Reference in new issue