1251881Speter/* 2251881Speter * ra_svn.h : private declarations for the ra_svn module 3251881Speter * 4251881Speter * ==================================================================== 5251881Speter * Licensed to the Apache Software Foundation (ASF) under one 6251881Speter * or more contributor license agreements. See the NOTICE file 7251881Speter * distributed with this work for additional information 8251881Speter * regarding copyright ownership. The ASF licenses this file 9251881Speter * to you under the Apache License, Version 2.0 (the 10251881Speter * "License"); you may not use this file except in compliance 11251881Speter * with the License. You may obtain a copy of the License at 12251881Speter * 13251881Speter * http://www.apache.org/licenses/LICENSE-2.0 14251881Speter * 15251881Speter * Unless required by applicable law or agreed to in writing, 16251881Speter * software distributed under the License is distributed on an 17251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18251881Speter * KIND, either express or implied. See the License for the 19251881Speter * specific language governing permissions and limitations 20251881Speter * under the License. 21251881Speter * ==================================================================== 22251881Speter */ 23251881Speter 24251881Speter 25251881Speter 26251881Speter#ifndef RA_SVN_H 27251881Speter#define RA_SVN_H 28251881Speter 29251881Speter#ifdef __cplusplus 30251881Speterextern "C" { 31251881Speter#endif /* __cplusplus */ 32251881Speter 33251881Speter#include <apr_network_io.h> 34251881Speter#include <apr_file_io.h> 35251881Speter#include <apr_thread_proc.h> 36251881Speter#include "svn_ra.h" 37251881Speter#include "svn_ra_svn.h" 38251881Speter 39251881Speter#include "private/svn_ra_svn_private.h" 40251881Speter 41251881Speter/* Callback function that indicates if a svn_ra_svn__stream_t has pending 42251881Speter * data. 43251881Speter */ 44251881Spetertypedef svn_boolean_t (*ra_svn_pending_fn_t)(void *baton); 45251881Speter 46251881Speter/* Callback function that sets the timeout value for a svn_ra_svn__stream_t. */ 47251881Spetertypedef void (*ra_svn_timeout_fn_t)(void *baton, apr_interval_time_t timeout); 48251881Speter 49251881Speter/* A stream abstraction for ra_svn. 50251881Speter * 51251881Speter * This is different from svn_stream_t in that it provides timeouts and 52251881Speter * the ability to check for pending data. 53251881Speter */ 54251881Spetertypedef struct svn_ra_svn__stream_st svn_ra_svn__stream_t; 55251881Speter 56251881Speter/* Handler for blocked writes. */ 57251881Spetertypedef svn_error_t *(*ra_svn_block_handler_t)(svn_ra_svn_conn_t *conn, 58251881Speter apr_pool_t *pool, 59251881Speter void *baton); 60251881Speter 61251881Speter/* The default "user agent". */ 62251881Speter#define SVN_RA_SVN__DEFAULT_USERAGENT "SVN/" SVN_VER_NUMBER\ 63251881Speter " (" SVN_BUILD_TARGET ")" 64251881Speter 65251881Speter/* The size of our per-connection read and write buffers. */ 66251881Speter#define SVN_RA_SVN__PAGE_SIZE 4096 67251881Speter#define SVN_RA_SVN__READBUF_SIZE (4 * SVN_RA_SVN__PAGE_SIZE) 68251881Speter#define SVN_RA_SVN__WRITEBUF_SIZE (4 * SVN_RA_SVN__PAGE_SIZE) 69251881Speter 70251881Speter/* Create forward reference */ 71251881Spetertypedef struct svn_ra_svn__session_baton_t svn_ra_svn__session_baton_t; 72251881Speter 73251881Speter/* This structure is opaque to the server. The client pokes at the 74251881Speter * first few fields during setup and cleanup. */ 75251881Speterstruct svn_ra_svn_conn_st { 76251881Speter 77251881Speter /* I/O buffers */ 78251881Speter char write_buf[SVN_RA_SVN__WRITEBUF_SIZE]; 79251881Speter char read_buf[SVN_RA_SVN__READBUF_SIZE]; 80251881Speter char *read_ptr; 81251881Speter char *read_end; 82251881Speter apr_size_t write_pos; 83251881Speter 84251881Speter svn_ra_svn__stream_t *stream; 85251881Speter svn_ra_svn__session_baton_t *session; 86251881Speter#ifdef SVN_HAVE_SASL 87251881Speter /* Although all reads and writes go through the svn_ra_svn__stream_t 88251881Speter interface, SASL still needs direct access to the underlying socket 89251881Speter for stuff like IP addresses and port numbers. */ 90251881Speter apr_socket_t *sock; 91251881Speter svn_boolean_t encrypted; 92251881Speter#endif 93251881Speter 94251881Speter /* abortion check control */ 95251881Speter apr_size_t written_since_error_check; 96251881Speter apr_size_t error_check_interval; 97251881Speter svn_boolean_t may_check_for_error; 98251881Speter 99251881Speter /* repository info */ 100251881Speter const char *uuid; 101251881Speter const char *repos_root; 102251881Speter 103251881Speter /* TX block notification target */ 104251881Speter ra_svn_block_handler_t block_handler; 105251881Speter void *block_baton; 106251881Speter 107251881Speter /* server settings */ 108251881Speter apr_hash_t *capabilities; 109251881Speter int compression_level; 110251881Speter apr_size_t zero_copy_limit; 111251881Speter 112251881Speter /* who's on the other side of the connection? */ 113251881Speter char *remote_ip; 114251881Speter 115251881Speter /* EV2 support*/ 116251881Speter svn_delta_shim_callbacks_t *shim_callbacks; 117251881Speter 118251881Speter /* our pool */ 119251881Speter apr_pool_t *pool; 120251881Speter}; 121251881Speter 122251881Speterstruct svn_ra_svn__session_baton_t { 123251881Speter apr_pool_t *pool; 124251881Speter svn_ra_svn_conn_t *conn; 125251881Speter svn_boolean_t is_tunneled; 126251881Speter const char *url; 127251881Speter const char *user; 128251881Speter const char *hostname; /* The remote hostname. */ 129251881Speter const char *realm_prefix; 130251881Speter const char **tunnel_argv; 131251881Speter const svn_ra_callbacks2_t *callbacks; 132251881Speter void *callbacks_baton; 133251881Speter apr_off_t bytes_read, bytes_written; /* apr_off_t's because that's what 134251881Speter the callback interface uses */ 135251881Speter const char *useragent; 136251881Speter}; 137251881Speter 138251881Speter/* Set a callback for blocked writes on conn. This handler may 139251881Speter * perform reads on the connection in order to prevent deadlock due to 140251881Speter * pipelining. If callback is NULL, the connection goes back to 141251881Speter * normal blocking I/O for writes. 142251881Speter */ 143251881Spetervoid svn_ra_svn__set_block_handler(svn_ra_svn_conn_t *conn, 144251881Speter ra_svn_block_handler_t callback, 145251881Speter void *baton); 146251881Speter 147251881Speter/* Return true if there is input waiting on conn. */ 148251881Spetersvn_boolean_t svn_ra_svn__input_waiting(svn_ra_svn_conn_t *conn, 149251881Speter apr_pool_t *pool); 150251881Speter 151251881Speter/* CRAM-MD5 client implementation. */ 152251881Spetersvn_error_t *svn_ra_svn__cram_client(svn_ra_svn_conn_t *conn, apr_pool_t *pool, 153251881Speter const char *user, const char *password, 154251881Speter const char **message); 155251881Speter 156251881Speter/* Return a pointer to the error chain child of ERR which contains the 157251881Speter * first "real" error message, not merely one of the 158251881Speter * SVN_ERR_RA_SVN_CMD_ERR wrapper errors. */ 159251881Spetersvn_error_t *svn_ra_svn__locate_real_error_child(svn_error_t *err); 160251881Speter 161251881Speter/* Return an error chain based on @a params (which contains a 162251881Speter * command response indicating failure). The error chain will be 163251881Speter * in the same order as the errors indicated in @a params. Use 164251881Speter * @a pool for temporary allocations. */ 165251881Spetersvn_error_t *svn_ra_svn__handle_failure_status(const apr_array_header_t *params, 166251881Speter apr_pool_t *pool); 167251881Speter 168251881Speter/* Returns a stream that reads/writes from/to SOCK. */ 169251881Spetersvn_ra_svn__stream_t *svn_ra_svn__stream_from_sock(apr_socket_t *sock, 170251881Speter apr_pool_t *pool); 171251881Speter 172251881Speter/* Returns a stream that reads from IN_FILE and writes to OUT_FILE. */ 173251881Spetersvn_ra_svn__stream_t *svn_ra_svn__stream_from_files(apr_file_t *in_file, 174251881Speter apr_file_t *out_file, 175251881Speter apr_pool_t *pool); 176251881Speter 177251881Speter/* Create an svn_ra_svn__stream_t using READ_CB, WRITE_CB, TIMEOUT_CB, 178251881Speter * PENDING_CB, and BATON. 179251881Speter */ 180251881Spetersvn_ra_svn__stream_t *svn_ra_svn__stream_create(void *baton, 181251881Speter svn_read_fn_t read_cb, 182251881Speter svn_write_fn_t write_cb, 183251881Speter ra_svn_timeout_fn_t timeout_cb, 184251881Speter ra_svn_pending_fn_t pending_cb, 185251881Speter apr_pool_t *pool); 186251881Speter 187251881Speter/* Write *LEN bytes from DATA to STREAM, returning the number of bytes 188251881Speter * written in *LEN. 189251881Speter */ 190251881Spetersvn_error_t *svn_ra_svn__stream_write(svn_ra_svn__stream_t *stream, 191251881Speter const char *data, apr_size_t *len); 192251881Speter 193251881Speter/* Read *LEN bytes from STREAM into DATA, returning the number of bytes 194251881Speter * read in *LEN. 195251881Speter */ 196251881Spetersvn_error_t *svn_ra_svn__stream_read(svn_ra_svn__stream_t *stream, 197251881Speter char *data, apr_size_t *len); 198251881Speter 199251881Speter/* Read the command word from CONN, return it in *COMMAND and skip to the 200251881Speter * end of the command. Allocate data in POOL. 201251881Speter */ 202251881Spetersvn_error_t *svn_ra_svn__read_command_only(svn_ra_svn_conn_t *conn, 203251881Speter apr_pool_t *pool, 204251881Speter const char **command); 205251881Speter 206251881Speter/* Set the timeout for operations on STREAM to INTERVAL. */ 207251881Spetervoid svn_ra_svn__stream_timeout(svn_ra_svn__stream_t *stream, 208251881Speter apr_interval_time_t interval); 209251881Speter 210251881Speter/* Return whether or not there is data pending on STREAM. */ 211251881Spetersvn_boolean_t svn_ra_svn__stream_pending(svn_ra_svn__stream_t *stream); 212251881Speter 213251881Speter/* Respond to an auth request and perform authentication. Use the Cyrus 214251881Speter * SASL library for mechanism negotiation and for creating authentication 215251881Speter * tokens. */ 216251881Spetersvn_error_t * 217251881Spetersvn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess, 218251881Speter const apr_array_header_t *mechlist, 219251881Speter const char *realm, apr_pool_t *pool); 220251881Speter 221251881Speter/* Same as svn_ra_svn__do_cyrus_auth, but uses the built-in implementation of 222251881Speter * the CRAM-MD5, ANONYMOUS and EXTERNAL mechanisms. Return the error 223251881Speter * SVN_ERR_RA_SVN_NO_MECHANSIMS if we cannot negotiate an authentication 224251881Speter * mechanism with the server. */ 225251881Spetersvn_error_t * 226251881Spetersvn_ra_svn__do_internal_auth(svn_ra_svn__session_baton_t *sess, 227251881Speter const apr_array_header_t *mechlist, 228251881Speter const char *realm, apr_pool_t *pool); 229251881Speter 230251881Speter/* Having picked a mechanism, start authentication by writing out an 231251881Speter * auth response. MECH_ARG may be NULL for mechanisms with no 232251881Speter * initial client response. */ 233251881Spetersvn_error_t *svn_ra_svn__auth_response(svn_ra_svn_conn_t *conn, 234251881Speter apr_pool_t *pool, 235251881Speter const char *mech, const char *mech_arg); 236251881Speter 237251881Speter/* Looks for MECH as a word in MECHLIST (an array of svn_ra_svn_item_t). */ 238251881Spetersvn_boolean_t svn_ra_svn__find_mech(const apr_array_header_t *mechlist, 239251881Speter const char *mech); 240251881Speter 241251881Speter/* Initialize the SASL library. */ 242251881Spetersvn_error_t *svn_ra_svn__sasl_init(void); 243251881Speter 244251881Speter 245251881Speter#ifdef __cplusplus 246251881Speter} 247251881Speter#endif /* __cplusplus */ 248251881Speter 249251881Speter#endif /* RA_SVN_H */ 250