From: David Mulder Date: Fri, 5 Jul 2024 21:00:31 +0000 (-0600) Subject: Add ntstatus_gen for Rust X-Git-Tag: tdb-1.4.13~929 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8ac241017f1c5771d67c33f8bcaa3d4d7719d530;p=thirdparty%2Fsamba.git Add ntstatus_gen for Rust Signed-off-by: David Mulder Reviewed-by: Alexander Bokovoy --- diff --git a/libcli/util/wscript_build b/libcli/util/wscript_build index 340ea420549..64bd21e19ca 100644 --- a/libcli/util/wscript_build +++ b/libcli/util/wscript_build @@ -22,9 +22,9 @@ bld.SAMBA_GENERATOR('hresult_generated', bld.SAMBA_GENERATOR('ntstatus_generated', source='../../source4/scripting/bin/gen_ntstatus.py ntstatus_err_table.txt ../../source4/scripting/bin/gen_error_common.py', - target='ntstatus_gen.h nterr_gen.c py_ntstatus.c', + target='ntstatus_gen.h nterr_gen.c py_ntstatus.c ntstatus_gen.rs', group='build_source', - rule='${PYTHON} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${TGT[0].abspath(env)} ${TGT[1].abspath(env)} ${TGT[2].abspath(env)}' + rule='${PYTHON} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${TGT[0].abspath(env)} ${TGT[1].abspath(env)} ${TGT[2].abspath(env)} ${TGT[3].abspath(env)}' ) bld.SAMBA_GENERATOR('werror_generated', diff --git a/source4/scripting/bin/gen_ntstatus.py b/source4/scripting/bin/gen_ntstatus.py index 5e79378f148..4d58731b525 100755 --- a/source4/scripting/bin/gen_ntstatus.py +++ b/source4/scripting/bin/gen_ntstatus.py @@ -92,6 +92,49 @@ def generatePythonFile(out_file, errors): out_file.write("\treturn m;\n") out_file.write("}\n") + +def generateRustFile(out_file, errors): + out_file.write("/*\n") + out_file.write(" * Descriptions for errors generated from\n") + out_file.write(" * [MS-ERREF] http://msdn.microsoft.com/en-us/library/cc704588.aspx\n") + out_file.write(" */\n\n") + out_file.write("use std::fmt;\n\n") + out_file.write("#[derive(PartialEq, Eq)]\n") + out_file.write("pub struct NTSTATUS(u32);\n\n") + for err in errors: + if err.err_define in ['NT_STATUS_OK', 'NT_STATUS_WAIT_0', + 'NT_STATUS_ABANDONED_WAIT_0', + 'NT_STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS']: + out_file.write("#[allow(dead_code)]\n") + line = "pub const %s: NTSTATUS = NTSTATUS(%#x);\n" % (err.err_define, err.err_code) + out_file.write(line) + out_file.write("\nimpl NTSTATUS {\n") + out_file.write("\tfn description(&self) -> &str {\n") + out_file.write("\t\tmatch *self {\n") + for err in errors: + # Account for the possibility that some errors may not have descriptions + if err.err_string == "": + continue + if err.err_define not in ['NT_STATUS_OK', 'NT_STATUS_WAIT_0', + 'NT_STATUS_ABANDONED_WAIT_0', + 'NT_STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS']: + out_file.write("\t\t\t%s => \"%s\",\n" % (err.err_define, err.err_string)) + out_file.write("\t\t\t_ => \"Unknown NTSTATUS error code\",\n") + out_file.write("\t\t}\n"); + out_file.write("\t}\n"); + out_file.write("}\n\n"); + out_file.write("impl fmt::Display for NTSTATUS {\n") + out_file.write("\tfn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n") + out_file.write("\t\twrite!(f, \"NTSTATUS({:#x}): {}\", self.0, self.description())\n") + out_file.write("\t}\n") + out_file.write("}\n\n"); + out_file.write("impl fmt::Debug for NTSTATUS {\n") + out_file.write("\tfn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n") + out_file.write("\t\twrite!(f, \"NTSTATUS({:#x})\", self.0)\n") + out_file.write("\t}\n") + out_file.write("}\n\n"); + out_file.write("impl std::error::Error for NTSTATUS {}\n") + def transformErrorName( error_name ): if error_name.startswith("STATUS_"): error_name = error_name.replace("STATUS_", "", 1) @@ -113,13 +156,14 @@ def transformErrorName( error_name ): def main (): input_file = None - if len(sys.argv) == 5: + if len(sys.argv) == 6: input_file = sys.argv[1] gen_headerfile_name = sys.argv[2] gen_sourcefile_name = sys.argv[3] gen_pythonfile_name = sys.argv[4] + gen_rustfile_name = sys.argv[5] else: - print("usage: %s winerrorfile headerfile sourcefile pythonfile" % (sys.argv[0])) + print("usage: %s winerrorfile headerfile sourcefile pythonfile rustfile" % (sys.argv[0])) sys.exit() # read in the data @@ -147,6 +191,10 @@ def main (): out_file = io.open(gen_pythonfile_name, "wt", encoding='utf8') generatePythonFile(out_file, errors) out_file.close() + print("writing new rust file: %s" % gen_rustfile_name) + out_file = io.open(gen_rustfile_name, "wt", encoding='utf8') + generateRustFile(out_file, errors) + out_file.close() if __name__ == '__main__':