From 6431307e7085a5154561c6b1a85f970d62f3cac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Svensson?= Date: Sat, 31 Oct 2020 20:54:44 +0100 Subject: [PATCH] Bug 568079: Reformat source code using clang-format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will enforce formatting when building the native code Change-Id: I6c047f4c0672609df322b7ba716fc786f0e3aab4 Signed-off-by: Torbjörn Svensson --- .clang-format | 12 + .gitattributes | 1 + .../os/linux/aarch64/libspawner.so | Bin 24624 -> 24624 bytes .../os/linux/ppc64le/libspawner.so | Bin 74912 -> 74912 bytes .../os/linux/x86_64/libspawner.so | Bin 23832 -> 23832 bytes .../os/macosx/x86/libspawner.jnilib | Bin 19916 -> 19916 bytes .../os/macosx/x86_64/libspawner.jnilib | Bin 20032 -> 20032 bytes .../.settings/org.eclipse.cdt.core.prefs | 189 --- .../.settings/org.eclipse.cdt.ui.prefs | 3 - .../include/org_eclipse_cdt_utils_pty_PTY.h | 16 +- ...org_eclipse_cdt_utils_pty_PTYInputStream.h | 6 +- ...rg_eclipse_cdt_utils_pty_PTYOutputStream.h | 6 +- .../org_eclipse_cdt_utils_spawner_Spawner.h | 24 +- ...pse_cdt_utils_spawner_SpawnerInputStream.h | 10 +- ...se_cdt_utils_spawner_SpawnerOutputStream.h | 7 +- .../native_src/unix/exec0.h | 2 +- .../native_src/unix/exec_pty.c | 311 ++-- .../native_src/unix/exec_unix.c | 253 ++- .../native_src/unix/io.c | 150 +- .../native_src/unix/openpty.c | 134 +- .../native_src/unix/pfind.c | 149 +- .../native_src/unix/pty.c | 68 +- .../native_src/unix/ptyio.c | 72 +- .../native_src/unix/spawner.c | 356 ++--- .../native_src/win/Win32ProcessEx.c | 1373 +++++++++-------- .../native_src/win/include/winpty.h | 4 +- .../native_src/win/iostream.c | 346 ++--- .../native_src/win/pty.cpp | 612 ++++---- .../native_src/win/pty_dllmain.cpp | 60 +- .../native_src/win/raise.c | 224 ++- .../native_src/win/spawner.c | 49 +- .../native_src/win/starter.c | 808 +++++----- .../.settings/org.eclipse.cdt.core.prefs | 189 +-- .../.settings/org.eclipse.cdt.ui.prefs | 3 - .../os/win32/x86_64/pty.dll | Bin 869359 -> 869359 bytes .../os/win32/x86_64/spawner.dll | Bin 331044 -> 331044 bytes .../os/win32/x86_64/starter.exe | Bin 398415 -> 398415 bytes .../.settings/org.eclipse.cdt.core.prefs | 189 --- .../.settings/org.eclipse.cdt.ui.prefs | 3 - .../.settings/org.eclipse.cdt.core.prefs | 189 --- .../.settings/org.eclipse.cdt.ui.prefs | 3 - .../org_eclipse_cdt_serial_SerialPort.h | 22 +- .../native_src/serial.c | 856 +++++----- .../os/win32/x86_64/serial.dll | Bin 381152 -> 381152 bytes releng/scripts/do_project_settings.sh | 18 - releng/scripts/do_rebuild_natives.sh | 11 +- 46 files changed, 2965 insertions(+), 3763 deletions(-) create mode 100644 .clang-format delete mode 100644 core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.core.prefs delete mode 100644 core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.ui.prefs delete mode 100644 core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.ui.prefs delete mode 100644 core/org.eclipse.cdt.core/.settings/org.eclipse.cdt.core.prefs delete mode 100644 core/org.eclipse.cdt.core/.settings/org.eclipse.cdt.ui.prefs delete mode 100644 native/org.eclipse.cdt.native.serial/.settings/org.eclipse.cdt.core.prefs delete mode 100644 native/org.eclipse.cdt.native.serial/.settings/org.eclipse.cdt.ui.prefs diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000000..63f88092bc0 --- /dev/null +++ b/.clang-format @@ -0,0 +1,12 @@ +BasedOnStyle: LLVM + +# Set column width to 120 +ColumnLimit: 120 + +# Sorting include statements will put "windows.h" last and result in build error. +# To avoid unpredictable build errors, disable sorting. +SortIncludes: false + +# Use 4 spaces as indentation +IndentWidth: 4 +UseTab: Never diff --git a/.gitattributes b/.gitattributes index e67fd4d1fbe..5abedf66e8f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -135,6 +135,7 @@ test_commands text # Other special files cdtOptions text +.clang-format text .contentsettings text *.csv text *.dia binary diff --git a/core/org.eclipse.cdt.core.linux.aarch64/os/linux/aarch64/libspawner.so b/core/org.eclipse.cdt.core.linux.aarch64/os/linux/aarch64/libspawner.so index 803a23739adbb0f64a7ab7f347d034976d97ec73..ca8ff04d3a457ce360d9e0a7a575d1832f9455bb 100755 GIT binary patch delta 61 zcmdmRfN=v5EnpN8Nw~8}J%rQp3!iqF)|_ea(#s=SH*aCwp~A>KIae*6QF-%KHG3Au R#gj#~cQYQ|d{H~z1OVDY7WM!D delta 61 zcmdmRfN=v5EnpN;mUl2@y6N=qPma#h=^t+}%bRrU-@Ju!hYF+ecpHTsf;c`t9(jJwWEx`LnbE+${kylaVif0Xnl0 XFw+GAK9kKh7nA%o&;d`g%{J5R6AvE= diff --git a/core/org.eclipse.cdt.core.linux.x86_64/os/linux/x86_64/libspawner.so b/core/org.eclipse.cdt.core.linux.x86_64/os/linux/x86_64/libspawner.so index e0cf1a9461dbc4a5e9c774af95bcad41cd1b4805..3c3e2ff384ed219f86970551b66491025aa2de2a 100755 GIT binary patch delta 61 zcmV-D0K)&6x&fHF0kGHs6ov7>>x(ZIQ8AeS0q%|H%!Ndq+q3Keh9UtllXE0t0XehP TB*_B-J(Hg(u>nrAQ7OkWUGEw- delta 61 zcmV-D0K)&6x&fHF0kGHs6zJBSaZE+CnuBQ7OkWgSZ;# diff --git a/core/org.eclipse.cdt.core.macosx/os/macosx/x86/libspawner.jnilib b/core/org.eclipse.cdt.core.macosx/os/macosx/x86/libspawner.jnilib index 042a58286428c1f676297aa67b00c4c84716ca17..b12ec7c661e941a6836d1bb7842984a05a7fc006 100755 GIT binary patch delta 153 zcmX>zoAJzS#tj)P0#df0cewjm=FUoxOmp2XdUkUKOQxWV0Rsa=_YQMuAZg!eqtfZ4 z!qOR{!g1V1g~wp>U(rl)OOS%to=zDRpg2os2}I6vbFEkmtGF##vI9-hcJc@5OHzIy Txw#ep|Nlpm_S<|%=7RwM(~>e4 delta 153 zcmX>zoAJzS#tj)P0*_pn(k@-HU$@RJ@#Dq(^E{g?STY4=3>g?0x_6jM14;W%8Wb| PJ(E)%$N^5X93CVvRs9n? delta 57 zcmV-90LK5ooB_a`0k9Ya5WjeEI|A%H28;o69*c52p0g+gFB1VVlUNvU0XnnD7>Wb| PK9f@&$N^8Y93CVvJSY-c diff --git a/core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.core.prefs b/core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.core.prefs deleted file mode 100644 index 85b6db296e7..00000000000 --- a/core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.core.prefs +++ /dev/null @@ -1,189 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.cdt.core.formatter.alignment_for_assignment=16 -org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 -org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34 -org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 -org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0 -org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 -org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 -org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 -org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20 -org.eclipse.cdt.core.formatter.alignment_for_member_access=0 -org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16 -org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false -org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1 -org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true -org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true -org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off -org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on -org.eclipse.cdt.core.formatter.compact_else_if=true -org.eclipse.cdt.core.formatter.continuation_indentation=2 -org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.cdt.core.formatter.format_block_comment=true -org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.cdt.core.formatter.format_header_comment=true -org.eclipse.cdt.core.formatter.format_line_comment=true -org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false -org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false -org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false -org.eclipse.cdt.core.formatter.indent_empty_lines=false -org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true -org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.cdt.core.formatter.indentation.size=4 -org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert -org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert -org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert -org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.join_wrapped_lines=true -org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.cdt.core.formatter.lineSplit=120 -org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.cdt.core.formatter.tabulation.char=tab -org.eclipse.cdt.core.formatter.tabulation.size=4 -org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true -org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false diff --git a/core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.ui.prefs b/core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.ui.prefs deleted file mode 100644 index 4f7bce2bbb8..00000000000 --- a/core/org.eclipse.cdt.core.native/.settings/org.eclipse.cdt.ui.prefs +++ /dev/null @@ -1,3 +0,0 @@ -eclipse.preferences.version=1 -formatter_profile=_Unmanaged profile 'CDT' -formatter_settings_version=1 diff --git a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTY.h b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTY.h index e9a84b41e06..cdeb5ad662b 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTY.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTY.h @@ -12,32 +12,30 @@ extern "C" { * Method: openMaster * Signature: (Z)Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster - (JNIEnv *, jobject, jboolean); +JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *, jobject, jboolean); /* * Class: org_eclipse_cdt_utils_pty_PTY * Method: change_window_size * Signature: (III)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size - (JNIEnv *, jobject, jint, jint, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(JNIEnv *, jobject, jint, jint, jint); /* * Class: org_eclipse_cdt_utils_pty_PTY * Method: exec2 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;Ljava/lang/String;IZ)I + * Signature: + * ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;Ljava/lang/String;IZ)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_exec2 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jobjectArray, jstring, jint, jboolean); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_exec2(JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, + jobjectArray, jstring, jint, jboolean); /* * Class: org_eclipse_cdt_utils_pty_PTY * Method: waitFor * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_waitFor - (JNIEnv *, jobject, jint, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_waitFor(JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYInputStream.h b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYInputStream.h index 2cb2f30a98f..29fae6fd63e 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYInputStream.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYInputStream.h @@ -18,16 +18,14 @@ extern "C" { * Method: read0 * Signature: (I[BI)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0 - (JNIEnv *, jobject, jint, jbyteArray, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *, jobject, jint, jbyteArray, jint); /* * Class: org_eclipse_cdt_utils_pty_PTYInputStream * Method: close0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0 - (JNIEnv *, jobject, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *, jobject, jint); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYOutputStream.h b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYOutputStream.h index 5053b595440..2473324b419 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYOutputStream.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_pty_PTYOutputStream.h @@ -14,16 +14,14 @@ extern "C" { * Method: write0 * Signature: (I[BI)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0 - (JNIEnv *, jobject, jint, jbyteArray, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *, jobject, jint, jbyteArray, jint); /* * Class: org_eclipse_cdt_utils_pty_PTYOutputStream * Method: close0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0 - (JNIEnv *, jobject, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *, jobject, jint); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_Spawner.h b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_Spawner.h index 49d912a2963..8b18623fd60 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_Spawner.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_Spawner.h @@ -10,42 +10,42 @@ extern "C" { /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I + * Signature: + * ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jobjectArray); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *, jobject, jobjectArray, jobjectArray, + jstring, jobjectArray); /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: exec1 * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *, jobject, jobjectArray, jobjectArray, + jstring); /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: exec2 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;Ljava/lang/String;IZ)I + * Signature: + * ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;Ljava/lang/String;IZ)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jobjectArray, jstring, jint, jboolean); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2(JNIEnv *, jobject, jobjectArray, jobjectArray, + jstring, jobjectArray, jstring, jint, jboolean); /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: raise * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise - (JNIEnv *, jobject, jint, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *, jobject, jint, jint); /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: waitFor * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor - (JNIEnv *, jobject, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv *, jobject, jint); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerInputStream.h b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerInputStream.h index c98afe971fe..76662bb4d63 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerInputStream.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerInputStream.h @@ -18,24 +18,22 @@ extern "C" { * Method: read0 * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;[BI)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0 - (JNIEnv *, jobject, jobject, jbyteArray, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *, jobject, jobject, + jbyteArray, jint); /* * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream * Method: close0 * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0 - (JNIEnv *, jobject, jobject); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *, jobject, jobject); /* * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream * Method: available0 * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0 - (JNIEnv *, jobject, jobject); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0(JNIEnv *, jobject, jobject); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerOutputStream.h b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerOutputStream.h index 9c5ab1671ff..bb94be6c533 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerOutputStream.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/org_eclipse_cdt_utils_spawner_SpawnerOutputStream.h @@ -12,16 +12,15 @@ extern "C" { * Method: write0 * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;[BI)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0 - (JNIEnv *, jobject, jobject, jbyteArray, jint); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *, jobject, jobject, + jbyteArray, jint); /* * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream * Method: close0 * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0 - (JNIEnv *, jobject, jobject); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *, jobject, jobject); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/exec0.h b/core/org.eclipse.cdt.core.native/native_src/unix/exec0.h index ab5648482c6..fb272ea9101 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/exec0.h +++ b/core/org.eclipse.cdt.core.native/native_src/unix/exec0.h @@ -22,6 +22,6 @@ extern pid_t exec0(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3]); extern pid_t exec_pty(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3], - const char *pts_name, int fdm, int console); + const char *pts_name, int fdm, int console); extern int wait0(pid_t pid); diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/exec_pty.c b/core/org.eclipse.cdt.core.native/native_src/unix/exec_pty.c index 5b2b58188d4..de5b86a5b3e 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/exec_pty.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/exec_pty.c @@ -10,7 +10,7 @@ * * Contributors: * QNX Software Systems - initial API and implementation - * Wind River Systems, Inc. + * Wind River Systems, Inc. * Mikhail Zabaluev (Nokia) - bug 82744 * Mikhail Sennikovsky - bug 145737 *******************************************************************************/ @@ -26,166 +26,165 @@ #include /* from pfind.c */ -extern char* pfind(const char *name, char *const envp[]); +extern char *pfind(const char *name, char *const envp[]); pid_t exec_pty(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3], - const char *pts_name, int fdm, int console) { - int pipe2[2]; - pid_t childpid; - char *full_path; - - /* - * We use pfind() to check that the program exists and is an executable. - * If not pass the error up. Also execve() wants a full path. - */ - full_path = pfind(path, envp); - if (full_path == NULL) { - fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); - return -1; - } - - /* - * Make sure we can create our pipes before forking. - */ - if (channels != NULL && console) { - if (pipe(pipe2) < 0) { - fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); - free(full_path); - return -1; - } - } - - childpid = fork(); - - if (childpid < 0) { - fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, - __LINE__, strerror(errno)); - free(full_path); - return -1; - } else if (childpid == 0) { /* child */ - - chdir(dirpath); - - if (channels != NULL) { - int fds; - - if (!console && setsid() < 0) { - perror("setsid()"); - return -1; - } - - fds = ptys_open(fdm, pts_name); - if (fds < 0) { - fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); - return -1; - } - - /* Close the read end of pipe2 */ - if (console && close(pipe2[0]) == -1) { - perror("close(pipe2[0]))"); - } - - /* close the master, no need in the child */ - close(fdm); - - if (console) { - set_noecho(fds); - if (setpgid(getpid(), getpid()) < 0) { - perror("setpgid()"); - return -1; - } - } - - /* redirections */ - dup2(fds, STDIN_FILENO); /* dup stdin */ - dup2(fds, STDOUT_FILENO); /* dup stdout */ - if (console) { - dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ - } else { - dup2(fds, STDERR_FILENO); /* dup stderr */ - } - close(fds); /* done with fds. */ - } - - /* Close all the fd's in the child */ - { - int fdlimit = sysconf(_SC_OPEN_MAX); - int fd = 3; - - while (fd < fdlimit) { - close(fd++); - } - } - - if (envp[0] == NULL) { - execv(full_path, argv); - } else { - execve(full_path, argv, envp); - } - - _exit(127); - - } else if (childpid != 0) { /* parent */ - if (console) { - set_noecho(fdm); - } - if (channels != NULL) { - channels[0] = fdm; /* Input Stream. */ - channels[1] = fdm; /* Output Stream. */ - if (console) { - /* close the write end of pipe1 */ - if (close(pipe2[1]) == -1) { - perror("close(pipe2[1])"); - } - channels[2] = pipe2[0]; /* stderr Stream. */ - } else { - channels[2] = fdm; /* Error Stream. */ - } - } - - free(full_path); - return childpid; - } - - free(full_path); - return -1; /*NOT REACHED */ + const char *pts_name, int fdm, int console) { + int pipe2[2]; + pid_t childpid; + char *full_path; + + /* + * We use pfind() to check that the program exists and is an executable. + * If not pass the error up. Also execve() wants a full path. + */ + full_path = pfind(path, envp); + if (full_path == NULL) { + fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); + return -1; + } + + /* + * Make sure we can create our pipes before forking. + */ + if (channels != NULL && console) { + if (pipe(pipe2) < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } + } + + childpid = fork(); + + if (childpid < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } else if (childpid == 0) { /* child */ + + chdir(dirpath); + + if (channels != NULL) { + int fds; + + if (!console && setsid() < 0) { + perror("setsid()"); + return -1; + } + + fds = ptys_open(fdm, pts_name); + if (fds < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); + return -1; + } + + /* Close the read end of pipe2 */ + if (console && close(pipe2[0]) == -1) { + perror("close(pipe2[0]))"); + } + + /* close the master, no need in the child */ + close(fdm); + + if (console) { + set_noecho(fds); + if (setpgid(getpid(), getpid()) < 0) { + perror("setpgid()"); + return -1; + } + } + + /* redirections */ + dup2(fds, STDIN_FILENO); /* dup stdin */ + dup2(fds, STDOUT_FILENO); /* dup stdout */ + if (console) { + dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + } else { + dup2(fds, STDERR_FILENO); /* dup stderr */ + } + close(fds); /* done with fds. */ + } + + /* Close all the fd's in the child */ + { + int fdlimit = sysconf(_SC_OPEN_MAX); + int fd = 3; + + while (fd < fdlimit) { + close(fd++); + } + } + + if (envp[0] == NULL) { + execv(full_path, argv); + } else { + execve(full_path, argv, envp); + } + + _exit(127); + + } else if (childpid != 0) { /* parent */ + if (console) { + set_noecho(fdm); + } + if (channels != NULL) { + channels[0] = fdm; /* Input Stream. */ + channels[1] = fdm; /* Output Stream. */ + if (console) { + /* close the write end of pipe1 */ + if (close(pipe2[1]) == -1) { + perror("close(pipe2[1])"); + } + channels[2] = pipe2[0]; /* stderr Stream. */ + } else { + channels[2] = fdm; /* Error Stream. */ + } + } + + free(full_path); + return childpid; + } + + free(full_path); + return -1; /*NOT REACHED */ } #ifdef __STAND_ALONE__ int main(int argc, char **argv, char **envp) { - const char *path = "./bufferring_test"; - int channels[3] = { -1, -1, -1}; - int status; - FILE *app_stdin; - FILE *app_stdout; - FILE *app_stderr; - char pts_name[32]; - int fdm; - char buffer[32]; - - fdm = ptym_open(pts_name); - status = exec_pty(path, argv, envp, ".", channels, pts_name, fdm); - if (status >= 0) { - app_stdin = fdopen(channels[0], "w"); - app_stdout = fdopen(channels[1], "r"); - app_stderr = fdopen(channels[2], "r"); - if (app_stdout == NULL || app_stderr == NULL || app_stdin == NULL) { - fprintf(stderr, "PROBLEMS\n"); - } else { - fputs("foo\n", app_stdin); - fputs("bar\n", app_stdin); - while(fgets(buffer, sizeof buffer, app_stdout) != NULL) { - fprintf(stdout, "STDOUT: %s\n", buffer); - } - while(fgets(buffer, sizeof buffer, app_stderr) != NULL) { - fprintf(stdout, "STDERR: %s\n", buffer); - } - } - } - fputs("bye\n", stdout); - close(channels[0]); - close(channels[1]); - close(channels[2]); - return 0; + const char *path = "./bufferring_test"; + int channels[3] = {-1, -1, -1}; + int status; + FILE *app_stdin; + FILE *app_stdout; + FILE *app_stderr; + char pts_name[32]; + int fdm; + char buffer[32]; + + fdm = ptym_open(pts_name); + status = exec_pty(path, argv, envp, ".", channels, pts_name, fdm); + if (status >= 0) { + app_stdin = fdopen(channels[0], "w"); + app_stdout = fdopen(channels[1], "r"); + app_stderr = fdopen(channels[2], "r"); + if (app_stdout == NULL || app_stderr == NULL || app_stdin == NULL) { + fprintf(stderr, "PROBLEMS\n"); + } else { + fputs("foo\n", app_stdin); + fputs("bar\n", app_stdin); + while (fgets(buffer, sizeof buffer, app_stdout) != NULL) { + fprintf(stdout, "STDOUT: %s\n", buffer); + } + while (fgets(buffer, sizeof buffer, app_stderr) != NULL) { + fprintf(stdout, "STDERR: %s\n", buffer); + } + } + } + fputs("bye\n", stdout); + close(channels[0]); + close(channels[1]); + close(channels[2]); + return 0; } #endif diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/exec_unix.c b/core/org.eclipse.cdt.core.native/native_src/unix/exec_unix.c index e15a9e95a23..5f388a8bdbb 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/exec_unix.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/exec_unix.c @@ -23,136 +23,135 @@ #include /* from pfind.c */ -extern char* pfind(const char *name, char *const envp[]); +extern char *pfind(const char *name, char *const envp[]); pid_t exec0(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3]) { - int pipe0[2], pipe1[2], pipe2[2]; - pid_t childpid; - char *full_path; - - /* - * We use pfind() to check that the program exists and is an executable. - * If not pass the error up. Also execve() wants a full path. - */ - full_path = pfind(path, envp); - if (full_path == NULL) { - fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); - return -1; - } - - /* - * Make sure we can create our pipes before forking. - */ - if (channels != NULL) { - if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) { - fprintf(stderr, "%s(%d): returning due to error.\n", __func__, - __LINE__); - free(full_path); - return -1; - } - } - - childpid = fork(); - - if (childpid < 0) { - fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); - free(full_path); - return -1; - } else if (childpid == 0) { /* child */ - chdir(dirpath); - - if (channels != NULL) { - /* Close the write end of pipe0 */ - if (close(pipe0[1]) == -1) { - perror("close(pipe0[1])"); - } - - /* Close the read end of pipe1 */ - if (close(pipe1[0]) == -1) { - perror("close(pipe1[0])"); - } - - /* Close the read end of pipe2 */ - if (close(pipe2[0]) == -1) { - perror("close(pipe2[0]))"); - } - - /* redirections */ - dup2(pipe0[0], STDIN_FILENO); /* dup stdin */ - dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */ - dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ - } - - /* Close all the fd's in the child */ - { - int fdlimit = sysconf(_SC_OPEN_MAX); - int fd = 3; - - while (fd < fdlimit) { - close(fd++); - } - } - - setpgid(getpid(), getpid()); - - if (envp[0] == NULL) { - execv(full_path, argv); - } else { - execve(full_path, argv, envp); - } - - _exit(127); - - } else if (childpid != 0) { /* parent */ - if (channels != NULL) { - /* close the read end of pipe1 */ - if (close(pipe0[0]) == -1) { - perror("close(pipe0[0])"); - } - - /* close the write end of pipe2 */ - if (close(pipe1[1]) == -1) { - perror("close(pipe1[1])"); - } - - /* close the write end of pipe2 */ - if (close(pipe2[1]) == -1) { - perror("close(pipe2[1])"); - } - - channels[0] = pipe0[1]; /* Output Stream. */ - channels[1] = pipe1[0]; /* Input Stream. */ - channels[2] = pipe2[0]; /* Input Stream. */ - } - - free(full_path); - return childpid; - } - - free(full_path); - return -1; /*NOT REACHED */ + int pipe0[2], pipe1[2], pipe2[2]; + pid_t childpid; + char *full_path; + + /* + * We use pfind() to check that the program exists and is an executable. + * If not pass the error up. Also execve() wants a full path. + */ + full_path = pfind(path, envp); + if (full_path == NULL) { + fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); + return -1; + } + + /* + * Make sure we can create our pipes before forking. + */ + if (channels != NULL) { + if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) { + fprintf(stderr, "%s(%d): returning due to error.\n", __func__, __LINE__); + free(full_path); + return -1; + } + } + + childpid = fork(); + + if (childpid < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __func__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } else if (childpid == 0) { /* child */ + chdir(dirpath); + + if (channels != NULL) { + /* Close the write end of pipe0 */ + if (close(pipe0[1]) == -1) { + perror("close(pipe0[1])"); + } + + /* Close the read end of pipe1 */ + if (close(pipe1[0]) == -1) { + perror("close(pipe1[0])"); + } + + /* Close the read end of pipe2 */ + if (close(pipe2[0]) == -1) { + perror("close(pipe2[0]))"); + } + + /* redirections */ + dup2(pipe0[0], STDIN_FILENO); /* dup stdin */ + dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */ + dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + } + + /* Close all the fd's in the child */ + { + int fdlimit = sysconf(_SC_OPEN_MAX); + int fd = 3; + + while (fd < fdlimit) { + close(fd++); + } + } + + setpgid(getpid(), getpid()); + + if (envp[0] == NULL) { + execv(full_path, argv); + } else { + execve(full_path, argv, envp); + } + + _exit(127); + + } else if (childpid != 0) { /* parent */ + if (channels != NULL) { + /* close the read end of pipe1 */ + if (close(pipe0[0]) == -1) { + perror("close(pipe0[0])"); + } + + /* close the write end of pipe2 */ + if (close(pipe1[1]) == -1) { + perror("close(pipe1[1])"); + } + + /* close the write end of pipe2 */ + if (close(pipe2[1]) == -1) { + perror("close(pipe2[1])"); + } + + channels[0] = pipe0[1]; /* Output Stream. */ + channels[1] = pipe1[0]; /* Input Stream. */ + channels[2] = pipe2[0]; /* Input Stream. */ + } + + free(full_path); + return childpid; + } + + free(full_path); + return -1; /*NOT REACHED */ } int wait0(pid_t pid) { - int status; - int val = -1; - - if (pid < 0) { - return -1; - } - - for (;;) { - if (waitpid(pid, &status, 0) < 0) { - if (errno == EINTR) { - // interrupted system call - retry - continue; - } - } - break; - } - if (WIFEXITED(status)) { - val = WEXITSTATUS(status); - } - - return val; + int status; + int val = -1; + + if (pid < 0) { + return -1; + } + + for (;;) { + if (waitpid(pid, &status, 0) < 0) { + if (errno == EINTR) { + // interrupted system call - retry + continue; + } + } + break; + } + if (WIFEXITED(status)) { + val = WEXITSTATUS(status); + } + + return val; } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/io.c b/core/org.eclipse.cdt.core.native/native_src/unix/io.c index d5c0de0f683..4805e9a6227 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/io.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/io.c @@ -22,95 +22,95 @@ /* Header for class _org_eclipse_cdt_utils_spawner_SpawnerOutputStream */ static void ThrowByName(JNIEnv *env, const char *name, const char *msg) { - jclass cls = (*env)->FindClass(env, name); + jclass cls = (*env)->FindClass(env, name); - if (cls != 0) { /* Otherwise an exception has already been thrown */ - (*env)->ThrowNew(env, cls, msg); - } + if (cls != 0) { /* Otherwise an exception has already been thrown */ + (*env)->ThrowNew(env, cls, msg); + } - /* It's a good practice to clean up the local references. */ - (*env)->DeleteLocalRef(env, cls); + /* It's a good practice to clean up the local references. */ + (*env)->DeleteLocalRef(env, cls); } static int channelToFileDesc(JNIEnv *env, jobject channel) { - if (channel == 0) { - ThrowByName(env, "java/io/IOException", "Invalid channel object"); - return -1; - } - - jclass cls = (*env)->GetObjectClass(env, channel); - if (cls == 0) { - ThrowByName(env, "java/io/IOException", "Unable to get channel class"); - return -1; - } - - jfieldID fid = (*env)->GetFieldID(env, cls, "fd", "I"); - if (fid == 0) { - ThrowByName(env, "java/io/IOException", "Unable to find fd"); - return -1; - } - - jint fd = (*env)->GetIntField(env, channel, fid); - return fd; + if (channel == 0) { + ThrowByName(env, "java/io/IOException", "Invalid channel object"); + return -1; + } + + jclass cls = (*env)->GetObjectClass(env, channel); + if (cls == 0) { + ThrowByName(env, "java/io/IOException", "Unable to get channel class"); + return -1; + } + + jfieldID fid = (*env)->GetFieldID(env, cls, "fd", "I"); + if (fid == 0) { + ThrowByName(env, "java/io/IOException", "Unable to find fd"); + return -1; + } + + jint fd = (*env)->GetIntField(env, channel, fid); + return fd; } -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *env, jobject jobj, jobject channel, jbyteArray buf, - jint buf_len) { - int fd; - int status; - jbyte *data; - int data_len; - - data = (*env)->GetByteArrayElements(env, buf, 0); - data_len = buf_len; - fd = channelToFileDesc(env, channel); - - status = read(fd, data, data_len); - (*env)->ReleaseByteArrayElements(env, buf, data, 0); - - if (status == 0) { - /* EOF. */ - status = -1; - } else if (status == -1) { - /* Error, toss an exception */ - jclass exception = (*env)->FindClass(env, "java/io/IOException"); - if (exception == NULL) { - /* Give up. */ - return -1; - } - (*env)->ThrowNew(env, exception, "read error"); - } - - return status; +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *env, jobject jobj, + jobject channel, jbyteArray buf, + jint buf_len) { + int fd; + int status; + jbyte *data; + int data_len; + + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = channelToFileDesc(env, channel); + + status = read(fd, data, data_len); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); + + if (status == 0) { + /* EOF. */ + status = -1; + } else if (status == -1) { + /* Error, toss an exception */ + jclass exception = (*env)->FindClass(env, "java/io/IOException"); + if (exception == NULL) { + /* Give up. */ + return -1; + } + (*env)->ThrowNew(env, exception, "read error"); + } + + return status; } -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *env, jobject jobj, jobject channel) { - int fd = channelToFileDesc(env, channel); - return close(fd); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *env, jobject jobj, + jobject channel) { + int fd = channelToFileDesc(env, channel); + return close(fd); } -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *env, jobject jobj, jobject channel, - jbyteArray buf, jint buf_len) { - int status; - int fd; - jbyte *data; - int data_len; +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *env, jobject jobj, + jobject channel, jbyteArray buf, + jint buf_len) { + int status; + int fd; + jbyte *data; + int data_len; - data = (*env)->GetByteArrayElements(env, buf, 0); - data_len = buf_len; - fd = channelToFileDesc(env, channel); + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = channelToFileDesc(env, channel); - status = write(fd, data, data_len); - (*env)->ReleaseByteArrayElements(env, buf, data, 0); + status = write(fd, data, data_len); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); - return status; + return status; } -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *env, jobject jobj, jobject channel) { - int fd = channelToFileDesc(env, channel); - return close(fd); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *env, jobject jobj, + jobject channel) { + int fd = channelToFileDesc(env, channel); + return close(fd); } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/openpty.c b/core/org.eclipse.cdt.core.native/native_src/unix/openpty.c index 66b08dc66ab..f5f763112ee 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/openpty.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/openpty.c @@ -40,95 +40,95 @@ int ptys_open(int fdm, const char *pts_name); void set_noecho(int fd); int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) { - char line[20]; - line[0] = 0; - *amaster = ptym_open(line); - if (*amaster < 0) { - return -1; - } - *aslave = ptys_open(*amaster, line); - if (*aslave < 0) { - close(*amaster); - return -1; - } + char line[20]; + line[0] = 0; + *amaster = ptym_open(line); + if (*amaster < 0) { + return -1; + } + *aslave = ptys_open(*amaster, line); + if (*aslave < 0) { + close(*amaster); + return -1; + } - if (name) { - strcpy(name, line); - } + if (name) { + strcpy(name, line); + } #ifndef TCSAFLUSH #define TCSAFLUSH TCSETAF #endif - if (termp) { - (void) tcsetattr(*aslave, TCSAFLUSH, termp); - } + if (termp) { + (void)tcsetattr(*aslave, TCSAFLUSH, termp); + } #ifdef TIOCSWINSZ - if (winp) { - (void) ioctl(*aslave, TIOCSWINSZ, (char *)winp); - } + if (winp) { + (void)ioctl(*aslave, TIOCSWINSZ, (char *)winp); + } #endif - return 0; + return 0; } void set_noecho(int fd) { - struct termios stermios; - if (tcgetattr(fd, &stermios) < 0) { - return; - } + struct termios stermios; + if (tcgetattr(fd, &stermios) < 0) { + return; + } - /* turn off echo */ - stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); - /* Turn off the NL to CR/NL mapping ou output. */ - /*stermios.c_oflag &= ~(ONLCR);*/ + /* turn off echo */ + stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); + /* Turn off the NL to CR/NL mapping ou output. */ + /*stermios.c_oflag &= ~(ONLCR);*/ - stermios.c_iflag |= (IGNCR); + stermios.c_iflag |= (IGNCR); - tcsetattr(fd, TCSANOW, &stermios); + tcsetattr(fd, TCSANOW, &stermios); } int ptym_open(char *pts_name) { - int fdm; - char *ptr; + int fdm; + char *ptr; - strcpy(pts_name, "/dev/ptmx"); + strcpy(pts_name, "/dev/ptmx"); #ifdef __APPLE__ - fdm = posix_openpt(O_RDWR|O_NOCTTY); + fdm = posix_openpt(O_RDWR | O_NOCTTY); #else - fdm = getpt(); + fdm = getpt(); #endif - if (fdm < 0) { - return -1; - } - if (grantpt(fdm) < 0) { /* grant access to slave */ - close(fdm); - return -2; - } - if (unlockpt(fdm) < 0) { /* clear slave's lock flag */ - close(fdm); - return -3; - } - ptr = ptsname(fdm); - if (ptr == NULL) { /* get slave's name */ - close(fdm); - return -4; - } - strcpy(pts_name, ptr); /* return name of slave */ - return fdm; /* return fd of master */ + if (fdm < 0) { + return -1; + } + if (grantpt(fdm) < 0) { /* grant access to slave */ + close(fdm); + return -2; + } + if (unlockpt(fdm) < 0) { /* clear slave's lock flag */ + close(fdm); + return -3; + } + ptr = ptsname(fdm); + if (ptr == NULL) { /* get slave's name */ + close(fdm); + return -4; + } + strcpy(pts_name, ptr); /* return name of slave */ + return fdm; /* return fd of master */ } int ptys_open(int fdm, const char *pts_name) { - int fds; - /* following should allocate controlling terminal */ - fds = open(pts_name, O_RDWR); - if (fds < 0) { - close(fdm); - return -5; - } + int fds; + /* following should allocate controlling terminal */ + fds = open(pts_name, O_RDWR); + if (fds < 0) { + close(fdm); + return -5; + } -#if defined(TIOCSCTTY) - /* TIOCSCTTY is the BSD way to acquire a controlling terminal. */ - if (ioctl(fds, TIOCSCTTY, (char *)0) < 0) { - // ignore error: this is expected in console-mode - } +#if defined(TIOCSCTTY) + /* TIOCSCTTY is the BSD way to acquire a controlling terminal. */ + if (ioctl(fds, TIOCSCTTY, (char *)0) < 0) { + // ignore error: this is expected in console-mode + } #endif - return fds; + return fds; } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/pfind.c b/core/org.eclipse.cdt.core.native/native_src/unix/pfind.c index 3c16c82f938..fbe3b73ed40 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/pfind.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/pfind.c @@ -32,85 +32,84 @@ #define PATH_DEF "PATH=" const int path_def_len = 5; /* strlen(PATH_DEF); */ -char* path_val(char *const envp[]) { - int i; - if (envp == NULL || envp[0] == NULL) { - return getenv("PATH"); - } - - for (i = 0; envp[i] != NULL; i++) { - char *p = envp[i]; - if (!strncmp(PATH_DEF, p, path_def_len)) { - return p + path_def_len; - } - } - - return NULL; +char *path_val(char *const envp[]) { + int i; + if (envp == NULL || envp[0] == NULL) { + return getenv("PATH"); + } + + for (i = 0; envp[i] != NULL; i++) { + char *p = envp[i]; + if (!strncmp(PATH_DEF, p, path_def_len)) { + return p + path_def_len; + } + } + + return NULL; } -char* pfind(const char *name, char *const envp[]) { - char *tok; - char *sp; - char *path; - char fullpath[PATH_MAX + 1]; - struct stat sb; - - /* Sanity check. */ - if (name == NULL) { - fprintf(stderr, "pfind(): Null argument.\n"); - return NULL; - } - - /* For absolute name or name with a path, check if it is an executable. */ - if (name[0] == '/' || name[0] == '.') { - if (access(name, X_OK) == 0) { - return strdup(name); - } - return NULL; - } - - /* Search in the PATH environment. */ - path = path_val(envp); - - if (path == NULL || strlen(path) <= 0) { - fprintf(stderr, "Unable to get $PATH.\n"); - return NULL; - } - - /* The value return by getenv() is read-only */ - path = strdup(path); - - tok = strtok_r(path, ":", &sp); - while (tok != NULL) { - snprintf(fullpath, sizeof(fullpath) - 1, "%s/%s", tok, name); - - if (stat(fullpath, &sb) == 0 && S_ISREG(sb.st_mode)) { /* fullpath is a file */ - if (access(fullpath, X_OK) == 0) { /* fullpath is executable */ - free(path); - return strdup(fullpath); - } - } - - tok = strtok_r(NULL, ":", &sp); - } - - free(path); - return NULL; +char *pfind(const char *name, char *const envp[]) { + char *tok; + char *sp; + char *path; + char fullpath[PATH_MAX + 1]; + struct stat sb; + + /* Sanity check. */ + if (name == NULL) { + fprintf(stderr, "pfind(): Null argument.\n"); + return NULL; + } + + /* For absolute name or name with a path, check if it is an executable. */ + if (name[0] == '/' || name[0] == '.') { + if (access(name, X_OK) == 0) { + return strdup(name); + } + return NULL; + } + + /* Search in the PATH environment. */ + path = path_val(envp); + + if (path == NULL || strlen(path) <= 0) { + fprintf(stderr, "Unable to get $PATH.\n"); + return NULL; + } + + /* The value return by getenv() is read-only */ + path = strdup(path); + + tok = strtok_r(path, ":", &sp); + while (tok != NULL) { + snprintf(fullpath, sizeof(fullpath) - 1, "%s/%s", tok, name); + + if (stat(fullpath, &sb) == 0 && S_ISREG(sb.st_mode)) { /* fullpath is a file */ + if (access(fullpath, X_OK) == 0) { /* fullpath is executable */ + free(path); + return strdup(fullpath); + } + } + + tok = strtok_r(NULL, ":", &sp); + } + + free(path); + return NULL; } #ifdef BUILD_WITH_MAIN -int main(int argc, char **argv) -{ - int i; - char *fullpath; - - for (i = 1; i < argc; i++) { - fullpath = pfind(argv[i], NULL); - if (fullpath == NULL) { - printf("Unable to find %s in $PATH.\n", argv[i]); - } else { - printf("Found %s @ %s.\n", argv[i], fullpath); - } - } +int main(int argc, char **argv) { + int i; + char *fullpath; + + for (i = 1; i < argc; i++) { + fullpath = pfind(argv[i], NULL); + if (fullpath == NULL) { + printf("Unable to find %s in $PATH.\n", argv[i]); + } else { + printf("Found %s @ %s.\n", argv[i], fullpath); + } + } } #endif diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/pty.c b/core/org.eclipse.cdt.core.native/native_src/unix/pty.c index 14f3703832a..8ce91ee17a0 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/pty.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/pty.c @@ -21,53 +21,51 @@ * Method: forkpty * Signature: ()I */ -JNIEXPORT jstring JNICALL -Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *env, jobject jobj, jboolean console) { - jfieldID fid; /* Store the field ID */ - jstring jstr = NULL; - int master = -1; - char line[1024]; /* FIXME: Should be enough */ - jclass cls; +JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *env, jobject jobj, jboolean console) { + jfieldID fid; /* Store the field ID */ + jstring jstr = NULL; + int master = -1; + char line[1024]; /* FIXME: Should be enough */ + jclass cls; - line[0] = '\0'; + line[0] = '\0'; - master = ptym_open(line); - if (master >= 0) { - // turn off echo - if (console) { - set_noecho(master); - } + master = ptym_open(line); + if (master >= 0) { + // turn off echo + if (console) { + set_noecho(master); + } - /* Get a reference to the obj's class */ - cls = (*env)->GetObjectClass(env, jobj); + /* Get a reference to the obj's class */ + cls = (*env)->GetObjectClass(env, jobj); - /* Set the master fd. */ - fid = (*env)->GetFieldID(env, cls, "master", "I"); - if (fid == NULL) { - return NULL; - } - (*env)->SetIntField(env, jobj, fid, (jint) master); + /* Set the master fd. */ + fid = (*env)->GetFieldID(env, cls, "master", "I"); + if (fid == NULL) { + return NULL; + } + (*env)->SetIntField(env, jobj, fid, (jint)master); - /* Create a new String for the slave. */ - jstr = (*env)->NewStringUTF(env, line); - } - return jstr; + /* Create a new String for the slave. */ + jstr = (*env)->NewStringUTF(env, line); + } + return jstr; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(JNIEnv *env, jobject jobj, jint fdm, - jint width, jint height) { + jint width, jint height) { #ifdef TIOCSWINSZ - struct winsize win; + struct winsize win; - win.ws_col = width; - win.ws_row = height; - win.ws_xpixel = 0; - win.ws_ypixel = 0; + win.ws_col = width; + win.ws_row = height; + win.ws_xpixel = 0; + win.ws_ypixel = 0; - return ioctl(fdm, TIOCSWINSZ, &win); + return ioctl(fdm, TIOCSWINSZ, &win); #else #error no TIOCSWINSZ - return 0; + return 0; #endif } - diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/ptyio.c b/core/org.eclipse.cdt.core.native/native_src/unix/ptyio.c index b09c4ae5d75..44e879cd48c 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/ptyio.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/ptyio.c @@ -25,26 +25,26 @@ * Method: read0 * Signature: (I)I */ -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, jint jfd, jbyteArray buf, jint buf_len) { - int fd; - int status; - jbyte *data; - int data_len; +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, jint jfd, + jbyteArray buf, jint buf_len) { + int fd; + int status; + jbyte *data; + int data_len; - data = (*env)->GetByteArrayElements(env, buf, 0); - data_len = buf_len; - fd = jfd; + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = jfd; - status = read(fd, data, data_len); - (*env)->ReleaseByteArrayElements(env, buf, data, 0); + status = read(fd, data, data_len); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); - if (status == 0) { - /* EOF. */ - status = -1; - } else if (status == -1) { - /* Error, toss an exception */ - /* Ignore the error for now, the debugger will attempt to close this multiple time. */ + if (status == 0) { + /* EOF. */ + status = -1; + } else if (status == -1) { + /* Error, toss an exception */ + /* Ignore the error for now, the debugger will attempt to close this multiple time. */ #if 0 jclass exception = (*env)->FindClass(env, "java/io/IOException"); if (exception == NULL) { @@ -53,9 +53,9 @@ Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, j } (*env)->ThrowNew(env, exception, "read error"); #endif - } + } - return status; + return status; } /* @@ -63,9 +63,8 @@ Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, j * Method: close0 * Signature: (I)I */ -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, jint fd) { - return close(fd); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, jint fd) { + return close(fd); } /* @@ -73,21 +72,21 @@ Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, * Method: write0 * Signature: (II)I */ -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, jint jfd, jbyteArray buf, jint buf_len) { - int status; - int fd; - jbyte *data; - int data_len; +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, jint jfd, + jbyteArray buf, jint buf_len) { + int status; + int fd; + jbyte *data; + int data_len; - data = (*env)->GetByteArrayElements(env, buf, 0); - data_len = buf_len; - fd = jfd; + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = jfd; - status = write(fd, data, data_len); - (*env)->ReleaseByteArrayElements(env, buf, data, 0); + status = write(fd, data, data_len); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); - return status; + return status; } /* @@ -95,7 +94,6 @@ Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, * Method: close0 * Signature: (I)I */ -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *env, jobject jobj, jint fd) { - return close(fd); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *env, jobject jobj, jint fd) { + return close(fd); } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c b/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c index b42af44d561..503130dd4ea 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c @@ -10,7 +10,7 @@ * * Contributors: * QNX Software Systems - initial API and implementation - * Wind River Systems, Inc. + * Wind River Systems, Inc. * Mikhail Zabaluev (Nokia) - bug 82744 *******************************************************************************/ #include @@ -26,7 +26,7 @@ #define DEBUGIT 0 /* - * Header for class org_eclipse_cdt_utils_spawner_Spawner + * Header for class org_eclipse_cdt_utils_spawner_Spawner */ #if DEBUGIT @@ -44,57 +44,59 @@ static void print_array(char **c_array) { } #endif -static char** alloc_c_array(JNIEnv *env, jobjectArray j_array) { - int i; - jint c_array_size = (*env)->GetArrayLength(env, j_array); - char **c_array = calloc(c_array_size + 1, sizeof(char*)); +static char **alloc_c_array(JNIEnv *env, jobjectArray j_array) { + int i; + jint c_array_size = (*env)->GetArrayLength(env, j_array); + char **c_array = calloc(c_array_size + 1, sizeof(char *)); - if (c_array == NULL) { - return NULL; - } + if (c_array == NULL) { + return NULL; + } - for (i = 0; i < c_array_size; i++) { - jstring j_str = (jstring)(*env)->GetObjectArrayElement(env, j_array, i); - const char *c_str = (*env)->GetStringUTFChars(env, j_str, NULL); - c_array[i] = (char*) strdup(c_str); - (*env)->ReleaseStringUTFChars(env, j_str, c_str); - (*env)->DeleteLocalRef(env, j_str); - } + for (i = 0; i < c_array_size; i++) { + jstring j_str = (jstring)(*env)->GetObjectArrayElement(env, j_array, i); + const char *c_str = (*env)->GetStringUTFChars(env, j_str, NULL); + c_array[i] = (char *)strdup(c_str); + (*env)->ReleaseStringUTFChars(env, j_str, c_str); + (*env)->DeleteLocalRef(env, j_str); + } - return c_array; + return c_array; } static void free_c_array(char **c_array) { - if (c_array) { - for (char **p = c_array; *p; p++) { - free(*p); - } - free(c_array); - } + if (c_array) { + for (char **p = c_array; *p; p++) { + free(*p); + } + free(c_array); + } } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2(JNIEnv *env, jobject jobj, jobjectArray jcmd, - jobjectArray jenv, jstring jdir, jobjectArray jchannels, jstring jslaveName, jint masterFD, jboolean console) { - const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); - const char *pts_name = (*env)->GetStringUTFChars(env, jslaveName, NULL); - char **cmd = NULL; - char **envp = NULL; - int fd[3]; - pid_t pid = -1; - - if (jchannels == NULL) { - goto bail_out; - } - - cmd = alloc_c_array(env, jcmd); - if (cmd == NULL) { - goto bail_out; - } - - envp = alloc_c_array(env, jenv); - if (envp == NULL) { - goto bail_out; - } + jobjectArray jenv, jstring jdir, + jobjectArray jchannels, jstring jslaveName, + jint masterFD, jboolean console) { + const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); + const char *pts_name = (*env)->GetStringUTFChars(env, jslaveName, NULL); + char **cmd = NULL; + char **envp = NULL; + int fd[3]; + pid_t pid = -1; + + if (jchannels == NULL) { + goto bail_out; + } + + cmd = alloc_c_array(env, jcmd); + if (cmd == NULL) { + goto bail_out; + } + + envp = alloc_c_array(env, jenv); + if (envp == NULL) { + goto bail_out; + } #if DEBUGIT fprintf(stderr, "command:"); @@ -105,42 +107,42 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2(JNIEnv * fprintf(stderr, "pts_name: %s\n", pts_name); #endif - pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD, console); - if (pid < 0) { - goto bail_out; - } - - jobject cls = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); - jmethodID constructor = (*env)->GetMethodID(env, cls, "", "(I)V"); - for (jsize i = 0; i < 3; i++) { - jobject chan = (*env)->NewObject(env, cls, constructor, fd[i]); - (*env)->SetObjectArrayElement(env, jchannels, i, chan); - } - - bail_out: (*env)->ReleaseStringUTFChars(env, jdir, dirpath); - (*env)->ReleaseStringUTFChars(env, jslaveName, pts_name); - free_c_array(cmd); - free_c_array(envp); - return pid; + pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD, console); + if (pid < 0) { + goto bail_out; + } + + jobject cls = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); + jmethodID constructor = (*env)->GetMethodID(env, cls, "", "(I)V"); + for (jsize i = 0; i < 3; i++) { + jobject chan = (*env)->NewObject(env, cls, constructor, fd[i]); + (*env)->SetObjectArrayElement(env, jchannels, i, chan); + } + +bail_out: + (*env)->ReleaseStringUTFChars(env, jdir, dirpath); + (*env)->ReleaseStringUTFChars(env, jslaveName, pts_name); + free_c_array(cmd); + free_c_array(envp); + return pid; } -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, - jstring jdir) { - const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); - char **cmd = NULL; - char **envp = NULL; - pid_t pid = -1; +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *env, jobject jobj, jobjectArray jcmd, + jobjectArray jenv, jstring jdir) { + const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); + char **cmd = NULL; + char **envp = NULL; + pid_t pid = -1; - cmd = alloc_c_array(env, jcmd); - if (cmd == NULL) { - goto bail_out; - } + cmd = alloc_c_array(env, jcmd); + if (cmd == NULL) { + goto bail_out; + } - envp = alloc_c_array(env, jenv); - if (envp == NULL) { - goto bail_out; - } + envp = alloc_c_array(env, jenv); + if (envp == NULL) { + goto bail_out; + } #if DEBUGIT fprintf(stderr, "command:"); @@ -150,51 +152,52 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *env, jobject jobj, jobj fprintf(stderr, "dirpath: %s\n", dirpath); #endif - pid = exec0(cmd[0], cmd, envp, dirpath, NULL); - if (pid < 0) { - goto bail_out; - } + pid = exec0(cmd[0], cmd, envp, dirpath, NULL); + if (pid < 0) { + goto bail_out; + } - bail_out: (*env)->ReleaseStringUTFChars(env, jdir, dirpath); - free_c_array(cmd); - free_c_array(envp); - return pid; +bail_out: + (*env)->ReleaseStringUTFChars(env, jdir, dirpath); + free_c_array(cmd); + free_c_array(envp); + return pid; } -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, - jstring jdir, jobjectArray jchannels) { - const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); - char **cmd = NULL; - char **envp = NULL; - int fd[3]; - pid_t pid = -1; - jclass channelClass = NULL; - jmethodID channelConstructor = NULL; - - if (jchannels == NULL) { - goto bail_out; - } - - channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); - if (channelClass == 0) { - goto bail_out; - } - - channelConstructor = (*env)->GetMethodID(env, channelClass, "", "(I)V"); - if (channelConstructor == 0) { - goto bail_out; - } - - cmd = alloc_c_array(env, jcmd); - if (cmd == NULL) { - goto bail_out; - } - - envp = alloc_c_array(env, jenv); - if (envp == NULL) { - goto bail_out; - } +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject jobj, jobjectArray jcmd, + jobjectArray jenv, jstring jdir, + jobjectArray jchannels) { + const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); + char **cmd = NULL; + char **envp = NULL; + int fd[3]; + pid_t pid = -1; + jclass channelClass = NULL; + jmethodID channelConstructor = NULL; + + if (jchannels == NULL) { + goto bail_out; + } + + channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); + if (channelClass == 0) { + goto bail_out; + } + + channelConstructor = (*env)->GetMethodID(env, channelClass, "", "(I)V"); + if (channelConstructor == 0) { + goto bail_out; + } + + cmd = alloc_c_array(env, jcmd); + if (cmd == NULL) { + goto bail_out; + } + + envp = alloc_c_array(env, jenv); + if (envp == NULL) { + goto bail_out; + } #if DEBUGIT fprintf(stderr, "command:"); @@ -203,20 +206,21 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject jobj, jobj print_array(envp); fprintf(stderr, "dirpath: %s\n", dirpath); #endif - pid = exec0(cmd[0], cmd, envp, dirpath, fd); - if (pid < 0) { - goto bail_out; - } - - for (jsize i = 0; i < 3; i++) { - jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, fd[i]); - (*env)->SetObjectArrayElement(env, jchannels, i, chan); - } - - bail_out: (*env)->ReleaseStringUTFChars(env, jdir, dirpath); - free_c_array(cmd); - free_c_array(envp); - return pid; + pid = exec0(cmd[0], cmd, envp, dirpath, fd); + if (pid < 0) { + goto bail_out; + } + + for (jsize i = 0; i < 3; i++) { + jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, fd[i]); + (*env)->SetObjectArrayElement(env, jchannels, i, chan); + } + +bail_out: + (*env)->ReleaseStringUTFChars(env, jdir, dirpath); + free_c_array(cmd); + free_c_array(envp); + return pid; } /* @@ -224,48 +228,47 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject jobj, jobj * Method: raise * Signature: (II)I */ -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *env, jobject jobj, jint pid, jint sig) { - int status = -1; - - switch (sig) { - case 0: /* NOOP */ - status = killpg(pid, 0); - if (status == -1) { - status = kill(pid, 0); - } - break; - - case 2: /* INTERRUPT */ - status = killpg(pid, SIGINT); - if (status == -1) { - status = kill(pid, SIGINT); - } - break; - - case 9: /* KILL */ - status = killpg(pid, SIGKILL); - if (status == -1) { - status = kill(pid, SIGKILL); - } - break; - - case 15: /* TERM */ - status = killpg(pid, SIGTERM); - if (status == -1) { - status = kill(pid, SIGTERM); - } - break; - - default: - status = killpg(pid, sig); /* WHAT ?? */ - if (status == -1) { - status = kill(pid, sig); /* WHAT ?? */ - } - break; - } - - return status; +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *env, jobject jobj, jint pid, jint sig) { + int status = -1; + + switch (sig) { + case 0: /* NOOP */ + status = killpg(pid, 0); + if (status == -1) { + status = kill(pid, 0); + } + break; + + case 2: /* INTERRUPT */ + status = killpg(pid, SIGINT); + if (status == -1) { + status = kill(pid, SIGINT); + } + break; + + case 9: /* KILL */ + status = killpg(pid, SIGKILL); + if (status == -1) { + status = kill(pid, SIGKILL); + } + break; + + case 15: /* TERM */ + status = killpg(pid, SIGTERM); + if (status == -1) { + status = kill(pid, SIGTERM); + } + break; + + default: + status = killpg(pid, sig); /* WHAT ?? */ + if (status == -1) { + status = kill(pid, sig); /* WHAT ?? */ + } + break; + } + + return status; } /* @@ -273,7 +276,6 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *env, jobject jobj, jint * Method: waitFor * Signature: (I)I */ -JNIEXPORT jint JNICALL -Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv *env, jobject jobj, jint pid) { - return wait0(pid); +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv *env, jobject jobj, jint pid) { + return wait0(pid); } diff --git a/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c b/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c index ef1e85ec8bd..6be590a3999 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c @@ -10,11 +10,11 @@ * * Contributors: * QNX Software Systems - initial API and implementation - * Wind River Systems, Inc. - * + * Wind River Systems, Inc. + * * Win32ProcessEx.c * - * This is a JNI implementation of spawner + * This is a JNI implementation of spawner *******************************************************************************/ #include @@ -26,26 +26,30 @@ #include "org_eclipse_cdt_utils_spawner_Spawner.h" -#define PIPE_SIZE 512 // Size of pipe buffer -#define MAX_CMD_SIZE 2049 // Initial size of command line -#define MAX_ENV_SIZE 4096 // Initial size of environment block -#define PIPE_NAME_LENGTH 100 // Size of pipe name buffer -#define PIPE_TIMEOUT 10000 // Default time-out value, in milliseconds. +#define PIPE_SIZE 512 // Size of pipe buffer +#define MAX_CMD_SIZE 2049 // Initial size of command line +#define MAX_ENV_SIZE 4096 // Initial size of environment block +#define PIPE_NAME_LENGTH 100 // Size of pipe name buffer +#define PIPE_TIMEOUT 10000 // Default time-out value, in milliseconds. -#define MAX_PROCS (100) // Maximum number of simultaneously running processes +#define MAX_PROCS (100) // Maximum number of simultaneously running processes // Process description block. Should be created for each launched process typedef struct _procInfo { - int pid; // Process ID - int uid; // quasi-unique process ID; we have to create it to avoid duplicated pid - // (actually this impossible from OS point of view but it is still possible - // a clash of new created and already finished process with one and the same PID. - // 4 events connected to this process (see starter) - HANDLE eventBreak;// signaled when Spawner.interrupt() is called; mildest of the terminate requests (SIGINT signal in UNIX world) - HANDLE eventWait; - HANDLE eventTerminate;// signaled when Spawner.terminate() is called; more forceful terminate request (SIGTERM signal in UNIX world) - HANDLE eventKill;// signaled when Spawner.kill() is called; most forceful terminate request (SIGKILL signal in UNIX world) - HANDLE eventCtrlc;// signaled when Spawner.interruptCTRLC() is called; like interrupt() but sends CTRL-C in all cases, even when inferior is a Cygwin program + int pid; // Process ID + int uid; // quasi-unique process ID; we have to create it to avoid duplicated pid + // (actually this impossible from OS point of view but it is still possible + // a clash of new created and already finished process with one and the same PID. + // 4 events connected to this process (see starter) + HANDLE eventBreak; // signaled when Spawner.interrupt() is called; mildest of the terminate requests (SIGINT signal + // in UNIX world) + HANDLE eventWait; + HANDLE eventTerminate; // signaled when Spawner.terminate() is called; more forceful terminate request (SIGTERM + // signal in UNIX world) + HANDLE eventKill; // signaled when Spawner.kill() is called; most forceful terminate request (SIGKILL signal in UNIX + // world) + HANDLE eventCtrlc; // signaled when Spawner.interruptCTRLC() is called; like interrupt() but sends CTRL-C in all + // cases, even when inferior is a Cygwin program } procInfo_t, *pProcInfo_t; static int procCounter = 0; // Number of running processes @@ -60,7 +64,7 @@ pProcInfo_t createProcInfo(); pProcInfo_t findProcInfo(int pid); // We launch separate thread for each project to trap it termination -void _cdecl waitProcTermination(void* pv); +void _cdecl waitProcTermination(void *pv); // This is a helper function to prevent losing of quotation marks static int copyTo(wchar_t *target, const wchar_t *source, int cpyLenght, int availSpace); @@ -72,12 +76,12 @@ int interruptProcess(int pid); // Signal codes typedef enum { - SIG_NOOP, // - SIG_HUP, // - SIG_INT, // - SIG_KILL = 9, // - SIG_TERM = 15, // - CTRLC = 1000 // special, Windows only. Sends CTRL-C in all cases, even when inferior is a Cygwin program + SIG_NOOP, // + SIG_HUP, // + SIG_INT, // + SIG_KILL = 9, // + SIG_TERM = 15, // + CTRLC = 1000 // special, Windows only. Sends CTRL-C in all cases, even when inferior is a Cygwin program } signals; extern CRITICAL_SECTION cs; @@ -91,7 +95,7 @@ static int nCounter = 0; // We use it to build unique synchronization object nam ///////////////////////////////////////////////////////////////////////////////////// // Launcher; launchess process and traps its termination // Arguments: (see Spawner.java) -// [in] cmdarray - array of command line elements +// [in] cmdarray - array of command line elements // [in] envp - array of environment variables // [in] dir - working directory // [out] channels - streams handlers @@ -100,490 +104,490 @@ static int nCounter = 0; // We use it to build unique synchronization object nam #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2(JNIEnv *env, jobject process, - jobjectArray cmdarray, jobjectArray envp, jstring dir, jobjectArray channels, jstring slaveName, jint fdm, - jboolean console) { - return -1; + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_Spawner_exec2(JNIEnv *env, jobject process, jobjectArray cmdarray, + jobjectArray envp, jstring dir, jobjectArray channels, + jstring slaveName, jint fdm, jboolean console) { + return -1; } void ensureSize(wchar_t **ptr, int *psize, int requiredLength) { - int size = *psize; - if (requiredLength > size) { - size = 2 * size; - if (size < requiredLength) { - size = requiredLength; - } - *ptr = (wchar_t*) realloc(*ptr, size * sizeof(wchar_t)); - if (NULL == *ptr) { - *psize = 0; - } else { - *psize = size; - } - } + int size = *psize; + if (requiredLength > size) { + size = 2 * size; + if (size < requiredLength) { + size = requiredLength; + } + *ptr = (wchar_t *)realloc(*ptr, size * sizeof(wchar_t)); + if (NULL == *ptr) { + *psize = 0; + } else { + *psize = size; + } + } } #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject process, - jobjectArray cmdarray, jobjectArray envp, jstring dir, jobjectArray channels) { - HANDLE stdHandles[3]; - PROCESS_INFORMATION pi = { 0 }, *piCopy; - STARTUPINFOW si; - DWORD flags = 0; - wchar_t *cwd = NULL; - int ret = 0; - int nCmdLineLength = 0; - wchar_t *szCmdLine = 0; - int nBlkSize = MAX_ENV_SIZE; - wchar_t *szEnvBlock = NULL; - jsize nCmdTokens = 0; - jsize nEnvVars = 0; - int i; - DWORD pid = GetCurrentProcessId(); - int nPos; - pProcInfo_t pCurProcInfo; - - // This needs to be big enough to contain the name of the event used when calling CreateEventW bellow. - // It is made of a prefix (7 characters max) plus the value of a pointer that gets output in characters. - // This will be bigger in the case of 64 bit. - static const int MAX_EVENT_NAME_LENGTH = 50; - wchar_t eventBreakName[MAX_EVENT_NAME_LENGTH]; - wchar_t eventWaitName[MAX_EVENT_NAME_LENGTH]; - wchar_t eventTerminateName[MAX_EVENT_NAME_LENGTH]; - wchar_t eventKillName[MAX_EVENT_NAME_LENGTH]; - wchar_t eventCtrlcName[MAX_EVENT_NAME_LENGTH]; + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject process, jobjectArray cmdarray, + jobjectArray envp, jstring dir, jobjectArray channels) { + HANDLE stdHandles[3]; + PROCESS_INFORMATION pi = {0}, *piCopy; + STARTUPINFOW si; + DWORD flags = 0; + wchar_t *cwd = NULL; + int ret = 0; + int nCmdLineLength = 0; + wchar_t *szCmdLine = 0; + int nBlkSize = MAX_ENV_SIZE; + wchar_t *szEnvBlock = NULL; + jsize nCmdTokens = 0; + jsize nEnvVars = 0; + int i; + DWORD pid = GetCurrentProcessId(); + int nPos; + pProcInfo_t pCurProcInfo; + + // This needs to be big enough to contain the name of the event used when calling CreateEventW bellow. + // It is made of a prefix (7 characters max) plus the value of a pointer that gets output in characters. + // This will be bigger in the case of 64 bit. + static const int MAX_EVENT_NAME_LENGTH = 50; + wchar_t eventBreakName[MAX_EVENT_NAME_LENGTH]; + wchar_t eventWaitName[MAX_EVENT_NAME_LENGTH]; + wchar_t eventTerminateName[MAX_EVENT_NAME_LENGTH]; + wchar_t eventKillName[MAX_EVENT_NAME_LENGTH]; + wchar_t eventCtrlcName[MAX_EVENT_NAME_LENGTH]; #ifdef DEBUG_MONITOR - wchar_t buffer[4000]; + wchar_t buffer[4000]; #endif - int nLocalCounter; - wchar_t inPipeName[PIPE_NAME_LENGTH]; - wchar_t outPipeName[PIPE_NAME_LENGTH]; - wchar_t errPipeName[PIPE_NAME_LENGTH]; - jclass channelClass = NULL; - jmethodID channelConstructor = NULL; - - if (channels == NULL) { - ThrowByName(env, "java/io/IOException", "Channels can't be null"); - return 0; - } - - channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$WinChannel"); - if (channelClass == 0) { - ThrowByName(env, "java/io/IOException", "Unable to find channel class"); - return 0; - } - - channelConstructor = (*env)->GetMethodID(env, channelClass, "", "(J)V"); - if (channelConstructor == 0) { - ThrowByName(env, "java/io/IOException", "Unable to find channel constructor"); - return 0; - } - - nCmdLineLength = MAX_CMD_SIZE; - szCmdLine = (wchar_t*) malloc(nCmdLineLength * sizeof(wchar_t)); - szCmdLine[0] = _T('\0'); - if ((HIBYTE(LOWORD(GetVersion()))) & 0x80) { - ThrowByName(env, "java/io/IOException", "Does not support Windows 3.1/95/98/Me"); - return 0; - } - - if (cmdarray == 0) { - ThrowByName(env, "java/lang/NullPointerException", "No command line specified"); - return 0; - } - - ZeroMemory(stdHandles, sizeof(stdHandles)); - - // Create pipe names - EnterCriticalSection(&cs); - swprintf(inPipeName, sizeof(inPipeName) / sizeof(inPipeName[0]), L"\\\\.\\pipe\\stdin%08i%010i", pid, nCounter); - swprintf(outPipeName, sizeof(outPipeName) / sizeof(outPipeName[0]), L"\\\\.\\pipe\\stdout%08i%010i", pid, nCounter); - swprintf(errPipeName, sizeof(errPipeName) / sizeof(errPipeName[0]), L"\\\\.\\pipe\\stderr%08i%010i", pid, nCounter); - nLocalCounter = nCounter; - ++nCounter; - LeaveCriticalSection(&cs); - - if ((INVALID_HANDLE_VALUE - == (stdHandles[0] = CreateNamedPipeW(inPipeName, PIPE_ACCESS_OUTBOUND, - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, PIPE_SIZE, - PIPE_TIMEOUT, NULL))) - || (INVALID_HANDLE_VALUE - == (stdHandles[1] = CreateNamedPipeW(outPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, - PIPE_SIZE, PIPE_TIMEOUT, NULL))) - || (INVALID_HANDLE_VALUE - == (stdHandles[2] = CreateNamedPipeW(errPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, - PIPE_SIZE, PIPE_TIMEOUT, NULL)))) { - CloseHandle(stdHandles[0]); - CloseHandle(stdHandles[1]); - CloseHandle(stdHandles[2]); - ThrowByName(env, "java/io/IOException", "CreatePipe"); - return 0; - } + int nLocalCounter; + wchar_t inPipeName[PIPE_NAME_LENGTH]; + wchar_t outPipeName[PIPE_NAME_LENGTH]; + wchar_t errPipeName[PIPE_NAME_LENGTH]; + jclass channelClass = NULL; + jmethodID channelConstructor = NULL; + + if (channels == NULL) { + ThrowByName(env, "java/io/IOException", "Channels can't be null"); + return 0; + } + + channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$WinChannel"); + if (channelClass == 0) { + ThrowByName(env, "java/io/IOException", "Unable to find channel class"); + return 0; + } + + channelConstructor = (*env)->GetMethodID(env, channelClass, "", "(J)V"); + if (channelConstructor == 0) { + ThrowByName(env, "java/io/IOException", "Unable to find channel constructor"); + return 0; + } + + nCmdLineLength = MAX_CMD_SIZE; + szCmdLine = (wchar_t *)malloc(nCmdLineLength * sizeof(wchar_t)); + szCmdLine[0] = _T('\0'); + if ((HIBYTE(LOWORD(GetVersion()))) & 0x80) { + ThrowByName(env, "java/io/IOException", "Does not support Windows 3.1/95/98/Me"); + return 0; + } + + if (cmdarray == 0) { + ThrowByName(env, "java/lang/NullPointerException", "No command line specified"); + return 0; + } + + ZeroMemory(stdHandles, sizeof(stdHandles)); + + // Create pipe names + EnterCriticalSection(&cs); + swprintf(inPipeName, sizeof(inPipeName) / sizeof(inPipeName[0]), L"\\\\.\\pipe\\stdin%08i%010i", pid, nCounter); + swprintf(outPipeName, sizeof(outPipeName) / sizeof(outPipeName[0]), L"\\\\.\\pipe\\stdout%08i%010i", pid, nCounter); + swprintf(errPipeName, sizeof(errPipeName) / sizeof(errPipeName[0]), L"\\\\.\\pipe\\stderr%08i%010i", pid, nCounter); + nLocalCounter = nCounter; + ++nCounter; + LeaveCriticalSection(&cs); + + if ((INVALID_HANDLE_VALUE == (stdHandles[0] = CreateNamedPipeW( + inPipeName, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, + PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, PIPE_SIZE, PIPE_TIMEOUT, NULL))) || + (INVALID_HANDLE_VALUE == + (stdHandles[1] = CreateNamedPipeW(outPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + PIPE_SIZE, PIPE_SIZE, PIPE_TIMEOUT, NULL))) || + (INVALID_HANDLE_VALUE == + (stdHandles[2] = CreateNamedPipeW(errPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + PIPE_SIZE, PIPE_SIZE, PIPE_TIMEOUT, NULL)))) { + CloseHandle(stdHandles[0]); + CloseHandle(stdHandles[1]); + CloseHandle(stdHandles[2]); + ThrowByName(env, "java/io/IOException", "CreatePipe"); + return 0; + } #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Opened pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Opened pipes: %s, %s, %s\n"), inPipeName, outPipeName, + errPipeName); + OutputDebugStringW(buffer); #endif - nCmdTokens = (*env)->GetArrayLength(env, cmdarray); - nEnvVars = (*env)->GetArrayLength(env, envp); - - pCurProcInfo = createProcInfo(); - - if (NULL == pCurProcInfo) { - ThrowByName(env, "java/io/IOException", "Too many processes"); - return 0; - } - - // Construct starter's command line - swprintf(eventBreakName, sizeof(eventBreakName) / sizeof(eventBreakName[0]), L"SABreak%04x%08x", pid, - nLocalCounter); - swprintf(eventWaitName, sizeof(eventWaitName) / sizeof(eventWaitName[0]), L"SAWait%04x%08x", pid, nLocalCounter); - swprintf(eventTerminateName, sizeof(eventTerminateName) / sizeof(eventTerminateName[0]), L"SATerm%04x%08x", pid, - nLocalCounter); - swprintf(eventKillName, sizeof(eventKillName) / sizeof(eventKillName[0]), L"SAKill%04x%08x", pid, nLocalCounter); - swprintf(eventCtrlcName, sizeof(eventCtrlcName) / sizeof(eventCtrlcName[0]), L"SACtrlc%04x%08x", pid, - nLocalCounter); - - pCurProcInfo->eventBreak = CreateEventW(NULL, FALSE, FALSE, eventBreakName); - if (NULL == pCurProcInfo->eventBreak || GetLastError() == ERROR_ALREADY_EXISTS) { - ThrowByName(env, "java/io/IOException", "Cannot create event"); - return 0; - } - pCurProcInfo->eventWait = CreateEventW(NULL, TRUE, FALSE, eventWaitName); - pCurProcInfo->eventTerminate = CreateEventW(NULL, FALSE, FALSE, eventTerminateName); - pCurProcInfo->eventKill = CreateEventW(NULL, FALSE, FALSE, eventKillName); - pCurProcInfo->eventCtrlc = CreateEventW(NULL, FALSE, FALSE, eventCtrlcName); - - swprintf(szCmdLine, nCmdLineLength, L"\"%sstarter.exe\" %i %i %s %s %s %s %s ", path, pid, nLocalCounter, - eventBreakName, eventWaitName, eventTerminateName, eventKillName, eventCtrlcName); - nPos = wcslen(szCmdLine); - - // Prepare command line - for (i = 0; i < nCmdTokens; ++i) { - jstring item = (jstring)(*env)->GetObjectArrayElement(env, cmdarray, i); - jsize len = (*env)->GetStringLength(env, item); - int nCpyLen; - const wchar_t *str = (const wchar_t*) (*env)->GetStringChars(env, item, 0); - if (NULL != str) { - int requiredSize = nPos + len + 2; - if (requiredSize > 32 * 1024) { - ThrowByName(env, "java/io/IOException", "Command line too long"); - return 0; - } - ensureSize(&szCmdLine, &nCmdLineLength, requiredSize); - if (NULL == szCmdLine) { - ThrowByName(env, "java/io/IOException", "Not enough memory"); - return 0; - } - - if (0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, nCmdLineLength - nPos))) { - ThrowByName(env, "java/io/IOException", "Command line too long"); - return 0; - } - nPos += nCpyLen; - szCmdLine[nPos] = _T(' '); - ++nPos; - (*env)->ReleaseStringChars(env, item, (const jchar*) str); - } - } - szCmdLine[nPos] = _T('\0'); + nCmdTokens = (*env)->GetArrayLength(env, cmdarray); + nEnvVars = (*env)->GetArrayLength(env, envp); + + pCurProcInfo = createProcInfo(); + + if (NULL == pCurProcInfo) { + ThrowByName(env, "java/io/IOException", "Too many processes"); + return 0; + } + + // Construct starter's command line + swprintf(eventBreakName, sizeof(eventBreakName) / sizeof(eventBreakName[0]), L"SABreak%04x%08x", pid, + nLocalCounter); + swprintf(eventWaitName, sizeof(eventWaitName) / sizeof(eventWaitName[0]), L"SAWait%04x%08x", pid, nLocalCounter); + swprintf(eventTerminateName, sizeof(eventTerminateName) / sizeof(eventTerminateName[0]), L"SATerm%04x%08x", pid, + nLocalCounter); + swprintf(eventKillName, sizeof(eventKillName) / sizeof(eventKillName[0]), L"SAKill%04x%08x", pid, nLocalCounter); + swprintf(eventCtrlcName, sizeof(eventCtrlcName) / sizeof(eventCtrlcName[0]), L"SACtrlc%04x%08x", pid, + nLocalCounter); + + pCurProcInfo->eventBreak = CreateEventW(NULL, FALSE, FALSE, eventBreakName); + if (NULL == pCurProcInfo->eventBreak || GetLastError() == ERROR_ALREADY_EXISTS) { + ThrowByName(env, "java/io/IOException", "Cannot create event"); + return 0; + } + pCurProcInfo->eventWait = CreateEventW(NULL, TRUE, FALSE, eventWaitName); + pCurProcInfo->eventTerminate = CreateEventW(NULL, FALSE, FALSE, eventTerminateName); + pCurProcInfo->eventKill = CreateEventW(NULL, FALSE, FALSE, eventKillName); + pCurProcInfo->eventCtrlc = CreateEventW(NULL, FALSE, FALSE, eventCtrlcName); + + swprintf(szCmdLine, nCmdLineLength, L"\"%sstarter.exe\" %i %i %s %s %s %s %s ", path, pid, nLocalCounter, + eventBreakName, eventWaitName, eventTerminateName, eventKillName, eventCtrlcName); + nPos = wcslen(szCmdLine); + + // Prepare command line + for (i = 0; i < nCmdTokens; ++i) { + jstring item = (jstring)(*env)->GetObjectArrayElement(env, cmdarray, i); + jsize len = (*env)->GetStringLength(env, item); + int nCpyLen; + const wchar_t *str = (const wchar_t *)(*env)->GetStringChars(env, item, 0); + if (NULL != str) { + int requiredSize = nPos + len + 2; + if (requiredSize > 32 * 1024) { + ThrowByName(env, "java/io/IOException", "Command line too long"); + return 0; + } + ensureSize(&szCmdLine, &nCmdLineLength, requiredSize); + if (NULL == szCmdLine) { + ThrowByName(env, "java/io/IOException", "Not enough memory"); + return 0; + } + + if (0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, nCmdLineLength - nPos))) { + ThrowByName(env, "java/io/IOException", "Command line too long"); + return 0; + } + nPos += nCpyLen; + szCmdLine[nPos] = _T(' '); + ++nPos; + (*env)->ReleaseStringChars(env, item, (const jchar *)str); + } + } + szCmdLine[nPos] = _T('\0'); #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("There are %i environment variables \n"), nEnvVars); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("There are %i environment variables \n"), nEnvVars); + OutputDebugStringW(buffer); #endif - // Prepare environment block - if (nEnvVars > 0) { - nPos = 0; - szEnvBlock = (wchar_t*) malloc(nBlkSize * sizeof(wchar_t)); - for (i = 0; i < nEnvVars; ++i) { - jstring item = (jstring)(*env)->GetObjectArrayElement(env, envp, i); - jsize len = (*env)->GetStringLength(env, item); - const wchar_t *str = (const wchar_t*) (*env)->GetStringChars(env, item, 0); - if (NULL != str) { - while ((nBlkSize - nPos) <= (len + 2)) { // +2 for two '\0' - nBlkSize += MAX_ENV_SIZE; - szEnvBlock = (wchar_t*) realloc(szEnvBlock, nBlkSize * sizeof(wchar_t)); - if (NULL == szEnvBlock) { - ThrowByName(env, "java/io/IOException", "Not enough memory"); - return 0; - } + // Prepare environment block + if (nEnvVars > 0) { + nPos = 0; + szEnvBlock = (wchar_t *)malloc(nBlkSize * sizeof(wchar_t)); + for (i = 0; i < nEnvVars; ++i) { + jstring item = (jstring)(*env)->GetObjectArrayElement(env, envp, i); + jsize len = (*env)->GetStringLength(env, item); + const wchar_t *str = (const wchar_t *)(*env)->GetStringChars(env, item, 0); + if (NULL != str) { + while ((nBlkSize - nPos) <= (len + 2)) { // +2 for two '\0' + nBlkSize += MAX_ENV_SIZE; + szEnvBlock = (wchar_t *)realloc(szEnvBlock, nBlkSize * sizeof(wchar_t)); + if (NULL == szEnvBlock) { + ThrowByName(env, "java/io/IOException", "Not enough memory"); + return 0; + } #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Realloc environment block; new length is %i \n"), nBlkSize); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), + _T("Realloc environment block; new length is %i \n"), nBlkSize); + OutputDebugStringW(buffer); #endif - - } + } #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("%s\n"), str); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("%s\n"), str); + OutputDebugStringW(buffer); #endif - wcsncpy(szEnvBlock + nPos, str, len); - nPos += len; - szEnvBlock[nPos] = _T('\0'); - ++nPos; - (*env)->ReleaseStringChars(env, item, (const jchar*) str); - } - } - szEnvBlock[nPos] = _T('\0'); - } - - if (dir != 0) { - const wchar_t *str = (const wchar_t*) (*env)->GetStringChars(env, dir, 0); - if (NULL != str) { - cwd = wcsdup(str); - (*env)->ReleaseStringChars(env, dir, (const jchar*) str); - } - } - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - si.dwFlags |= STARTF_USESHOWWINDOW; - si.wShowWindow = SW_HIDE; // Processes in the Process Group are hidden - - SetHandleInformation(stdHandles[0], HANDLE_FLAG_INHERIT, FALSE); - SetHandleInformation(stdHandles[1], HANDLE_FLAG_INHERIT, FALSE); - SetHandleInformation(stdHandles[2], HANDLE_FLAG_INHERIT, FALSE); - - flags = CREATE_NEW_CONSOLE; - flags |= CREATE_NO_WINDOW; - flags |= CREATE_UNICODE_ENVIRONMENT; + wcsncpy(szEnvBlock + nPos, str, len); + nPos += len; + szEnvBlock[nPos] = _T('\0'); + ++nPos; + (*env)->ReleaseStringChars(env, item, (const jchar *)str); + } + } + szEnvBlock[nPos] = _T('\0'); + } + + if (dir != 0) { + const wchar_t *str = (const wchar_t *)(*env)->GetStringChars(env, dir, 0); + if (NULL != str) { + cwd = wcsdup(str); + (*env)->ReleaseStringChars(env, dir, (const jchar *)str); + } + } + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.dwFlags |= STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; // Processes in the Process Group are hidden + + SetHandleInformation(stdHandles[0], HANDLE_FLAG_INHERIT, FALSE); + SetHandleInformation(stdHandles[1], HANDLE_FLAG_INHERIT, FALSE); + SetHandleInformation(stdHandles[2], HANDLE_FLAG_INHERIT, FALSE); + + flags = CREATE_NEW_CONSOLE; + flags |= CREATE_NO_WINDOW; + flags |= CREATE_UNICODE_ENVIRONMENT; #ifdef DEBUG_MONITOR - OutputDebugStringW(szCmdLine); + OutputDebugStringW(szCmdLine); #endif - // launches starter; we need it to create another console group to correctly process - // emulation of SYSint signal (Ctrl-C) - ret = CreateProcessW(0, /* executable name */ - szCmdLine, /* command line */ - 0, /* process security attribute */ - 0, /* thread security attribute */ - FALSE, /* inherits system handles */ - flags, /* normal attached process */ - szEnvBlock, /* environment block */ - cwd, /* change to the new current directory */ - &si, /* (in) startup information */ - &pi); /* (out) process information */ - - free(cwd); - free(szEnvBlock); - free(szCmdLine); - - if (!ret) { // Launching error - char *lpMsgBuf; - CloseHandle(stdHandles[0]); - CloseHandle(stdHandles[1]); - CloseHandle(stdHandles[2]); - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (char*) &lpMsgBuf, 0, NULL); - ThrowByName(env, "java/io/IOException", lpMsgBuf); - // Free the buffer. - LocalFree(lpMsgBuf); - cleanUpProcBlock(pCurProcInfo); - ret = -1; - } else { - HANDLE h[2]; - int what; - - EnterCriticalSection(&cs); - - pCurProcInfo->pid = pi.dwProcessId; - h[0] = pCurProcInfo->eventWait; - h[1] = pi.hProcess; - - what = WaitForMultipleObjects(2, h, FALSE, INFINITE); - if (what != WAIT_OBJECT_0) { // CreateProcess failed + // launches starter; we need it to create another console group to correctly process + // emulation of SYSint signal (Ctrl-C) + ret = CreateProcessW(0, /* executable name */ + szCmdLine, /* command line */ + 0, /* process security attribute */ + 0, /* thread security attribute */ + FALSE, /* inherits system handles */ + flags, /* normal attached process */ + szEnvBlock, /* environment block */ + cwd, /* change to the new current directory */ + &si, /* (in) startup information */ + &pi); /* (out) process information */ + + free(cwd); + free(szEnvBlock); + free(szCmdLine); + + if (!ret) { // Launching error + char *lpMsgBuf; + CloseHandle(stdHandles[0]); + CloseHandle(stdHandles[1]); + CloseHandle(stdHandles[2]); + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (char *)&lpMsgBuf, 0, NULL); + ThrowByName(env, "java/io/IOException", lpMsgBuf); + // Free the buffer. + LocalFree(lpMsgBuf); + cleanUpProcBlock(pCurProcInfo); + ret = -1; + } else { + HANDLE h[2]; + int what; + + EnterCriticalSection(&cs); + + pCurProcInfo->pid = pi.dwProcessId; + h[0] = pCurProcInfo->eventWait; + h[1] = pi.hProcess; + + what = WaitForMultipleObjects(2, h, FALSE, INFINITE); + if (what != WAIT_OBJECT_0) { // CreateProcess failed #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Process %i failed\n"), pi.dwProcessId); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Process %i failed\n"), pi.dwProcessId); + OutputDebugStringW(buffer); #endif - cleanUpProcBlock(pCurProcInfo); - ThrowByName(env, "java/io/IOException", "Launching failed"); + cleanUpProcBlock(pCurProcInfo); + ThrowByName(env, "java/io/IOException", "Launching failed"); #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Process failed\n")); + OutputDebugStringW(_T("Process failed\n")); #endif - } else { - ret = (long) (pCurProcInfo->uid); + } else { + ret = (long)(pCurProcInfo->uid); - // Prepare stream handlers to return to java program - for (jsize i = 0; i < 3; i++) { - jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, (jlong) stdHandles[i]); - (*env)->SetObjectArrayElement(env, channels, i, chan); - } + // Prepare stream handlers to return to java program + for (jsize i = 0; i < 3; i++) { + jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, (jlong)stdHandles[i]); + (*env)->SetObjectArrayElement(env, channels, i, chan); + } - // do the cleanup so launch the according thread - // create a copy of the PROCESS_INFORMATION as this might get destroyed - piCopy = (PROCESS_INFORMATION*) malloc(sizeof(PROCESS_INFORMATION)); - memcpy(piCopy, &pi, sizeof(PROCESS_INFORMATION)); - _beginthread(waitProcTermination, 0, (void*) piCopy); + // do the cleanup so launch the according thread + // create a copy of the PROCESS_INFORMATION as this might get destroyed + piCopy = (PROCESS_INFORMATION *)malloc(sizeof(PROCESS_INFORMATION)); + memcpy(piCopy, &pi, sizeof(PROCESS_INFORMATION)); + _beginthread(waitProcTermination, 0, (void *)piCopy); #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Process started\n")); + OutputDebugStringW(_T("Process started\n")); #endif - } - LeaveCriticalSection(&cs); - - } + } + LeaveCriticalSection(&cs); + } - CloseHandle(pi.hThread); - - return ret; + CloseHandle(pi.hThread); + return ret; } ///////////////////////////////////////////////////////////////////////////////////// // Launcher; just launches process and don't care about it any more // Arguments: (see Spawner.java) -// [in] cmdarray - array of command line elements +// [in] cmdarray - array of command line elements // [in] envp - array of environment variables // [in] dir - working directory ///////////////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *env, jobject process, - jobjectArray cmdarray, jobjectArray envp, jstring dir) { - - SECURITY_ATTRIBUTES sa; - PROCESS_INFORMATION pi = { 0 }; - STARTUPINFOW si; - DWORD flags = 0; - wchar_t *cwd = NULL; - wchar_t *envBlk = NULL; - int ret = 0; - jsize nCmdTokens = 0; - jsize nEnvVars = 0; - int i; - int nPos; - int nCmdLineLength = 0; - wchar_t *szCmdLine = 0; - int nBlkSize = MAX_ENV_SIZE; - wchar_t *szEnvBlock = NULL; - - nCmdLineLength = MAX_CMD_SIZE; - szCmdLine = (wchar_t*) malloc(nCmdLineLength * sizeof(wchar_t)); - szCmdLine[0] = 0; - - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = 0; - sa.bInheritHandle = TRUE; - - nCmdTokens = (*env)->GetArrayLength(env, cmdarray); - nEnvVars = (*env)->GetArrayLength(env, envp); - - nPos = 0; - - // Prepare command line - for (i = 0; i < nCmdTokens; ++i) { - jstring item = (jstring)(*env)->GetObjectArrayElement(env, cmdarray, i); - jsize len = (*env)->GetStringLength(env, item); - int nCpyLen; - const wchar_t *str = (const wchar_t*) (*env)->GetStringChars(env, item, 0); - if (NULL != str) { - int requiredSize = nPos + len + 2; - if (requiredSize > 32 * 1024) { - ThrowByName(env, "java/io/IOException", "Command line too long"); - return 0; - } - ensureSize(&szCmdLine, &nCmdLineLength, requiredSize); - if (NULL == szCmdLine) { - ThrowByName(env, "java/io/IOException", "Not enough memory"); - return 0; - } - - if (0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, nCmdLineLength - nPos))) { - ThrowByName(env, "java/io/Exception", "Command line too long"); - return 0; - } - nPos += nCpyLen; - szCmdLine[nPos] = _T(' '); - ++nPos; - (*env)->ReleaseStringChars(env, item, (const jchar*) str); - } - } - - szCmdLine[nPos] = _T('\0'); - - // Prepare environment block - if (nEnvVars > 0) { - szEnvBlock = (wchar_t*) malloc(nBlkSize * sizeof(wchar_t)); - nPos = 0; - for (i = 0; i < nEnvVars; ++i) { - jstring item = (jstring)(*env)->GetObjectArrayElement(env, envp, i); - jsize len = (*env)->GetStringLength(env, item); - const wchar_t *str = (const wchar_t*) (*env)->GetStringChars(env, item, 0); - if (NULL != str) { - while ((nBlkSize - nPos) <= (len + 2)) { // +2 for two '\0' - nBlkSize += MAX_ENV_SIZE; - szEnvBlock = (wchar_t*) realloc(szEnvBlock, nBlkSize * sizeof(wchar_t)); - if (NULL == szEnvBlock) { - ThrowByName(env, "java/io/Exception", "Not enough memory"); - return 0; - } - } - wcsncpy(szEnvBlock + nPos, str, len); - nPos += len; - szEnvBlock[nPos] = _T('\0'); - ++nPos; - (*env)->ReleaseStringChars(env, item, (const jchar*) str); - } - } - szEnvBlock[nPos] = _T('\0'); - envBlk = szEnvBlock; - } - - if (dir != 0) { - const wchar_t *str = (const wchar_t*) (*env)->GetStringChars(env, dir, 0); - if (NULL != str) { - cwd = wcsdup(str); - (*env)->ReleaseStringChars(env, dir, (const jchar*) str); - } - } - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - - flags = CREATE_NEW_CONSOLE; - flags |= CREATE_UNICODE_ENVIRONMENT; - ret = CreateProcessW(0, /* executable name */ - szCmdLine, /* command line */ - 0, /* process security attribute */ - 0, /* thread security attribute */ - TRUE, /* inherits system handles */ - flags, /* normal attached process */ - envBlk, /* environment block */ - cwd, /* change to the new current directory */ - &si, /* (in) startup information */ - &pi); /* (out) process information */ - - free(cwd); - free(szEnvBlock); - free(szCmdLine); - - if (!ret) { // error - char *lpMsgBuf; - - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, - GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (wchar_t*) &lpMsgBuf, 0, NULL); - ThrowByName(env, "java/io/IOException", lpMsgBuf); - // Free the buffer. - LocalFree(lpMsgBuf); - ret = -1; - } else { - // Clean-up - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - ret = (long) pi.dwProcessId; //hProcess; - } - - return ret; - + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *env, jobject process, jobjectArray cmdarray, + jobjectArray envp, jstring dir) { + + SECURITY_ATTRIBUTES sa; + PROCESS_INFORMATION pi = {0}; + STARTUPINFOW si; + DWORD flags = 0; + wchar_t *cwd = NULL; + wchar_t *envBlk = NULL; + int ret = 0; + jsize nCmdTokens = 0; + jsize nEnvVars = 0; + int i; + int nPos; + int nCmdLineLength = 0; + wchar_t *szCmdLine = 0; + int nBlkSize = MAX_ENV_SIZE; + wchar_t *szEnvBlock = NULL; + + nCmdLineLength = MAX_CMD_SIZE; + szCmdLine = (wchar_t *)malloc(nCmdLineLength * sizeof(wchar_t)); + szCmdLine[0] = 0; + + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = 0; + sa.bInheritHandle = TRUE; + + nCmdTokens = (*env)->GetArrayLength(env, cmdarray); + nEnvVars = (*env)->GetArrayLength(env, envp); + + nPos = 0; + + // Prepare command line + for (i = 0; i < nCmdTokens; ++i) { + jstring item = (jstring)(*env)->GetObjectArrayElement(env, cmdarray, i); + jsize len = (*env)->GetStringLength(env, item); + int nCpyLen; + const wchar_t *str = (const wchar_t *)(*env)->GetStringChars(env, item, 0); + if (NULL != str) { + int requiredSize = nPos + len + 2; + if (requiredSize > 32 * 1024) { + ThrowByName(env, "java/io/IOException", "Command line too long"); + return 0; + } + ensureSize(&szCmdLine, &nCmdLineLength, requiredSize); + if (NULL == szCmdLine) { + ThrowByName(env, "java/io/IOException", "Not enough memory"); + return 0; + } + + if (0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, nCmdLineLength - nPos))) { + ThrowByName(env, "java/io/Exception", "Command line too long"); + return 0; + } + nPos += nCpyLen; + szCmdLine[nPos] = _T(' '); + ++nPos; + (*env)->ReleaseStringChars(env, item, (const jchar *)str); + } + } + + szCmdLine[nPos] = _T('\0'); + + // Prepare environment block + if (nEnvVars > 0) { + szEnvBlock = (wchar_t *)malloc(nBlkSize * sizeof(wchar_t)); + nPos = 0; + for (i = 0; i < nEnvVars; ++i) { + jstring item = (jstring)(*env)->GetObjectArrayElement(env, envp, i); + jsize len = (*env)->GetStringLength(env, item); + const wchar_t *str = (const wchar_t *)(*env)->GetStringChars(env, item, 0); + if (NULL != str) { + while ((nBlkSize - nPos) <= (len + 2)) { // +2 for two '\0' + nBlkSize += MAX_ENV_SIZE; + szEnvBlock = (wchar_t *)realloc(szEnvBlock, nBlkSize * sizeof(wchar_t)); + if (NULL == szEnvBlock) { + ThrowByName(env, "java/io/Exception", "Not enough memory"); + return 0; + } + } + wcsncpy(szEnvBlock + nPos, str, len); + nPos += len; + szEnvBlock[nPos] = _T('\0'); + ++nPos; + (*env)->ReleaseStringChars(env, item, (const jchar *)str); + } + } + szEnvBlock[nPos] = _T('\0'); + envBlk = szEnvBlock; + } + + if (dir != 0) { + const wchar_t *str = (const wchar_t *)(*env)->GetStringChars(env, dir, 0); + if (NULL != str) { + cwd = wcsdup(str); + (*env)->ReleaseStringChars(env, dir, (const jchar *)str); + } + } + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + + flags = CREATE_NEW_CONSOLE; + flags |= CREATE_UNICODE_ENVIRONMENT; + ret = CreateProcessW(0, /* executable name */ + szCmdLine, /* command line */ + 0, /* process security attribute */ + 0, /* thread security attribute */ + TRUE, /* inherits system handles */ + flags, /* normal attached process */ + envBlk, /* environment block */ + cwd, /* change to the new current directory */ + &si, /* (in) startup information */ + &pi); /* (out) process information */ + + free(cwd); + free(szEnvBlock); + free(szCmdLine); + + if (!ret) { // error + char *lpMsgBuf; + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, + GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (wchar_t *)&lpMsgBuf, 0, NULL); + ThrowByName(env, "java/io/IOException", lpMsgBuf); + // Free the buffer. + LocalFree(lpMsgBuf); + ret = -1; + } else { + // Clean-up + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + ret = (long)pi.dwProcessId; // hProcess; + } + + return ret; } ///////////////////////////////////////////////////////////////////////////////////// @@ -595,85 +599,85 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *env, jobject process, jint uid, - jint signal) { - jint ret = 0; + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *env, jobject process, jint uid, jint signal) { + jint ret = 0; - HANDLE hProc; - pProcInfo_t pCurProcInfo = findProcInfo(uid); + HANDLE hProc; + pProcInfo_t pCurProcInfo = findProcInfo(uid); #ifdef DEBUG_MONITOR - wchar_t buffer[100]; + wchar_t buffer[100]; #endif - if (NULL == pCurProcInfo) { - if (SIG_INT == signal) { // Try another way - return interruptProcess(uid); - } - return -1; - } + if (NULL == pCurProcInfo) { + if (SIG_INT == signal) { // Try another way + return interruptProcess(uid); + } + return -1; + } #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Spawner received signal %i for process %i\n"), signal, pCurProcInfo -> pid); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Spawner received signal %i for process %i\n"), signal, + pCurProcInfo->pid); + OutputDebugStringW(buffer); #endif - hProc = OpenProcess(SYNCHRONIZE, 0, pCurProcInfo->pid); - - if (NULL == hProc) { - return -1; - } - - switch (signal) { - case SIG_NOOP: - // Wait 0 msec -just check if the process has been still running - ret = ((WAIT_TIMEOUT == WaitForSingleObject(hProc, 0)) ? 0 : -1); - break; - case SIG_HUP: - // Temporary do nothing - ret = 0; - break; - case SIG_TERM: + hProc = OpenProcess(SYNCHRONIZE, 0, pCurProcInfo->pid); + + if (NULL == hProc) { + return -1; + } + + switch (signal) { + case SIG_NOOP: + // Wait 0 msec -just check if the process has been still running + ret = ((WAIT_TIMEOUT == WaitForSingleObject(hProc, 0)) ? 0 : -1); + break; + case SIG_HUP: + // Temporary do nothing + ret = 0; + break; + case SIG_TERM: #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Spawner received TERM signal for process %i\n"), - pCurProcInfo -> pid); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Spawner received TERM signal for process %i\n"), + pCurProcInfo->pid); + OutputDebugStringW(buffer); #endif - SetEvent(pCurProcInfo->eventTerminate); + SetEvent(pCurProcInfo->eventTerminate); #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Spawner signaled TERM event\n")); + OutputDebugStringW(_T("Spawner signaled TERM event\n")); #endif - ret = 0; - break; + ret = 0; + break; - case SIG_KILL: + case SIG_KILL: #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Spawner received KILL signal for process %i\n"), - pCurProcInfo -> pid); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Spawner received KILL signal for process %i\n"), + pCurProcInfo->pid); + OutputDebugStringW(buffer); #endif - SetEvent(pCurProcInfo->eventKill); + SetEvent(pCurProcInfo->eventKill); #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Spawner signaled KILL event\n")); + OutputDebugStringW(_T("Spawner signaled KILL event\n")); #endif - ret = 0; - break; - case SIG_INT: - ResetEvent(pCurProcInfo->eventWait); - SetEvent(pCurProcInfo->eventBreak); - ret = (WaitForSingleObject(pCurProcInfo->eventWait, 100) == WAIT_OBJECT_0); - break; - case CTRLC: - ResetEvent(pCurProcInfo->eventWait); - SetEvent(pCurProcInfo->eventCtrlc); - ret = (WaitForSingleObject(pCurProcInfo->eventWait, 100) == WAIT_OBJECT_0); - break; - default: - break; - } - - CloseHandle(hProc); - return ret; - + ret = 0; + break; + case SIG_INT: + ResetEvent(pCurProcInfo->eventWait); + SetEvent(pCurProcInfo->eventBreak); + ret = (WaitForSingleObject(pCurProcInfo->eventWait, 100) == WAIT_OBJECT_0); + break; + case CTRLC: + ResetEvent(pCurProcInfo->eventWait); + SetEvent(pCurProcInfo->eventCtrlc); + ret = (WaitForSingleObject(pCurProcInfo->eventWait, 100) == WAIT_OBJECT_0); + break; + default: + break; + } + + CloseHandle(hProc); + return ret; } ///////////////////////////////////////////////////////////////////////////////////// @@ -684,172 +688,173 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv * #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv *env, jobject process, jint uid) { - DWORD exit_code = -1; - int what = 0; - HANDLE hProc; - pProcInfo_t pCurProcInfo = findProcInfo(uid); + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv *env, jobject process, jint uid) { + DWORD exit_code = -1; + int what = 0; + HANDLE hProc; + pProcInfo_t pCurProcInfo = findProcInfo(uid); - if (NULL == pCurProcInfo) { - return -1; - } + if (NULL == pCurProcInfo) { + return -1; + } - hProc = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, 0, pCurProcInfo->pid); + hProc = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, 0, pCurProcInfo->pid); - if (NULL == hProc) { - return -1; - } + if (NULL == hProc) { + return -1; + } - what = WaitForSingleObject(hProc, INFINITE); + what = WaitForSingleObject(hProc, INFINITE); - if (what == WAIT_OBJECT_0) { - GetExitCodeProcess(hProc, &exit_code); - } + if (what == WAIT_OBJECT_0) { + GetExitCodeProcess(hProc, &exit_code); + } - if (hProc) { - CloseHandle(hProc); - } + if (hProc) { + CloseHandle(hProc); + } - return exit_code; + return exit_code; } // Utilities ///////////////////////////////////////////////////////////////////////////////////// // Throws Java exception (will be trapped by VM). -// Arguments: +// Arguments: // [in] name - name of exception class // [in] message to assign thi event ///////////////////////////////////////////////////////////////////////////////////// void ThrowByName(JNIEnv *env, const char *name, const char *msg) { - jclass cls = (*env)->FindClass(env, name); + jclass cls = (*env)->FindClass(env, name); - if (cls != 0) { /* Otherwise an exception has already been thrown */ - (*env)->ThrowNew(env, cls, msg); - } + if (cls != 0) { /* Otherwise an exception has already been thrown */ + (*env)->ThrowNew(env, cls, msg); + } - /* It's a good practice to clean up the local references. */ - (*env)->DeleteLocalRef(env, cls); + /* It's a good practice to clean up the local references. */ + (*env)->DeleteLocalRef(env, cls); } ///////////////////////////////////////////////////////////////////////////////////// // Create process description block. // Arguments: no -// Return : pointer to the process descriptor +// Return : pointer to the process descriptor ///////////////////////////////////////////////////////////////////////////////////// pProcInfo_t createProcInfo() { - int i; - pProcInfo_t p = NULL; + int i; + pProcInfo_t p = NULL; - EnterCriticalSection(&cs); + EnterCriticalSection(&cs); - if (NULL == pInfo) { - pInfo = (pProcInfo_t) malloc(sizeof(procInfo_t) * MAX_PROCS); - ZeroMemory(pInfo, sizeof(procInfo_t) * MAX_PROCS); - } + if (NULL == pInfo) { + pInfo = (pProcInfo_t)malloc(sizeof(procInfo_t) * MAX_PROCS); + ZeroMemory(pInfo, sizeof(procInfo_t) * MAX_PROCS); + } - for (i = 0; i < MAX_PROCS; ++i) { - if (pInfo[i].pid == 0) { - pInfo[i].pid = -1; - pInfo[i].uid = ++procCounter; - p = pInfo + i; - break; - } - } + for (i = 0; i < MAX_PROCS; ++i) { + if (pInfo[i].pid == 0) { + pInfo[i].pid = -1; + pInfo[i].uid = ++procCounter; + p = pInfo + i; + break; + } + } - LeaveCriticalSection(&cs); + LeaveCriticalSection(&cs); - return p; + return p; } ///////////////////////////////////////////////////////////////////////////////////// // Using unique process ID finds process descriptor // Arguments: no -// Return : pointer to the process descriptor +// Return : pointer to the process descriptor ///////////////////////////////////////////////////////////////////////////////////// pProcInfo_t findProcInfo(int uid) { - int i; - pProcInfo_t p = NULL; - if (NULL == pInfo) { - return NULL; - } - - for (i = 0; i < MAX_PROCS; ++i) { - if (pInfo[i].uid == uid) { - p = pInfo + i; - break; - } - } - - return p; + int i; + pProcInfo_t p = NULL; + if (NULL == pInfo) { + return NULL; + } + + for (i = 0; i < MAX_PROCS; ++i) { + if (pInfo[i].uid == uid) { + p = pInfo + i; + break; + } + } + + return p; } ///////////////////////////////////////////////////////////////////////////////////// // Cleans up vacant process descriptor -// Arguments: +// Arguments: // pCurProcInfo - pointer to descriptor to clean up // Return : no void cleanUpProcBlock(pProcInfo_t pCurProcInfo) { - if (0 != pCurProcInfo->eventBreak) { - CloseHandle(pCurProcInfo->eventBreak); - pCurProcInfo->eventBreak = 0; - } - if (0 != pCurProcInfo->eventWait) { - CloseHandle(pCurProcInfo->eventWait); - pCurProcInfo->eventWait = 0; - } - if (0 != pCurProcInfo->eventTerminate) { - CloseHandle(pCurProcInfo->eventTerminate); - pCurProcInfo->eventTerminate = 0; - } - - if (0 != pCurProcInfo->eventKill) { - CloseHandle(pCurProcInfo->eventKill); - pCurProcInfo->eventKill = 0; - } - - if (0 != pCurProcInfo->eventCtrlc) { - CloseHandle(pCurProcInfo->eventCtrlc); - pCurProcInfo->eventCtrlc = 0; - } - - pCurProcInfo->pid = 0; + if (0 != pCurProcInfo->eventBreak) { + CloseHandle(pCurProcInfo->eventBreak); + pCurProcInfo->eventBreak = 0; + } + if (0 != pCurProcInfo->eventWait) { + CloseHandle(pCurProcInfo->eventWait); + pCurProcInfo->eventWait = 0; + } + if (0 != pCurProcInfo->eventTerminate) { + CloseHandle(pCurProcInfo->eventTerminate); + pCurProcInfo->eventTerminate = 0; + } + + if (0 != pCurProcInfo->eventKill) { + CloseHandle(pCurProcInfo->eventKill); + pCurProcInfo->eventKill = 0; + } + + if (0 != pCurProcInfo->eventCtrlc) { + CloseHandle(pCurProcInfo->eventCtrlc); + pCurProcInfo->eventCtrlc = 0; + } + + pCurProcInfo->pid = 0; } ///////////////////////////////////////////////////////////////////////////////////// // Running in separate thread and waiting for the process termination -// Arguments: +// Arguments: // pv - pointer to PROCESS_INFORMATION struct // Return : no ///////////////////////////////////////////////////////////////////////////////////// -void _cdecl waitProcTermination(void* pv) { - PROCESS_INFORMATION *pi = (PROCESS_INFORMATION *)pv; - int i; +void _cdecl waitProcTermination(void *pv) { + PROCESS_INFORMATION *pi = (PROCESS_INFORMATION *)pv; + int i; #ifdef DEBUG_MONITOR - wchar_t buffer[1000]; + wchar_t buffer[1000]; #endif - // wait for process termination - WaitForSingleObject(pi->hProcess, INFINITE); + // wait for process termination + WaitForSingleObject(pi->hProcess, INFINITE); - for (i = 0; i < MAX_PROCS; ++i) { - if (pInfo[i].pid == pi->dwProcessId) { - cleanUpProcBlock(pInfo + i); + for (i = 0; i < MAX_PROCS; ++i) { + if (pInfo[i].pid == pi->dwProcessId) { + cleanUpProcBlock(pInfo + i); #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("waitProcTermination: set PID %i to 0\n"), - pi->dwProcessId); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("waitProcTermination: set PID %i to 0\n"), + pi->dwProcessId); + OutputDebugStringW(buffer); #endif - } - } - CloseHandle(pi->hProcess); + } + } + CloseHandle(pi->hProcess); - free(pi); + free(pi); } ///////////////////////////////////////////////////////////////////////////////////// // Use this utility program to process correctly quotation marks in the command line -// Arguments: +// Arguments: // target - string to copy to // source - string to copy from // cpyLength - copy length @@ -857,62 +862,62 @@ void _cdecl waitProcTermination(void* pv) { // Return :number of bytes used in target, or -1 in case of error ///////////////////////////////////////////////////////////////////////////////////// int copyTo(wchar_t *target, const wchar_t *source, int cpyLength, int availSpace) { - BOOL bSlash = FALSE; - int i = 0, j = 0; + BOOL bSlash = FALSE; + int i = 0, j = 0; -#define QUOTATION_DO 0 +#define QUOTATION_DO 0 #define QUOTATION_DONE 1 #define QUOTATION_NONE 2 - int nQuotationMode = 0; - - if (availSpace <= cpyLength) { // = to reserve space for final '\0' - return -1; - } - - if ((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) { - nQuotationMode = QUOTATION_DONE; - } else if (wcschr(source, _T(' ')) == NULL) { - // No reason to quote term because it doesn't have embedded spaces - nQuotationMode = QUOTATION_NONE; - } else { - // Needs to be quoted - nQuotationMode = QUOTATION_DO; - *target = _T('\"'); - ++j; - } - - for (; i < cpyLength; ++i, ++j) { - if (source[i] == _T('\\')) { - bSlash = TRUE; - } else { - // Don't escape embracing quotation marks - if ((source[i] == _T('\"')) - && !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))))) { - if (!bSlash) { // If still not escaped - if (j == availSpace) { - return -1; - } - target[j] = _T('\\'); - ++j; - } - } - bSlash = FALSE; - } - - if (j == availSpace) { - return -1; - } - target[j] = source[i]; - } - - if (nQuotationMode == QUOTATION_DO) { - if (j == availSpace) { - return -1; - } - target[j] = _T('\"'); - ++j; - } - - return j; + int nQuotationMode = 0; + + if (availSpace <= cpyLength) { // = to reserve space for final '\0' + return -1; + } + + if ((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) { + nQuotationMode = QUOTATION_DONE; + } else if (wcschr(source, _T(' ')) == NULL) { + // No reason to quote term because it doesn't have embedded spaces + nQuotationMode = QUOTATION_NONE; + } else { + // Needs to be quoted + nQuotationMode = QUOTATION_DO; + *target = _T('\"'); + ++j; + } + + for (; i < cpyLength; ++i, ++j) { + if (source[i] == _T('\\')) { + bSlash = TRUE; + } else { + // Don't escape embracing quotation marks + if ((source[i] == _T('\"')) && + !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))))) { + if (!bSlash) { // If still not escaped + if (j == availSpace) { + return -1; + } + target[j] = _T('\\'); + ++j; + } + } + bSlash = FALSE; + } + + if (j == availSpace) { + return -1; + } + target[j] = source[i]; + } + + if (nQuotationMode == QUOTATION_DO) { + if (j == availSpace) { + return -1; + } + target[j] = _T('\"'); + ++j; + } + + return j; } diff --git a/core/org.eclipse.cdt.core.native/native_src/win/include/winpty.h b/core/org.eclipse.cdt.core.native/native_src/win/include/winpty.h index ddd525e2da4..7987c4de1fe 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/include/winpty.h +++ b/core/org.eclipse.cdt.core.native/native_src/win/include/winpty.h @@ -47,7 +47,7 @@ typedef struct winpty_s winpty_t; * * This function creates a new agent process and connects to it. */ -WINPTY_API winpty_t* winpty_open(int cols, int rows); +WINPTY_API winpty_t *winpty_open(int cols, int rows); /* * Start a child process. Either (but not both) of appname and cmdline may @@ -63,7 +63,7 @@ WINPTY_API winpty_t* winpty_open(int cols, int rows); * Returns 0 on success or a Win32 error code on failure. */ WINPTY_API int winpty_start_process(winpty_t *pc, const wchar_t *appname, const wchar_t *cmdline, const wchar_t *cwd, - const wchar_t *env); + const wchar_t *env); /* * Returns the exit code of the process started with winpty_start_process, diff --git a/core/org.eclipse.cdt.core.native/native_src/win/iostream.c b/core/org.eclipse.cdt.core.native/native_src/win/iostream.c index d0cb1dbac3d..df1d0b875c0 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/iostream.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/iostream.c @@ -13,7 +13,7 @@ * * raise.c * - * This is a part of JNI implementation of spawner + * This is a part of JNI implementation of spawner * Includes implementation of JNI methods (see Spawner.java) *******************************************************************************/ #include @@ -27,222 +27,224 @@ void ThrowByName(JNIEnv *env, const char *name, const char *msg); -#define BUFF_SIZE (1024) +#define BUFF_SIZE (1024) static HANDLE channelToHandle(JNIEnv *env, jobject channel) { - if (channel == 0) { - ThrowByName(env, "java/io/IOException", "Invalid channel object"); - return NULL; - } - - jclass cls = (*env)->GetObjectClass(env, channel); - if (cls == NULL) { - ThrowByName(env, "java/io/IOException", "Unable to get channel class"); - return NULL; - } - - jfieldID fid = (*env)->GetFieldID(env, cls, "handle", "J"); - if (fid == NULL) { - ThrowByName(env, "java/io/IOException", "Unable to find handle"); - return NULL; - } - - jlong handle = (*env)->GetLongField(env, channel, fid); - return (HANDLE) handle; + if (channel == 0) { + ThrowByName(env, "java/io/IOException", "Invalid channel object"); + return NULL; + } + + jclass cls = (*env)->GetObjectClass(env, channel); + if (cls == NULL) { + ThrowByName(env, "java/io/IOException", "Unable to get channel class"); + return NULL; + } + + jfieldID fid = (*env)->GetFieldID(env, cls, "handle", "J"); + if (fid == NULL) { + ThrowByName(env, "java/io/IOException", "Unable to find handle"); + return NULL; + } + + jlong handle = (*env)->GetLongField(env, channel, fid); + return (HANDLE)handle; } /* Inaccessible static: skipBuffer */ #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *env, jobject proc, - jobject channel, jbyteArray buf, jint len) { - jbyte tmpBuf[BUFF_SIZE]; - int nBuffOffset = 0; - HANDLE handle = channelToHandle(env, channel); + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *env, jobject proc, jobject channel, + jbyteArray buf, jint len) { + jbyte tmpBuf[BUFF_SIZE]; + int nBuffOffset = 0; + HANDLE handle = channelToHandle(env, channel); #ifdef DEBUG_MONITOR - _TCHAR buffer[1000]; -#endif - OVERLAPPED overlapped; - overlapped.Offset = 0; - overlapped.OffsetHigh = 0; - overlapped.hEvent = CreateEvent(NULL, // no security attribute - TRUE, // manual-reset event - TRUE, // initial state = signaled - NULL); // unnamed event object - - if (NULL == overlapped.hEvent) { - char *lpMsgBuf; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, - GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (wchar_t*) &lpMsgBuf, 0, NULL); - - ThrowByName(env, "java/io/IOException", lpMsgBuf); - // Free the buffer. - LocalFree(lpMsgBuf); - } + _TCHAR buffer[1000]; +#endif + OVERLAPPED overlapped; + overlapped.Offset = 0; + overlapped.OffsetHigh = 0; + overlapped.hEvent = CreateEvent(NULL, // no security attribute + TRUE, // manual-reset event + TRUE, // initial state = signaled + NULL); // unnamed event object + + if (NULL == overlapped.hEvent) { + char *lpMsgBuf; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, + GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (wchar_t *)&lpMsgBuf, 0, NULL); + + ThrowByName(env, "java/io/IOException", lpMsgBuf); + // Free the buffer. + LocalFree(lpMsgBuf); + } #ifdef DEBUG_MONITOR #ifdef READ_REPORT - _stprintf(buffer, _T("Start read %i\n"), fd); - OutputDebugStringW(buffer); -#endif -#endif - - while (len > nBuffOffset) { - DWORD nNumberOfBytesToRead = min(len - nBuffOffset, BUFF_SIZE); - DWORD nNumberOfBytesRead; - if (0 == ReadFile(handle, tmpBuf, nNumberOfBytesToRead, &nNumberOfBytesRead, &overlapped)) { - int err = GetLastError(); - - if (err == ERROR_IO_PENDING) { - // asynchronous i/o is still in progress - // check on the results of the asynchronous read - if (GetOverlappedResult(handle, &overlapped, &nNumberOfBytesRead, TRUE)) { - err = 0; - } else { // if there was a problem ... - err = GetLastError(); - } - } - if (err == ERROR_BROKEN_PIPE) { // Pipe was closed - break; - } - if (err != 0) { - char *lpMsgBuf; + _stprintf(buffer, _T("Start read %i\n"), fd); + OutputDebugStringW(buffer); +#endif +#endif + + while (len > nBuffOffset) { + DWORD nNumberOfBytesToRead = min(len - nBuffOffset, BUFF_SIZE); + DWORD nNumberOfBytesRead; + if (0 == ReadFile(handle, tmpBuf, nNumberOfBytesToRead, &nNumberOfBytesRead, &overlapped)) { + int err = GetLastError(); + + if (err == ERROR_IO_PENDING) { + // asynchronous i/o is still in progress + // check on the results of the asynchronous read + if (GetOverlappedResult(handle, &overlapped, &nNumberOfBytesRead, TRUE)) { + err = 0; + } else { // if there was a problem ... + err = GetLastError(); + } + } + if (err == ERROR_BROKEN_PIPE) { // Pipe was closed + break; + } + if (err != 0) { + char *lpMsgBuf; #ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Read failed - %i, error %i\n"), fd, err); - OutputDebugStringW(buffer); -#endif - if (err != ERROR_MORE_DATA) { // Otherwise error means just that there are more data than buffer can accept - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (wchar_t*) &lpMsgBuf, 0, NULL); - - ThrowByName(env, "java/io/IOException", lpMsgBuf); - LocalFree(lpMsgBuf); - nBuffOffset = 0; - break; - } else { - // buffer overflow? - // according to msdn this happens in message read mode only + _stprintf(buffer, _T("Read failed - %i, error %i\n"), fd, err); + OutputDebugStringW(buffer); +#endif + if (err != + ERROR_MORE_DATA) { // Otherwise error means just that there are more data than buffer can accept + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (wchar_t *)&lpMsgBuf, 0, NULL); + + ThrowByName(env, "java/io/IOException", lpMsgBuf); + LocalFree(lpMsgBuf); + nBuffOffset = 0; + break; + } else { + // buffer overflow? + // according to msdn this happens in message read mode only #ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Buffer full - %i, bytes read: %i\n"), fd, nNumberOfBytesRead); - OutputDebugStringW(buffer); -#endif - // nNumberOfBytesRead can be 0 here for unknown reason (bug 269223) - nNumberOfBytesRead = nNumberOfBytesToRead; - } - } - } - if (nNumberOfBytesRead > 0) { - (*env)->SetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesRead, tmpBuf); - } else { - break; - } - nBuffOffset += nNumberOfBytesRead; - if (nNumberOfBytesRead != nNumberOfBytesToRead) { - break; - } else { - // Is there data left in the pipe? - DWORD bytesAvailable = 0; - if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL) || bytesAvailable == 0) { - // No bytes left - break; - } - } - } - CloseHandle(overlapped.hEvent); + _stprintf(buffer, _T("Buffer full - %i, bytes read: %i\n"), fd, nNumberOfBytesRead); + OutputDebugStringW(buffer); +#endif + // nNumberOfBytesRead can be 0 here for unknown reason (bug 269223) + nNumberOfBytesRead = nNumberOfBytesToRead; + } + } + } + if (nNumberOfBytesRead > 0) { + (*env)->SetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesRead, tmpBuf); + } else { + break; + } + nBuffOffset += nNumberOfBytesRead; + if (nNumberOfBytesRead != nNumberOfBytesToRead) { + break; + } else { + // Is there data left in the pipe? + DWORD bytesAvailable = 0; + if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL) || bytesAvailable == 0) { + // No bytes left + break; + } + } + } + CloseHandle(overlapped.hEvent); #ifdef DEBUG_MONITOR #ifdef READ_REPORT - _stprintf(buffer, _T("End read %i - bytes read: %d\n"), fd, nBuffOffset); - OutputDebugStringW(buffer); + _stprintf(buffer, _T("End read %i - bytes read: %d\n"), fd, nBuffOffset); + OutputDebugStringW(buffer); #endif #endif - return nBuffOffset; // This is a real full readed length - + return nBuffOffset; // This is a real full readed length } #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *env, jobject proc, - jobject channel) { - int rc; - HANDLE handle = channelToHandle(env, channel); + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *env, jobject proc, jobject channel) { + int rc; + HANDLE handle = channelToHandle(env, channel); #ifdef DEBUG_MONITOR - _TCHAR buffer[1000]; - _stprintf(buffer, _T("Close %i\n"), fd); - OutputDebugStringW(buffer); + _TCHAR buffer[1000]; + _stprintf(buffer, _T("Close %i\n"), fd); + OutputDebugStringW(buffer); #endif - rc = (CloseHandle(handle) ? 0 : -1); + rc = (CloseHandle(handle) ? 0 : -1); #ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Closed %i\n"), fd); - OutputDebugStringW(buffer); + _stprintf(buffer, _T("Closed %i\n"), fd); + OutputDebugStringW(buffer); #endif - return (rc ? GetLastError() : 0); + return (rc ? GetLastError() : 0); } #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0(JNIEnv *env, jobject proc, - jobject channel) { - DWORD nAvail = 0; - HANDLE handle = channelToHandle(env, channel); + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0(JNIEnv *env, jobject proc, jobject channel) { + DWORD nAvail = 0; + HANDLE handle = channelToHandle(env, channel); - if (0 == PeekNamedPipe(handle, NULL, 0, NULL, &nAvail, NULL)) { - // error - return 0; - } - return nAvail; + if (0 == PeekNamedPipe(handle, NULL, 0, NULL, &nAvail, NULL)) { + // error + return 0; + } + return nAvail; } #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *env, jobject proc, - jobject channel, jbyteArray buf, jint len) { - jbyte tmpBuf[BUFF_SIZE]; - int nBuffOffset = 0; - HANDLE handle = channelToHandle(env, channel); - - while (len > nBuffOffset) { - DWORD nNumberOfBytesToWrite = min(len - nBuffOffset, BUFF_SIZE); - DWORD nNumberOfBytesWritten; - (*env)->GetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesToWrite, tmpBuf); - if (0 == WriteFile(handle, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) { - char *lpMsgBuf; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (wchar_t*) &lpMsgBuf, 0, NULL); - - ThrowByName(env, "java/io/IOException", lpMsgBuf); - LocalFree(lpMsgBuf); - return 0; - } - nBuffOffset += nNumberOfBytesWritten; - } - return 0; + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *env, jobject proc, jobject channel, + jbyteArray buf, jint len) { + jbyte tmpBuf[BUFF_SIZE]; + int nBuffOffset = 0; + HANDLE handle = channelToHandle(env, channel); + + while (len > nBuffOffset) { + DWORD nNumberOfBytesToWrite = min(len - nBuffOffset, BUFF_SIZE); + DWORD nNumberOfBytesWritten; + (*env)->GetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesToWrite, tmpBuf); + if (0 == WriteFile(handle, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) { + char *lpMsgBuf; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (wchar_t *)&lpMsgBuf, 0, NULL); + + ThrowByName(env, "java/io/IOException", lpMsgBuf); + LocalFree(lpMsgBuf); + return 0; + } + nBuffOffset += nNumberOfBytesWritten; + } + return 0; } #ifdef __cplusplus extern "C" #endif -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *env, jobject proc, - jobject channel) { - int rc; - HANDLE handle = channelToHandle(env, channel); + JNIEXPORT jint JNICALL + Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *env, jobject proc, jobject channel) { + int rc; + HANDLE handle = channelToHandle(env, channel); #ifdef DEBUG_MONITOR - _TCHAR buffer[1000]; - _stprintf(buffer, _T("Close %i\n"), fd); - OutputDebugStringW(buffer); + _TCHAR buffer[1000]; + _stprintf(buffer, _T("Close %i\n"), fd); + OutputDebugStringW(buffer); #endif - FlushFileBuffers(handle); - rc = (CloseHandle(handle) ? 0 : -1); + FlushFileBuffers(handle); + rc = (CloseHandle(handle) ? 0 : -1); #ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Closed %i\n"), fd); - OutputDebugStringW(buffer); + _stprintf(buffer, _T("Closed %i\n"), fd); + OutputDebugStringW(buffer); #endif - return (rc ? GetLastError() : 0); + return (rc ? GetLastError() : 0); } diff --git a/core/org.eclipse.cdt.core.native/native_src/win/pty.cpp b/core/org.eclipse.cdt.core.native/native_src/win/pty.cpp index e64312299c1..8824458e90b 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/pty.cpp +++ b/core/org.eclipse.cdt.core.native/native_src/win/pty.cpp @@ -24,358 +24,360 @@ #include #include -static std::map fd2pty; +static std::map fd2pty; static std::map fd2rc; JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *env, jobject jobj, jboolean console) { - jfieldID fid; /* Store the field ID */ - jstring jstr = NULL; - jclass cls; + jfieldID fid; /* Store the field ID */ + jstring jstr = NULL; + jclass cls; - int master = -1; - char line[1024]; + int master = -1; + char line[1024]; - line[0] = '\0'; + line[0] = '\0'; - /* Open new winpty handle */ - winpty_t *winpty = winpty_open(80, 40); - if (winpty == NULL) { - return NULL; - } + /* Open new winpty handle */ + winpty_t *winpty = winpty_open(80, 40); + if (winpty == NULL) { + return NULL; + } - /* Configure console mode */ - if (console) { - winpty_set_console_mode(winpty, 1); - } + /* Configure console mode */ + if (console) { + winpty_set_console_mode(winpty, 1); + } - /* Generate masterFD based on current system time */ - srand((unsigned int) time(NULL)); - master = rand(); + /* Generate masterFD based on current system time */ + srand((unsigned int)time(NULL)); + master = rand(); - /* Make sure masterFD does not exist */ - while (fd2pty.find(master) != fd2pty.end()) { - master++; - } + /* Make sure masterFD does not exist */ + while (fd2pty.find(master) != fd2pty.end()) { + master++; + } - sprintf(line, "winpty_%i", master); + sprintf(line, "winpty_%i", master); - /* Remember the winpty handle for the generated masterFD */ - fd2pty.insert(std::pair(master, winpty)); + /* Remember the winpty handle for the generated masterFD */ + fd2pty.insert(std::pair(master, winpty)); - /* Get a reference to the obj's class */ - cls = env->GetObjectClass(jobj); + /* Get a reference to the obj's class */ + cls = env->GetObjectClass(jobj); - /* Set the master fd. */ - fid = env->GetFieldID(cls, "master", "I"); - if (fid == NULL) { - return NULL; - } - env->SetIntField(jobj, fid, (jint) master); + /* Set the master fd. */ + fid = env->GetFieldID(cls, "master", "I"); + if (fid == NULL) { + return NULL; + } + env->SetIntField(jobj, fid, (jint)master); - /* Create a new String for the slave. */ - jstr = env->NewStringUTF(line); + /* Create a new String for the slave. */ + jstr = env->NewStringUTF(line); - return jstr; + return jstr; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(JNIEnv *env, jobject jobj, jint fdm, - jint width, jint height) { - int fd; - std::map::const_iterator fd2pty_Iter; - - fd = fdm; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - if (winpty != NULL) { - return winpty_set_size(winpty, width, height); - } - } - - return 0; + jint width, jint height) { + int fd; + std::map::const_iterator fd2pty_Iter; + + fd = fdm; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + if (winpty != NULL) { + return winpty_set_size(winpty, width, height); + } + } + + return 0; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, jint jfd, - jbyteArray buf, jint buf_len) { - DWORD amount = -1; - OVERLAPPED over; - int fd; - std::map::const_iterator fd2pty_Iter; - - fd = jfd; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - if (winpty != NULL) { - /* Get the pipe handle */ - HANDLE handle = winpty_get_data_pipe(winpty); - - memset(&over, 0, sizeof(over)); - over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - - char *buffer = new char[buf_len]; - memset(buffer, 0, sizeof(*buffer)); - - jbyte *data = env->GetByteArrayElements(buf, 0); - memset(data, 0, sizeof(*data)); - - amount = 0; - BOOL ret = ReadFile(handle, buffer, buf_len, &amount, &over); - if (!ret) { - DWORD error = GetLastError(); - if (error == ERROR_IO_PENDING) { - ret = GetOverlappedResult(handle, &over, &amount, TRUE); - } - } - - if (ret && amount > 0) { - memcpy(data, buffer, amount); - } - - if (!ret || amount == 0) { - amount = -1; - } - - if (!ret && fd2pty.find(fd) != fd2pty.end()) { - int rc = winpty_get_exit_code(winpty); - fd2rc.insert(std::pair(fd, rc)); - } - - delete[] buffer; - env->ReleaseByteArrayElements(buf, data, 0); - ResetEvent(over.hEvent); - } - } - - return amount; + jbyteArray buf, jint buf_len) { + DWORD amount = -1; + OVERLAPPED over; + int fd; + std::map::const_iterator fd2pty_Iter; + + fd = jfd; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + if (winpty != NULL) { + /* Get the pipe handle */ + HANDLE handle = winpty_get_data_pipe(winpty); + + memset(&over, 0, sizeof(over)); + over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + char *buffer = new char[buf_len]; + memset(buffer, 0, sizeof(*buffer)); + + jbyte *data = env->GetByteArrayElements(buf, 0); + memset(data, 0, sizeof(*data)); + + amount = 0; + BOOL ret = ReadFile(handle, buffer, buf_len, &amount, &over); + if (!ret) { + DWORD error = GetLastError(); + if (error == ERROR_IO_PENDING) { + ret = GetOverlappedResult(handle, &over, &amount, TRUE); + } + } + + if (ret && amount > 0) { + memcpy(data, buffer, amount); + } + + if (!ret || amount == 0) { + amount = -1; + } + + if (!ret && fd2pty.find(fd) != fd2pty.end()) { + int rc = winpty_get_exit_code(winpty); + fd2rc.insert(std::pair(fd, rc)); + } + + delete[] buffer; + env->ReleaseByteArrayElements(buf, data, 0); + ResetEvent(over.hEvent); + } + } + + return amount; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, jint jfd) { - int fd; - std::map::iterator fd2pty_Iter; - - fd = jfd; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - fd2pty.erase(fd2pty_Iter); - if (winpty != NULL) { - winpty_close(winpty); - winpty = NULL; - } - } - - return 0; + int fd; + std::map::iterator fd2pty_Iter; + + fd = jfd; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + fd2pty.erase(fd2pty_Iter); + if (winpty != NULL) { + winpty_close(winpty); + winpty = NULL; + } + } + + return 0; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, jint jfd, - jbyteArray buf, jint buf_len) { - DWORD written = -1; - OVERLAPPED over; - int fd; - std::map::iterator fd2pty_Iter; - - fd = jfd; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - if (winpty != NULL) { - /* Get the pipe handle */ - HANDLE handle = winpty_get_data_pipe(winpty); - - memset(&over, 0, sizeof(over)); - over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - - char *buffer = new char[buf_len]; - memset(buffer, 0, sizeof(*buffer)); - - jbyte *data = env->GetByteArrayElements(buf, 0); - memcpy(buffer, data, buf_len); - - BOOL ret = WriteFile(handle, buffer, buf_len, &written, &over); - env->ReleaseByteArrayElements(buf, data, 0); - - if (!ret && GetLastError() == ERROR_IO_PENDING) { - ret = GetOverlappedResult(handle, &over, &written, TRUE); - } - if (!ret || (int) written != buf_len) { - written = -1; - } - - delete[] buffer; - } - } - - return written; + jbyteArray buf, jint buf_len) { + DWORD written = -1; + OVERLAPPED over; + int fd; + std::map::iterator fd2pty_Iter; + + fd = jfd; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + if (winpty != NULL) { + /* Get the pipe handle */ + HANDLE handle = winpty_get_data_pipe(winpty); + + memset(&over, 0, sizeof(over)); + over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + char *buffer = new char[buf_len]; + memset(buffer, 0, sizeof(*buffer)); + + jbyte *data = env->GetByteArrayElements(buf, 0); + memcpy(buffer, data, buf_len); + + BOOL ret = WriteFile(handle, buffer, buf_len, &written, &over); + env->ReleaseByteArrayElements(buf, data, 0); + + if (!ret && GetLastError() == ERROR_IO_PENDING) { + ret = GetOverlappedResult(handle, &over, &written, TRUE); + } + if (!ret || (int)written != buf_len) { + written = -1; + } + + delete[] buffer; + } + } + + return written; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *env, jobject jobj, jint jfd) { - int fd; - std::map::iterator fd2pty_Iter; - - fd = jfd; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - fd2pty.erase(fd2pty_Iter); - if (winpty != NULL) { - winpty_close(winpty); - winpty = NULL; - } - } - - return 0; + int fd; + std::map::iterator fd2pty_Iter; + + fd = jfd; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + fd2pty.erase(fd2pty_Iter); + if (winpty != NULL) { + winpty_close(winpty); + winpty = NULL; + } + } + + return 0; } /* * Convert convert slashes to backslashes. */ static std::wstring convertSlashes(const wchar_t *path) { - std::wstring ret; + std::wstring ret; - for (int i = 0; path[i] != L'\0'; ++i) { - if (path[i] == L'/') { - ret.push_back(L'\\'); - } else { - ret.push_back(path[i]); - } - } + for (int i = 0; path[i] != L'\0'; ++i) { + if (path[i] == L'/') { + ret.push_back(L'\\'); + } else { + ret.push_back(path[i]); + } + } - return ret; + return ret; } // Convert argc/argv into a Win32 command-line following the escaping convention // documented on MSDN. (e.g. see CommandLineToArgvW documentation) static std::wstring argvToCommandLine(const std::vector &argv) { - std::wstring result; - for (size_t argIndex = 0; argIndex < argv.size(); ++argIndex) { - if (argIndex > 0) { - result.push_back(L' '); - } - const wchar_t *arg = argv[argIndex].c_str(); - const bool quote = wcschr(arg, L' ') != NULL || wcschr(arg, L'\t') != NULL || *arg == L'\0'; - if (quote) { - result.push_back(L'\"'); - } - int bsCount = 0; - for (const wchar_t *p = arg; *p != L'\0'; ++p) { - if (*p == L'\\') { - bsCount++; - } else if (*p == L'\"') { - result.append(bsCount * 2 + 1, L'\\'); - result.push_back(L'\"'); - bsCount = 0; - } else { - result.append(bsCount, L'\\'); - bsCount = 0; - result.push_back(*p); - } - } - if (quote) { - result.append(bsCount * 2, L'\\'); - result.push_back(L'\"'); - } else { - result.append(bsCount, L'\\'); - } - } - return result; + std::wstring result; + for (size_t argIndex = 0; argIndex < argv.size(); ++argIndex) { + if (argIndex > 0) { + result.push_back(L' '); + } + const wchar_t *arg = argv[argIndex].c_str(); + const bool quote = wcschr(arg, L' ') != NULL || wcschr(arg, L'\t') != NULL || *arg == L'\0'; + if (quote) { + result.push_back(L'\"'); + } + int bsCount = 0; + for (const wchar_t *p = arg; *p != L'\0'; ++p) { + if (*p == L'\\') { + bsCount++; + } else if (*p == L'\"') { + result.append(bsCount * 2 + 1, L'\\'); + result.push_back(L'\"'); + bsCount = 0; + } else { + result.append(bsCount, L'\\'); + bsCount = 0; + result.push_back(*p); + } + } + if (quote) { + result.append(bsCount * 2, L'\\'); + result.push_back(L'\"'); + } else { + result.append(bsCount, L'\\'); + } + } + return result; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_exec2(JNIEnv *env, jobject jobj, jobjectArray jcmd, - jobjectArray jenv, jstring jdir, jobjectArray jchannels, jstring jslaveName, jint masterFD, jboolean console) { - int fd; - std::map::iterator fd2pty_Iter; - - const wchar_t *cwdW = (const wchar_t*) env->GetStringChars(jdir, NULL); - const char *pts_name = env->GetStringUTFChars(jslaveName, NULL); - - int pid = -1; - - int i; - jint argc = env->GetArrayLength(jcmd); - jint envc = env->GetArrayLength(jenv); - - if (jchannels == NULL || env->GetArrayLength(jchannels) != 3) { - goto bail_out; - } - - fd = masterFD; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - if (winpty != NULL) { - std::vector < std::wstring > argVector; - - for (i = 0; i < argc; i++) { - jstring j_str = (jstring) env->GetObjectArrayElement(jcmd, i); - const wchar_t *w_str = (const wchar_t*) env->GetStringChars(j_str, NULL); - if (i == 0) { - argVector.push_back(convertSlashes(w_str)); - } else { - argVector.push_back(w_str); - } - env->ReleaseStringChars(j_str, (const jchar*) w_str); - env->DeleteLocalRef(j_str); - } - - std::wstring envp; - - for (i = 0; i < envc; i++) { - jstring j_str = (jstring) env->GetObjectArrayElement(jenv, i); - const wchar_t *w_str = (const wchar_t*) env->GetStringChars(j_str, NULL); - envp.append(w_str); - envp.push_back(L'\0'); - env->ReleaseStringChars(j_str, (const jchar*) w_str); - env->DeleteLocalRef(j_str); - } - - std::wstring cmdLine = argvToCommandLine(argVector); - const wchar_t *cmdLineW = cmdLine.c_str(); - - int ret = winpty_start_process(winpty, NULL, cmdLineW, cwdW, envp.c_str()); - - if (ret == 0) { - // Success. Get the process id. - pid = winpty_get_process_id(winpty); - } - } - } - - bail_out: env->ReleaseStringChars(jdir, (const jchar*) cwdW); - env->ReleaseStringUTFChars(jslaveName, pts_name); - - return pid; + jobjectArray jenv, jstring jdir, jobjectArray jchannels, + jstring jslaveName, jint masterFD, jboolean console) { + int fd; + std::map::iterator fd2pty_Iter; + + const wchar_t *cwdW = (const wchar_t *)env->GetStringChars(jdir, NULL); + const char *pts_name = env->GetStringUTFChars(jslaveName, NULL); + + int pid = -1; + + int i; + jint argc = env->GetArrayLength(jcmd); + jint envc = env->GetArrayLength(jenv); + + if (jchannels == NULL || env->GetArrayLength(jchannels) != 3) { + goto bail_out; + } + + fd = masterFD; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + if (winpty != NULL) { + std::vector argVector; + + for (i = 0; i < argc; i++) { + jstring j_str = (jstring)env->GetObjectArrayElement(jcmd, i); + const wchar_t *w_str = (const wchar_t *)env->GetStringChars(j_str, NULL); + if (i == 0) { + argVector.push_back(convertSlashes(w_str)); + } else { + argVector.push_back(w_str); + } + env->ReleaseStringChars(j_str, (const jchar *)w_str); + env->DeleteLocalRef(j_str); + } + + std::wstring envp; + + for (i = 0; i < envc; i++) { + jstring j_str = (jstring)env->GetObjectArrayElement(jenv, i); + const wchar_t *w_str = (const wchar_t *)env->GetStringChars(j_str, NULL); + envp.append(w_str); + envp.push_back(L'\0'); + env->ReleaseStringChars(j_str, (const jchar *)w_str); + env->DeleteLocalRef(j_str); + } + + std::wstring cmdLine = argvToCommandLine(argVector); + const wchar_t *cmdLineW = cmdLine.c_str(); + + int ret = winpty_start_process(winpty, NULL, cmdLineW, cwdW, envp.c_str()); + + if (ret == 0) { + // Success. Get the process id. + pid = winpty_get_process_id(winpty); + } + } + } + +bail_out: + env->ReleaseStringChars(jdir, (const jchar *)cwdW); + env->ReleaseStringUTFChars(jslaveName, pts_name); + + return pid; } JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_waitFor(JNIEnv *env, jobject jobj, jint masterFD, jint pid) { - int status = -1; - DWORD flags; - - int fd; - std::map::iterator fd2pty_Iter; - std::map::iterator fd2rc_Iter; - - fd = masterFD; - fd2pty_Iter = fd2pty.find(fd); - if (fd2pty_Iter != fd2pty.end()) { - winpty_t *winpty = fd2pty_Iter->second; - if (winpty != NULL) { - HANDLE handle = winpty_get_data_pipe(winpty); - BOOL success; - do { - success = GetHandleInformation(handle, &flags); - if (success) { - Sleep(500); - } - } while (success); - - fd2rc_Iter = fd2rc.find(fd); - if (fd2rc_Iter != fd2rc.end()) { - status = fd2rc_Iter->second; - fd2rc.erase(fd2rc_Iter); - } - } - } - - return status; + int status = -1; + DWORD flags; + + int fd; + std::map::iterator fd2pty_Iter; + std::map::iterator fd2rc_Iter; + + fd = masterFD; + fd2pty_Iter = fd2pty.find(fd); + if (fd2pty_Iter != fd2pty.end()) { + winpty_t *winpty = fd2pty_Iter->second; + if (winpty != NULL) { + HANDLE handle = winpty_get_data_pipe(winpty); + BOOL success; + do { + success = GetHandleInformation(handle, &flags); + if (success) { + Sleep(500); + } + } while (success); + + fd2rc_Iter = fd2rc.find(fd); + if (fd2rc_Iter != fd2rc.end()) { + status = fd2rc_Iter->second; + fd2rc.erase(fd2rc_Iter); + } + } + } + + return status; } diff --git a/core/org.eclipse.cdt.core.native/native_src/win/pty_dllmain.cpp b/core/org.eclipse.cdt.core.native/native_src/win/pty_dllmain.cpp index c9c29b52a07..79e230e78ec 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/pty_dllmain.cpp +++ b/core/org.eclipse.cdt.core.native/native_src/win/pty_dllmain.cpp @@ -4,42 +4,42 @@ #include static HMODULE getCurrentModule() { - HMODULE module; - if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - (LPCTSTR) getCurrentModule, &module)) { - assert(false); - } - return module; + HMODULE module; + if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCTSTR)getCurrentModule, &module)) { + assert(false); + } + return module; } HMODULE PTYExplicitLoadLibrary(LPCSTR pszModuleName) { - if (lstrcmpiA(pszModuleName, "winpty.dll") == 0) { - CHAR szPath[MAX_PATH] = ""; - //_hdllInstance is the HMODULE of *this* module - DWORD cchPath = GetModuleFileNameA(getCurrentModule(), szPath, MAX_PATH); - while (cchPath > 0) { - switch (szPath[cchPath - 1]) { - case '\\': - case '/': - case ':': - break; - default: - --cchPath; - continue; - } - break; //stop searching; found path separator - } - lstrcpynA(szPath + cchPath, pszModuleName, MAX_PATH - cchPath); - return LoadLibraryA(szPath); //call with full path to dependent DLL - } - return NULL; + if (lstrcmpiA(pszModuleName, "winpty.dll") == 0) { + CHAR szPath[MAX_PATH] = ""; + //_hdllInstance is the HMODULE of *this* module + DWORD cchPath = GetModuleFileNameA(getCurrentModule(), szPath, MAX_PATH); + while (cchPath > 0) { + switch (szPath[cchPath - 1]) { + case '\\': + case '/': + case ':': + break; + default: + --cchPath; + continue; + } + break; // stop searching; found path separator + } + lstrcpynA(szPath + cchPath, pszModuleName, MAX_PATH - cchPath); + return LoadLibraryA(szPath); // call with full path to dependent DLL + } + return NULL; } FARPROC WINAPI PTYDliNotifyHook(unsigned dliNotify, PDelayLoadInfo pdli) { - if (dliNotify == dliNotePreLoadLibrary) { - return (FARPROC) PTYExplicitLoadLibrary(pdli->szDll); - } - return NULL; + if (dliNotify == dliNotePreLoadLibrary) { + return (FARPROC)PTYExplicitLoadLibrary(pdli->szDll); + } + return NULL; } extern "C" { diff --git a/core/org.eclipse.cdt.core.native/native_src/win/raise.c b/core/org.eclipse.cdt.core.native/native_src/win/raise.c index 3cd29f37e70..27fd6e90488 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/raise.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/raise.c @@ -13,7 +13,7 @@ * * raise.c * - * This is a part of JNI implementation of spawner + * This is a part of JNI implementation of spawner *******************************************************************************/ #include #include @@ -26,40 +26,38 @@ static HWND consoleHWND; ///////////////////////////////////////////////////////////////////////////////////// // Check if window is a console of process with pid -// Arguments: +// Arguments: // hwnd - window handler // arg - process PID // Return : TRUE if yes ///////////////////////////////////////////////////////////////////////////////////// -static BOOL CALLBACK -find_child_console(HWND hwnd, LPARAM arg) { - DWORD process_id; - DWORD pid = arg; - - GetWindowThreadProcessId(hwnd, &process_id); - if (process_id == pid) { - wchar_t window_class[32]; - - GetClassName(hwnd, window_class, sizeof(window_class)); - if (wcscmp(window_class, L"ConsoleWindowClass") == 0) { - consoleHWND = hwnd; - return FALSE; - } - } - /* keep looking */ - return TRUE; +static BOOL CALLBACK find_child_console(HWND hwnd, LPARAM arg) { + DWORD process_id; + DWORD pid = arg; + + GetWindowThreadProcessId(hwnd, &process_id); + if (process_id == pid) { + wchar_t window_class[32]; + + GetClassName(hwnd, window_class, sizeof(window_class)); + if (wcscmp(window_class, L"ConsoleWindowClass") == 0) { + consoleHWND = hwnd; + return FALSE; + } + } + /* keep looking */ + return TRUE; } // Need to declare this Win32 prototype ourselves. _WIN32_WINNT is getting -// defined to a Windows NT value, thus we don't get this. Can't assume +// defined to a Windows NT value, thus we don't get this. Can't assume // we're running on XP, anyway (or can we by now?) #if (_WIN32_WINNT < 0x0501) || defined(_MSC_VER) -typedef BOOL(WINAPI *DebugBreakProcessFunc) -(HANDLE); +typedef BOOL(WINAPI *DebugBreakProcessFunc)(HANDLE); #endif ///////////////////////////////////////////////////////////////////////////////////// -// Called to interrupt a process that we didn't launch (and thus does not share our +// Called to interrupt a process that we didn't launch (and thus does not share our // console). Windows XP introduced the function 'DebugBreakProcess', which allows // a process to interrupt another process even if if the two do not share a console. // If we're running on 2000 or earlier, we have to resort to simulating a CTRL-C @@ -67,111 +65,109 @@ typedef BOOL(WINAPI *DebugBreakProcessFunc) // has its own console. That means, e.g., the process should have been started at // the cmdline with 'start myprogram.exe' instead of 'myprogram.exe'. // -// Arguments: +// Arguments: // pid - process' pid // Return : 0 if OK or error code ///////////////////////////////////////////////////////////////////////////////////// int interruptProcess(int pid) { - // See if DebugBreakProcess is available (XP and beyond) - HMODULE hmod = LoadLibrary(L"Kernel32.dll"); - if (hmod != NULL) { - BOOL success = FALSE; - FARPROC procaddr = GetProcAddress(hmod, "DebugBreakProcess"); - if (procaddr != NULL) { - HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD) pid); - if (proc != NULL) { - typedef BOOL WINAPI( *DebugBreakProcessFunc) - (HANDLE); - DebugBreakProcessFunc pDebugBreakProcess = (DebugBreakProcessFunc) procaddr; - success = (*pDebugBreakProcess)(proc); - CloseHandle(proc); - } - } - FreeLibrary(hmod); - hmod = NULL; - - if (success) { - return 0; // 0 == OK; if not, try old-school way - } - } + // See if DebugBreakProcess is available (XP and beyond) + HMODULE hmod = LoadLibrary(L"Kernel32.dll"); + if (hmod != NULL) { + BOOL success = FALSE; + FARPROC procaddr = GetProcAddress(hmod, "DebugBreakProcess"); + if (procaddr != NULL) { + HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid); + if (proc != NULL) { + typedef BOOL WINAPI (*DebugBreakProcessFunc)(HANDLE); + DebugBreakProcessFunc pDebugBreakProcess = (DebugBreakProcessFunc)procaddr; + success = (*pDebugBreakProcess)(proc); + CloseHandle(proc); + } + } + FreeLibrary(hmod); + hmod = NULL; + + if (success) { + return 0; // 0 == OK; if not, try old-school way + } + } #ifdef DEBUG_MONITOR _TCHAR buffer[1000]; #endif - int rc = 0; - consoleHWND = NULL; + int rc = 0; + consoleHWND = NULL; #ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Try to interrupt process %i\n"), pid); - OutputDebugStringW(buffer); + _stprintf(buffer, _T("Try to interrupt process %i\n"), pid); + OutputDebugStringW(buffer); #endif - // Find console - EnumWindows(find_child_console, (LPARAM) pid); - - if (NULL != consoleHWND) { // Yes, we found out it - // We are going to switch focus to console, - // send Ctrl-C and then restore focus - BYTE control_scan_code = (BYTE) MapVirtualKey(VK_CONTROL, 0); - /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */ - BYTE vk_break_code = VK_CANCEL; - BYTE break_scan_code = (BYTE) MapVirtualKey(vk_break_code, 0); - HWND foreground_window; - - foreground_window = GetForegroundWindow(); - if (foreground_window) { - /* NT 5.0, and apparently also Windows 98, will not allow - * a Window to be set to foreground directly without the - * user's involvement. The workaround is to attach - * ourselves to the thread that owns the foreground - * window, since that is the only thread that can set the - * foreground window. - */ - DWORD foreground_thread, child_thread; - foreground_thread = GetWindowThreadProcessId(foreground_window, NULL); - if (foreground_thread == GetCurrentThreadId() - || !AttachThreadInput(GetCurrentThreadId(), foreground_thread, TRUE)) { - foreground_thread = 0; - } - - child_thread = GetWindowThreadProcessId(consoleHWND, NULL); - if (child_thread == GetCurrentThreadId() || !AttachThreadInput(GetCurrentThreadId(), child_thread, TRUE)) { - child_thread = 0; - } - - /* Set the foreground window to the child. */ - if (SetForegroundWindow(consoleHWND)) { - if (0 != break_scan_code) { - /* Generate keystrokes as if user had typed Ctrl-Break */ - keybd_event(VK_CONTROL, control_scan_code, 0, 0); - keybd_event(vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY, 0); - keybd_event(vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); - keybd_event(VK_CONTROL, control_scan_code, KEYEVENTF_KEYUP, 0); - } - - /* Sleep for a bit to give time for respond */ - Sleep(100); - - SetForegroundWindow(foreground_window); - } - /* Detach from the foreground and child threads now that the foreground switching is over. */ - if (foreground_thread) { - AttachThreadInput(GetCurrentThreadId(), foreground_thread, FALSE); - } - if (child_thread) { - AttachThreadInput(GetCurrentThreadId(), child_thread, FALSE); - } + // Find console + EnumWindows(find_child_console, (LPARAM)pid); + + if (NULL != consoleHWND) { // Yes, we found out it + // We are going to switch focus to console, + // send Ctrl-C and then restore focus + BYTE control_scan_code = (BYTE)MapVirtualKey(VK_CONTROL, 0); + /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */ + BYTE vk_break_code = VK_CANCEL; + BYTE break_scan_code = (BYTE)MapVirtualKey(vk_break_code, 0); + HWND foreground_window; + + foreground_window = GetForegroundWindow(); + if (foreground_window) { + /* NT 5.0, and apparently also Windows 98, will not allow + * a Window to be set to foreground directly without the + * user's involvement. The workaround is to attach + * ourselves to the thread that owns the foreground + * window, since that is the only thread that can set the + * foreground window. + */ + DWORD foreground_thread, child_thread; + foreground_thread = GetWindowThreadProcessId(foreground_window, NULL); + if (foreground_thread == GetCurrentThreadId() || + !AttachThreadInput(GetCurrentThreadId(), foreground_thread, TRUE)) { + foreground_thread = 0; + } + + child_thread = GetWindowThreadProcessId(consoleHWND, NULL); + if (child_thread == GetCurrentThreadId() || !AttachThreadInput(GetCurrentThreadId(), child_thread, TRUE)) { + child_thread = 0; + } + + /* Set the foreground window to the child. */ + if (SetForegroundWindow(consoleHWND)) { + if (0 != break_scan_code) { + /* Generate keystrokes as if user had typed Ctrl-Break */ + keybd_event(VK_CONTROL, control_scan_code, 0, 0); + keybd_event(vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY, 0); + keybd_event(vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); + keybd_event(VK_CONTROL, control_scan_code, KEYEVENTF_KEYUP, 0); + } + + /* Sleep for a bit to give time for respond */ + Sleep(100); + + SetForegroundWindow(foreground_window); + } + /* Detach from the foreground and child threads now that the foreground switching is over. */ + if (foreground_thread) { + AttachThreadInput(GetCurrentThreadId(), foreground_thread, FALSE); + } + if (child_thread) { + AttachThreadInput(GetCurrentThreadId(), child_thread, FALSE); + } #ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Sent Ctrl-C & Ctrl-Break to process %i\n"), pid); - OutputDebugStringW(buffer); + _stprintf(buffer, _T("Sent Ctrl-C & Ctrl-Break to process %i\n"), pid); + OutputDebugStringW(buffer); #endif - } + } #ifdef DEBUG_MONITOR - } else { - _stprintf(buffer, _T("Cannot find console for process %i\n"), pid); - OutputDebugStringW(buffer); + } else { + _stprintf(buffer, _T("Cannot find console for process %i\n"), pid); + OutputDebugStringW(buffer); #endif - } + } - return rc; + return rc; } - diff --git a/core/org.eclipse.cdt.core.native/native_src/win/spawner.c b/core/org.eclipse.cdt.core.native/native_src/win/spawner.c index b3fd6451ecf..81fc68b6756 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/spawner.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/spawner.c @@ -13,7 +13,7 @@ * * spawner.c * - * This is a part of JNI implementation of spawner + * This is a part of JNI implementation of spawner *******************************************************************************/ #include @@ -23,32 +23,31 @@ CRITICAL_SECTION cs; -wchar_t path[MAX_PATH + 1] = { _T('\0') }; // Directory where spawner.dll is located +wchar_t path[MAX_PATH + 1] = {_T('\0')}; // Directory where spawner.dll is located #if __cplusplus extern "C" #endif -BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: { - wchar_t *p; - InitializeCriticalSection(&cs); - GetModuleFileNameW(hModule, path, MAX_PATH); - p = wcsrchr(path, _T('\\')); - if (NULL != p) { - *(p + 1) = _T('\0'); - } else { - wcscat(path, L"\\"); - } - } - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - break; - case DLL_PROCESS_DETACH: - DeleteCriticalSection(&cs); - break; - } - return TRUE; + BOOL APIENTRY + DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH: { + wchar_t *p; + InitializeCriticalSection(&cs); + GetModuleFileNameW(hModule, path, MAX_PATH); + p = wcsrchr(path, _T('\\')); + if (NULL != p) { + *(p + 1) = _T('\0'); + } else { + wcscat(path, L"\\"); + } + } break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + DeleteCriticalSection(&cs); + break; + } + return TRUE; } - diff --git a/core/org.eclipse.cdt.core.native/native_src/win/starter.c b/core/org.eclipse.cdt.core.native/native_src/win/starter.c index 2faa95893bf..5fc193dea08 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/starter.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/starter.c @@ -10,7 +10,7 @@ * * Contributors: * QNX Software Systems - initial API and implementation - * Wind River Systems, Inc. + * Wind River Systems, Inc. * * starter.cpp * @@ -26,36 +26,36 @@ #include #include -//#define DEBUG_MONITOR +//#define DEBUG_MONITOR #define MAX_CMD_LINE_LENGTH (2049) #define PIPE_NAME_LENGTH 100 int copyTo(wchar_t *target, const wchar_t *source, int cpyLength, int availSpace); void DisplayErrorMessage(); -//BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process +// BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process /////////////////////////////////////////////////////////////////////////////// BOOL WINAPI HandlerRoutine(DWORD dwCtrlType) { // control signal type - BOOL ret = TRUE; - switch (dwCtrlType) { - case CTRL_C_EVENT: - break; - case CTRL_BREAK_EVENT: - break; - case CTRL_CLOSE_EVENT: - ret = FALSE; - break; - case CTRL_LOGOFF_EVENT: - ret = FALSE; - break; - case CTRL_SHUTDOWN_EVENT: - ret = FALSE; - break; - default: - break; - } - return ret; + BOOL ret = TRUE; + switch (dwCtrlType) { + case CTRL_C_EVENT: + break; + case CTRL_BREAK_EVENT: + break; + case CTRL_CLOSE_EVENT: + ret = FALSE; + break; + case CTRL_LOGOFF_EVENT: + ret = FALSE; + break; + case CTRL_SHUTDOWN_EVENT: + ret = FALSE; + break; + default: + break; + } + return ret; } // The default here means we haven't checked yet @@ -64,387 +64,389 @@ wchar_t *cygwinBin = NULL; bool _isCygwin = true; bool isCygwin(HANDLE process) { - // Have we checked before? - if (cygwinBin != NULL || !_isCygwin) { - return _isCygwin; - } - - // See if this process loaded cygwin, need a different SIGINT for them - HMODULE mods[1024]; - DWORD needed; - if (EnumProcessModules(process, mods, sizeof(mods), &needed)) { - int i; - needed /= sizeof(HMODULE); - for (i = 0; i < needed; ++i) { - wchar_t modName[MAX_PATH]; - if (GetModuleFileNameEx(process, mods[i], modName, MAX_PATH)) { - wchar_t *p = wcsrchr(modName, L'\\'); - if (p) { - *p = 0; // Null terminate there for future reference - if (!wcscmp(++p, L"cygwin1.dll")) { - _isCygwin = true; - // Store away the bind dir - cygwinBin = wcsdup(modName); - return _isCygwin; - } - } - } - } - } - - _isCygwin = false; - return _isCygwin; + // Have we checked before? + if (cygwinBin != NULL || !_isCygwin) { + return _isCygwin; + } + + // See if this process loaded cygwin, need a different SIGINT for them + HMODULE mods[1024]; + DWORD needed; + if (EnumProcessModules(process, mods, sizeof(mods), &needed)) { + int i; + needed /= sizeof(HMODULE); + for (i = 0; i < needed; ++i) { + wchar_t modName[MAX_PATH]; + if (GetModuleFileNameEx(process, mods[i], modName, MAX_PATH)) { + wchar_t *p = wcsrchr(modName, L'\\'); + if (p) { + *p = 0; // Null terminate there for future reference + if (!wcscmp(++p, L"cygwin1.dll")) { + _isCygwin = true; + // Store away the bind dir + cygwinBin = wcsdup(modName); + return _isCygwin; + } + } + } + } + } + + _isCygwin = false; + return _isCygwin; } bool runCygwinCommand(wchar_t *command) { - wchar_t cygcmd[1024]; - swprintf(cygcmd, sizeof(cygcmd) / sizeof(cygcmd[0]), L"%s\\%s", cygwinBin, command); - - STARTUPINFO si; - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - PROCESS_INFORMATION pi; - ZeroMemory(&pi, sizeof(pi)); - if (CreateProcess(NULL, cygcmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { - WaitForSingleObject(pi.hProcess, INFINITE); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - return true; - } else if (CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { - WaitForSingleObject(pi.hProcess, INFINITE); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - return true; - } - return false; + wchar_t cygcmd[1024]; + swprintf(cygcmd, sizeof(cygcmd) / sizeof(cygcmd[0]), L"%s\\%s", cygwinBin, command); + + STARTUPINFO si; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + PROCESS_INFORMATION pi; + ZeroMemory(&pi, sizeof(pi)); + if (CreateProcess(NULL, cygcmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + return true; + } else if (CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + return true; + } + return false; } void ensureSize(wchar_t **ptr, int *psize, int requiredLength) { - int size = *psize; - if (requiredLength > size) { - size = 2 * size; - if (size < requiredLength) { - size = requiredLength; - } - *ptr = (wchar_t*) realloc(*ptr, size * sizeof(wchar_t)); - if (NULL == *ptr) { - *psize = 0; - } else { - *psize = size; - } - } + int size = *psize; + if (requiredLength > size) { + size = 2 * size; + if (size < requiredLength) { + size = requiredLength; + } + *ptr = (wchar_t *)realloc(*ptr, size * sizeof(wchar_t)); + if (NULL == *ptr) { + *psize = 0; + } else { + *psize = size; + } + } } int main() { - int argc; - wchar_t **argv = CommandLineToArgvW(GetCommandLine(), &argc); - - // Make sure that we've been passed the right number of arguments - if (argc < 8) { - wprintf(L"Usage: %s (four inheritable event handles) (CommandLineToSpawn)\n", argv[0]); - return 0; - } - - // Construct the full command line - int nCmdLineLength = MAX_CMD_LINE_LENGTH; - wchar_t *szCmdLine = (wchar_t*) malloc(nCmdLineLength * sizeof(wchar_t)); - szCmdLine[0] = 0; - int nPos = 0; - - for (int i = 8; i < argc; ++i) { - int nCpyLen; - int len = wcslen(argv[i]); - int requiredSize = nPos + len + 2; - if (requiredSize > 32 * 1024) { + int argc; + wchar_t **argv = CommandLineToArgvW(GetCommandLine(), &argc); + + // Make sure that we've been passed the right number of arguments + if (argc < 8) { + wprintf(L"Usage: %s (four inheritable event handles) (CommandLineToSpawn)\n", argv[0]); + return 0; + } + + // Construct the full command line + int nCmdLineLength = MAX_CMD_LINE_LENGTH; + wchar_t *szCmdLine = (wchar_t *)malloc(nCmdLineLength * sizeof(wchar_t)); + szCmdLine[0] = 0; + int nPos = 0; + + for (int i = 8; i < argc; ++i) { + int nCpyLen; + int len = wcslen(argv[i]); + int requiredSize = nPos + len + 2; + if (requiredSize > 32 * 1024) { #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Command line too long!\n")); + OutputDebugStringW(_T("Command line too long!\n")); #endif - return 0; - } - ensureSize(&szCmdLine, &nCmdLineLength, requiredSize); - if (NULL == szCmdLine) { + return 0; + } + ensureSize(&szCmdLine, &nCmdLineLength, requiredSize); + if (NULL == szCmdLine) { #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Not enough memory to build cmd line!\n")); + OutputDebugStringW(_T("Not enough memory to build cmd line!\n")); #endif - return 0; - } - if (0 > (nCpyLen = copyTo(szCmdLine + nPos, argv[i], len, nCmdLineLength - nPos))) { + return 0; + } + if (0 > (nCpyLen = copyTo(szCmdLine + nPos, argv[i], len, nCmdLineLength - nPos))) { #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Not enough space to build command line\n")); + OutputDebugStringW(_T("Not enough space to build command line\n")); #endif - return 0; - } - nPos += nCpyLen; - szCmdLine[nPos] = _T(' '); - ++nPos; - } - szCmdLine[nPos] = _T('\0'); - - STARTUPINFOW si = { sizeof(si) }; - PROCESS_INFORMATION pi = { 0 }; - DWORD dwExitCode = 0; + return 0; + } + nPos += nCpyLen; + szCmdLine[nPos] = _T(' '); + ++nPos; + } + szCmdLine[nPos] = _T('\0'); + + STARTUPINFOW si = {sizeof(si)}; + PROCESS_INFORMATION pi = {0}; + DWORD dwExitCode = 0; #ifdef DEBUG_MONITOR - int currentPID = GetCurrentProcessId(); - wchar_t buffer[MAX_CMD_LINE_LENGTH]; + int currentPID = GetCurrentProcessId(); + wchar_t buffer[MAX_CMD_LINE_LENGTH]; #endif - BOOL exitProc = FALSE; - HANDLE waitEvent = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[4]); - HANDLE h[5]; - h[0] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[3]); // simulated SIGINT (CTRL-C or Cygwin 'kill -SIGINT') -// h[1] we reserve for the process handle - h[2] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[5]); // simulated SIGTERM - h[3] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[6]); // simulated SIGKILL - h[4] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[7]); // CTRL-C, in all cases - - SetConsoleCtrlHandler(HandlerRoutine, TRUE); - - int parentPid = wcstol(argv[1], NULL, 10); - int nCounter = wcstol(argv[2], NULL, 10); - wchar_t inPipeName[PIPE_NAME_LENGTH]; - wchar_t outPipeName[PIPE_NAME_LENGTH]; - wchar_t errPipeName[PIPE_NAME_LENGTH]; - - swprintf(inPipeName, sizeof(inPipeName) / sizeof(inPipeName[0]), L"\\\\.\\pipe\\stdin%08i%010i", parentPid, - nCounter); - swprintf(outPipeName, sizeof(outPipeName) / sizeof(outPipeName[0]), L"\\\\.\\pipe\\stdout%08i%010i", parentPid, - nCounter); - swprintf(errPipeName, sizeof(errPipeName) / sizeof(errPipeName[0]), L"\\\\.\\pipe\\stderr%08i%010i", parentPid, - nCounter); + BOOL exitProc = FALSE; + HANDLE waitEvent = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[4]); + HANDLE h[5]; + h[0] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[3]); // simulated SIGINT (CTRL-C or Cygwin 'kill -SIGINT') + // h[1] we reserve for the process handle + h[2] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[5]); // simulated SIGTERM + h[3] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[6]); // simulated SIGKILL + h[4] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[7]); // CTRL-C, in all cases + + SetConsoleCtrlHandler(HandlerRoutine, TRUE); + + int parentPid = wcstol(argv[1], NULL, 10); + int nCounter = wcstol(argv[2], NULL, 10); + wchar_t inPipeName[PIPE_NAME_LENGTH]; + wchar_t outPipeName[PIPE_NAME_LENGTH]; + wchar_t errPipeName[PIPE_NAME_LENGTH]; + + swprintf(inPipeName, sizeof(inPipeName) / sizeof(inPipeName[0]), L"\\\\.\\pipe\\stdin%08i%010i", parentPid, + nCounter); + swprintf(outPipeName, sizeof(outPipeName) / sizeof(outPipeName[0]), L"\\\\.\\pipe\\stdout%08i%010i", parentPid, + nCounter); + swprintf(errPipeName, sizeof(errPipeName) / sizeof(errPipeName[0]), L"\\\\.\\pipe\\stderr%08i%010i", parentPid, + nCounter); #ifdef DEBUG_MONITOR - swprintf(buffer, _T("Pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName); - OutputDebugStringW(buffer); + swprintf(buffer, _T("Pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName); + OutputDebugStringW(buffer); #endif - HANDLE stdHandles[3]; - - SECURITY_ATTRIBUTES sa; - sa.nLength = sizeof(SECURITY_ATTRIBUTES); - sa.bInheritHandle = TRUE; - sa.lpSecurityDescriptor = NULL; - - if ((INVALID_HANDLE_VALUE - == (stdHandles[0] = CreateFileW(inPipeName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, &sa))) - || (INVALID_HANDLE_VALUE - == (stdHandles[1] = CreateFileW(outPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - 0, &sa))) - || (INVALID_HANDLE_VALUE - == (stdHandles[2] = CreateFileW(errPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - 0, &sa)))) { + HANDLE stdHandles[3]; + + SECURITY_ATTRIBUTES sa; + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + + if ((INVALID_HANDLE_VALUE == + (stdHandles[0] = CreateFileW(inPipeName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, &sa))) || + (INVALID_HANDLE_VALUE == + (stdHandles[1] = CreateFileW(outPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa))) || + (INVALID_HANDLE_VALUE == + (stdHandles[2] = CreateFileW(errPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa)))) { #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Failed to open pipe %i, %i, %i: %i\n"), stdHandles[0], stdHandles[1], stdHandles[2], GetLastError()); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Failed to open pipe %i, %i, %i: %i\n"), stdHandles[0], + stdHandles[1], stdHandles[2], GetLastError()); + OutputDebugStringW(buffer); #endif - CloseHandle(stdHandles[0]); - CloseHandle(stdHandles[1]); - CloseHandle(stdHandles[2]); - return -1; - } - SetHandleInformation(stdHandles[0], HANDLE_FLAG_INHERIT, TRUE); - SetHandleInformation(stdHandles[1], HANDLE_FLAG_INHERIT, TRUE); - SetHandleInformation(stdHandles[2], HANDLE_FLAG_INHERIT, TRUE); - - if (!SetStdHandle(STD_INPUT_HANDLE, stdHandles[0]) || !SetStdHandle(STD_OUTPUT_HANDLE, stdHandles[1]) - || !SetStdHandle(STD_ERROR_HANDLE, stdHandles[2])) { + CloseHandle(stdHandles[0]); + CloseHandle(stdHandles[1]); + CloseHandle(stdHandles[2]); + return -1; + } + SetHandleInformation(stdHandles[0], HANDLE_FLAG_INHERIT, TRUE); + SetHandleInformation(stdHandles[1], HANDLE_FLAG_INHERIT, TRUE); + SetHandleInformation(stdHandles[2], HANDLE_FLAG_INHERIT, TRUE); + + if (!SetStdHandle(STD_INPUT_HANDLE, stdHandles[0]) || !SetStdHandle(STD_OUTPUT_HANDLE, stdHandles[1]) || + !SetStdHandle(STD_ERROR_HANDLE, stdHandles[2])) { #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Failed to reassign standard streams: %i\n"), GetLastError()); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Failed to reassign standard streams: %i\n"), + GetLastError()); + OutputDebugStringW(buffer); #endif - CloseHandle(stdHandles[0]); - CloseHandle(stdHandles[1]); - CloseHandle(stdHandles[2]); - return -1; - } + CloseHandle(stdHandles[0]); + CloseHandle(stdHandles[1]); + CloseHandle(stdHandles[2]); + return -1; + } #ifdef DEBUG_MONITOR_DETAILS - wchar_t * lpvEnv = GetEnvironmentStringsW(); - - // If the returned pointer is NULL, exit. - if (lpvEnv == NULL) { - OutputDebugStringW(_T("Cannot Read Environment\n")); - } else { - // Variable strings are separated by NULL byte, and the block is - // terminated by a NULL byte. - - OutputDebugStringW(_T("Starter: Environment\n")); - for (wchar_t * lpszVariable = (wchar_t *) lpvEnv; *lpszVariable; lpszVariable += wcslen(lpszVariable) + 1) { - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("%s\n"), lpszVariable); - OutputDebugStringW(buffer); - } - - FreeEnvironmentStringsW(lpvEnv); - } + wchar_t *lpvEnv = GetEnvironmentStringsW(); + + // If the returned pointer is NULL, exit. + if (lpvEnv == NULL) { + OutputDebugStringW(_T("Cannot Read Environment\n")); + } else { + // Variable strings are separated by NULL byte, and the block is + // terminated by a NULL byte. + + OutputDebugStringW(_T("Starter: Environment\n")); + for (wchar_t *lpszVariable = (wchar_t *)lpvEnv; *lpszVariable; lpszVariable += wcslen(lpszVariable) + 1) { + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("%s\n"), lpszVariable); + OutputDebugStringW(buffer); + } + + FreeEnvironmentStringsW(lpvEnv); + } #endif #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Starting: %s\n"), szCmdLine); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Starting: %s\n"), szCmdLine); + OutputDebugStringW(buffer); #endif - // Create job object - HANDLE hJob = CreateJobObject(NULL, NULL); - if (hJob != NULL) { - // Configure job to - // - terminate all associated processes when the last handle to it is closed - // - allow child processes to break away from the job. - JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo; - ZeroMemory(&jobInfo, sizeof(jobInfo)); - jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_BREAKAWAY_OK; - if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo))) { + // Create job object + HANDLE hJob = CreateJobObject(NULL, NULL); + if (hJob != NULL) { + // Configure job to + // - terminate all associated processes when the last handle to it is closed + // - allow child processes to break away from the job. + JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo; + ZeroMemory(&jobInfo, sizeof(jobInfo)); + jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_BREAKAWAY_OK; + if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo))) { #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Cannot set job information\n")); - DisplayErrorMessage(); + OutputDebugStringW(_T("Cannot set job information\n")); + DisplayErrorMessage(); #endif - } - } else { + } + } else { #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Cannot create job object\n")); - DisplayErrorMessage(); + OutputDebugStringW(_T("Cannot create job object\n")); + DisplayErrorMessage(); #endif - } - // Spawn the other processes as part of this Process Group - // If this process is already part of a job, the flag CREATE_BREAKAWAY_FROM_JOB - // makes the child process detach from the job, such that we can assign it - // to our own job object. - BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi); - // If breaking away from job is not permitted, retry without breakaway flag - if (!f) { - f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); - } - - // We don't need them any more - CloseHandle(stdHandles[0]); - CloseHandle(stdHandles[1]); - CloseHandle(stdHandles[2]); - - if (f) { + } + // Spawn the other processes as part of this Process Group + // If this process is already part of a job, the flag CREATE_BREAKAWAY_FROM_JOB + // makes the child process detach from the job, such that we can assign it + // to our own job object. + BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi); + // If breaking away from job is not permitted, retry without breakaway flag + if (!f) { + f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); + } + + // We don't need them any more + CloseHandle(stdHandles[0]); + CloseHandle(stdHandles[1]); + CloseHandle(stdHandles[2]); + + if (f) { #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Process %i started\n"), pi.dwProcessId); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Process %i started\n"), pi.dwProcessId); + OutputDebugStringW(buffer); #endif - SetEvent(waitEvent); // Means that process has been spawned - CloseHandle(pi.hThread); - h[1] = pi.hProcess; + SetEvent(waitEvent); // Means that process has been spawned + CloseHandle(pi.hThread); + h[1] = pi.hProcess; - if (NULL != hJob) { - if (!AssignProcessToJobObject(hJob, pi.hProcess)) { + if (NULL != hJob) { + if (!AssignProcessToJobObject(hJob, pi.hProcess)) { #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Cannot assign process %i to a job\n"), pi.dwProcessId); - OutputDebugStringW(buffer); - DisplayErrorMessage(); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Cannot assign process %i to a job\n"), + pi.dwProcessId); + OutputDebugStringW(buffer); + DisplayErrorMessage(); #endif - } - } - - while (!exitProc) { - // Wait for the spawned-process to die or for the event - // indicating that the processes should be forcibly killed. - DWORD event = WaitForMultipleObjects(5, h, FALSE, INFINITE); - switch (event) { - case WAIT_OBJECT_0 + 0: // SIGINT - case WAIT_OBJECT_0 + 4: // CTRL-C + } + } + + while (!exitProc) { + // Wait for the spawned-process to die or for the event + // indicating that the processes should be forcibly killed. + DWORD event = WaitForMultipleObjects(5, h, FALSE, INFINITE); + switch (event) { + case WAIT_OBJECT_0 + 0: // SIGINT + case WAIT_OBJECT_0 + 4: // CTRL-C #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("starter (PID %i) received CTRL-C event\n"), currentPID); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("starter (PID %i) received CTRL-C event\n"), + currentPID); + OutputDebugStringW(buffer); #endif - if ((event == (WAIT_OBJECT_0 + 0)) && isCygwin(h[1])) { - // Need to issue a kill command - wchar_t kill[1024]; - swprintf(kill, sizeof(kill) / sizeof(kill[0]), L"kill -SIGINT %d", pi.dwProcessId); - if (!runCygwinCommand(kill)) { - // fall back to console event - GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); - } - } else { - GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); - } - - SetEvent(waitEvent); - break; - - case WAIT_OBJECT_0 + 1: // App terminated normally - // Make it's exit code our exit code + if ((event == (WAIT_OBJECT_0 + 0)) && isCygwin(h[1])) { + // Need to issue a kill command + wchar_t kill[1024]; + swprintf(kill, sizeof(kill) / sizeof(kill[0]), L"kill -SIGINT %d", pi.dwProcessId); + if (!runCygwinCommand(kill)) { + // fall back to console event + GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); + } + } else { + GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); + } + + SetEvent(waitEvent); + break; + + case WAIT_OBJECT_0 + 1: // App terminated normally + // Make it's exit code our exit code #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("starter: launched process has been terminated(PID %i)\n"), - pi.dwProcessId); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), + _T("starter: launched process has been terminated(PID %i)\n"), pi.dwProcessId); + OutputDebugStringW(buffer); #endif - GetExitCodeProcess(pi.hProcess, &dwExitCode); - exitProc = TRUE; - break; - - // Terminate and Kill behavior differ only for cygwin processes, where - // we use the cygwin 'kill' command. We send a SIGKILL in one case, - // SIGTERM in the other. For non-cygwin processes, both requests - // are treated exactly the same - case WAIT_OBJECT_0 + 2: // TERM - case WAIT_OBJECT_0 + 3: // KILL - { - const wchar_t *signal = (event == WAIT_OBJECT_0 + 2) ? L"TERM" : L"KILL"; + GetExitCodeProcess(pi.hProcess, &dwExitCode); + exitProc = TRUE; + break; + + // Terminate and Kill behavior differ only for cygwin processes, where + // we use the cygwin 'kill' command. We send a SIGKILL in one case, + // SIGTERM in the other. For non-cygwin processes, both requests + // are treated exactly the same + case WAIT_OBJECT_0 + 2: // TERM + case WAIT_OBJECT_0 + 3: // KILL + { + const wchar_t *signal = (event == WAIT_OBJECT_0 + 2) ? L"TERM" : L"KILL"; #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("starter received %s event (PID %i)\n"), signal, currentPID); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("starter received %s event (PID %i)\n"), signal, + currentPID); + OutputDebugStringW(buffer); #endif - if (isCygwin(h[1])) { - // Need to issue a kill command - wchar_t kill[1024]; - swprintf(kill, sizeof(kill) / sizeof(kill[0]), L"kill -%s %d", signal, pi.dwProcessId); - if (!runCygwinCommand(kill)) { - // fall back to console event - GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); - } - } else { - GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); - } - - SetEvent(waitEvent); - - if (NULL != hJob) { - if (!TerminateJobObject(hJob, (DWORD) - 1)) { + if (isCygwin(h[1])) { + // Need to issue a kill command + wchar_t kill[1024]; + swprintf(kill, sizeof(kill) / sizeof(kill[0]), L"kill -%s %d", signal, pi.dwProcessId); + if (!runCygwinCommand(kill)) { + // fall back to console event + GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); + } + } else { + GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); + } + + SetEvent(waitEvent); + + if (NULL != hJob) { + if (!TerminateJobObject(hJob, (DWORD)-1)) { #ifdef DEBUG_MONITOR - OutputDebugStringW(_T("Cannot terminate job\n")); - DisplayErrorMessage(); + OutputDebugStringW(_T("Cannot terminate job\n")); + DisplayErrorMessage(); #endif - } - } + } + } - // Note that we keep trucking until the child process terminates (case WAIT_OBJECT_0 + 1) - break; - } + // Note that we keep trucking until the child process terminates (case WAIT_OBJECT_0 + 1) + break; + } - default: - // Unexpected code + default: + // Unexpected code #ifdef DEBUG_MONITOR - DisplayErrorMessage(); + DisplayErrorMessage(); #endif - exitProc = TRUE; - break; - } - - } - } else { + exitProc = TRUE; + break; + } + } + } else { #ifdef DEBUG_MONITOR - swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Cannot start: %s\n"), szCmdLine); - OutputDebugStringW(buffer); + swprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _T("Cannot start: %s\n"), szCmdLine); + OutputDebugStringW(buffer); - DisplayErrorMessage(); + DisplayErrorMessage(); #endif - } + } - free(szCmdLine); + free(szCmdLine); - CloseHandle(waitEvent); - CloseHandle(h[0]); - CloseHandle(h[1]); - CloseHandle(h[2]); - CloseHandle(h[3]); - CloseHandle(h[4]); + CloseHandle(waitEvent); + CloseHandle(h[0]); + CloseHandle(h[1]); + CloseHandle(h[2]); + CloseHandle(h[3]); + CloseHandle(h[4]); - return dwExitCode; + return dwExitCode; } ///////////////////////////////////////////////////////////////////////////////////// // Use this utility program to process correctly quotation marks in the command line -// Arguments: +// Arguments: // target - string to copy to // source - string to copy from // cpyLength - copy length @@ -452,75 +454,75 @@ int main() { // Return :number of bytes used in target, or -1 in case of error ///////////////////////////////////////////////////////////////////////////////////// int copyTo(wchar_t *target, const wchar_t *source, int cpyLength, int availSpace) { - BOOL bSlash = FALSE; - int i = 0, j = 0; + BOOL bSlash = FALSE; + int i = 0, j = 0; -#define QUOTATION_DO 0 +#define QUOTATION_DO 0 #define QUOTATION_DONE 1 #define QUOTATION_NONE 2 - int nQuotationMode = 0; - if (availSpace <= cpyLength) { // = to reserve space for '\0' - return -1; - } - - if ((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) { - // Already done - nQuotationMode = QUOTATION_DONE; - } else if (wcschr(source, _T(' ')) == NULL) { - // No reason to quotate term becase it doesn't have embedded spaces - nQuotationMode = QUOTATION_NONE; - } else { - // Needs to be quotated - nQuotationMode = QUOTATION_DO; - *target = _T('\"'); - ++j; - } - - for (; i < cpyLength; ++i, ++j) { - if (source[i] == _T('\\')) { - bSlash = TRUE; - } else { - // Don't escape embracing quotation marks - if ((source[i] == _T('\"')) - && !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))))) { - if (!bSlash) { - if (j == availSpace) { - return -1; - } - target[j] = _T('\\'); - ++j; - } - bSlash = FALSE; - } else { - bSlash = FALSE; - } - } - - if (j == availSpace) { - return -1; - } - target[j] = source[i]; - } - - if (nQuotationMode == QUOTATION_DO) { - if (j == availSpace) { - return -1; - } - target[j] = _T('\"'); - ++j; - } - return j; + int nQuotationMode = 0; + if (availSpace <= cpyLength) { // = to reserve space for '\0' + return -1; + } + + if ((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) { + // Already done + nQuotationMode = QUOTATION_DONE; + } else if (wcschr(source, _T(' ')) == NULL) { + // No reason to quotate term becase it doesn't have embedded spaces + nQuotationMode = QUOTATION_NONE; + } else { + // Needs to be quotated + nQuotationMode = QUOTATION_DO; + *target = _T('\"'); + ++j; + } + + for (; i < cpyLength; ++i, ++j) { + if (source[i] == _T('\\')) { + bSlash = TRUE; + } else { + // Don't escape embracing quotation marks + if ((source[i] == _T('\"')) && + !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))))) { + if (!bSlash) { + if (j == availSpace) { + return -1; + } + target[j] = _T('\\'); + ++j; + } + bSlash = FALSE; + } else { + bSlash = FALSE; + } + } + + if (j == availSpace) { + return -1; + } + target[j] = source[i]; + } + + if (nQuotationMode == QUOTATION_DO) { + if (j == availSpace) { + return -1; + } + target[j] = _T('\"'); + ++j; + } + return j; } void DisplayErrorMessage() { - wchar_t *lpMsgBuf; - FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, - GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (wchar_t*) &lpMsgBuf, 0, NULL); - OutputDebugStringW(lpMsgBuf); - // Free the buffer. - LocalFree(lpMsgBuf); + wchar_t *lpMsgBuf; + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, + GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (wchar_t *)&lpMsgBuf, 0, NULL); + OutputDebugStringW(lpMsgBuf); + // Free the buffer. + LocalFree(lpMsgBuf); } //////////////////////////////// End of File ////////////////////////////////// diff --git a/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs b/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs index dc54ff754d8..086daaa547e 100644 --- a/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs +++ b/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs @@ -1,192 +1,5 @@ +#Wed Jun 06 11:37:01 EDT 2007 eclipse.preferences.version=1 indexer/indexerId=org.eclipse.cdt.core.nullindexer indexerId=org.eclipse.cdt.core.nullindexer instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true -org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.cdt.core.formatter.alignment_for_assignment=16 -org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 -org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34 -org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 -org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0 -org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 -org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 -org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 -org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20 -org.eclipse.cdt.core.formatter.alignment_for_member_access=0 -org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16 -org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false -org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1 -org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true -org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true -org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off -org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on -org.eclipse.cdt.core.formatter.compact_else_if=true -org.eclipse.cdt.core.formatter.continuation_indentation=2 -org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.cdt.core.formatter.format_block_comment=true -org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.cdt.core.formatter.format_header_comment=true -org.eclipse.cdt.core.formatter.format_line_comment=true -org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false -org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false -org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false -org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false -org.eclipse.cdt.core.formatter.indent_empty_lines=false -org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true -org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.cdt.core.formatter.indentation.size=4 -org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert -org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert -org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert -org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert -org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert -org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert -org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.cdt.core.formatter.join_wrapped_lines=true -org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.cdt.core.formatter.lineSplit=120 -org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.cdt.core.formatter.tabulation.char=tab -org.eclipse.cdt.core.formatter.tabulation.size=4 -org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true -org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false diff --git a/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.ui.prefs b/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.ui.prefs deleted file mode 100644 index 4f7bce2bbb8..00000000000 --- a/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.ui.prefs +++ /dev/null @@ -1,3 +0,0 @@ -eclipse.preferences.version=1 -formatter_profile=_Unmanaged profile 'CDT' -formatter_settings_version=1 diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/pty.dll b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/pty.dll index 45aa71adbe4cc22a7fc29696001380d7540b8b6f..63c49e6b3d93997ae2cc4f10015d4617da8fb34c 100755 GIT binary patch delta 81 zcmaFgZu-96bV3Kq9ItstC-(R-Tj%gL-fq3kxb-%Z=6tYdJI4YhAZ7+)79eH?Vm2UV V2VxE&<^*CcAm-lAv4H3KVgP0nA4~uM delta 81 zcmaFgZu-96bV3Kqy7KeyCieI+AC%y0yxn@6aqDd+&G}%_c8K+FupEI`Z(#B4y! V4#XTl%n8I?K+L_JV*$_e#Q?ecAh7@d diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll index 8f2e9e07d370707acb700eff2992dae2d6f48103..014b67690721585d808e8ff24f8cc933ddcba5c5 100755 GIT binary patch delta 49 zcmZ27OJvC`kqI3vDidC9p4j8V6qUE}mR2g5+su*H&XL9l#7scUyqzPBMP@kw096up delta 49 zcmZ27OJvC`kqI3vU58eznb_mQwCKpjTUx1LZZk((J4YHL5HkTW^LCCj7MbM$D4Y|r diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/starter.exe b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/starter.exe index 4622304f3fde3c941423810d4af0a35b6a06a121..f7b6d02d50b9dd78eaaa7cc5dfd56cee3e305ff8 100755 GIT binary patch delta 41 zcmV+^0M`G{s2I #include -#define FUNC(x) Java_org_eclipse_cdt_serial_SerialPort_ ## x +#define FUNC(x) Java_org_eclipse_cdt_serial_SerialPort_##x /** * Use this method to throw an exception when open fails after the OS open @@ -51,515 +51,507 @@ static void closeAndthrowIOException(int fd, JNIEnv *env, const char *msg) { #else static void closeAndthrowIOException(HANDLE handle, JNIEnv *env, const char *msg) { #endif - char buff[256]; + char buff[256]; #ifndef __MINGW32__ - sprintf(buff, "%s: %s", msg, strerror(errno)); - close(fd); + sprintf(buff, "%s: %s", msg, strerror(errno)); + close(fd); #else - sprintf_s(buff, sizeof(buff), "%s (%d)", msg, GetLastError()); - CloseHandle(handle); + sprintf_s(buff, sizeof(buff), "%s (%d)", msg, GetLastError()); + CloseHandle(handle); #endif - jclass cls = (*env)->FindClass(env, "java/io/IOException"); - (*env)->ThrowNew(env, cls, buff); + jclass cls = (*env)->FindClass(env, "java/io/IOException"); + (*env)->ThrowNew(env, cls, buff); } #endif static void throwIOException(JNIEnv *env, const char *msg) { - char buff[256]; + char buff[256]; #ifndef __MINGW32__ - sprintf(buff, "%s: %s", msg, strerror(errno)); + sprintf(buff, "%s: %s", msg, strerror(errno)); #else - sprintf_s(buff, sizeof(buff), "%s (%d)", msg, GetLastError()); + sprintf_s(buff, sizeof(buff), "%s (%d)", msg, GetLastError()); #endif - jclass cls = (*env)->FindClass(env, "java/io/IOException"); - (*env)->ThrowNew(env, cls, buff); + jclass cls = (*env)->FindClass(env, "java/io/IOException"); + (*env)->ThrowNew(env, cls, buff); } JNIEXPORT jlong JNICALL FUNC(open0)(JNIEnv *env, jobject jobj, jstring portName, jint baudRate, jint byteSize, - jint parity, jint stopBits) { + jint parity, jint stopBits) { #ifndef __MINGW32__ - const char *cportName = (*env)->GetStringUTFChars(env, portName, NULL); - int fd = open(cportName, O_RDWR | O_NOCTTY | O_NDELAY); - if (fd < 0) { - char msg[256]; - sprintf(msg, "Error opening %s", cportName); - (*env)->ReleaseStringUTFChars(env, portName, cportName); - throwIOException(env, msg); - return fd; - } - (*env)->ReleaseStringUTFChars(env, portName, cportName); - - // Turn off all flags - fcntl(fd, F_SETFL, 0); - - struct termios options; - tcgetattr(fd, &options); - options.c_cflag |= (CLOCAL | CREAD); + const char *cportName = (*env)->GetStringUTFChars(env, portName, NULL); + int fd = open(cportName, O_RDWR | O_NOCTTY | O_NDELAY); + if (fd < 0) { + char msg[256]; + sprintf(msg, "Error opening %s", cportName); + (*env)->ReleaseStringUTFChars(env, portName, cportName); + throwIOException(env, msg); + return fd; + } + (*env)->ReleaseStringUTFChars(env, portName, cportName); + + // Turn off all flags + fcntl(fd, F_SETFL, 0); + + struct termios options; + tcgetattr(fd, &options); + options.c_cflag |= (CLOCAL | CREAD); #ifndef __APPLE__ - speed_t baud; - switch (baudRate) { - case 110: - baud = B110; - break; - case 300: - baud = B300; - break; - case 600: - baud = B600; - break; - case 1200: - baud = B1200; - break; - case 2400: - baud = B2400; - break; - case 4800: - baud = B4800; - break; - case 9600: - baud = B9600; - break; - case 19200: - baud = B19200; - break; - case 38400: - baud = B38400; - break; - case 57600: - baud = B57600; - break; - case 115200: - baud = B115200; - break; - case 230400: - baud = B230400; - break; - case 460800: - baud = B460800; - break; - case 500000: - baud = B500000; - break; - case 576000: - baud = B576000; - break; - case 921600: - baud = B921600; - break; - case 1000000: - baud = B1000000; - break; - case 1152000: - baud = B1152000; - break; - case 1500000: - baud = B1500000; - break; - case 2000000: - baud = B2000000; - break; - case 2500000: - baud = B2500000; - break; - case 3000000: - baud = B3000000; - break; - case 3500000: - baud = B3500000; - break; - case 4000000: - baud = B4000000; - break; - default: - baud = B0; - break; - } - - if (baud == B0) { - // Use custom linux baud rates if possible: https://bugs.eclipse.org/bugs/show_bug.cgi?id=543122#c8 - struct serial_struct serial_options; - options.c_cflag |= B38400; - - if (ioctl(fd, TIOCGSERIAL, &serial_options) != 0) { - closeAndthrowIOException(fd, env, "Failed to use custom baud rate. Error using TIOCGSERIAL"); - return -1; - } - serial_options.custom_divisor = serial_options.baud_base / baudRate; - if (serial_options.custom_divisor == 0) { - serial_options.custom_divisor = 1; - } - - serial_options.flags &= ~ASYNC_SPD_MASK; - serial_options.flags |= ASYNC_SPD_CUST; - - if (ioctl(fd, TIOCSSERIAL, &serial_options) != 0) { - closeAndthrowIOException(fd, env, "Failed to use custom baud rate. Error using TIOCSSERIAL"); - return -1; - } - } else { - // Set baud rate - cfsetispeed(&options, baud); - cfsetospeed(&options, baud); - } + speed_t baud; + switch (baudRate) { + case 110: + baud = B110; + break; + case 300: + baud = B300; + break; + case 600: + baud = B600; + break; + case 1200: + baud = B1200; + break; + case 2400: + baud = B2400; + break; + case 4800: + baud = B4800; + break; + case 9600: + baud = B9600; + break; + case 19200: + baud = B19200; + break; + case 38400: + baud = B38400; + break; + case 57600: + baud = B57600; + break; + case 115200: + baud = B115200; + break; + case 230400: + baud = B230400; + break; + case 460800: + baud = B460800; + break; + case 500000: + baud = B500000; + break; + case 576000: + baud = B576000; + break; + case 921600: + baud = B921600; + break; + case 1000000: + baud = B1000000; + break; + case 1152000: + baud = B1152000; + break; + case 1500000: + baud = B1500000; + break; + case 2000000: + baud = B2000000; + break; + case 2500000: + baud = B2500000; + break; + case 3000000: + baud = B3000000; + break; + case 3500000: + baud = B3500000; + break; + case 4000000: + baud = B4000000; + break; + default: + baud = B0; + break; + } + + if (baud == B0) { + // Use custom linux baud rates if possible: https://bugs.eclipse.org/bugs/show_bug.cgi?id=543122#c8 + struct serial_struct serial_options; + options.c_cflag |= B38400; + + if (ioctl(fd, TIOCGSERIAL, &serial_options) != 0) { + closeAndthrowIOException(fd, env, "Failed to use custom baud rate. Error using TIOCGSERIAL"); + return -1; + } + serial_options.custom_divisor = serial_options.baud_base / baudRate; + if (serial_options.custom_divisor == 0) { + serial_options.custom_divisor = 1; + } + + serial_options.flags &= ~ASYNC_SPD_MASK; + serial_options.flags |= ASYNC_SPD_CUST; + + if (ioctl(fd, TIOCSSERIAL, &serial_options) != 0) { + closeAndthrowIOException(fd, env, "Failed to use custom baud rate. Error using TIOCSSERIAL"); + return -1; + } + } else { + // Set baud rate + cfsetispeed(&options, baud); + cfsetospeed(&options, baud); + } #else - // On OSX speed_t is simply the baud rate: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/cfsetispeed.3.html - cfsetispeed(&options, baudRate); - cfsetospeed(&options, baudRate); + // On OSX speed_t is simply the baud rate: + // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/cfsetispeed.3.html + cfsetispeed(&options, baudRate); + cfsetospeed(&options, baudRate); #endif - // set data size - options.c_cflag &= ~CSIZE; - switch (byteSize) { - case 5: - options.c_cflag |= CS5; - break; - case 6: - options.c_cflag |= CS6; - break; - case 7: - options.c_cflag |= CS7; - break; - case 8: - options.c_cflag |= CS8; - break; - - } - - // set parity - switch (parity) { - case 0: // None - options.c_cflag &= ~PARENB; - break; - case 1: // Even - options.c_cflag |= PARENB; - options.c_cflag &= ~PARODD; - break; - case 2: // Odd - options.c_cflag |= (PARENB | PARODD); - break; - } - - switch (stopBits) { - case 0: // 1 - options.c_cflag &= ~CSTOPB; - break; - case 1: // 2 - options.c_cflag |= CSTOPB; - break; - } - - // raw input - options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); - - // ignore parity - options.c_iflag |= IGNPAR; - - // turn off those bits in the input flag that fiddle with CR and NL - options.c_iflag &= ~(ICRNL | INLCR | IGNCR); - - options.c_cc[VMIN] = 0; // min chars to read - options.c_cc[VTIME] = 2; // 10ths second timeout - - tcflush(fd, TCIFLUSH); - tcsetattr(fd, TCSANOW, &options); - - return fd; + // set data size + options.c_cflag &= ~CSIZE; + switch (byteSize) { + case 5: + options.c_cflag |= CS5; + break; + case 6: + options.c_cflag |= CS6; + break; + case 7: + options.c_cflag |= CS7; + break; + case 8: + options.c_cflag |= CS8; + break; + } + + // set parity + switch (parity) { + case 0: // None + options.c_cflag &= ~PARENB; + break; + case 1: // Even + options.c_cflag |= PARENB; + options.c_cflag &= ~PARODD; + break; + case 2: // Odd + options.c_cflag |= (PARENB | PARODD); + break; + } + + switch (stopBits) { + case 0: // 1 + options.c_cflag &= ~CSTOPB; + break; + case 1: // 2 + options.c_cflag |= CSTOPB; + break; + } + + // raw input + options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); + + // ignore parity + options.c_iflag |= IGNPAR; + + // turn off those bits in the input flag that fiddle with CR and NL + options.c_iflag &= ~(ICRNL | INLCR | IGNCR); + + options.c_cc[VMIN] = 0; // min chars to read + options.c_cc[VTIME] = 2; // 10ths second timeout + + tcflush(fd, TCIFLUSH); + tcsetattr(fd, TCSANOW, &options); + + return fd; #else // __MINGW32__ - const wchar_t * cportName = (const wchar_t *)(*env)->GetStringChars(env, portName, NULL); - HANDLE handle = CreateFile(cportName, - GENERIC_READ | GENERIC_WRITE, - 0, - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED, - NULL); - (*env)->ReleaseStringChars(env, portName, cportName); - - if (handle == INVALID_HANDLE_VALUE) { - char msg[256]; - const char * name = (*env)->GetStringUTFChars(env, portName, NULL); - sprintf_s(msg, sizeof(msg), "Error opening %s", name); - (*env)->ReleaseStringUTFChars(env, portName, name); - throwIOException(env, msg); - return -1; - } - - DCB dcb = { 0 }; - - if (!GetCommState(handle, &dcb)) { - closeAndthrowIOException(handle, env, "Error getting DCB"); - return -1; - } - - dcb.BaudRate = baudRate; - dcb.ByteSize = (BYTE)byteSize; - - switch (parity) { - case 0: // None - dcb.fParity = FALSE; - dcb.Parity = NOPARITY; - break; - case 1: // Even - dcb.fParity = TRUE; - dcb.Parity = EVENPARITY; - break; - case 2: // Odd - dcb.fParity = TRUE; - dcb.Parity = ODDPARITY; - break; - } - - switch (stopBits) { - case 0: - dcb.StopBits = ONESTOPBIT; - break; - case 1: - dcb.StopBits = TWOSTOPBITS; - break; - } - - if (!SetCommState(handle, &dcb)) { - closeAndthrowIOException(handle, env, "Error setting DCB"); - return -1; - } - - COMMTIMEOUTS timeouts = { 0 }; - timeouts.ReadIntervalTimeout = MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier = MAXDWORD; - timeouts.ReadTotalTimeoutConstant = 200; - if (!SetCommTimeouts(handle, &timeouts)) { - closeAndthrowIOException(handle, env, "Error setting timeouts"); - return -1; - } + const wchar_t *cportName = (const wchar_t *)(*env)->GetStringChars(env, portName, NULL); + HANDLE handle = + CreateFile(cportName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + (*env)->ReleaseStringChars(env, portName, cportName); + + if (handle == INVALID_HANDLE_VALUE) { + char msg[256]; + const char *name = (*env)->GetStringUTFChars(env, portName, NULL); + sprintf_s(msg, sizeof(msg), "Error opening %s", name); + (*env)->ReleaseStringUTFChars(env, portName, name); + throwIOException(env, msg); + return -1; + } + + DCB dcb = {0}; + + if (!GetCommState(handle, &dcb)) { + closeAndthrowIOException(handle, env, "Error getting DCB"); + return -1; + } + + dcb.BaudRate = baudRate; + dcb.ByteSize = (BYTE)byteSize; + + switch (parity) { + case 0: // None + dcb.fParity = FALSE; + dcb.Parity = NOPARITY; + break; + case 1: // Even + dcb.fParity = TRUE; + dcb.Parity = EVENPARITY; + break; + case 2: // Odd + dcb.fParity = TRUE; + dcb.Parity = ODDPARITY; + break; + } + + switch (stopBits) { + case 0: + dcb.StopBits = ONESTOPBIT; + break; + case 1: + dcb.StopBits = TWOSTOPBITS; + break; + } + + if (!SetCommState(handle, &dcb)) { + closeAndthrowIOException(handle, env, "Error setting DCB"); + return -1; + } + + COMMTIMEOUTS timeouts = {0}; + timeouts.ReadIntervalTimeout = MAXDWORD; + timeouts.ReadTotalTimeoutMultiplier = MAXDWORD; + timeouts.ReadTotalTimeoutConstant = 200; + if (!SetCommTimeouts(handle, &timeouts)) { + closeAndthrowIOException(handle, env, "Error setting timeouts"); + return -1; + } #ifdef _WIN64 - return (jlong)handle; + return (jlong)handle; #else - return (jlong)(unsigned)handle; + return (jlong)(unsigned)handle; #endif #endif // __MINGW32__ } -JNIEXPORT void JNICALL FUNC(close0) -(JNIEnv *env, jobject jobj, jlong handle) { +JNIEXPORT void JNICALL FUNC(close0)(JNIEnv *env, jobject jobj, jlong handle) { #ifndef __MINGW32__ - close(handle); + close(handle); #else #ifdef _WIN64 - CloseHandle((HANDLE)handle); + CloseHandle((HANDLE)handle); #else - CloseHandle((HANDLE)(unsigned)handle); + CloseHandle((HANDLE)(unsigned)handle); #endif #endif } JNIEXPORT jint JNICALL FUNC(available0)(JNIEnv *env, jobject jobj, jlong jhandle) { #ifndef __MINGW32__ - int result = 0; - if (ioctl(jhandle, FIONREAD, &result) < 0) { - throwIOException(env, "Error calling ioctl"); - return 0; - } - return result; + int result = 0; + if (ioctl(jhandle, FIONREAD, &result) < 0) { + throwIOException(env, "Error calling ioctl"); + return 0; + } + return result; #else - COMSTAT stat; - DWORD errCode; + COMSTAT stat; + DWORD errCode; #ifdef _WIN64 - HANDLE handle = (HANDLE)jhandle; + HANDLE handle = (HANDLE)jhandle; #else - HANDLE handle = (HANDLE)(unsigned)jhandle; + HANDLE handle = (HANDLE)(unsigned)jhandle; #endif - if (ClearCommError(handle, &errCode, &stat) == 0) { - throwIOException(env, "Error calling ClearCommError"); - return -1; - } - return (int)stat.cbInQue; + if (ClearCommError(handle, &errCode, &stat) == 0) { + throwIOException(env, "Error calling ClearCommError"); + return -1; + } + return (int)stat.cbInQue; #endif } JNIEXPORT jint JNICALL FUNC(read1)(JNIEnv *env, jobject jobj, jlong jhandle, jbyteArray bytes, jint offset, jint size) { #ifndef __MINGW32__ - jbyte buff[256]; - int n = size < sizeof(buff) ? size : sizeof(buff); - n = read(jhandle, buff, n); - if (n > 0) { - (*env)->SetByteArrayRegion(env, bytes, offset, n, buff); - } - return n; + jbyte buff[256]; + int n = size < sizeof(buff) ? size : sizeof(buff); + n = read(jhandle, buff, n); + if (n > 0) { + (*env)->SetByteArrayRegion(env, bytes, offset, n, buff); + } + return n; #else - OVERLAPPED olp = { 0 }; + OVERLAPPED olp = {0}; - olp.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (olp.hEvent == NULL) { - throwIOException(env, "Error creating event"); - return -1; - } + olp.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (olp.hEvent == NULL) { + throwIOException(env, "Error creating event"); + return -1; + } - char buff[256]; - DWORD nread = sizeof(buff) < size ? sizeof(buff) : size; + char buff[256]; + DWORD nread = sizeof(buff) < size ? sizeof(buff) : size; #ifdef _WIN64 - HANDLE handle = (HANDLE)jhandle; + HANDLE handle = (HANDLE)jhandle; #else - HANDLE handle = (HANDLE)(unsigned)jhandle; + HANDLE handle = (HANDLE)(unsigned)jhandle; #endif - if (!ReadFile(handle, buff, sizeof(buff), &nread, &olp)) { - if (GetLastError() != ERROR_IO_PENDING) { - throwIOException(env, "Error reading from port"); - CloseHandle(olp.hEvent); - return -1; - } else { - switch (WaitForSingleObject(olp.hEvent, INFINITE)) { - case WAIT_OBJECT_0: - if (!GetOverlappedResult(handle, &olp, &nread, FALSE)) { - if (GetLastError() != ERROR_OPERATION_ABORTED) { - throwIOException(env, "Error waiting for read"); - } - CloseHandle(olp.hEvent); - return -1; - } - break; - } - } - } - - if (nread > 0) { - (*env)->SetByteArrayRegion(env, bytes, offset, nread, (jbyte *)buff); - } - CloseHandle(olp.hEvent); - return nread; + if (!ReadFile(handle, buff, sizeof(buff), &nread, &olp)) { + if (GetLastError() != ERROR_IO_PENDING) { + throwIOException(env, "Error reading from port"); + CloseHandle(olp.hEvent); + return -1; + } else { + switch (WaitForSingleObject(olp.hEvent, INFINITE)) { + case WAIT_OBJECT_0: + if (!GetOverlappedResult(handle, &olp, &nread, FALSE)) { + if (GetLastError() != ERROR_OPERATION_ABORTED) { + throwIOException(env, "Error waiting for read"); + } + CloseHandle(olp.hEvent); + return -1; + } + break; + } + } + } + + if (nread > 0) { + (*env)->SetByteArrayRegion(env, bytes, offset, nread, (jbyte *)buff); + } + CloseHandle(olp.hEvent); + return nread; #endif } -JNIEXPORT void JNICALL FUNC(write0) -(JNIEnv *env, jobject jobj, jlong jhandle, jint b) { +JNIEXPORT void JNICALL FUNC(write0)(JNIEnv *env, jobject jobj, jlong jhandle, jint b) { #ifndef __MINGW32__ - char buff = b; - write(jhandle, &buff, 1); + char buff = b; + write(jhandle, &buff, 1); #else - OVERLAPPED olp = { 0 }; + OVERLAPPED olp = {0}; - olp.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (olp.hEvent == NULL) { - throwIOException(env, "Error creating event"); - return; - } + olp.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (olp.hEvent == NULL) { + throwIOException(env, "Error creating event"); + return; + } - char buff = (char)b; - DWORD nwritten; + char buff = (char)b; + DWORD nwritten; #ifdef _WIN64 - HANDLE handle = (HANDLE)jhandle; + HANDLE handle = (HANDLE)jhandle; #else - HANDLE handle = (HANDLE)(unsigned)jhandle; + HANDLE handle = (HANDLE)(unsigned)jhandle; #endif - if (!WriteFile(handle, &buff, sizeof(buff), &nwritten, &olp)) { - if (GetLastError() != ERROR_IO_PENDING) { - throwIOException(env, "Error writing to port"); - } - else { - switch (WaitForSingleObject(olp.hEvent, INFINITE)) { - case WAIT_OBJECT_0: - if (!GetOverlappedResult(handle, &olp, &nwritten, FALSE)) { - throwIOException(env, "Error waiting for write"); - } - } - } - } - - CloseHandle(olp.hEvent); + if (!WriteFile(handle, &buff, sizeof(buff), &nwritten, &olp)) { + if (GetLastError() != ERROR_IO_PENDING) { + throwIOException(env, "Error writing to port"); + } else { + switch (WaitForSingleObject(olp.hEvent, INFINITE)) { + case WAIT_OBJECT_0: + if (!GetOverlappedResult(handle, &olp, &nwritten, FALSE)) { + throwIOException(env, "Error waiting for write"); + } + } + } + } + + CloseHandle(olp.hEvent); #endif } -JNIEXPORT void JNICALL FUNC(write1)(JNIEnv *env, jobject jobj, jlong jhandle, jbyteArray bytes, jint offset, jint size) { +JNIEXPORT void JNICALL FUNC(write1)(JNIEnv *env, jobject jobj, jlong jhandle, jbyteArray bytes, jint offset, + jint size) { #ifndef __MINGW32__ - while (size > 0) { - jbyte buff[256]; - int n = size < sizeof(buff) ? size : sizeof(buff); - (*env)->GetByteArrayRegion(env, bytes, offset, n, buff); - n = write(jhandle, buff, n); - if (n < 0) { - return; - } - size -= n; - offset += n; - } + while (size > 0) { + jbyte buff[256]; + int n = size < sizeof(buff) ? size : sizeof(buff); + (*env)->GetByteArrayRegion(env, bytes, offset, n, buff); + n = write(jhandle, buff, n); + if (n < 0) { + return; + } + size -= n; + offset += n; + } #else - OVERLAPPED olp = { 0 }; - - olp.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (olp.hEvent == NULL) { - throwIOException(env, "Error creating event"); - return; - } - - while (size > 0) { - char buff[256]; - DWORD nwritten = sizeof(buff) < size ? sizeof(buff) : size; - (*env)->GetByteArrayRegion(env, bytes, offset, nwritten, (jbyte *)buff); + OVERLAPPED olp = {0}; + + olp.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (olp.hEvent == NULL) { + throwIOException(env, "Error creating event"); + return; + } + + while (size > 0) { + char buff[256]; + DWORD nwritten = sizeof(buff) < size ? sizeof(buff) : size; + (*env)->GetByteArrayRegion(env, bytes, offset, nwritten, (jbyte *)buff); #ifdef _WIN64 - HANDLE handle = (HANDLE)jhandle; + HANDLE handle = (HANDLE)jhandle; #else - HANDLE handle = (HANDLE)(unsigned)jhandle; + HANDLE handle = (HANDLE)(unsigned)jhandle; #endif - if (!WriteFile(handle, buff, nwritten, &nwritten, &olp)) { - if (GetLastError() != ERROR_IO_PENDING) { - throwIOException(env, "Error writing to port"); - return; - } else { - switch (WaitForSingleObject(olp.hEvent, INFINITE)) { - case WAIT_OBJECT_0: - if (!GetOverlappedResult(handle, &olp, &nwritten, FALSE)) { - throwIOException(env, "Error waiting for write"); - return; - } - } - } - } - size -= nwritten; - offset += nwritten; - } - - CloseHandle(olp.hEvent); + if (!WriteFile(handle, buff, nwritten, &nwritten, &olp)) { + if (GetLastError() != ERROR_IO_PENDING) { + throwIOException(env, "Error writing to port"); + return; + } else { + switch (WaitForSingleObject(olp.hEvent, INFINITE)) { + case WAIT_OBJECT_0: + if (!GetOverlappedResult(handle, &olp, &nwritten, FALSE)) { + throwIOException(env, "Error waiting for write"); + return; + } + } + } + } + size -= nwritten; + offset += nwritten; + } + + CloseHandle(olp.hEvent); #endif } #ifdef __MINGW32__ -JNIEXPORT jstring FUNC(getPortName)(JNIEnv *env, jclass cls, jint i) -{ - HKEY key; - - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_READ, &key) != ERROR_SUCCESS) { - // There are none - return NULL; - } - - wchar_t name[256]; - DWORD len = sizeof(name); - LONG rc = RegEnumValue(key, (DWORD)i, name, &len, NULL, NULL, NULL, NULL); - if (rc != ERROR_SUCCESS) { - if (rc != ERROR_NO_MORE_ITEMS) { - throwIOException(env, "Can not enum value"); - } - RegCloseKey(key); - return NULL; - } - - wchar_t value[256]; - DWORD type; - len = sizeof(value); - if (RegQueryValueEx(key, name, NULL, &type, (BYTE *)value, &len) != ERROR_SUCCESS) { - throwIOException(env, "Can not query value"); - RegCloseKey(key); - return NULL; - } - - jstring result = (*env)->NewString(env, (jchar *)value, (jsize) wcslen(value)); - RegCloseKey(key); - return result; +JNIEXPORT jstring FUNC(getPortName)(JNIEnv *env, jclass cls, jint i) { + HKEY key; + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_READ, &key) != ERROR_SUCCESS) { + // There are none + return NULL; + } + + wchar_t name[256]; + DWORD len = sizeof(name); + LONG rc = RegEnumValue(key, (DWORD)i, name, &len, NULL, NULL, NULL, NULL); + if (rc != ERROR_SUCCESS) { + if (rc != ERROR_NO_MORE_ITEMS) { + throwIOException(env, "Can not enum value"); + } + RegCloseKey(key); + return NULL; + } + + wchar_t value[256]; + DWORD type; + len = sizeof(value); + if (RegQueryValueEx(key, name, NULL, &type, (BYTE *)value, &len) != ERROR_SUCCESS) { + throwIOException(env, "Can not query value"); + RegCloseKey(key); + return NULL; + } + + jstring result = (*env)->NewString(env, (jchar *)value, (jsize)wcslen(value)); + RegCloseKey(key); + return result; } #endif diff --git a/native/org.eclipse.cdt.native.serial/os/win32/x86_64/serial.dll b/native/org.eclipse.cdt.native.serial/os/win32/x86_64/serial.dll index a14bc966cee798869195f603bb1a829c21aae689..5a68572e0c9381e0baa4477cf99cb45e6f644419 100755 GIT binary patch delta 53 zcmaE`Q2fC{@d+I)2MF=+Nx3nC=+-44^b`B>-AZ7w$W*}zS&f&y*qYnVG C*cK!J delta 53 zcmaE`Q2fC{@d+I)RdNr%PweqwVtTmomX;%!+sxtA&f&xe#7scU48$zkIh /dev/null; then - # Disable indexer for test plugins - sed -i ' - /^eclipse.preferences.version/ { - p # Print line - i indexer/indexerId=org.eclipse.cdt.core.nullindexer - i indexerId=org.eclipse.cdt.core.nullindexer - i instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true - d # Already printed - }' $d/.settings/org.eclipse.cdt.core.prefs - fi - else - rm -f $d/.settings/org.eclipse.cdt.*.prefs - fi done ## diff --git a/releng/scripts/do_rebuild_natives.sh b/releng/scripts/do_rebuild_natives.sh index 92e68783c96..7c95e368718 100755 --- a/releng/scripts/do_rebuild_natives.sh +++ b/releng/scripts/do_rebuild_natives.sh @@ -23,14 +23,9 @@ for p in native/org.eclipse.cdt.native.serial core/org.eclipse.cdt.core.native; exit 1 fi -# Disabled until https://bugs.eclipse.org/bugs/show_bug.cgi?id=568137 is resolved -# # Need to apply format after header files are generated -# tmpws=$(mktemp -d) -# ${ECLIPSE:-~/buildtools/eclipse-cpp-2020-09/eclipse} \ -# -consolelog -nosplash -application org.eclipse.cdt.core.CodeFormatter \ -# -config $p/.settings/org.eclipse.cdt.core.prefs \ -# $p/native_src -verbose -data $tmpws -# rm -rf $tmpws + # Need to apply format after header files are generated + echo "Applying enforcing formatting rules to $p native source files" + clang-format -i --style=file $(git ls-files $p/native_src/\*\*/\*.{c,cpp,cc,h,hh,hpp}) echo "Rebuilding $p natives to make sure they match source" logfile=make-natives-${p//\//-}.log