/* * Copyright 1999-2006 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GLOBUS_XIO_TCP_DRIVER_INCLUDE #define GLOBUS_XIO_TCP_DRIVER_INCLUDE /** * @file globus_xio_tcp_driver.h * @brief Header file for XIO TCP Driver */ #include "globus_xio_system.h" #ifdef __cplusplus extern "C" { #endif /** * @defgroup globus_xio_tcp_driver Globus XIO TCP Driver * @ingroup globus_xio * @brief Globus XIO TCP Driver * * The IPV4/6 TCP socket driver. */ /** * @defgroup globus_xio_tcp_driver_instance Opening/Closing * @ingroup globus_xio_tcp_driver * @brief Opening/Closing * * An XIO handle with the tcp driver can be created with either * @ref globus_xio_handle_create() or @ref globus_xio_server_register_accept(). * * If the handle is created with @ref globus_xio_server_register_accept(), * the @ref globus_xio_register_open() call does nothing more than initialize * the internal handle with the accepted socket. * * If the handle is created with @ref globus_xio_handle_create(), and * there is no handle set on the attr passed to the * @ref globus_xio_register_open() call, it performs the equivalent of an * asynchronous connect() call. In this case, the contact string must contain * a host name and service/port. Both the hostname and port number can be * numeric or symbolic (eg: some.webserver.com:80 or 214.123.12.1:http). * If the hostname is symbolic and it resolves to multiple ip addresses, each * one will be attempted in succession, until the connect is successful or * there are no more addresses. * * When the XIO handle is closed, the tcp driver will destroy its internal * resources and close the socket (unless this socket was set on an attr). * Any write data pending in system buffers will be sent unless the linger * option has been set. Any remaining data in recv buffers will be discarded * and (on some systems) a connection reset sent to the peer. */ /** * @defgroup globus_xio_tcp_driver_io Reading/Writing * @ingroup globus_xio_tcp_driver * @brief Reading/Writing * * Both the @ref globus_xio_register_read() and * @ref globus_xio_register_write() calls follow similar semantics as described * below. * * If the waitforbytes parameter is greater than zero, the io will happen * asynchronously and be completed when at least waitforbytes has been * read/written. * * If the waitforbytes parameter is equal to zero, one of the following * alternative behaviors occur: * * If the length of the buffer is > 0 the read or write happens synchronously. * If the user is using one of the blocking xio calls, no internal callback * will occur. * * If the length of the buffer is also 0, the call behaves like an asynchronous * notification of data ready to be either read or written. ie, an * asynchronous select(). * * In any case, when an error or EOF occurs before the waitforbytes request * has been met, the outgoing nbytes is set to the amount of data actually * read/written before the error or EOF occurred. */ /** * @defgroup globus_xio_tcp_driver_server Server * @ingroup globus_xio_tcp_driver * @brief Server * * @ref globus_xio_server_create() causes a tcp listener socket to be created * and listened upon. @ref globus_xio_server_register_accept() performs an * asynchronous accept(). @ref globus_xio_server_register_close() cleans up * the internal resources associated with the tcp server and calls close() on * the listener socket (unless the socket was set on the server via the attr) * * All accepted handles inherit all tcp specific attributes set in the attr to * @ref globus_xio_server_create(), but can be overridden with the attr to * @ref globus_xio_register_open(). */ /** * @defgroup globus_xio_tcp_driver_envs Env Variables * @ingroup globus_xio_tcp_driver * @brief Env Variables * * The tcp driver uses the following environment variables * - GLOBUS_HOSTNAME Used when setting the hostname in the contact string * - GLOBUS_TCP_PORT_RANGE Used to restrict anonymous listener ports * ex: GLOBUS_TCP_PORT_RANGE=4000,4100 * - GLOBUS_TCP_PORT_RANGE_STATE_FILE Used in conjunction with * GLOBUS_TCP_PORT_RANGE to maintain last used port among many * applications making use of the same port range. That last port + 1 * will be used as a starting point within the specified tcp port range * instead of always starting at the beginning. This is really only * necessary when a machine is behind a stateful firewall which is holding * a port in a different state than the application's machine. * See bugzilla.globus.org, bug 1851 for more info. * ex: GLOBUS_TCP_PORT_RANGE_STATE_FILE=/tmp/port_state * (file will be created if it does not exist) * - GLOBUS_TCP_SOURCE_RANGE Used to restrict local ports used in a connection * - GLOBUS_XIO_TCP_DEBUG Available if using a debug build. See globus_debug.h * for format. The TCP driver defines the levels TRACE for all function * call tracing and INFO for write buffer sizes * - GLOBUS_XIO_SYSTEM_DEBUG Available if using a debug build. See * globus_debug.h for format. The TCP driver uses globus_xio_system * (along with the File and UDP drivers) which defines the following * levels: TRACE for all function call tracing, DATA for data read and * written counts, INFO for some special events, and RAW which dumps the * raw buffers actually read or written. This can contain binary data, * so be careful when you enable it. */ /** * @defgroup globus_xio_tcp_driver_cntls Attributes and Cntls * @ingroup globus_xio_tcp_driver * @brief Attributes and Cntls * * Tcp driver specific attrs and cntls. * * @see globus_xio_attr_cntl() * @see globus_xio_handle_cntl() * @see globus_xio_server_cntl() * @see globus_xio_data_descriptor_cntl() */ /** * @defgroup globus_xio_tcp_driver_types Types * @ingroup globus_xio_tcp_driver * @brief Types */ /** * @defgroup globus_xio_tcp_driver_errors Error Types * @ingroup globus_xio_tcp_driver * @brief Error Types * * The TCP driver is very close to the system code, so most errors * reported by it are converted from the system errno. A few of the exceptions * are GLOBUS_XIO_ERROR_EOF, GLOBUS_XIO_ERROR_COMMAND, * GLOBUS_XIO_ERROR_CONTACT_STRING, GLOBUS_XIO_ERROR_CANCELED, and * @ref GLOBUS_XIO_TCP_ERROR_NO_ADDRS * * @see globus_xio_driver_error_match() * @see globus_error_errno_match() */ /** * Invalid handle type * @ingroup globus_xio_tcp_driver_types * @hideinitializer * @see GLOBUS_XIO_TCP_SET_HANDLE */ #define GLOBUS_XIO_TCP_INVALID_HANDLE GLOBUS_XIO_SYSTEM_INVALID_SOCKET /** * TCP driver specific error types * @ingroup globus_xio_tcp_driver_errors */ typedef enum { /** * Indicates that no IPv4/6 compatible sockets could be resolved * for the specified hostname */ GLOBUS_XIO_TCP_ERROR_NO_ADDRS } globus_xio_tcp_error_type_t; /** doxygen varargs filter stuff * GlobusVarArgDefine( * attr, globus_result_t, globus_xio_attr_cntl, attr, driver) * GlobusVarArgDefine( * handle, globus_result_t, globus_xio_handle_cntl, handle, driver) * GlobusVarArgDefine( * server, globus_result_t, globus_xio_server_cntl, server, driver) * GlobusVarArgDefine( * dd, globus_result_t, globus_xio_data_descriptor_cntl, dd, driver) */ /** * TCP driver specific cntls * @ingroup globus_xio_tcp_driver_cntls */ typedef enum { /** GlobusVarArgEnum(attr) * Set the tcp service name to bind to. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create(). * * @param service_name * The service name to use when setting up the listener. If the * service name cannot be resolved, the port (if one is set) will * be used instead. * * string opt: port=string */ /* const char * service_name */ GLOBUS_XIO_TCP_SET_SERVICE, /** GlobusVarArgEnum(attr) * Get the tcp service name to bind to. * @ingroup globus_xio_tcp_driver_cntls * * @param service_name_out * A pointer to the service name will be stored here If none is set, * NULL will be passed back. Otherwise, the name will be * duplicated with strdup() and the user should call free() on it. */ /* char ** service_name_out */ GLOBUS_XIO_TCP_GET_SERVICE, /** GlobusVarArgEnum(attr) * Set the tcp port number to bind to. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create(). The default * port number is 0 (system assigned) * * @param listener_port * The port number to use when setting up the listener. If the * service name is also set, this will only be used if that can't be * resolved. * * string opt: port=int */ /* int listener_port */ GLOBUS_XIO_TCP_SET_PORT, /** GlobusVarArgEnum(attr) * Get the tcp port number to bind to. * @ingroup globus_xio_tcp_driver_cntls * * @param listener_port_out * The port will be stored here. */ /* int * listener_port_out */ GLOBUS_XIO_TCP_GET_PORT, /** GlobusVarArgEnum(attr) * Set the listener backlog on a server. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create(). The default * backlog is -1 (system maximum) * * @param listener_backlog * This indicates the maximum length of the system's queue of * pending connections. Any connection attempts when the queue is * full will fail. If backlog is equal to -1, then the system-specific * maximum queue length will be used. */ /* int listener_backlog */ GLOBUS_XIO_TCP_SET_BACKLOG, /** GlobusVarArgEnum(attr) * Get the listener backlog on an attr. * @ingroup globus_xio_tcp_driver_cntls * * @param listener_backlog_out * The backlog will be stored here. */ /* int * listener_backlog_out */ GLOBUS_XIO_TCP_GET_BACKLOG, /** GlobusVarArgEnum(attr) * Set the tcp port range to confine the server to. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create() where no * specific service or port has been set. It overrides the range set in * the GLOBUS_TCP_PORT_RANGE env variable. If 'restrict port' is true, * the server's listening port will be constrained to the range specified. * * @param listener_min_port * The lower bound on the listener port. (default 0 -- no bound) * * @param listener_max_port * The upper bound on the listener port. (default 0 -- no bound) * * @see GLOBUS_XIO_TCP_SET_RESTRICT_PORT * * string opt: listen_range=int,int */ /* int listener_min_port, * int listener_max_port */ GLOBUS_XIO_TCP_SET_LISTEN_RANGE, /** GlobusVarArgEnum(attr) * Get the tcp port range on an attr. * @ingroup globus_xio_tcp_driver_cntls * * @param listener_min_port_out * The lower bound will be stored here. * * @param listener_max_port_out * The upper bound will be stored here. */ /* int * listener_min_port_out, * int * listener_max_port_out */ GLOBUS_XIO_TCP_GET_LISTEN_RANGE, /** GlobusVarArgEnum(attr, handle, server) * Get the tcp socket handle on an attr, handle, or server. * @ingroup globus_xio_tcp_driver_cntls * * @param handle_out * The tcp socket will be stored here. If none is set, * GLOBUS_XIO_TCP_INVALID_HANDLE will be set. */ /* globus_xio_system_socket_t * handle_out */ GLOBUS_XIO_TCP_GET_HANDLE, /** GlobusVarArgEnum(attr) * Set the tcp socket to use for a handle or server. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create() or * @ref globus_xio_register_open(). * * @param handle * Use this handle (fd or SOCKET) for the listener or connection. * Note: close() will not be called on this handle. */ /* globus_xio_system_socket_t handle */ GLOBUS_XIO_TCP_SET_HANDLE, /** GlobusVarArgEnum(attr) * Set the interface to bind a listener or connection to. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create() or * @ref globus_xio_register_open. * * @param interface * The interface to use. Can be a hostname or numeric IP * * string opt: iface=string */ /* const char * interface */ GLOBUS_XIO_TCP_SET_INTERFACE, /** GlobusVarArgEnum(attr) * Get the interface on the attr. * @ingroup globus_xio_tcp_driver_cntls * * @param interface_out * A pointer to the interface will be stored here If one is set, * NULL will be passed back. Otherwise, the interface will be * duplicated with strdup() and the user should call free() on it. */ /* char ** interface_out */ GLOBUS_XIO_TCP_GET_INTERFACE, /** GlobusVarArgEnum(attr) * Enable or disable the listener or connector range constraints. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create() or * @ref globus_xio_register_open(). This enables or ignores the port range * found in the attr or in then env. By default, those ranges are enabled. * * @param restrict_port * GLOBUS_TRUE to enable (default), GLOBUS_FALSE to disable. * * @see GLOBUS_XIO_TCP_SET_LISTEN_RANGE * @see GLOBUS_XIO_TCP_SET_CONNECT_RANGE */ /* globus_bool_t restrict_port */ GLOBUS_XIO_TCP_SET_RESTRICT_PORT, /** GlobusVarArgEnum(attr) * Get the restrict port flag. * @ingroup globus_xio_tcp_driver_cntls * * @param restrict_port_out * The restrict port flag will be stored here. */ /* globus_bool_t * restrict_port_out */ GLOBUS_XIO_TCP_GET_RESTRICT_PORT, /** GlobusVarArgEnum(attr) * Reuse addr when binding. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create() or * @ref globus_xio_register_open() to determine whether or not to allow * reuse of addresses when binding a socket to a port number. * * @param resuseaddr * GLOBUS_TRUE to allow, GLOBUS_FALSE to disallow (default) * * string opt: reuse=bool */ /* globus_bool_t resuseaddr */ GLOBUS_XIO_TCP_SET_REUSEADDR, /** GlobusVarArgEnum(attr) * Get the reuseaddr flag on an attr. * @ingroup globus_xio_tcp_driver_cntls * * @param resuseaddr_out * The reuseaddr flag will be stored here. */ /* globus_bool_t * resuseaddr_out */ GLOBUS_XIO_TCP_GET_REUSEADDR, /** GlobusVarArgEnum(attr) * Restrict to IPV4 only. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_server_create() or * @ref globus_xio_register_open(). Disallow IPV6 sockets from being used * (default is to use either ipv4 or ipv6) * * @param no_ipv6 * GLOBUS_TRUE to disallow ipv6, GLOBUS_FALSE to allow (default) * * string opt: noipv6=bool */ /* globus_bool_t no_ipv6 */ GLOBUS_XIO_TCP_SET_NO_IPV6, /** GlobusVarArgEnum(attr) * Get the no ipv6 flag on an attr. * @ingroup globus_xio_tcp_driver_cntls * * @param no_ipv6_out * The no ipv6 flag will be stored here. */ /* globus_bool_t * no_ipv6_out */ GLOBUS_XIO_TCP_GET_NO_IPV6, /** GlobusVarArgEnum(attr) * Set the tcp port range to confine the server to. * @ingroup globus_xio_tcp_driver_cntls * Used only on attrs for @ref globus_xio_register_open(). It overrides * the range set in the GLOBUS_TCP_SOURCE_RANGE env variable. If * 'restrict port' is true, the connecting socket's local port will be * constrained to the range specified. * * @param connector_min_port * The lower bound on the listener port. (default 0 -- no bound) * * @param connector_max_port * The upper bound on the listener port. (default 0 -- no bound) * * @see GLOBUS_XIO_TCP_SET_RESTRICT_PORT */ /* int connector_min_port, * int connector_max_port */ GLOBUS_XIO_TCP_SET_CONNECT_RANGE, /** GlobusVarArgEnum(attr) * Get the tcp source port range on an attr. * @ingroup globus_xio_tcp_driver_cntls * * @param connector_min_port_out * The lower bound will be stored here. * * @param connector_max_port_out * The upper bound will be stored here. */ /* int * connector_min_port_out, * int * connector_max_port_out */ GLOBUS_XIO_TCP_GET_CONNECT_RANGE, /** GlobusVarArgEnum(attr, handle) * Enable tcp keepalive. * @ingroup globus_xio_tcp_driver_cntls * Used on attrs for @ref globus_xio_server_create(), * @ref globus_xio_register_open() and with @ref globus_xio_handle_cntl() * to determine whether or not to periodically send "keepalive" messages * on a connected socket handle. This may enable earlier detection of * broken connections. * * @param keepalive * GLOBUS_TRUE to enable, GLOBUS_FALSE to disable (default) * * string opt: keepalive=bool */ /* globus_bool_t keepalive */ GLOBUS_XIO_TCP_SET_KEEPALIVE, /** GlobusVarArgEnum(attr, handle) * Get the tcp keepalive flag. * @ingroup globus_xio_tcp_driver_cntls * * @param keepalive_out * The tcp keepalive flag will be stored here. */ /* globus_bool_t * keepalive_out */ GLOBUS_XIO_TCP_GET_KEEPALIVE, /** GlobusVarArgEnum(attr, handle) * Set tcp linger. * @ingroup globus_xio_tcp_driver_cntls * Used on attrs for @ref globus_xio_server_create(), * @ref globus_xio_register_open() and with @ref globus_xio_handle_cntl() * to determine what to do when data is in the socket's buffer when the * socket is closed. If linger is set to true, then the close operation * will block until the socket buffers are empty, or the linger_time has * expired. If this is enabled, any data remaining after the linger time * has expired, will be discarded. If this is disabled, close finishes * immediately, but the OS will still attempt to transmit the remaining * data. * * @param linger * GLOBUS_TRUE to enable, GLOBUS_FALSE to disable (default) * * @param linger_time * The time (in seconds) to block at close time if linger is true * and data is queued in the socket buffer. */ /* globus_bool_t linger, * int linger_time */ GLOBUS_XIO_TCP_SET_LINGER, /** GlobusVarArgEnum(attr, handle) * Get the tcp linger flag and time. * @ingroup globus_xio_tcp_driver_cntls * * @param linger_out * The linger flag will be stored here. * * @param linger_time_out * The linger time will be set here. */ /* globus_bool_t * linger_out, * int * linger_time_out */ GLOBUS_XIO_TCP_GET_LINGER, /** GlobusVarArgEnum(attr, handle) * Receive out of band data (tcp urgent data) in normal stream. * @ingroup globus_xio_tcp_driver_cntls * Used on attrs for @ref globus_xio_server_create(), * @ref globus_xio_register_open() and with @ref globus_xio_handle_cntl() * to choose whether out-of-band data is received in the normal data * queue. (Currently, there is no other way to receive OOB data) * * @param oobinline * GLOBUS_TRUE to enable, GLOBUS_FALSE to disable (default) */ /* globus_bool_t oobinline */ GLOBUS_XIO_TCP_SET_OOBINLINE, /** GlobusVarArgEnum(attr, handle) * Get the oobinline flag. * @ingroup globus_xio_tcp_driver_cntls * * @param oobinline_out * The oobinline flag will be stored here. */ /* globus_bool_t * oobinline_out */ GLOBUS_XIO_TCP_GET_OOBINLINE, /** GlobusVarArgEnum(attr, handle) * Set the tcp socket send buffer size. * @ingroup globus_xio_tcp_driver_cntls * Used on attrs for @ref globus_xio_server_create(), * @ref globus_xio_register_open() and with @ref globus_xio_handle_cntl() * to set the size of the send buffer used on the socket. * * @param sndbuf * The send buffer size in bytes to use. (default is system specific) * * string opt: sndbuf=formatted int */ /* int sndbuf */ GLOBUS_XIO_TCP_SET_SNDBUF, /** GlobusVarArgEnum(attr, handle) * Get the tcp send buffer size on the attr or handle. * @ingroup globus_xio_tcp_driver_cntls * * @param sndbuf_out * The send buffer size will be stored here. */ /* int * sndbuf_out */ GLOBUS_XIO_TCP_GET_SNDBUF, /** GlobusVarArgEnum(attr, handle) * Set the tcp socket receive buffer size. * @ingroup globus_xio_tcp_driver_cntls * Used on attrs for @ref globus_xio_server_create(), * @ref globus_xio_register_open() and with @ref globus_xio_handle_cntl() * to set the size of the receive buffer used on the socket. The receive * buffer size is often used by the operating system to choose the * appropriate TCP window size. * * @param rcvbuf * The receive buffer size in bytes. (default is system specific) * * string opt: rcvbuf=formatted int */ /* int rcvbuf */ GLOBUS_XIO_TCP_SET_RCVBUF, /** GlobusVarArgEnum(attr, handle) * Get the tcp receive buffer size on the attr or handle. * @ingroup globus_xio_tcp_driver_cntls * * @param rcvbuf_out * The receive buffer size will be stored here. */ /* int * rcvbuf_out */ GLOBUS_XIO_TCP_GET_RCVBUF, /** GlobusVarArgEnum(attr, handle) * Disable Nagle's algorithm. * @ingroup globus_xio_tcp_driver_cntls * Used on attrs for @ref globus_xio_server_create(), * @ref globus_xio_register_open() and with @ref globus_xio_handle_cntl() * to determine whether or not to disable Nagle's algorithm. If set to * GLOBUS_TRUE, the socket will send packets as soon as possible with * no unnecessary delays introduced. * * @param nodelay * GLOBUS_TRUE to disable nagle, GLOBUS_FALSE to enable (default) * * string opt: nodelay=bool */ /* globus_bool_t nodelay */ GLOBUS_XIO_TCP_SET_NODELAY, /** GlobusVarArgEnum(attr, handle) * Get the tcp nodelay flag. * @ingroup globus_xio_tcp_driver_cntls * * @param nodelay_out * The no delay flag will be stored here. */ /* globus_bool_t * nodelay_out */ GLOBUS_XIO_TCP_GET_NODELAY, /**GlobusVarArgEnum(dd) * Set tcp send flags. * @ingroup globus_xio_tcp_driver_cntls * Used only for data descriptors to write calls. * * @param send_flags * The flags to use when sending data. * * @see globus_xio_tcp_send_flags_t */ /* int send_flags */ GLOBUS_XIO_TCP_SET_SEND_FLAGS, /**GlobusVarArgEnum(dd) * Get tcp send flags. * @ingroup globus_xio_tcp_driver_cntls * * @param send_flags_out * The flags to use will be stored here. */ /* int * send_flags_out */ GLOBUS_XIO_TCP_GET_SEND_FLAGS, /**GlobusVarArgEnum(handle, server) * Get local socket info. * @ingroup globus_xio_tcp_driver_cntls * * @param contact_string_out * A pointer to a contact string for the local end of a connected * socket or listener will be stored here. The user should free() it * when done with it. It will be in the format: \:\ * * @see globus_xio_server_get_contact_string() * @see GLOBUS_XIO_GET_LOCAL_CONTACT */ /* char ** contact_string_out */ GLOBUS_XIO_TCP_GET_LOCAL_CONTACT, /**GlobusVarArgEnum(handle, server) * Get local socket info. * @ingroup globus_xio_tcp_driver_cntls * * @param contact_string_out * A pointer to a contact string for the local end of a connected * socket or listener will be stored here. The user should free() it * when done with it. It will be in the format: \:\ * * @see GLOBUS_XIO_GET_LOCAL_NUMERIC_CONTACT */ /* char ** contact_string_out */ GLOBUS_XIO_TCP_GET_LOCAL_NUMERIC_CONTACT, /**GlobusVarArgEnum(handle) * Get remote socket info. * @ingroup globus_xio_tcp_driver_cntls * * @param contact_string_out * A pointer to a contact string for the remote end of a connected * socket will be stored here. The user should free() it * when done with it. It will be in the format: \:\ * * @see GLOBUS_XIO_GET_REMOTE_CONTACT */ /* char ** contact_string_out */ GLOBUS_XIO_TCP_GET_REMOTE_CONTACT, /**GlobusVarArgEnum(handle) * Get remote socket info. * @ingroup globus_xio_tcp_driver_cntls * * @param contact_string_out * A pointer to a contact string for the remote end of a connected * socket will be stored here. The user should free() it * when done with it. It will be in the format: \:\ * * @see GLOBUS_XIO_GET_REMOTE_NUMERIC_CONTACT */ /* char ** contact_string_out */ GLOBUS_XIO_TCP_GET_REMOTE_NUMERIC_CONTACT, /**GlobusVarArgEnum(attr) * Change the default attr values. * @ingroup globus_xio_tcp_driver_cntls * * @param affect_global * If GLOBUS_TRUE, any future cntls on this attr will access * the global default attr (which all new attrs are initialized from) * The default is GLOBUS_FALSE. Note: this should only be used at * the application level and there should only be one. There is no * mutex protecting the global attr. This feature should not be * abused. There are some attrs that make no sense to change * globally. Attrs that do include the tcp port range stuff, socket * buffer sizes, etc. */ /* globus_bool_t affect_global */ GLOBUS_XIO_TCP_AFFECT_ATTR_DEFAULTS, /** GlobusVarArgEnum(attr, handle) * Enable true blocking io when making globus_xio_read/write() calls. * Note: use with caution. you can deadlock an entire app with this. * @ingroup globus_xio_tcp_driver_cntls * * @param use_blocking_io * If GLOBUS_TRUE, true blocking io will be enabled. * GLOBUS_FALSE will disable it (default); */ /* globus_bool_t use_blocking_io */ GLOBUS_XIO_TCP_SET_BLOCKING_IO, /** GlobusVarArgEnum(attr, handle) * Get the blocking io status in use or in attr. * @ingroup globus_xio_tcp_driver_cntls * * @param use_blocking_io_out * The flag will be set here. GLOBUS_TRUE for enabled. */ /* globus_bool_t * use_blocking_io_out */ GLOBUS_XIO_TCP_GET_BLOCKING_IO } globus_xio_tcp_cmd_t; /** * TCP driver specific types * @ingroup globus_xio_tcp_driver_types * @hideinitializer */ typedef enum { /** * Use this with @ref GLOBUS_XIO_TCP_SET_SEND_FLAGS to send a TCP message * out of band (Urgent data flag set) */ GLOBUS_XIO_TCP_SEND_OOB = MSG_OOB } globus_xio_tcp_send_flags_t; #ifdef __cplusplus } #endif #endif