491144b5e2
This is for add_setshow_boolean_cmd as well as the gdb::option interface. gdb/ChangeLog: 2019-09-17 Christian Biesinger <cbiesinger@google.com> * ada-lang.c (ada_ignore_descriptive_types_p): Change to bool. (print_signatures): Likewise. (trust_pad_over_xvs): Likewise. * arch/aarch64-insn.c (aarch64_debug): Likewise. * arch/aarch64-insn.h (aarch64_debug): Likewise. * arm-linux-nat.c (arm_apcs_32): Likewise. * arm-linux-tdep.c (arm_apcs_32): Likewise. * arm-nbsd-nat.c (arm_apcs_32): Likewise. * arm-tdep.c (arm_debug): Likewise. (arm_apcs_32): Likewise. * auto-load.c (debug_auto_load): Likewise. (auto_load_gdb_scripts): Likewise. (global_auto_load): Likewise. (auto_load_local_gdbinit): Likewise. (auto_load_local_gdbinit_loaded): Likewise. * auto-load.h (global_auto_load): Likewise. (auto_load_local_gdbinit): Likewise. (auto_load_local_gdbinit_loaded): Likewise. * breakpoint.c (disconnected_dprintf): Likewise. (breakpoint_proceeded): Likewise. (automatic_hardware_breakpoints): Likewise. (always_inserted_mode): Likewise. (target_exact_watchpoints): Likewise. (_initialize_breakpoint): Update. * breakpoint.h (target_exact_watchpoints): Change to bool. * btrace.c (maint_btrace_pt_skip_pad): Likewise. * cli/cli-cmds.c (trace_commands): Likewise. * cli/cli-cmds.h (trace_commands): Likewise. * cli/cli-decode.c (add_setshow_boolean_cmd): Change int* argument to bool*. * cli/cli-logging.c (logging_overwrite): Change to bool. (logging_redirect): Likewise. (debug_redirect): Likewise. * cli/cli-option.h (option_def) <boolean>: Change return type to bool*. (struct boolean_option_def) <get_var_address_cb_>: Change return type to bool. <boolean_option_def>: Update. (struct flag_option_def): Change default type of Context to bool from int. <flag_option_def>: Change return type of var_address_cb_ to bool*. * cli/cli-setshow.c (do_set_command): Cast to bool* instead of int*. (get_setshow_command_value_string): Likewise. * cli/cli-style.c (cli_styling): Change to bool. (source_styling): Likewise. * cli/cli-style.h (source_styling): Likewise. (cli_styling): Likewise. * cli/cli-utils.h (struct qcs_flags) <quiet, cont, silent>: Change to bool. * command.h (var_types): Update comment. (add_setshow_boolean_cmd): Change int* var argument to bool*. * compile/compile-cplus-types.c (debug_compile_cplus_types): Change to bool. (debug_compile_cplus_scopes): Likewise. * compile/compile-internal.h (compile_debug): Likewise. * compile/compile.c (compile_debug): Likewise. (struct compile_options) <raw>: Likewise. * cp-support.c (catch_demangler_crashes): Likewise. * cris-tdep.c (usr_cmd_cris_version_valid): Likewise. (usr_cmd_cris_dwarf2_cfi): Likewise. * csky-tdep.c (csky_debug): Likewise. * darwin-nat.c (enable_mach_exceptions): Likewise. * dcache.c (dcache_enabled_p): Likewise. * defs.h (info_verbose): Likewise. * demangle.c (demangle): Likewise. (asm_demangle): Likewise. * dwarf-index-cache.c (debug_index_cache): Likewise. * dwarf2-frame.c (dwarf2_frame_unwinders_enabled_p): Likewise. * dwarf2-frame.h (dwarf2_frame_unwinders_enabled_p): Likewise. * dwarf2read.c (check_physname): Likewise. (use_deprecated_index_sections): Likewise. (dwarf_always_disassemble): Likewise. * eval.c (overload_resolution): Likewise. * event-top.c (set_editing_cmd_var): Likewise. (exec_done_display_p): Likewise. * event-top.h (set_editing_cmd_var): Likewise. (exec_done_display_p): Likewise. * exec.c (write_files): Likewise. * fbsd-nat.c (debug_fbsd_lwp): Likewise (debug_fbsd_nat): Likewise. * frame.h (struct frame_print_options) <print_raw_frame_arguments>: Likewise. (struct set_backtrace_options) <backtrace_past_main>: Likewise. <backtrace_past_entry> Likewise. * gdb-demangle.h (demangle): Likewise. (asm_demangle): Likewise. * gdb_bfd.c (bfd_sharing): Likewise. * gdbcore.h (write_files): Likewise. * gdbsupport/common-debug.c (show_debug_regs): Likewise. * gdbsupport/common-debug.h (show_debug_regs): Likewise. * gdbthread.h (print_thread_events): Likewise. * gdbtypes.c (opaque_type_resolution): Likewise. (strict_type_checking): Likewise. * gnu-nat.c (gnu_debug_flag): Likewise. * guile/scm-auto-load.c (auto_load_guile_scripts): Likewise. * guile/scm-param.c (pascm_variable): Add boolval. (add_setshow_generic): Update. (pascm_param_value): Update. (pascm_set_param_value_x): Update. * hppa-tdep.c (hppa_debug): Change to bool.. * infcall.c (may_call_functions_p): Likewise. (coerce_float_to_double_p): Likewise. (unwind_on_signal_p): Likewise. (unwind_on_terminating_exception_p): Likewise. * infcmd.c (startup_with_shell): Likewise. * inferior.c (print_inferior_events): Likewise. * inferior.h (startup_with_shell): Likewise. (print_inferior_events): Likewise. * infrun.c (step_stop_if_no_debug): Likewise. (detach_fork): Likewise. (debug_displaced): Likewise. (disable_randomization): Likewise. (non_stop): Likewise. (non_stop_1): Likewise. (observer_mode): Likewise. (observer_mode_1): Likewise. (set_observer_mode): Update. (sched_multi): Change to bool. * infrun.h (debug_displaced): Likewise. (sched_multi): Likewise. (step_stop_if_no_debug): Likewise. (non_stop): Likewise. (disable_randomization): Likewise. * linux-tdep.c (use_coredump_filter): Likewise. (dump_excluded_mappings): Likewise. * linux-thread-db.c (auto_load_thread_db): Likewise. (check_thread_db_on_load): Likewise. * main.c (captured_main_1): Update. * maint-test-options.c (struct test_options_opts) <flag_opt, xx1_opt, xx2_opt, boolean_opt>: Change to bool. * maint-test-settings.c (maintenance_test_settings_boolean): Likewise. * maint.c (maintenance_profile_p): Likewise. (per_command_time): Likewise. (per_command_space): Likewise. (per_command_symtab): Likewise. * memattr.c (inaccessible_by_default): Likewise. * mi/mi-main.c (mi_async): Likewise. (mi_async_1): Likewise. * mips-tdep.c (mips64_transfers_32bit_regs_p): Likewise. * nat/fork-inferior.h (startup_with_shell): Likewise. * nat/linux-namespaces.c (debug_linux_namespaces): Likewise. * nat/linux-namespaces.h (debug_linux_namespaces): Likewise. * nios2-tdep.c (nios2_debug): Likewise. * or1k-tdep.c (or1k_debug): Likewise. * parse.c (parser_debug): Likewise. * parser-defs.h (parser_debug): Likewise. * printcmd.c (print_symbol_filename): Likewise. * proc-api.c (procfs_trace): Likewise. * python/py-auto-load.c (auto_load_python_scripts): Likewise. * python/py-param.c (union parmpy_variable): Add "bool boolval" field. (set_parameter_value): Update. (add_setshow_generic): Update. * python/py-value.c (copy_py_bool_obj): Change argument from int* to bool*. * python/python.c (gdbpy_parameter_value): Cast to bool* instead of int*. * ravenscar-thread.c (ravenscar_task_support): Change to bool. * record-btrace.c (record_btrace_target::store_registers): Update. * record-full.c (record_full_memory_query): Change to bool. (record_full_stop_at_limit): Likewise. * record-full.h (record_full_memory_query): Likewise. * remote-notif.c (notif_debug): Likewise. * remote-notif.h (notif_debug): Likewise. * remote.c (use_range_stepping): Likewise. (interrupt_on_connect): Likewise. (remote_break): Likewise. * ser-tcp.c (tcp_auto_retry): Likewise. * ser-unix.c (serial_hwflow): Likewise. * skip.c (debug_skip): Likewise. * solib-aix.c (solib_aix_debug): Likewise. * spu-tdep.c (spu_stop_on_load_p): Likewise. (spu_auto_flush_cache_p): Likewise. * stack.c (struct backtrace_cmd_options) <full, no_filters, hide>: Likewise. (struct info_print_options) <quiet>: Likewise. * symfile-debug.c (debug_symfile): Likewise. * symfile.c (auto_solib_add): Likewise. (separate_debug_file_debug): Likewise. * symfile.h (auto_solib_add): Likewise. (separate_debug_file_debug): Likewise. * symtab.c (basenames_may_differ): Likewise. (struct filename_partial_match_opts) <dirname, basename>: Likewise. (struct info_print_options) <quiet, exclude_minsyms>: Likewise. (struct info_types_options) <quiet>: Likewise. * symtab.h (demangle): Likewise. (basenames_may_differ): Likewise. * target-dcache.c (stack_cache_enabled_1): Likewise. (code_cache_enabled_1): Likewise. * target.c (trust_readonly): Likewise. (may_write_registers): Likewise. (may_write_memory): Likewise. (may_insert_breakpoints): Likewise. (may_insert_tracepoints): Likewise. (may_insert_fast_tracepoints): Likewise. (may_stop): Likewise. (auto_connect_native_target): Likewise. (target_stop_and_wait): Update. (target_async_permitted): Change to bool. (target_async_permitted_1): Likewise. (may_write_registers_1): Likewise. (may_write_memory_1): Likewise. (may_insert_breakpoints_1): Likewise. (may_insert_tracepoints_1): Likewise. (may_insert_fast_tracepoints_1): Likewise. (may_stop_1): Likewise. * target.h (target_async_permitted): Likewise. (may_write_registers): Likewise. (may_write_memory): Likewise. (may_insert_breakpoints): Likewise. (may_insert_tracepoints): Likewise. (may_insert_fast_tracepoints): Likewise. (may_stop): Likewise. * thread.c (struct info_threads_opts) <show_global_ids>: Likewise. (make_thread_apply_all_options_def_group): Change argument from int* to bool*. (thread_apply_all_command): Update. (print_thread_events): Change to bool. * top.c (confirm): Likewise. (command_editing_p): Likewise. (history_expansion_p): Likewise. (write_history_p): Likewise. (info_verbose): Likewise. * top.h (confirm): Likewise. (history_expansion_p): Likewise. * tracepoint.c (disconnected_tracing): Likewise. (circular_trace_buffer): Likewise. * typeprint.c (print_methods): Likewise. (print_typedefs): Likewise. * utils.c (debug_timestamp): Likewise. (sevenbit_strings): Likewise. (pagination_enabled): Likewise. * utils.h (sevenbit_strings): Likewise. (pagination_enabled): Likewise. * valops.c (overload_resolution): Likewise. * valprint.h (struct value_print_options) <prettyformat_arrays, prettyformat_structs, vtblprint, unionprint, addressprint, objectprint, stop_print_at_null, print_array_indexes, deref_ref, static_field_print, pascal_static_field_print, raw, summary, symbol_print, finish_print>: Likewise. * windows-nat.c (new_console): Likewise. (cygwin_exceptions): Likewise. (new_group): Likewise. (debug_exec): Likewise. (debug_events): Likewise. (debug_memory): Likewise. (debug_exceptions): Likewise. (useshell): Likewise. * windows-tdep.c (maint_display_all_tib): Likewise. * xml-support.c (debug_xml): Likewise.
510 lines
12 KiB
C
510 lines
12 KiB
C
/* Serial interface for raw TCP connections on Un*x like systems.
|
|
|
|
Copyright (C) 1992-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "serial.h"
|
|
#include "ser-base.h"
|
|
#include "ser-tcp.h"
|
|
#include "gdbcmd.h"
|
|
#include "cli/cli-decode.h"
|
|
#include "cli/cli-setshow.h"
|
|
#include "gdbsupport/filestuff.h"
|
|
#include "gdbsupport/netstuff.h"
|
|
|
|
#include <sys/types.h>
|
|
|
|
#ifdef HAVE_SYS_FILIO_H
|
|
#include <sys/filio.h> /* For FIONBIO. */
|
|
#endif
|
|
#ifdef HAVE_SYS_IOCTL_H
|
|
#include <sys/ioctl.h> /* For FIONBIO. */
|
|
#endif
|
|
|
|
#include "gdbsupport/gdb_sys_time.h"
|
|
|
|
#ifdef USE_WIN32API
|
|
#include <ws2tcpip.h>
|
|
#ifndef ETIMEDOUT
|
|
#define ETIMEDOUT WSAETIMEDOUT
|
|
#endif
|
|
/* Gnulib defines close too, but gnulib's replacement
|
|
doesn't call closesocket unless we import the
|
|
socketlib module. */
|
|
#undef close
|
|
#define close(fd) closesocket (fd)
|
|
#define ioctl ioctlsocket
|
|
#else
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <netdb.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/tcp.h>
|
|
#endif
|
|
|
|
#include <signal.h>
|
|
#include "gdb_select.h"
|
|
#include <algorithm>
|
|
|
|
#ifndef HAVE_SOCKLEN_T
|
|
typedef int socklen_t;
|
|
#endif
|
|
|
|
/* For "set tcp" and "show tcp". */
|
|
|
|
static struct cmd_list_element *tcp_set_cmdlist;
|
|
static struct cmd_list_element *tcp_show_cmdlist;
|
|
|
|
/* Whether to auto-retry refused connections. */
|
|
|
|
static bool tcp_auto_retry = true;
|
|
|
|
/* Timeout period for connections, in seconds. */
|
|
|
|
static unsigned int tcp_retry_limit = 15;
|
|
|
|
/* How many times per second to poll deprecated_ui_loop_hook. */
|
|
|
|
#define POLL_INTERVAL 5
|
|
|
|
/* Helper function to wait a while. If SOCK is not -1, wait on its
|
|
file descriptor. Otherwise just wait on a timeout, updating
|
|
*POLLS. Returns -1 on timeout or interrupt, otherwise the value of
|
|
select. */
|
|
|
|
static int
|
|
wait_for_connect (int sock, unsigned int *polls)
|
|
{
|
|
struct timeval t;
|
|
int n;
|
|
|
|
/* While we wait for the connect to complete,
|
|
poll the UI so it can update or the user can
|
|
interrupt. */
|
|
if (deprecated_ui_loop_hook && deprecated_ui_loop_hook (0))
|
|
{
|
|
errno = EINTR;
|
|
return -1;
|
|
}
|
|
|
|
/* Check for timeout. */
|
|
if (*polls > tcp_retry_limit * POLL_INTERVAL)
|
|
{
|
|
errno = ETIMEDOUT;
|
|
return -1;
|
|
}
|
|
|
|
/* Back off to polling once per second after the first POLL_INTERVAL
|
|
polls. */
|
|
if (*polls < POLL_INTERVAL)
|
|
{
|
|
t.tv_sec = 0;
|
|
t.tv_usec = 1000000 / POLL_INTERVAL;
|
|
}
|
|
else
|
|
{
|
|
t.tv_sec = 1;
|
|
t.tv_usec = 0;
|
|
}
|
|
|
|
if (sock >= 0)
|
|
{
|
|
fd_set rset, wset, eset;
|
|
|
|
FD_ZERO (&rset);
|
|
FD_SET (sock, &rset);
|
|
wset = rset;
|
|
eset = rset;
|
|
|
|
/* POSIX systems return connection success or failure by signalling
|
|
wset. Windows systems return success in wset and failure in
|
|
eset.
|
|
|
|
We must call select here, rather than gdb_select, because
|
|
the serial structure has not yet been initialized - the
|
|
MinGW select wrapper will not know that this FD refers
|
|
to a socket. */
|
|
n = select (sock + 1, &rset, &wset, &eset, &t);
|
|
}
|
|
else
|
|
/* Use gdb_select here, since we have no file descriptors, and on
|
|
Windows, plain select doesn't work in that case. */
|
|
n = gdb_select (0, NULL, NULL, NULL, &t);
|
|
|
|
/* If we didn't time out, only count it as one poll. */
|
|
if (n > 0 || *polls < POLL_INTERVAL)
|
|
(*polls)++;
|
|
else
|
|
(*polls) += POLL_INTERVAL;
|
|
|
|
return n;
|
|
}
|
|
|
|
/* Try to connect to the host represented by AINFO. If the connection
|
|
succeeds, return its socket. Otherwise, return -1 and set ERRNO
|
|
accordingly. POLLS is used when 'connect' returns EINPROGRESS, and
|
|
we need to invoke 'wait_for_connect' to obtain the status. */
|
|
|
|
static int
|
|
try_connect (const struct addrinfo *ainfo, unsigned int *polls)
|
|
{
|
|
int sock = gdb_socket_cloexec (ainfo->ai_family, ainfo->ai_socktype,
|
|
ainfo->ai_protocol);
|
|
|
|
if (sock < 0)
|
|
return -1;
|
|
|
|
/* Set socket nonblocking. */
|
|
#ifdef USE_WIN32API
|
|
u_long ioarg = 1;
|
|
#else
|
|
int ioarg = 1;
|
|
#endif
|
|
|
|
ioctl (sock, FIONBIO, &ioarg);
|
|
|
|
/* Use Non-blocking connect. connect() will return 0 if connected
|
|
already. */
|
|
if (connect (sock, ainfo->ai_addr, ainfo->ai_addrlen) < 0)
|
|
{
|
|
#ifdef USE_WIN32API
|
|
int err = WSAGetLastError();
|
|
#else
|
|
int err = errno;
|
|
#endif
|
|
|
|
/* If we've got a "connection refused" error, just return
|
|
-1. The caller will know what to do. */
|
|
if (
|
|
#ifdef USE_WIN32API
|
|
err == WSAECONNREFUSED
|
|
#else
|
|
err == ECONNREFUSED
|
|
#endif
|
|
)
|
|
{
|
|
close (sock);
|
|
errno = err;
|
|
return -1;
|
|
}
|
|
|
|
if (
|
|
/* Any other error (except EINPROGRESS) will be "swallowed"
|
|
here. We return without specifying a return value, and
|
|
set errno if the caller wants to inspect what
|
|
happened. */
|
|
#ifdef USE_WIN32API
|
|
/* Under Windows, calling "connect" with a non-blocking socket
|
|
results in WSAEWOULDBLOCK, not WSAEINPROGRESS. */
|
|
err != WSAEWOULDBLOCK
|
|
#else
|
|
err != EINPROGRESS
|
|
#endif
|
|
)
|
|
{
|
|
close (sock);
|
|
errno = err;
|
|
return -1;
|
|
}
|
|
|
|
/* Looks like we need to wait for the connect. */
|
|
int n;
|
|
|
|
do
|
|
n = wait_for_connect (sock, polls);
|
|
while (n == 0);
|
|
|
|
if (n < 0)
|
|
{
|
|
int saved_errno = errno;
|
|
|
|
/* A negative value here means that we either timed out or
|
|
got interrupted by the user. Just return. */
|
|
close (sock);
|
|
errno = saved_errno;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* Got something. Is it an error? */
|
|
int err;
|
|
socklen_t len = sizeof (err);
|
|
|
|
/* On Windows, the fourth parameter to getsockopt is a "char *";
|
|
on UNIX systems it is generally "void *". The cast to "char *"
|
|
is OK everywhere, since in C++ any data pointer type can be
|
|
implicitly converted to "void *". */
|
|
int ret = getsockopt (sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len);
|
|
|
|
if (ret < 0)
|
|
{
|
|
int saved_errno = errno;
|
|
|
|
close (sock);
|
|
errno = saved_errno;
|
|
return -1;
|
|
}
|
|
else if (ret == 0 && err != 0)
|
|
{
|
|
close (sock);
|
|
errno = err;
|
|
return -1;
|
|
}
|
|
|
|
/* The connection succeeded. Return the socket. */
|
|
return sock;
|
|
}
|
|
|
|
/* Open a tcp socket. */
|
|
|
|
int
|
|
net_open (struct serial *scb, const char *name)
|
|
{
|
|
struct addrinfo hint;
|
|
struct addrinfo *ainfo;
|
|
|
|
memset (&hint, 0, sizeof (hint));
|
|
/* Assume no prefix will be passed, therefore we should use
|
|
AF_UNSPEC. */
|
|
hint.ai_family = AF_UNSPEC;
|
|
hint.ai_socktype = SOCK_STREAM;
|
|
hint.ai_protocol = IPPROTO_TCP;
|
|
|
|
parsed_connection_spec parsed = parse_connection_spec (name, &hint);
|
|
|
|
if (parsed.port_str.empty ())
|
|
error (_("Missing port on hostname '%s'"), name);
|
|
|
|
int r = getaddrinfo (parsed.host_str.c_str (),
|
|
parsed.port_str.c_str (),
|
|
&hint, &ainfo);
|
|
|
|
if (r != 0)
|
|
{
|
|
fprintf_unfiltered (gdb_stderr, _("%s: cannot resolve name: %s\n"),
|
|
name, gai_strerror (r));
|
|
errno = ENOENT;
|
|
return -1;
|
|
}
|
|
|
|
scoped_free_addrinfo free_ainfo (ainfo);
|
|
|
|
/* Flag to indicate whether we've got a connection refused. It will
|
|
be true if any of the connections tried was refused. */
|
|
bool got_connrefused;
|
|
/* If a connection succeeeds, SUCCESS_AINFO will point to the
|
|
'struct addrinfo' that succeed. */
|
|
struct addrinfo *success_ainfo = NULL;
|
|
unsigned int polls = 0;
|
|
|
|
/* Assume the worst. */
|
|
scb->fd = -1;
|
|
|
|
do
|
|
{
|
|
got_connrefused = false;
|
|
|
|
for (addrinfo *iter = ainfo; iter != NULL; iter = iter->ai_next)
|
|
{
|
|
/* Iterate over the list of possible addresses to connect
|
|
to. For each, we'll try to connect and see if it
|
|
succeeds. */
|
|
int sock = try_connect (iter, &polls);
|
|
|
|
if (sock >= 0)
|
|
{
|
|
/* We've gotten a successful connection. Save its
|
|
'struct addrinfo', the socket, and break. */
|
|
success_ainfo = iter;
|
|
scb->fd = sock;
|
|
break;
|
|
}
|
|
else if (
|
|
#ifdef USE_WIN32API
|
|
errno == WSAECONNREFUSED
|
|
#else
|
|
errno == ECONNREFUSED
|
|
#endif
|
|
)
|
|
got_connrefused = true;
|
|
}
|
|
}
|
|
/* Just retry if:
|
|
|
|
- tcp_auto_retry is true, and
|
|
- We haven't gotten a connection yet, and
|
|
- Any of our connection attempts returned with ECONNREFUSED, and
|
|
- wait_for_connect signals that we can keep going. */
|
|
while (tcp_auto_retry
|
|
&& success_ainfo == NULL
|
|
&& got_connrefused
|
|
&& wait_for_connect (-1, &polls) >= 0);
|
|
|
|
if (success_ainfo == NULL)
|
|
{
|
|
net_close (scb);
|
|
return -1;
|
|
}
|
|
|
|
/* Turn off nonblocking. */
|
|
#ifdef USE_WIN32API
|
|
u_long ioarg = 0;
|
|
#else
|
|
int ioarg = 0;
|
|
#endif
|
|
|
|
ioctl (scb->fd, FIONBIO, &ioarg);
|
|
|
|
if (success_ainfo->ai_protocol == IPPROTO_TCP)
|
|
{
|
|
/* Disable Nagle algorithm. Needed in some cases. */
|
|
int tmp = 1;
|
|
|
|
setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
|
|
(char *) &tmp, sizeof (tmp));
|
|
}
|
|
|
|
#ifdef SIGPIPE
|
|
/* If we don't do this, then GDB simply exits
|
|
when the remote side dies. */
|
|
signal (SIGPIPE, SIG_IGN);
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
net_close (struct serial *scb)
|
|
{
|
|
if (scb->fd == -1)
|
|
return;
|
|
|
|
close (scb->fd);
|
|
scb->fd = -1;
|
|
}
|
|
|
|
int
|
|
net_read_prim (struct serial *scb, size_t count)
|
|
{
|
|
/* Need to cast to silence -Wpointer-sign on MinGW, as Winsock's
|
|
'recv' takes 'char *' as second argument, while 'scb->buf' is
|
|
'unsigned char *'. */
|
|
return recv (scb->fd, (char *) scb->buf, count, 0);
|
|
}
|
|
|
|
int
|
|
net_write_prim (struct serial *scb, const void *buf, size_t count)
|
|
{
|
|
/* On Windows, the second parameter to send is a "const char *"; on
|
|
UNIX systems it is generally "const void *". The cast to "const
|
|
char *" is OK everywhere, since in C++ any data pointer type can
|
|
be implicitly converted to "const void *". */
|
|
return send (scb->fd, (const char *) buf, count, 0);
|
|
}
|
|
|
|
int
|
|
ser_tcp_send_break (struct serial *scb)
|
|
{
|
|
/* Send telnet IAC and BREAK characters. */
|
|
return (serial_write (scb, "\377\363", 2));
|
|
}
|
|
|
|
/* Support for "set tcp" and "show tcp" commands. */
|
|
|
|
static void
|
|
set_tcp_cmd (const char *args, int from_tty)
|
|
{
|
|
help_list (tcp_set_cmdlist, "set tcp ", all_commands, gdb_stdout);
|
|
}
|
|
|
|
static void
|
|
show_tcp_cmd (const char *args, int from_tty)
|
|
{
|
|
help_list (tcp_show_cmdlist, "show tcp ", all_commands, gdb_stdout);
|
|
}
|
|
|
|
#ifndef USE_WIN32API
|
|
|
|
/* The TCP ops. */
|
|
|
|
static const struct serial_ops tcp_ops =
|
|
{
|
|
"tcp",
|
|
net_open,
|
|
net_close,
|
|
NULL,
|
|
ser_base_readchar,
|
|
ser_base_write,
|
|
ser_base_flush_output,
|
|
ser_base_flush_input,
|
|
ser_tcp_send_break,
|
|
ser_base_raw,
|
|
ser_base_get_tty_state,
|
|
ser_base_copy_tty_state,
|
|
ser_base_set_tty_state,
|
|
ser_base_print_tty_state,
|
|
ser_base_setbaudrate,
|
|
ser_base_setstopbits,
|
|
ser_base_setparity,
|
|
ser_base_drain_output,
|
|
ser_base_async,
|
|
net_read_prim,
|
|
net_write_prim
|
|
};
|
|
|
|
#endif /* USE_WIN32API */
|
|
|
|
void
|
|
_initialize_ser_tcp (void)
|
|
{
|
|
#ifdef USE_WIN32API
|
|
/* Do nothing; the TCP serial operations will be initialized in
|
|
ser-mingw.c. */
|
|
#else
|
|
serial_add_interface (&tcp_ops);
|
|
#endif /* USE_WIN32API */
|
|
|
|
add_prefix_cmd ("tcp", class_maintenance, set_tcp_cmd, _("\
|
|
TCP protocol specific variables.\n\
|
|
Configure variables specific to remote TCP connections."),
|
|
&tcp_set_cmdlist, "set tcp ",
|
|
0 /* allow-unknown */, &setlist);
|
|
add_prefix_cmd ("tcp", class_maintenance, show_tcp_cmd, _("\
|
|
TCP protocol specific variables.\n\
|
|
Configure variables specific to remote TCP connections."),
|
|
&tcp_show_cmdlist, "show tcp ",
|
|
0 /* allow-unknown */, &showlist);
|
|
|
|
add_setshow_boolean_cmd ("auto-retry", class_obscure,
|
|
&tcp_auto_retry, _("\
|
|
Set auto-retry on socket connect."), _("\
|
|
Show auto-retry on socket connect."),
|
|
NULL, NULL, NULL,
|
|
&tcp_set_cmdlist, &tcp_show_cmdlist);
|
|
|
|
add_setshow_uinteger_cmd ("connect-timeout", class_obscure,
|
|
&tcp_retry_limit, _("\
|
|
Set timeout limit in seconds for socket connection."), _("\
|
|
Show timeout limit in seconds for socket connection."), _("\
|
|
If set to \"unlimited\", GDB will keep attempting to establish a\n\
|
|
connection forever, unless interrupted with Ctrl-c.\n\
|
|
The default is 15 seconds."),
|
|
NULL, NULL,
|
|
&tcp_set_cmdlist, &tcp_show_cmdlist);
|
|
}
|