binutils-gdb/gdb/ser-tcp.c
Christian Biesinger 491144b5e2 Change boolean options to bool instead of int
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.
2019-09-18 09:35:12 +09:00

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);
}