| 1244 | } |
| 1245 | |
| 1246 | static dav_error * dav_fs_remove_lock(dav_lockdb *lockdb, |
| 1247 | const dav_resource *resource, |
| 1248 | const dav_locktoken *locktoken) |
| 1249 | { |
| 1250 | dav_error *err; |
| 1251 | dav_buffer buf = { 0 }; |
| 1252 | dav_lock_discovery *dh = NULL; |
| 1253 | dav_lock_indirect *ih = NULL; |
| 1254 | apr_datum_t key; |
| 1255 | |
| 1256 | key = dav_fs_build_key(lockdb->info->pool, resource); |
| 1257 | |
| 1258 | if (locktoken != NULL) { |
| 1259 | dav_lock_discovery *dp; |
| 1260 | dav_lock_discovery *dprev = NULL; |
| 1261 | dav_lock_indirect *ip; |
| 1262 | dav_lock_indirect *iprev = NULL; |
| 1263 | |
| 1264 | if ((err = dav_fs_load_lock_record(lockdb, key, DAV_CREATE_LIST, |
| 1265 | &dh, &ih)) != NULL) { |
| 1266 | /* ### maybe add a higher-level description */ |
| 1267 | return err; |
| 1268 | } |
| 1269 | |
| 1270 | for (dp = dh; dp != NULL; dp = dp->next) { |
| 1271 | if (dav_compare_locktoken(locktoken, dp->locktoken) == 0) { |
| 1272 | if (dprev) |
| 1273 | dprev->next = dp->next; |
| 1274 | else |
| 1275 | dh = dh->next; |
| 1276 | } |
| 1277 | dprev = dp; |
| 1278 | } |
| 1279 | |
| 1280 | for (ip = ih; ip != NULL; ip = ip->next) { |
| 1281 | if (dav_compare_locktoken(locktoken, ip->locktoken) == 0) { |
| 1282 | if (iprev) |
| 1283 | iprev->next = ip->next; |
| 1284 | else |
| 1285 | ih = ih->next; |
| 1286 | } |
| 1287 | iprev = ip; |
| 1288 | } |
| 1289 | |
| 1290 | } |
| 1291 | |
| 1292 | /* save the modified locks, or remove all locks (dh=ih=NULL). */ |
| 1293 | if ((err = dav_fs_save_lock_record(lockdb, key, dh, ih)) != NULL) { |
| 1294 | /* ### maybe add a higher-level description */ |
| 1295 | return err; |
| 1296 | } |
| 1297 | |
| 1298 | /* |
| 1299 | ** If this resource is a locknull resource AND no more locks exist, |
| 1300 | ** then remove the locknull member. |
| 1301 | ** |
| 1302 | ** Note: remove_locknull_state() attempts to convert a locknull member |
| 1303 | ** to a real member. In this case, all locks are gone, so the |
nothing calls this directly
no test coverage detected