2018-12-11 02:23:17 +03:00
#!/usr/bin/env python3
2014-03-25 00:35:50 +04:00
#
# Unix SMB/CIFS implementation.
#
# HRESULT Error definitions
#
# Copyright (C) Noel Power <noel.power@suse.com> 2014
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
2023-04-27 06:17:18 +03:00
import sys , io
2023-05-26 06:14:22 +03:00
from gen_error_common import ErrorDef , parseErrorDescriptions
2014-03-25 00:35:50 +04:00
2017-01-20 02:11:30 +03:00
def generateHeaderFile ( out_file , errors ) :
2014-03-25 00:35:50 +04:00
out_file . write ( " /* \n " )
2017-01-12 03:20:37 +03:00
out_file . write ( " * Descriptions for errors generated from \n " )
2014-03-25 00:35:50 +04:00
out_file . write ( " * [MS-ERREF] http://msdn.microsoft.com/en-us/library/cc704588.aspx \n " )
out_file . write ( " */ \n \n " )
2017-01-12 03:20:37 +03:00
out_file . write ( " #ifndef _NTSTATUS_GEN_H \n " )
out_file . write ( " #define _NTSTATUS_GEN_H \n " )
2017-01-20 02:11:30 +03:00
for err in errors :
2017-10-25 18:37:24 +03:00
line = " #define %s NT_STATUS( %#x ) \n " % ( err . err_define , err . err_code )
2014-03-25 00:35:50 +04:00
out_file . write ( line )
2017-01-12 03:20:37 +03:00
out_file . write ( " \n #endif /* _NTSTATUS_GEN_H */ \n " )
2014-03-25 00:35:50 +04:00
2017-01-20 02:11:30 +03:00
def generateSourceFile ( out_file , errors ) :
2014-03-25 00:35:50 +04:00
out_file . write ( " /* \n " )
2017-01-12 03:20:37 +03:00
out_file . write ( " * Names for errors generated from \n " )
2014-03-25 00:35:50 +04:00
out_file . write ( " * [MS-ERREF] http://msdn.microsoft.com/en-us/library/cc704588.aspx \n " )
out_file . write ( " */ \n " )
2017-01-12 03:20:37 +03:00
out_file . write ( " static const nt_err_code_struct nt_errs[] = \n " )
out_file . write ( " { \n " )
2017-01-20 02:11:30 +03:00
for err in errors :
2017-01-12 03:20:37 +03:00
out_file . write ( " \t { \" %s \" , %s }, \n " % ( err . err_define , err . err_define ) )
out_file . write ( " { 0, NT_STATUS(0) } \n " )
out_file . write ( " }; \n " )
out_file . write ( " \n /* \n " )
out_file . write ( " * Descriptions for errors generated from \n " )
2014-03-25 00:35:50 +04:00
out_file . write ( " * [MS-ERREF] http://msdn.microsoft.com/en-us/library/cc704588.aspx \n " )
out_file . write ( " */ \n " )
2017-01-12 03:20:37 +03:00
out_file . write ( " static const nt_err_code_struct nt_err_desc[] = \n " )
out_file . write ( " { \n " )
2017-01-20 02:11:30 +03:00
for err in errors :
2017-01-12 03:20:37 +03:00
# Account for the possibility that some errors may not have descriptions
if err . err_string == " " :
continue
out_file . write ( " \t { N_( \" %s \" ), %s }, \n " % ( err . err_string , err . err_define ) )
out_file . write ( " { 0, NT_STATUS(0) } \n " )
out_file . write ( " }; " )
2014-03-25 00:35:50 +04:00
2017-01-20 02:11:30 +03:00
def generatePythonFile ( out_file , errors ) :
2016-09-27 21:31:58 +03:00
out_file . write ( " /* \n " )
out_file . write ( " * New descriptions for existing errors generated from \n " )
out_file . write ( " * [MS-ERREF] http://msdn.microsoft.com/en-us/library/cc704588.aspx \n " )
out_file . write ( " */ \n " )
out_file . write ( " #include <Python.h> \n " )
2017-08-08 12:50:30 +03:00
out_file . write ( " #include \" python/py3compat.h \" \n " )
2016-09-27 21:31:58 +03:00
out_file . write ( " #include \" includes.h \" \n \n " )
2017-02-01 01:55:39 +03:00
# This is needed to avoid a missing prototype error from the C
# compiler. There is never a prototype for this function, it is a
# module loaded by python with dlopen() and found with dlsym().
2017-08-08 12:50:30 +03:00
out_file . write ( " static struct PyModuleDef moduledef = { \n " )
out_file . write ( " \t PyModuleDef_HEAD_INIT, \n " )
out_file . write ( " \t .m_name = \" ntstatus \" , \n " )
out_file . write ( " \t .m_doc = \" NTSTATUS error defines \" , \n " )
out_file . write ( " \t .m_size = -1, \n " )
out_file . write ( " }; \n \n " )
out_file . write ( " MODULE_INIT_FUNC(ntstatus) \n " )
2016-09-27 21:31:58 +03:00
out_file . write ( " { \n " )
out_file . write ( " \t PyObject *m; \n \n " )
2023-02-24 02:54:16 +03:00
out_file . write ( " \t m = PyModule_Create(&moduledef); \n " )
out_file . write ( " \t if (m == NULL) \n " )
out_file . write ( " \t \t return NULL; \n \n " )
2017-01-20 02:11:30 +03:00
for err in errors :
2017-01-12 04:39:52 +03:00
line = """ \t PyModule_AddObject(m, \" %s \" ,
2019-05-06 06:58:49 +03:00
\t \tPyLong_FromUnsignedLongLong ( NT_STATUS_V ( % s ) ) ) ; \n """ % (err.err_define, err.err_define)
2016-09-27 21:31:58 +03:00
out_file . write ( line )
2023-02-24 02:54:16 +03:00
out_file . write ( " \n " )
out_file . write ( " \t return m; \n " )
out_file . write ( " } \n " )
2016-09-27 21:31:58 +03:00
2017-01-20 02:11:30 +03:00
def transformErrorName ( error_name ) :
if error_name . startswith ( " STATUS_ " ) :
error_name = error_name . replace ( " STATUS_ " , " " , 1 )
elif error_name . startswith ( " RPC_NT_ " ) :
error_name = error_name . replace ( " RPC_NT_ " , " RPC_ " , 1 )
elif error_name . startswith ( " EPT_NT_ " ) :
error_name = error_name . replace ( " EPT_NT_ " , " EPT_ " , 1 )
return " NT_STATUS_ " + error_name
2017-01-12 03:20:37 +03:00
# Very simple script to generate files nterr_gen.c & ntstatus_gen.h.
# These files contain generated definitions.
# This script takes four inputs:
# [1]: The name of the text file which is the content of an HTML table
# (e.g. the one found at http://msdn.microsoft.com/en-us/library/cc231200.aspx)
# copied and pasted.
# [2]: The name of the output generated header file with NTStatus #defines
# [3]: The name of the output generated source file with C arrays
# [4]: The name of the output generated python file
2014-03-25 00:35:50 +04:00
def main ( ) :
2023-02-24 02:54:16 +03:00
input_file = None
2017-01-12 03:20:37 +03:00
if len ( sys . argv ) == 5 :
input_file = sys . argv [ 1 ]
gen_headerfile_name = sys . argv [ 2 ]
gen_sourcefile_name = sys . argv [ 3 ]
gen_pythonfile_name = sys . argv [ 4 ]
2014-03-25 00:35:50 +04:00
else :
2017-08-08 11:56:17 +03:00
print ( " usage: %s winerrorfile headerfile sourcefile pythonfile " % ( sys . argv [ 0 ] ) )
2014-03-25 00:35:50 +04:00
sys . exit ( )
# read in the data
2023-04-27 06:15:03 +03:00
with io . open ( input_file , " rt " , encoding = ' utf8 ' ) as file_contents :
errors = parseErrorDescriptions ( file_contents , False , transformErrorName )
2017-01-12 04:39:52 +03:00
2023-05-26 06:14:22 +03:00
# NT_STATUS_OK is a synonym of NT_STATUS_SUCCESS, and is very widely used
# throughout Samba. It must go first in the list to ensure that to ensure
# that code that previously found this error code in ‘ special_errs’
# maintains the same behaviour by falling back to ‘ nt_errs’ .
ok_status = ErrorDef ( )
ok_status . err_code = 0
ok_status . err_define = ' NT_STATUS_OK '
errors . insert ( 0 , ok_status )
2017-08-08 11:56:17 +03:00
print ( " writing new header file: %s " % gen_headerfile_name )
s4/scripting/bin: open unicode files with utf8 encoding and write unicode string
In files like `libcli/util/werror_err_table.txt` and `libcli/util/ntstatus_err_table.txt`,
there were unicode quote symbols at line 6:
...(“this documentation”)...
In `libcli/util/wscript_build`, it will run `gen_werror.py` and `gen_ntstatus.py`
to `open` above files, read content from them and write to other files.
When encoding not specified, `open` in both python 2/3 will guess encoding from locale.
When locale is not set, it defaults to POSIX or C, and then python will use
encoding `ANSI_X3.4-1968`.
So, on a system locale is not set, `make` will fail with encoding error
for both python 2 and 3:
File "/home/ubuntu/samba/source4/scripting/bin/gen_werror.py", line 139, in main
errors = parseErrorDescriptions(input_file, True, transformErrorName)
File "/home/ubuntu/samba/source4/scripting/bin/gen_error_common.py", line 52, in parseErrorDescriptions
for line in file_contents:
File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 318: ordinal not in range(128)
In this case, we have to use `io.open` with `encoding='utf8'`.
However, then we got unicode strs and try to write them with other strs
into new file, which means the new file must also open with utf-8 and
all other strs have to be unicode, too.
Instead of prefix `u` to all strs, a more easier/elegant way is to enable
unicode literals for the python scripts, which we normally didn't do in samba.
Since both `gen_werror.py` and `gen_ntstatus.py` are bin scripts and no
other modules import them, it should be ok for this case.
Signed-off-by: Joe Guo <joeg@catalyst.net.nz>
Autobuild-User(master): Douglas Bagnall <dbagnall@samba.org>
Autobuild-Date(master): Fri Feb 8 06:34:47 CET 2019 on sn-devel-144
2019-01-30 05:52:08 +03:00
out_file = io . open ( gen_headerfile_name , " wt " , encoding = ' utf8 ' )
2017-01-20 02:11:30 +03:00
generateHeaderFile ( out_file , errors )
2014-03-25 00:35:50 +04:00
out_file . close ( )
2017-08-08 11:56:17 +03:00
print ( " writing new source file: %s " % gen_sourcefile_name )
s4/scripting/bin: open unicode files with utf8 encoding and write unicode string
In files like `libcli/util/werror_err_table.txt` and `libcli/util/ntstatus_err_table.txt`,
there were unicode quote symbols at line 6:
...(“this documentation”)...
In `libcli/util/wscript_build`, it will run `gen_werror.py` and `gen_ntstatus.py`
to `open` above files, read content from them and write to other files.
When encoding not specified, `open` in both python 2/3 will guess encoding from locale.
When locale is not set, it defaults to POSIX or C, and then python will use
encoding `ANSI_X3.4-1968`.
So, on a system locale is not set, `make` will fail with encoding error
for both python 2 and 3:
File "/home/ubuntu/samba/source4/scripting/bin/gen_werror.py", line 139, in main
errors = parseErrorDescriptions(input_file, True, transformErrorName)
File "/home/ubuntu/samba/source4/scripting/bin/gen_error_common.py", line 52, in parseErrorDescriptions
for line in file_contents:
File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 318: ordinal not in range(128)
In this case, we have to use `io.open` with `encoding='utf8'`.
However, then we got unicode strs and try to write them with other strs
into new file, which means the new file must also open with utf-8 and
all other strs have to be unicode, too.
Instead of prefix `u` to all strs, a more easier/elegant way is to enable
unicode literals for the python scripts, which we normally didn't do in samba.
Since both `gen_werror.py` and `gen_ntstatus.py` are bin scripts and no
other modules import them, it should be ok for this case.
Signed-off-by: Joe Guo <joeg@catalyst.net.nz>
Autobuild-User(master): Douglas Bagnall <dbagnall@samba.org>
Autobuild-Date(master): Fri Feb 8 06:34:47 CET 2019 on sn-devel-144
2019-01-30 05:52:08 +03:00
out_file = io . open ( gen_sourcefile_name , " wt " , encoding = ' utf8 ' )
2017-01-20 02:11:30 +03:00
generateSourceFile ( out_file , errors )
2014-03-25 00:35:50 +04:00
out_file . close ( )
2017-08-08 11:56:17 +03:00
print ( " writing new python file: %s " % gen_pythonfile_name )
s4/scripting/bin: open unicode files with utf8 encoding and write unicode string
In files like `libcli/util/werror_err_table.txt` and `libcli/util/ntstatus_err_table.txt`,
there were unicode quote symbols at line 6:
...(“this documentation”)...
In `libcli/util/wscript_build`, it will run `gen_werror.py` and `gen_ntstatus.py`
to `open` above files, read content from them and write to other files.
When encoding not specified, `open` in both python 2/3 will guess encoding from locale.
When locale is not set, it defaults to POSIX or C, and then python will use
encoding `ANSI_X3.4-1968`.
So, on a system locale is not set, `make` will fail with encoding error
for both python 2 and 3:
File "/home/ubuntu/samba/source4/scripting/bin/gen_werror.py", line 139, in main
errors = parseErrorDescriptions(input_file, True, transformErrorName)
File "/home/ubuntu/samba/source4/scripting/bin/gen_error_common.py", line 52, in parseErrorDescriptions
for line in file_contents:
File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 318: ordinal not in range(128)
In this case, we have to use `io.open` with `encoding='utf8'`.
However, then we got unicode strs and try to write them with other strs
into new file, which means the new file must also open with utf-8 and
all other strs have to be unicode, too.
Instead of prefix `u` to all strs, a more easier/elegant way is to enable
unicode literals for the python scripts, which we normally didn't do in samba.
Since both `gen_werror.py` and `gen_ntstatus.py` are bin scripts and no
other modules import them, it should be ok for this case.
Signed-off-by: Joe Guo <joeg@catalyst.net.nz>
Autobuild-User(master): Douglas Bagnall <dbagnall@samba.org>
Autobuild-Date(master): Fri Feb 8 06:34:47 CET 2019 on sn-devel-144
2019-01-30 05:52:08 +03:00
out_file = io . open ( gen_pythonfile_name , " wt " , encoding = ' utf8 ' )
2017-01-20 02:11:30 +03:00
generatePythonFile ( out_file , errors )
2016-09-27 21:31:58 +03:00
out_file . close ( )
2014-03-25 00:35:50 +04:00
if __name__ == ' __main__ ' :
main ( )