# pro-archman # src/garbage.sh # Functions for garbage collection # # Copyright (C) 2013 Patrick McDermott # # This file is part of the ProteanOS Archive Manager. # # The ProteanOS Archive Manager is free software: you can redistribute # it and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # The ProteanOS Archive Manager is distributed in the hope that it # will be useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the ProteanOS Archive Manager. If not, see # . _time() { # Based on code from by Rich # Felker, with whitespace added for readability. printf '%d' $(($(TZ=UTC0 date "+ ( (%Y - 1600) * 365 + (%Y - 1600) / 4 - (%Y - 1600) / 100 + (%Y - 1600) / 400 + 1%j - 1000 - 135140 ) * 86400 + (1%H - 100) * 3600 + (1%M - 100) * 60 + (1%S - 100)"))) } collect_garbage() { local cur_time= local garbage= local gar_time= local dirs= local file= info_v "$(get_msg 'collecting_garbage')" cur_time=$(_time) for garbage in "${base_dir}/.db/garbage/"*; do if [ ! -f "${garbage}" ]; then continue fi gar_time=${garbage##*/} if [ ${cur_time} -lt ${gar_time} ]; then break fi while read -r dirs file; do info_v "$(get_msg 'collecting_garbage_file')" "${file}" rm -f -- "${base_dir}/${file}" while [ ${dirs} -gt 0 ]; do file="${file%/*}" try_rmdir "${base_dir}/${file}" || : dirs=$((${dirs} - 1)) done done 0<"${garbage}" rm -f -- "${garbage}" done return 0 } mark_pool_garbage() { local file="${1}" shift 1 local time= info_v "$(get_msg 'marking_garbage_file')" "${file}" time=$(_time) time=$((${time} + ${conf_pool_gc_delay})) mkdir -p -- "${base_dir}/.db/garbage" printf '2 %s\n' "${file}" 1>>"${base_dir}/.db/garbage/${time}" return 0 }