diff options
Diffstat (limited to 'core')
37 files changed, 2517 insertions, 3099 deletions
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 Binary files differindex 803a23739ad..ca8ff04d3a4 100755 --- 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 diff --git a/core/org.eclipse.cdt.core.linux.ppc64le/os/linux/ppc64le/libspawner.so b/core/org.eclipse.cdt.core.linux.ppc64le/os/linux/ppc64le/libspawner.so Binary files differindex 2e4bafecb24..41b7f6df88a 100755 --- a/core/org.eclipse.cdt.core.linux.ppc64le/os/linux/ppc64le/libspawner.so +++ b/core/org.eclipse.cdt.core.linux.ppc64le/os/linux/ppc64le/libspawner.so 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 Binary files differindex e0cf1a9461d..3c3e2ff384e 100755 --- 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 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 Binary files differindex 042a5828642..b12ec7c661e 100755 --- a/core/org.eclipse.cdt.core.macosx/os/macosx/x86/libspawner.jnilib +++ b/core/org.eclipse.cdt.core.macosx/os/macosx/x86/libspawner.jnilib diff --git a/core/org.eclipse.cdt.core.macosx/os/macosx/x86_64/libspawner.jnilib b/core/org.eclipse.cdt.core.macosx/os/macosx/x86_64/libspawner.jnilib Binary files differindex a50a78618ec..56f3928f5d1 100755 --- a/core/org.eclipse.cdt.core.macosx/os/macosx/x86_64/libspawner.jnilib +++ b/core/org.eclipse.cdt.core.macosx/os/macosx/x86_64/libspawner.jnilib 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 <termios.h> /* 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 <stdlib.h> /* 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 <unistd.h> @@ -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, "<init>", "(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, "<init>", "(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, "<init>", "(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, "<init>", "(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 <string.h> @@ -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, "<init>", "(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, "<init>", "(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 <string.h> @@ -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 <assert.h> #include <ctime> -static std::map<int, winpty_t*> fd2pty; +static std::map<int, winpty_t *> fd2pty; static std::map<int, int> 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<int, winpty_t*>(master, winpty)); + /* Remember the winpty handle for the generated masterFD */ + fd2pty.insert(std::pair<int, winpty_t *>(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<int, winpty_t*>::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<int, winpty_t *>::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<int, winpty_t*>::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<int, int>(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<int, winpty_t *>::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<int, int>(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<int, winpty_t*>::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<int, winpty_t *>::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<int, winpty_t*>::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<int, winpty_t *>::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<int, winpty_t*>::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<int, winpty_t *>::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<std::wstring> &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<int, winpty_t*>::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<int, winpty_t *>::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; } 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<int, winpty_t*>::iterator fd2pty_Iter; - std::map<int, int>::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<int, winpty_t *>::iterator fd2pty_Iter; + std::map<int, int>::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 <assert.h> 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 <jni.h> #include <windows.h> @@ -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 <tchar.h> @@ -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 <psapi.h> #include <stdbool.h> -//#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 Binary files differindex 45aa71adbe4..63c49e6b3d9 100755 --- 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 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 Binary files differindex 8f2e9e07d37..014b6769072 100755 --- 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 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 Binary files differindex 4622304f3fd..f7b6d02d50b 100755 --- 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 diff --git a/core/org.eclipse.cdt.core/.settings/org.eclipse.cdt.core.prefs b/core/org.eclipse.cdt.core/.settings/org.eclipse.cdt.core.prefs deleted file mode 100644 index 85b6db296e7..00000000000 --- a/core/org.eclipse.cdt.core/.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/.settings/org.eclipse.cdt.ui.prefs b/core/org.eclipse.cdt.core/.settings/org.eclipse.cdt.ui.prefs deleted file mode 100644 index 4f7bce2bbb8..00000000000 --- a/core/org.eclipse.cdt.core/.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 |