26#define APR_WANT_MEMFUNC
77#define DAV_CREATE_LIST 23
78#define DAV_APPEND_LIST 24
81#define DAV_LOCK_DIRECT 1
82#define DAV_LOCK_INDIRECT 2
88#define DAV_TYPE_FNAME 11
102#define dav_compare_locktoken(plt1, plt2) \
103 memcmp(&(plt1)->uuid, &(plt2)->uuid, sizeof((plt1)->uuid))
154#define dav_size_direct(a) ( 1 + sizeof(dav_lock_discovery_fixed) \
155 + sizeof(apr_uuid_t) \
156 + ((a)->owner ? strlen((a)->owner) : 0) \
157 + ((a)->auth_user ? strlen((a)->auth_user) : 0) \
161#define dav_size_indirect(a) (1 + sizeof(apr_uuid_t) \
163 + sizeof((a)->key.dsize) + (a)->key.dsize)
226 if (locktoken ==
NULL) {
231 comb->pub.locktoken = locktoken;
252 "The lock token uses an unknown State-token "
253 "format and could not be parsed.");
260 "The opaquelocktoken has an incorrect format "
261 "and could not be parsed.");
315 "Could not open the lock database.",
346 if (
comb->priv.lockdb_path ==
NULL) {
349 "A lock database was not specified with the "
350 "DAVLockDB directive. One must be specified "
351 "to use the locking functionality.");
355 *lockdb = &
comb->pub;
394 if (
key.dptr[
key.dsize - 2] ==
'/')
395 key.dptr[--
key.dsize - 1] =
'\0';
428 "INTERNAL DESIGN ERROR: the lockdb was opened "
429 "readonly, but an attempt to save locks was "
465 ptr +=
sizeof(
dp->f);
466 memcpy(ptr,
dp->locktoken,
sizeof(*
dp->locktoken));
467 ptr +=
sizeof(*
dp->locktoken);
472 memcpy(ptr,
dp->owner, strlen(
dp->owner) + 1);
473 ptr += strlen(
dp->owner) + 1;
475 if (
dp->auth_user ==
NULL) {
479 memcpy(ptr,
dp->auth_user, strlen(
dp->auth_user) + 1);
480 ptr += strlen(
dp->auth_user) + 1;
504 "Could not save lock information.",
581 offset += strlen(
dp->auth_user) + 1;
642 "The lock database was found to "
643 "be corrupt. offset %"
698 "The lock database was found to be corrupt. "
699 "An indirect lock's direct lock could not "
718 "<D:lockscope><D:exclusive/></D:lockscope>" DEBUG_CR
719 "<D:locktype><D:write/></D:locktype>" DEBUG_CR
722 "<D:lockscope><D:shared/></D:lockscope>" DEBUG_CR
723 "<D:locktype><D:write/></D:locktype>" DEBUG_CR
756 if (
pbuf->buf[
pbuf->cur_len - 1] ==
'/')
773 "Opened but could not stat file %s",
781 "Opened but rejected huge file %s",
792 "Failure reading locknull file "
828 if (
pbuf->cur_len == 0) {
843 "Error opening %s for writing",
940 "Could not load .locknull file.",
err);
948 "Could not save .locknull file.",
err);
988 (*lock)->is_locknull = !
resource->exists;
1010 "INTERNAL DESIGN ERROR: DAV_GETLOCKS_COMPLETE "
1011 "is not yet supported");
1039 for (; ip !=
NULL; ip = ip->
next) {
1093 (*lock)->is_locknull = !
resource->exists;
1094 (*lock)->scope =
dp->f.scope;
1095 (*lock)->type =
dp->f.type;
1096 (*lock)->depth =
dp->f.depth;
1097 (*lock)->timeout =
dp->f.timeout;
1098 (*lock)->owner =
dp->owner;
1099 (*lock)->auth_user =
dp->auth_user;
1104 for (; ip !=
NULL; ip = ip->
next) {
1107 (*lock)->is_locknull = !
resource->exists;
1120 (*lock)->scope =
dp->f.scope;
1121 (*lock)->type =
dp->f.type;
1122 (*lock)->depth =
dp->f.depth;
1123 (*lock)->timeout =
dp->f.timeout;
1124 (*lock)->owner =
dp->owner;
1125 (*lock)->auth_user =
dp->auth_user;
1258 if (locktoken !=
NULL) {
1265 &dh, &ih)) !=
NULL) {
1280 for (ip = ih; ip !=
NULL; ip = ip->
next) {
1390 for (; ip !=
NULL; ip = ip->
next) {
const char apr_size_t len
APR Standard Headers Support.
const unsigned char * buf
#define APR_UUID_FORMATTED_LENGTH
const char const char * pathname
const apr_xml_elem int apr_array_header_t int const char ** pbuf
#define HTTP_INTERNAL_SERVER_ERROR
dav_error * dav_dbm_store(dav_db *db, apr_datum_t key, apr_datum_t value)
void dav_fs_ensure_state_dir(apr_pool_t *p, const char *dirname)
#define DAV_ERR_LOCK_NO_DB
dav_error * dav_dbm_delete(dav_db *db, apr_datum_t key)
const char * dav_get_lockdb_path(const request_rec *r)
void dav_buffer_init(apr_pool_t *p, dav_buffer *pbuf, const char *str)
apr_pool_t * dav_fs_pool(const dav_resource *resource)
void dav_buffer_append(apr_pool_t *p, dav_buffer *pbuf, const char *str)
void dav_dbm_freedatum(dav_db *db, apr_datum_t data)
dav_error * dav_dbm_fetch(dav_db *db, apr_datum_t key, apr_datum_t *pvalue)
const char * dav_fs_pathname(const dav_resource *resource)
int dav_dbm_exists(dav_db *db, apr_datum_t key)
#define DAV_ERR_LOCK_PARSE_TOKEN
#define DAV_ERR_LOCK_OPENDB
dav_error * dav_fs_dir_file_name(const dav_resource *resource, const char **dirpath_p, const char **fname_p)
void dav_dbm_close(dav_db *db)
#define DAV_ERR_LOCK_CORRUPT_DB
#define DAV_ERR_LOCK_SAVE_LOCK
dav_error * dav_push_error(apr_pool_t *p, int status, int error_id, const char *desc, dav_error *prev)
dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro, dav_db **pdb)
#define DAV_ERR_LOCK_UNK_STATE_TOKEN
dav_error * dav_fs_get_locknull_members(const dav_resource *resource, dav_buffer *pbuf)
#define DAV_TIMEOUT_INFINITE
void dav_set_bufsize(apr_pool_t *p, dav_buffer *pbuf, apr_size_t size)
void dav_buffer_place(apr_pool_t *p, dav_buffer *pbuf, const char *str)
#define DAV_FS_LOCK_NULL_FILE
dav_error * dav_new_error(apr_pool_t *p, int status, int error_id, apr_status_t aprerr, const char *desc)
@ DAV_LOCKREC_INDIRECT_PARTIAL
#define ap_strstr_c(s, c)
apr_seek_where_t apr_off_t * offset
const char apr_file_t * file
#define apr_pcalloc(p, size)
apr_size_t const char * filename
apr_int32_t apr_int32_t apr_int32_t err
static dav_error * dav_fs_create_lock(dav_lockdb *lockdb, const dav_resource *resource, dav_lock **lock)
static dav_error * dav_fs_load_locknull_list(apr_pool_t *p, const char *dirpath, dav_buffer *pbuf)
static const char * dav_fs_format_locktoken(apr_pool_t *p, const dav_locktoken *locktoken)
static dav_error * dav_fs_find_lock(dav_lockdb *lockdb, const dav_resource *resource, const dav_locktoken *locktoken, int partial_ok, dav_lock **lock)
struct dav_lock_discovery dav_lock_discovery
static dav_error * dav_fs_save_lock_record(dav_lockdb *lockdb, apr_datum_t key, dav_lock_discovery *direct, dav_lock_indirect *indirect)
static dav_error * dav_fs_add_locknull_state(dav_lockdb *lockdb, const dav_resource *resource)
static dav_error * dav_fs_remove_lock(dav_lockdb *lockdb, const dav_resource *resource, const dav_locktoken *locktoken)
static dav_error * dav_fs_resolve(dav_lockdb *lockdb, dav_lock_indirect *indirect, dav_lock_discovery **direct, dav_lock_discovery **ref_dp, dav_lock_indirect **ref_ip)
static dav_error * dav_fs_really_open_lockdb(dav_lockdb *lockdb)
static int dav_fs_do_refresh(dav_lock_discovery *dp, const dav_locktoken_list *ltl, time_t new_time)
static const char * dav_fs_get_supportedlock(const dav_resource *resource)
static int dav_fs_compare_locktoken(const dav_locktoken *lt1, const dav_locktoken *lt2)
static dav_error * dav_fs_refresh_locks(dav_lockdb *lockdb, const dav_resource *resource, const dav_locktoken_list *ltl, time_t new_time, dav_lock **locks)
static dav_error * dav_fs_load_lock_record(dav_lockdb *lockdb, apr_datum_t key, int add_method, dav_lock_discovery **direct, dav_lock_indirect **indirect)
static dav_lock * dav_fs_alloc_lock(dav_lockdb *lockdb, apr_datum_t key, const dav_locktoken *locktoken)
static int dav_fs_lock_expired(time_t expires)
struct dav_lock_indirect dav_lock_indirect
struct dav_lock_discovery_fixed dav_lock_discovery_fixed
static dav_error * dav_fs_open_lockdb(request_rec *r, int ro, int force, dav_lockdb **lockdb)
const dav_hooks_locks dav_hooks_locks_fs
static apr_datum_t dav_fs_build_key(apr_pool_t *p, const dav_resource *resource)
#define dav_size_indirect(a)
static dav_error * dav_fs_parse_locktoken(apr_pool_t *p, const char *char_token, dav_locktoken **locktoken_p)
static dav_error * dav_fs_get_locks(dav_lockdb *lockdb, const dav_resource *resource, int calltype, dav_lock **locks)
static dav_error * dav_fs_remove_locknull_member(apr_pool_t *p, const char *filename, dav_buffer *pbuf)
#define dav_size_direct(a)
static dav_error * dav_fs_append_locks(dav_lockdb *lockdb, const dav_resource *resource, int make_indirect, const dav_lock *lock)
static dav_error * dav_fs_remove_locknull_state(dav_lockdb *lockdb, const dav_resource *resource)
static dav_error * dav_fs_save_locknull_list(apr_pool_t *p, const char *dirpath, dav_buffer *pbuf)
static dav_error * dav_fs_has_locks(dav_lockdb *lockdb, const dav_resource *resource, int *locks_present)
#define dav_compare_locktoken(plt1, plt2)
static void dav_fs_close_lockdb(dav_lockdb *lockdb)
#define DAV_LOCK_INDIRECT
DAV extension module for Apache 2.0.*.
#define DAV_GETLOCKS_COMPLETE
#define DAV_GETLOCKS_RESOLVED
Declarations for the filesystem repository implementation.
struct dav_lock_discovery * next
struct dav_lock_discovery_fixed f
dav_locktoken * locktoken
dav_locktoken * locktoken
struct dav_lock_indirect * next
dav_lockdb_private * info
A structure that represents the current request.