Skip to content

Commit b0f8e1f

Browse files
Khushal928chucklever
authored andcommitted
xdrgen: handle _XdrString in union encoder/decoder
Running xdrgen on xdrgen/tests/test.x fails when generating encoder or decoder functions for union members of type _XdrString. It was because _XdrString does not have a spec attribute like _XdrBasic, leading to AttributeError. This patch updates emit_union_case_spec_definition and emit_union_case_spec_decoder/encoder to handle _XdrString by assigning type_name = "char *" and avoiding referencing to spec. Testing: Fixed xdrgen tool was run on originally failing test file (tools/net/sunrpc/xdrgen/tests/test.x) and now completes without AttributeError. Modified xdrgen tool was also run against nfs4_1.x (Documentation/sunrpc/xdr/nfs4_1.x). The output header file matches with nfs4_1.h (include/linux/sunrpc/xdrgen/nfs4_1.h). This validates the patch for all XDR input files currently within the kernel. Changes since v2: - Moved the shebang to the first line - Removed SPDX header to match style of current xdrgen files Changes since v1: - Corrected email address in Signed-off-by. - Wrapped patch description lines to 72 characters. Signed-off-by: Khushal Chitturi <kc9282016@gmail.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 42ba5bd commit b0f8e1f

2 files changed

Lines changed: 31 additions & 9 deletions

File tree

tools/net/sunrpc/xdrgen/generators/union.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from generators import SourceGenerator
99
from generators import create_jinja2_environment, get_jinja2_template
1010

11-
from xdr_ast import _XdrBasic, _XdrUnion, _XdrVoid, get_header_name
11+
from xdr_ast import _XdrBasic, _XdrUnion, _XdrVoid, _XdrString, get_header_name
1212
from xdr_ast import _XdrDeclaration, _XdrCaseSpec, public_apis, big_endian
1313

1414

@@ -40,13 +40,20 @@ def emit_union_case_spec_definition(
4040
"""Emit a definition for an XDR union's case arm"""
4141
if isinstance(node.arm, _XdrVoid):
4242
return
43-
assert isinstance(node.arm, _XdrBasic)
43+
if isinstance(node.arm, _XdrString):
44+
type_name = "char *"
45+
classifier = ""
46+
else:
47+
type_name = node.arm.spec.type_name
48+
classifier = node.arm.spec.c_classifier
49+
50+
assert isinstance(node.arm, (_XdrBasic, _XdrString))
4451
template = get_jinja2_template(environment, "definition", "case_spec")
4552
print(
4653
template.render(
4754
name=node.arm.name,
48-
type=node.arm.spec.type_name,
49-
classifier=node.arm.spec.c_classifier,
55+
type=type_name,
56+
classifier=classifier,
5057
)
5158
)
5259

@@ -84,6 +91,12 @@ def emit_union_case_spec_decoder(
8491

8592
if isinstance(node.arm, _XdrVoid):
8693
return
94+
if isinstance(node.arm, _XdrString):
95+
type_name = "char *"
96+
classifier = ""
97+
else:
98+
type_name = node.arm.spec.type_name
99+
classifier = node.arm.spec.c_classifier
87100

88101
if big_endian_discriminant:
89102
template = get_jinja2_template(environment, "decoder", "case_spec_be")
@@ -92,13 +105,13 @@ def emit_union_case_spec_decoder(
92105
for case in node.values:
93106
print(template.render(case=case))
94107

95-
assert isinstance(node.arm, _XdrBasic)
108+
assert isinstance(node.arm, (_XdrBasic, _XdrString))
96109
template = get_jinja2_template(environment, "decoder", node.arm.template)
97110
print(
98111
template.render(
99112
name=node.arm.name,
100-
type=node.arm.spec.type_name,
101-
classifier=node.arm.spec.c_classifier,
113+
type=type_name,
114+
classifier=classifier,
102115
)
103116
)
104117

@@ -169,7 +182,10 @@ def emit_union_case_spec_encoder(
169182

170183
if isinstance(node.arm, _XdrVoid):
171184
return
172-
185+
if isinstance(node.arm, _XdrString):
186+
type_name = "char *"
187+
else:
188+
type_name = node.arm.spec.type_name
173189
if big_endian_discriminant:
174190
template = get_jinja2_template(environment, "encoder", "case_spec_be")
175191
else:
@@ -181,7 +197,7 @@ def emit_union_case_spec_encoder(
181197
print(
182198
template.render(
183199
name=node.arm.name,
184-
type=node.arm.spec.type_name,
200+
type=type_name,
185201
)
186202
)
187203

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{# SPDX-License-Identifier: GPL-2.0 #}
2+
{% if annotate %}
3+
/* member {{ name }} (variable-length string) */
4+
{% endif %}
5+
if (!xdrgen_encode_string(xdr, ptr->u.{{ name }}, {{ maxsize }}))
6+
return false;

0 commit comments

Comments
 (0)