mirror of
https://github.com/torvalds/linux.git
synced 2026-05-05 23:05:25 -04:00
xdrgen: Fix struct prefix for typedef types in program wrappers
The program templates for decoder/argument.j2 and encoder/result.j2
unconditionally add 'struct' prefix to all types. This is incorrect
when an RPC protocol specification lists a typedef'd basic type or
an enum as a procedure argument or result (e.g., NFSv2's fhandle or
stat), resulting in compiler errors when building generated C code.
Fixes: 4b132aacb0 ("tools: Add xdrgen")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
@@ -6,7 +6,7 @@ from pathlib import Path
|
||||
from jinja2 import Environment, FileSystemLoader, Template
|
||||
|
||||
from xdr_ast import _XdrAst, Specification, _RpcProgram, _XdrTypeSpecifier
|
||||
from xdr_ast import public_apis, pass_by_reference, get_header_name
|
||||
from xdr_ast import public_apis, pass_by_reference, structs, get_header_name
|
||||
from xdr_parse import get_xdr_annotate
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ def create_jinja2_environment(language: str, xdr_type: str) -> Environment:
|
||||
environment.globals["annotate"] = get_xdr_annotate()
|
||||
environment.globals["public_apis"] = public_apis
|
||||
environment.globals["pass_by_reference"] = pass_by_reference
|
||||
environment.globals["structs"] = structs
|
||||
return environment
|
||||
case _:
|
||||
raise NotImplementedError("Language not supported")
|
||||
|
||||
@@ -14,7 +14,11 @@ bool {{ program }}_svc_decode_{{ argument }}(struct svc_rqst *rqstp, struct xdr_
|
||||
{% if argument == 'void' %}
|
||||
return xdrgen_decode_void(xdr);
|
||||
{% else %}
|
||||
{% if argument in structs %}
|
||||
struct {{ argument }} *argp = rqstp->rq_argp;
|
||||
{% else %}
|
||||
{{ argument }} *argp = rqstp->rq_argp;
|
||||
{% endif %}
|
||||
|
||||
return xdrgen_decode_{{ argument }}(xdr, argp);
|
||||
{% endif %}
|
||||
|
||||
@@ -14,8 +14,14 @@ bool {{ program }}_svc_encode_{{ result }}(struct svc_rqst *rqstp, struct xdr_st
|
||||
{% if result == 'void' %}
|
||||
return xdrgen_encode_void(xdr);
|
||||
{% else %}
|
||||
{% if result in structs %}
|
||||
struct {{ result }} *resp = rqstp->rq_resp;
|
||||
|
||||
return xdrgen_encode_{{ result }}(xdr, resp);
|
||||
{% else %}
|
||||
{{ result }} *resp = rqstp->rq_resp;
|
||||
|
||||
return xdrgen_encode_{{ result }}(xdr, *resp);
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user