⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 locks.c

📁 linux网络服务器工具
💻 C
📖 第 1 页 / 共 3 页
字号:
        return err;    }    /* copy all direct locks to the result list */    for (; dp != NULL; dp = dp->next) {        newlock = dav_generic_alloc_lock(lockdb, key, dp->locktoken);        newlock->is_locknull = !resource->exists;        newlock->scope = dp->f.scope;        newlock->type = dp->f.type;        newlock->depth = dp->f.depth;        newlock->timeout = dp->f.timeout;        newlock->owner = dp->owner;        newlock->auth_user = dp->auth_user;        /* hook into the result list */        newlock->next = lock;        lock = newlock;    }    /* copy all the indirect locks to the result list. resolve as needed. */    for (; ip != NULL; ip = ip->next) {        newlock = dav_generic_alloc_lock(lockdb, ip->key, ip->locktoken);        newlock->is_locknull = !resource->exists;        if (calltype == DAV_GETLOCKS_RESOLVED) {            err = dav_generic_resolve(lockdb, ip, &dp, NULL, NULL);            if (err != NULL) {                /* ### push a higher-level desc? */                return err;            }            newlock->scope = dp->f.scope;            newlock->type = dp->f.type;            newlock->depth = dp->f.depth;            newlock->timeout = dp->f.timeout;            newlock->owner = dp->owner;            newlock->auth_user = dp->auth_user;        }        else {            /* DAV_GETLOCKS_PARTIAL */            newlock->rectype = DAV_LOCKREC_INDIRECT_PARTIAL;        }        /* hook into the result list */        newlock->next = lock;        lock = newlock;    }    *locks = lock;    return NULL;}static dav_error * dav_generic_find_lock(dav_lockdb *lockdb,                                         const dav_resource *resource,                                         const dav_locktoken *locktoken,                                         int partial_ok,                                         dav_lock **lock){    dav_error *err;    apr_datum_t key;    dav_lock_discovery *dp;    dav_lock_indirect *ip;    *lock = NULL;    key = dav_generic_build_key(lockdb->info->pool, resource);    if ((err = dav_generic_load_lock_record(lockdb, key, DAV_CREATE_LIST,                                       &dp, &ip)) != NULL) {        /* ### push a higher-level desc? */        return err;    }    for (; dp != NULL; dp = dp->next) {        if (!dav_compare_locktoken(locktoken, dp->locktoken)) {            *lock = dav_generic_alloc_lock(lockdb, key, locktoken);            (*lock)->is_locknull = !resource->exists;            (*lock)->scope = dp->f.scope;            (*lock)->type = dp->f.type;            (*lock)->depth = dp->f.depth;            (*lock)->timeout = dp->f.timeout;            (*lock)->owner = dp->owner;            (*lock)->auth_user = dp->auth_user;            return NULL;        }    }    for (; ip != NULL; ip = ip->next) {        if (!dav_compare_locktoken(locktoken, ip->locktoken)) {            *lock = dav_generic_alloc_lock(lockdb, ip->key, locktoken);            (*lock)->is_locknull = !resource->exists;            /* ### nobody uses the resolving right now! */            if (partial_ok) {                (*lock)->rectype = DAV_LOCKREC_INDIRECT_PARTIAL;            }            else {                (*lock)->rectype = DAV_LOCKREC_INDIRECT;                if ((err = dav_generic_resolve(lockdb, ip, &dp,                                          NULL, NULL)) != NULL) {                    /* ### push a higher-level desc? */                    return err;                }                (*lock)->scope = dp->f.scope;                (*lock)->type = dp->f.type;                (*lock)->depth = dp->f.depth;                (*lock)->timeout = dp->f.timeout;                (*lock)->owner = dp->owner;                (*lock)->auth_user = dp->auth_user;            }            return NULL;        }    }    return NULL;}static dav_error * dav_generic_has_locks(dav_lockdb *lockdb,                                         const dav_resource *resource,                                         int *locks_present){    dav_error *err;    apr_datum_t key;    *locks_present = 0;    if ((err = dav_generic_really_open_lockdb(lockdb)) != NULL) {        /* ### insert a higher-level error description */        return err;    }    /*     * If we opened readonly and the db wasn't there, then there are no     * locks for this resource. Just exit.     */    if (lockdb->info->db == NULL)        return NULL;    key = dav_generic_build_key(lockdb->info->pool, resource);    *locks_present = apr_dbm_exists(lockdb->info->db, key);    return NULL;}static dav_error * dav_generic_append_locks(dav_lockdb *lockdb,                                            const dav_resource *resource,                                            int make_indirect,                                            const dav_lock *lock){    apr_pool_t *p = lockdb->info->pool;    dav_error *err;    dav_lock_indirect *ip;    dav_lock_discovery *dp;    apr_datum_t key;    key = dav_generic_build_key(lockdb->info->pool, resource);    err = dav_generic_load_lock_record(lockdb, key, 0, &dp, &ip);    if (err != NULL) {        /* ### maybe add in a higher-level description */        return err;    }    /*     * ### when we store the lock more directly, we need to update     * ### lock->rectype and lock->is_locknull     */    if (make_indirect) {        for (; lock != NULL; lock = lock->next) {            /* ### this works for any <lock> rectype */            dav_lock_indirect *newi = apr_pcalloc(p, sizeof(*newi));            /* ### shut off the const warning for now */            newi->locktoken = (dav_locktoken *)lock->locktoken;            newi->timeout   = lock->timeout;            newi->key       = lock->info->key;            newi->next      = ip;            ip              = newi;        }    }    else {        for (; lock != NULL; lock = lock->next) {            /* create and link in the right kind of lock */            if (lock->rectype == DAV_LOCKREC_DIRECT) {                dav_lock_discovery *newd = apr_pcalloc(p, sizeof(*newd));                newd->f.scope = lock->scope;                newd->f.type = lock->type;                newd->f.depth = lock->depth;                newd->f.timeout = lock->timeout;                /* ### shut off the const warning for now */                newd->locktoken = (dav_locktoken *)lock->locktoken;                newd->owner = lock->owner;                newd->auth_user = lock->auth_user;                newd->next = dp;                dp = newd;            }            else {                /* DAV_LOCKREC_INDIRECT(_PARTIAL) */                dav_lock_indirect *newi = apr_pcalloc(p, sizeof(*newi));                /* ### shut off the const warning for now */                newi->locktoken = (dav_locktoken *)lock->locktoken;                newi->key       = lock->info->key;                newi->next      = ip;                ip              = newi;            }        }    }    if ((err = dav_generic_save_lock_record(lockdb, key, dp, ip)) != NULL) {        /* ### maybe add a higher-level description */        return err;    }    return NULL;}static dav_error * dav_generic_remove_lock(dav_lockdb *lockdb,                                           const dav_resource *resource,                                           const dav_locktoken *locktoken){    dav_error *err;    dav_lock_discovery *dh = NULL;    dav_lock_indirect *ih = NULL;    apr_datum_t key;    key = dav_generic_build_key(lockdb->info->pool, resource);    if (locktoken != NULL) {        dav_lock_discovery *dp;        dav_lock_discovery *dprev = NULL;        dav_lock_indirect *ip;        dav_lock_indirect *iprev = NULL;        if ((err = dav_generic_load_lock_record(lockdb, key, DAV_CREATE_LIST,                                           &dh, &ih)) != NULL) {            /* ### maybe add a higher-level description */            return err;        }        for (dp = dh; dp != NULL; dp = dp->next) {            if (dav_compare_locktoken(locktoken, dp->locktoken) == 0) {                if (dprev)                    dprev->next = dp->next;                else                    dh = dh->next;            }            dprev = dp;        }        for (ip = ih; ip != NULL; ip = ip->next) {            if (dav_compare_locktoken(locktoken, ip->locktoken) == 0) {                if (iprev)                    iprev->next = ip->next;                else                    ih = ih->next;            }            iprev = ip;        }    }    /* save the modified locks, or remove all locks (dh=ih=NULL). */    if ((err = dav_generic_save_lock_record(lockdb, key, dh, ih)) != NULL) {        /* ### maybe add a higher-level description */        return err;    }    return NULL;}static int dav_generic_do_refresh(dav_lock_discovery *dp,                                  const dav_locktoken_list *ltl,                                  time_t new_time){    int dirty = 0;    for (; ltl != NULL; ltl = ltl->next) {        if (dav_compare_locktoken(dp->locktoken, ltl->locktoken) == 0)        {            dp->f.timeout = new_time;            dirty = 1;        }    }    return dirty;}static dav_error * dav_generic_refresh_locks(dav_lockdb *lockdb,                                             const dav_resource *resource,                                             const dav_locktoken_list *ltl,                                             time_t new_time,                                             dav_lock **locks){    dav_error *err;    apr_datum_t key;    dav_lock_discovery *dp;    dav_lock_discovery *dp_scan;    dav_lock_indirect *ip;    int dirty = 0;    dav_lock *newlock;    *locks = NULL;    key = dav_generic_build_key(lockdb->info->pool, resource);    if ((err = dav_generic_load_lock_record(lockdb, key, DAV_CREATE_LIST,                                            &dp, &ip)) != NULL) {        /* ### maybe add in a higher-level description */        return err;    }    /* ### we should be refreshing direct AND (resolved) indirect locks! */    /* refresh all of the direct locks on this resource */    for (dp_scan = dp; dp_scan != NULL; dp_scan = dp_scan->next) {        if (dav_generic_do_refresh(dp_scan, ltl, new_time)) {            /* the lock was refreshed. return the lock. */            newlock = dav_generic_alloc_lock(lockdb, key, dp_scan->locktoken);            newlock->is_locknull = !resource->exists;            newlock->scope = dp_scan->f.scope;            newlock->type = dp_scan->f.type;            newlock->depth = dp_scan->f.depth;            newlock->timeout = dp_scan->f.timeout;            newlock->owner = dp_scan->owner;            newlock->auth_user = dp_scan->auth_user;            newlock->next = *locks;            *locks = newlock;            dirty = 1;        }    }    /* if we refreshed any locks, then save them back. */    if (dirty        && (err = dav_generic_save_lock_record(lockdb, key, dp, ip)) != NULL) {        /* ### maybe add in a higher-level description */        return err;    }    /* for each indirect lock, find its direct lock and refresh it. */    for (; ip != NULL; ip = ip->next) {        dav_lock_discovery *ref_dp;        dav_lock_indirect *ref_ip;        if ((err = dav_generic_resolve(lockdb, ip, &dp_scan,                                       &ref_dp, &ref_ip)) != NULL) {            /* ### push a higher-level desc? */            return err;        }        if (dav_generic_do_refresh(dp_scan, ltl, new_time)) {            /* the lock was refreshed. return the lock. */            newlock = dav_generic_alloc_lock(lockdb, ip->key, dp->locktoken);            newlock->is_locknull = !resource->exists;            newlock->scope = dp->f.scope;            newlock->type = dp->f.type;            newlock->depth = dp->f.depth;            newlock->timeout = dp->f.timeout;            newlock->owner = dp->owner;            newlock->auth_user = dp_scan->auth_user;            newlock->next = *locks;            *locks = newlock;            /* save the (resolved) direct lock back */            if ((err = dav_generic_save_lock_record(lockdb, ip->key, ref_dp,                                                    ref_ip)) != NULL) {                /* ### push a higher-level desc? */                return err;            }        }    }    return NULL;}const dav_hooks_locks dav_hooks_locks_generic ={    dav_generic_get_supportedlock,    dav_generic_parse_locktoken,    dav_generic_format_locktoken,    dav_generic_compare_locktoken,    dav_generic_open_lockdb,    dav_generic_close_lockdb,    dav_generic_remove_locknull_state,    dav_generic_create_lock,    dav_generic_get_locks,    dav_generic_find_lock,    dav_generic_has_locks,    dav_generic_append_locks,    dav_generic_remove_lock,    dav_generic_refresh_locks,    NULL, /* lookup_resource */    NULL /* ctx */};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -