Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_ra_svn/client.c view on Meta::CPAN
*tunnel = apr_pstrmemdup(pool, url, p - url);
}
}
static svn_error_t *make_connection(const char *hostname, unsigned short port,
apr_socket_t **sock, apr_pool_t *pool)
{
apr_sockaddr_t *sa;
apr_status_t status;
int family = APR_INET;
/* Make sure we have IPV6 support first before giving apr_sockaddr_info_get
APR_UNSPEC, because it may give us back an IPV6 address even if we can't
create IPV6 sockets. */
#if APR_HAVE_IPV6
#ifdef MAX_SECS_TO_LINGER
status = apr_socket_create(sock, APR_INET6, SOCK_STREAM, pool);
#else
status = apr_socket_create(sock, APR_INET6, SOCK_STREAM,
APR_PROTO_TCP, pool);
#endif
if (status == 0)
{
apr_socket_close(*sock);
family = APR_UNSPEC;
}
#endif
/* Resolve the hostname. */
status = apr_sockaddr_info_get(&sa, hostname, family, port, 0, pool);
if (status)
return svn_error_createf(status, NULL, _("Unknown hostname '%s'"),
hostname);
/* Iterate through the returned list of addresses attempting to
* connect to each in turn. */
do
{
/* Create the socket. */
#ifdef MAX_SECS_TO_LINGER
/* ### old APR interface */
status = apr_socket_create(sock, sa->family, SOCK_STREAM, pool);
#else
status = apr_socket_create(sock, sa->family, SOCK_STREAM, APR_PROTO_TCP,
pool);
#endif
if (status == APR_SUCCESS)
{
status = apr_socket_connect(*sock, sa);
if (status != APR_SUCCESS)
apr_socket_close(*sock);
}
sa = sa->next;
}
while (status != APR_SUCCESS && sa);
if (status)
return svn_error_wrap_apr(status, _("Can't connect to host '%s'"),
hostname);
/* Enable TCP keep-alives on the socket so we time out when
* the connection breaks due to network-layer problems.
* If the peer has dropped the connection due to a network partition
* or a crash, or if the peer no longer considers the connection
* valid because we are behind a NAT and our public IP has changed,
* it will respond to the keep-alive probe with a RST instead of an
* acknowledgment segment, which will cause svn to abort the session
* even while it is currently blocked waiting for data from the peer.
* See issue #3347. */
status = apr_socket_opt_set(*sock, APR_SO_KEEPALIVE, 1);
if (status)
{
/* It's not a fatal error if we cannot enable keep-alives. */
}
return SVN_NO_ERROR;
}
/* Set *DIFFS to an array of svn_prop_t, allocated in POOL, based on the
property diffs in LIST, received from the server. */
static svn_error_t *parse_prop_diffs(const apr_array_header_t *list,
apr_pool_t *pool,
apr_array_header_t **diffs)
{
int i;
*diffs = apr_array_make(pool, list->nelts, sizeof(svn_prop_t));
for (i = 0; i < list->nelts; i++)
{
svn_prop_t *prop;
svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(list, i, svn_ra_svn_item_t);
if (elt->kind != SVN_RA_SVN_LIST)
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
_("Prop diffs element not a list"));
prop = apr_array_push(*diffs);
SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "c(?s)", &prop->name,
&prop->value));
}
return SVN_NO_ERROR;
}
/* Parse a lockdesc, provided in LIST as specified by the protocol into
LOCK, allocated in POOL. */
static svn_error_t *parse_lock(const apr_array_header_t *list, apr_pool_t *pool,
svn_lock_t **lock)
{
const char *cdate, *edate;
*lock = svn_lock_create(pool);
SVN_ERR(svn_ra_svn__parse_tuple(list, pool, "ccc(?c)c(?c)", &(*lock)->path,
&(*lock)->token, &(*lock)->owner,
&(*lock)->comment, &cdate, &edate));
(*lock)->path = svn_fspath__canonicalize((*lock)->path, pool);
SVN_ERR(svn_time_from_cstring(&(*lock)->creation_date, cdate, pool));
if (edate)
SVN_ERR(svn_time_from_cstring(&(*lock)->expiration_date, edate, pool));
return SVN_NO_ERROR;
}
/* --- AUTHENTICATION ROUTINES --- */
svn_error_t *svn_ra_svn__auth_response(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *mech, const char *mech_arg)
{
return svn_ra_svn__write_tuple(conn, pool, "w(?c)", mech, mech_arg);
}
static svn_error_t *handle_auth_request(svn_ra_svn__session_baton_t *sess,
apr_pool_t *pool)
{
svn_ra_svn_conn_t *conn = sess->conn;
( run in 0.710 second using v1.01-cache-2.11-cpan-df04353d9ac )